Здравствуйте еще раз. Разобрался со старыми ошибками скрипта, там не верно работал цикл фо. Теперь этот скрипт покупает хорошо, но возникла трудность с продажей. На демоквике хорошо работает, а в реальном первую заявку он считает не прошедшей и открывает еще одну. вот часть лога: ,0,30.05.2017,12:42:03,Робот: ОТКРЫЛ ПОЗИЦИЮ №1,,
1,0,30.05.2017,12:52:32,Простой MA-робот: В ПРОЦЕССЕ ЗАКРЫТИЯ,,
1,0,30.05.2017,12:52:32,Точка закрытия 1: 1,,
1,0,30.05.2017,12:52:32,Точка закрытия 3,,
1,0,30.05.2017,12:52:32,звкрытие Status 4303,,
1,0,30.05.2017,12:52:32,Робот: Транзакция не прошла! ОШИБКА: ,,
1,0,30.05.2017,12:52:32,Точка закрытия 1: 1,,
1,0,30.05.2017,12:52:32,Точка закрытия 3,,
1,0,30.05.2017,12:52:32,Заявка 26412225679 успешно зарегистрирована.,,
1,0,30.05.2017,12:52:33,Робот: trans_Status 3 trans_result_msg Заявка 26412225703 успешно зарегистрирована.,,
1,0,30.05.2017,12:52:33,Робот: trans_Status 4305 trans_result_msg ,,
А вот код, помогите пожалуйста понять почему первая заявка у него не верная
1,0,30.05.2017,12:52:32,Простой MA-робот: В ПРОЦЕССЕ ЗАКРЫТИЯ,,
1,0,30.05.2017,12:52:32,Точка закрытия 1: 1,,
1,0,30.05.2017,12:52:32,Точка закрытия 3,,
1,0,30.05.2017,12:52:32,звкрытие Status 4303,,
1,0,30.05.2017,12:52:32,Робот: Транзакция не прошла! ОШИБКА: ,,
1,0,30.05.2017,12:52:32,Точка закрытия 1: 1,,
1,0,30.05.2017,12:52:32,Точка закрытия 3,,
1,0,30.05.2017,12:52:32,Заявка 26412225679 успешно зарегистрирована.,,
1,0,30.05.2017,12:52:33,Робот: trans_Status 3 trans_result_msg Заявка 26412225703 успешно зарегистрирована.,,
1,0,30.05.2017,12:52:33,Робот: trans_Status 4305 trans_result_msg ,,
А вот код, помогите пожалуйста понять почему первая заявка у него не верная
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 | --[[ ]] --/*НАСТРАИВАЕМЫЕ ПАРАМЕТРЫ*/ --ACCOUNT = 'NL0011100043'; -- Идентификатор счета ACCOUNT = 'SPBFUT0025E'; -- Идентификатор счета --CLASS_CODE = 'QJSIM'; -- Код класса CLASS_CODE = 'SPBFUT'; -- Код класса --SEC_CODE = 'SBER'; -- Код бумаги SEC_CODE = 'SiM7'; -- Код бумаги NPos=1 --размер открываемых позиций одной сделкой NProsk=50 --проскальзывание Price1="PRICE_SAR" --ссылка на график цены ParMed1="SAR_1" --синий, ссылка на график медленного параболика ParSr1="SAR_2" --красный, ссылка на график среднего параболика ParFiltr1="SAR_3" --зеленый, ссылка на график фильтровочного параболика ParFas1="SAR_4" --желтый, ссылка на график быстрого параболика INTERVAL = INTERVAL_M1; -- Таймфрейм графика (для построения скользящих) --/*РАБОЧИЕ ПЕРЕМЕННЫЕ РОБОТА (менять не нужно)*/ SEC_PRICE_STEP = 0; -- ШАГ ЦЕНЫ ИНСТРУМЕНТА DS = nil; -- Источник данных графика (DataSource) ROBOT_STATE ='В ПОИСКЕ ТОЧКИ ВХОДА';-- СОСТОЯНИЕ робота ['В ПРОЦЕССЕ СДЕЛКИ', либо 'В ПОИСКЕ ТОЧКИ ВХОДА'] trans_id = os.time(); -- Задает начальный номер ID транзакций trans_Status = nil; -- Статус текущей транзакции из функции OnTransPeply trans_result_msg = ''; -- Сообщение по текущей транзакции из функции OnTransPeply CurrentDir ect = 'BUY'; -- Текущее НАПРАВЛЕНИЕ ['BUY', или 'SELL'] LastOpenBarIndex = 0; -- Индекс свечи, на которой была открыта последняя позиция (нужен для того, чтобы после закрытия по стопу тут же не открыть еще одну позицию) Run = true; -- Флаг поддержания работы бесконечного цикла в main Napravlenie_Sdelki=false --направление открытия позиции ,Napravlenie_Sdelki='ПОЗИЯ КУПЛЕНА, ОТКРЫТА' Napravlenie_Sdelki='ПОЗИЯ ПРОДАНА, ОТКРЫТА' -- Функция первичной инициализации скрипта (ВЫЗЫВАЕТСЯ ТЕРМИНАЛОМ QUIK в самом начале) function OnInit() -- Получает доступ к свечам графика local Error = ''; DS,Error = CreateDataSource(CLASS_CODE, SEC_CODE, INTERVAL); -- Проверка if DS == nil then message('Простой MA-робот:ОШИБКА получения доступа к свечам! '..Error); -- Завершает выполнение скрипта Run = false; return; end; -- Получает ШАГ ЦЕНЫ ИНСТРУМЕНТА SEC_PRICE_STEP = getParamEx(CLASS_CODE, SEC_CODE, "SEC_PRICE_STEP").param_value; message('SEC_PRICE_STEP'..tostring(SEC_PRICE_STEP)) --message(' Price = getParamEx(CLASS_CODE, SEC_CODE, offer).param_value'..tostring( getParamEx(CLASS_CODE, SEC_CODE, 'offer').param_value)) --message(' Price = getParamEx(CLASS_CODE, SEC_CODE, bid).param_value'..tostring( getParamEx(CLASS_CODE, SEC_CODE, 'bid').param_value)) end; function main() -- Выводит сообщение message('Простой MA-робот: '..ROBOT_STATE); -- "Бесконечный" цикл while Run do NumCandles1=getNumCandles(Price1) NumCandles2=getNumCandles(ParMed1) tPrice1,n1,s1 = getCandlesByIndex (Price1, 0, NumCandles1-2, 2) --считывает данные с графика цены tPrice2,n2,s2 = getCandlesByIndex (ParMed1, 0, NumCandles2-2, 2) --считывает данные с графика медленного параболика --------------------------------------------------------------------------------------------------------------------------------------------------------------------- --механизм открытия позиции 1 --------------------------------------------------------------------------------------------------------------------------------------------------------------------- --Если СОСТОЯНИЕ робота "В ПРОЦЕССЕ СДЕЛКИ" if ROBOT_STATE == 'В ПРОЦЕССЕ СДЕЛКИ' then -- Выводит сообщение message('Робот: В ПРОЦЕССЕ СДЕЛКИ'); -- Делает 10 попыток открыть сделку local Price = false; -- Переменная для получения результата открытия позиции (цена, либо ошибка(false)) for i=1,10 do if not Run then return; end; -- Если скрипт останавливается, не затягивает процесс -- Совершает СДЕЛКУ указанного типа ["BUY", или "SELL"] по рыночной(текущей) цене размером в 1 лот, --- возвращает цену открытой сделки, либо FALSE, если невозможно открыть сделку Price = Trade(CurrentDirect); -- Если сделка открылась if Price ~= false or ROBOT_STATE =='ОТКРЫЛ ПОЗИЦИЮ №1' then ROBOT_STATE = 'ОТКРЫЛ ПОЗИЦИЮ №1' LastOpenBarIndex = DS:Size(); -- Прерывает цикл FOR i=20 break; end; sleep(100); -- Пауза в 100 мс между попытками открыть сделку if i==10 and Price == false and ROBOT_STATE == 'В ПРОЦЕССЕ СДЕЛКИ' then ROBOT_STATE='В ПОИСКЕ ТОЧКИ ВХОДА' end end; if not Run then return; end; -- Если скрипт останавливается, не затягивает процесс -- Если сделка открыта if Price ~= false then ROBOT_STATE = 'ОТКРЫЛ ПОЗИЦИЮ №1' message('Робот: ОТКРЫЛ ПОЗИЦИЮ №1'); end; --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --откоытие позиции 1 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- else -- СОСТОЯНИЕ робота 'В ПОИСКЕ ТОЧКИ ВХОДА' -- Если на этой свече еще не было открыто позиций if DS:Size() > LastOpenBarIndex then -- Если быстрая пересекла медленную СНИЗУ ВВЕРХ -- if FastMA(DS:Size()-1) SlowMA() then if crossOverMed() and ROBOT_STATE == 'В ПОИСКЕ ТОЧКИ ВХОДА' and ParFiltrOver() or crossOverFiltr() and ROBOT_STATE == 'В ПОИСКЕ ТОЧКИ ВХОДА' and ParFiltSar1Over() then -- Задает направление НА ПОКУПКУ CurrentDirect = 'BUY'; message('CurrentDirect = "BUY"'); -- Меняет СОСТОЯНИЕ робота на "В ПРОЦЕССЕ СДЕЛКИ" ROBOT_STATE = 'В ПРОЦЕССЕ СДЕЛКИ'; -- Если быстрая пересекла медленную СВЕРХУ ВНИЗ elseif crossUnderMed() and ROBOT_STATE == 'В ПОИСКЕ ТОЧКИ ВХОДА' and ParFiltrUnder() or crossUnderFiltr() and ROBOT_STATE == 'В ПОИСКЕ ТОЧКИ ВХОДА' and ParFiltrSar1Under() then -- Если по данному инструменту не запрещены операции шорт -- Задает направление НА ПРОДАЖУ CurrentDirect = 'SELL'; message('CurrentDirect = "SELL"'); -- Меняет СОСТОЯНИЕ робота на "В ПРОЦЕССЕ СДЕЛКИ" ROBOT_STATE = 'В ПРОЦЕССЕ СДЕЛКИ'; end; end; end; ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --закрытие позиции 1 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- if ROBOT_STATE == 'ОТКРЫЛ ПОЗИЦИЮ №1' and Napravlenie_Sdelki=='ПОЗИЯ КУПЛЕНА, ОТКРЫТА' and crossUnderMed() or ROBOT_STATE == 'ОТКРЫЛ ПОЗИЦИЮ №1' and Napravlenie_Sdelki=='ПОЗИЯ ПРОДАНА, ОТКРЫТА' and crossOverMed() then -- Выводит сообщение message('Робот: В ПРОЦЕССЕ ЗАКРЫТИЯ'); ROBOT_STATE = 'В ПРОЦЕССЕ ЗАКРЫТИЯ' -- Делает 10 попыток закрыть сделку local PriceZak = false; -- Переменная для получения результата открытия позиции (цена, либо ошибка(false)) for i=1,10 do if not Run then return; end; -- Если скрипт останавливается, не затягивает процесс if Napravlenie_Sdelki=='ПОЗИЯ КУПЛЕНА, ОТКРЫТА' then CurrentDirectZak='SELLzak' elseif Napravlenie_Sdelki=='ПОЗИЯ ПРОДАНА, ОТКРЫТА' then CurrentDirectZak='BUYzak' end -- Совершает СДЕЛКУ указанного типа ["BUY", или "SELL"] по рыночной(текущей) цене размером в 1 лот, --- возвращает цену открытой сделки, либо FALSE, если невозможно открыть сделку PriceZak = TradeZak(CurrentDirectZak); -- Если сделка открылась if getItem ("FUTURES_CLIENT_HOLDING",0).totalnet==0 or ROBOT_STATE == 'В ПОИСКЕ ТОЧКИ ВХОДА' then i=20 -- Прерывает цикл FOR break; end; sleep(100); -- Пауза в 100 мс между попытками открыть сделку if i==10 and Price == false and ROBOT_STATE == 'В ПРОЦЕССЕ ЗАКРЫТИЯ' then ROBOT_STATE='ОТКРЫЛ ПОЗИЦИЮ №1' end end; if not Run then return; end; -- Если скрипт останавливается, не затягивает процесс -- Если сделка закрыта if PriceZak~= false and getItem ("FUTURES_CLIENT_HOLDING",0).totalnet==0 then -- Запоминает индекс свечи, на которой была открыта последняя позиция (нужен для того, чтобы после закрытия по стопу тут же не открыть еще одну позицию) -- LastOpenBarIndex = DS:Size(); -- Выводит сообщение message('Робот: Закрыта сделка '..tostring(CurrentDirectZak)..' по цене '..tostring(PriceZak)); ROBOT_STATE = 'В ПОИСКЕ ТОЧКИ ВХОДА'; end end ----------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ sleep(1);--Пауза 10 мс, для того, чтобы не перегружать процессор компьютера end; end; -- Функция вызывается терминалом QUIK при получении ответа на транзакцию пользователя function OnTransReply(trans_reply) -- Если поступила информация по текущей транзакции if trans_reply.trans_id == trans_id then -- Передает статус в глобальную переменную trans_Status = trans_reply.status; -- Передает сообщение в глобальную переменную trans_result_msg = trans_reply.result_msg; message('Робот: trans_Status '..tostring(trans_Status)..' trans_result_msg '..tostring(trans_result_msg)); end; end; -- Функция ВЫЗЫВАЕТСЯ ТЕРМИНАЛОМ QUIK при остановке скрипта function OnStop() Run = false; end; ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -- ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ -- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -- Совершает СДЕЛКУ указанного типа (Type) ["BUY", или "SELL"] по рыночной(текущей) цене размером в 1 лот, --- возвращает цену открытой сделки, либо FALSE, если невозможно открыть сделку function Trade(Type) --Получает ID транзакции trans_id = trans_id + 1; local Price = 0; local Operation = ''; --Устанавливает цену и операцию, в зависимости от типа сделки и от класса инструмента if Type == 'BUY' then if CLASS_CODE ~= 'QJSIM' and CLASS_CODE ~= 'TQBR' then Price = getParamEx(CLASS_CODE, SEC_CODE, 'offer').param_value + NProsk*SEC_PRICE_STEP;end; -- по цене, завышенной на 10 мин. шагов цены Operation = 'B'; else if CLASS_CODE ~= 'QJSIM' and CLASS_CODE ~= 'TQBR' then Price = getParamEx(CLASS_CODE, SEC_CODE, 'bid').param_value - NProsk*SEC_PRICE_STEP;end; -- по цене, заниженной на 10 мин. шагов цены Operation = 'S'; end; -- Заполняет структуру для отправки транзакции message(' Price = getParamEx(CLASS_CODE, SEC_CODE, offer).param_value'..tostring( getParamEx(CLASS_CODE, SEC_CODE, 'offer').param_value)) message(' Price = getParamEx(CLASS_CODE, SEC_CODE, bid).param_value'..tostring( getParamEx(CLASS_CODE, SEC_CODE, 'bid').param_value)) local Transaction={ ['TRANS_ID'] = tostring(trans_id), ['ACTION'] = 'NEW_ORDER', ['CLASSCODE'] = CLASS_CODE, ['SECCODE'] = SEC_CODE, ['OPERATION'] = Operation, -- операция ("B" - buy, или "S" - sell) ['TYPE'] = 'M', -- по рынку (MARKET) ['QUANTITY'] = tostring(NPos), -- количество ['ACCOUNT'] = ACCOUNT, ['PRICE'] = tostring(Price), ['COMMENT'] = 'Простой MA-робот' } -- Отправляет транзакцию sendTransaction(Transaction); -- OnTransReply()--пробую так исправить -- Ждет, пока получит статус текущей транзакции (переменные "trans_Status" и "trans_result_msg" заполняются в функции OnTransReply()) while Run and trans_Status == nil do sleep(1);--[[ message('Робот1,1: trans_Status: '..tostring(trans_Status)..'trans_result_msg'..tostring(trans_result_msg));]] end; -- message('Робот: trans_Status: '..tostring(trans_Status)) -- Запоминает значение local Status = trans_Status; -- Очищает глобальную переменную trans_Status = nil; -- Если транзакция не выполнена по какой-то причине --message('Робот1,2: trans_Status: '..tostring(trans_Status)..'trans_result_msg'..tostring(trans_result_msg)); message('Робот1,2: Status: '..tostring(Status)..'trans_result_msg'..tostring(trans_result_msg)); if Status ~= 3 then -- Выводит сообщение с ошибкой message('Робот: Транзакция не прошла!\nОШИБКА: '..tostring(trans_result_msg)); -- Возвращает FALSE return false; else --Транзакция отправлена local OrderNum = nil; --ЖДЕТ пока ЗАЯВКА на ОТКРЫТИЕ сделки будет ИСПОЛНЕНА полностью message('ЖДЕТ пока ЗАЯВКА на ОТКРЫТИЕ сделки будет ИСПОЛНЕНА полностью'); --Запоминает время начала в секундах local BeginTime = os.time(); while Run and OrderNum == nil do --Перебирает ТАБЛИЦУ ЗАЯВОК for i=getNumberOf('orders')-1, 0, -1 do local order = getItem('orders', i); --message('Робот1,3:order: '..tostring(order) ); --Если заявка по отправленной транзакции ИСПОЛНЕНА ПОЛНОСТЬЮ if order.trans_id == trans_id and order.balance == 0 then message('Робот1,4:trans_id: '..tostring(trans_id)..'order.balance '.. tostring(order.balance)); --Запоминает номер заявки OrderNum = order.order_num; --Прерывает цикл FOR break; end; end; --Если прошло 10 секунд, а заявка не исполнена, значит произошла ошибка --[[ if os.time() - BeginTime > 9 then -- Выводит сообщение с ошибкой message('Робот: Прошло 10 секунд, а заявка не исполнена, значит произошла ошибка'); -- Возвращает FALSE return false; end;]] sleep(10); -- Пауза 10 мс, чтобы не перегружать процессор компьютера end; --ЖДЕТ пока СДЕЛКА ОТКРЫТИЯ позиции будет СОВЕРШЕНА --Запоминает время начала в секундах BeginTime = os.time(); while Run do --Перебирает ТАБЛИЦУ СДЕЛОК for i=0,getNumberOf('trades')-1 do local trade = getItem('trades', i); --Если сделка по текущей заявке --message('Робот1,5:trade: '..tostring(trade) ); if trade.order_num == OrderNum then message('Робот1,6:trade.order_num: '..tostring(trade.order_num) ); --Возвращает фАКТИЧЕСКУЮ ЦЕНУ открытой сделки if Type == 'BUY' then Napravlenie_Sdelki='ПОЗИЯ КУПЛЕНА, ОТКРЫТА' elseif Type == 'SELL' then Napravlenie_Sdelki='ПОЗИЯ ПРОДАНА, ОТКРЫТА' end -- флаг направления позиции --message('открыта ли позиция роботом '..OnTransReply(status)) message('Робот1,7:trade.order_num: '..tostring(trade.price) ); return trade.price; end; end; --Если прошло 10 секунд, а сделка не совершена, значит на демо-счете произошла ошибка --[[ if os.time() - BeginTime > 9 then -- Выводит сообщение с ошибкой message('Робот: Прошло 10 секунд, а сделка не совершена, значит на демо-счете произошла ошибка'); -- Возвращает FALSE return false; end;]] sleep(10); -- Пауза 10 мс, чтобы не перегружать процессор компьютера end; end; end; -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --закрытие позиции -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -- Совершает СДЕЛКУ указанного типа (Type) ["BUY", или "SELL"] по рыночной(текущей) цене размером в 1 лот, --- возвращает цену открытой сделки, либо FALSE, если невозможно открыть сделку function TradeZak(TypeZak) --Получает ID транзакции trans_id = trans_id + 1; message('Точка закрытия 1: '..tostring(getItem("FUTURES_CLIENT_HOLDING",0).totalnet)) --then ROBOT_STATE = 'В ПОИСКЕ ТОЧКИ ВХОДА'; message('Точка закрытия 1') else if getItem("FUTURES_CLIENT_HOLDING",0).totalnet==0 then ROBOT_STATE = 'В ПОИСКЕ ТОЧКИ ВХОДА'; message('Точка закрытия 2') else message('Точка закрытия 3') local Price = 0; local Operation = ''; --Устанавливает цену и операцию, в зависимости от типа сделки и от класса инструмента if getItem("FUTURES_CLIENT_HOLDING",0).totalnet0 then TypeZak ='SELLzak' end if TypeZak == 'BUYzak' then if CLASS_CODE ~= 'QJSIM' and CLASS_CODE ~= 'TQBR' then Price = getParamEx(CLASS_CODE, SEC_CODE, 'offer').param_value + NProsk*SEC_PRICE_STEP;end; -- по цене, завышенной на 10 мин. шагов цены Operation = 'B'; else if CLASS_CODE ~= 'QJSIM' and CLASS_CODE ~= 'TQBR' then Price = getParamEx(CLASS_CODE, SEC_CODE, 'bid').param_value - NProsk*SEC_PRICE_STEP;end; -- по цене, заниженной на 10 мин. шагов цены Operation = 'S'; end; -- Заполняет структуру для отправки транзакции local Transaction={ ['TRANS_ID'] = tostring(trans_id), ['ACTION'] = 'NEW_ORDER', ['CLASSCODE'] = CLASS_CODE, ['SECCODE'] = SEC_CODE, ['OPERATION'] = Operation, -- операция ("B" - buy, или "S" - sell) ['TYPE'] = 'M', -- по рынку (MARKET) ['QUANTITY'] = tostring(math.abs(getItem("FUTURES_CLIENT_HOLDING",0).totalnet)), -- количество ['ACCOUNT'] = ACCOUNT, ['PRICE'] = tostring(Price), ['COMMENT'] = 'Простой MA-робот' } -- Отправляет транзакцию sendTransaction(Transaction); -- Ждет, пока получит статус текущей транзакции (переменные "trans_Status" и "trans_result_msg" заполняются в функции OnTransReply()) while Run and trans_Status == nil do sleep(1); end; -- Запоминает значение local Status = trans_Status; -- Очищает глобальную переменную trans_Status = nil; message('звкрытие Status '..tostring(Status)) -- Если транзакция не выполнена по какой-то причине if Status ~= 3 then -- Если данный инструмент запрещен для операции шорт -- Выводит сообщение с ошибкой message('Робот: Транзакция не прошла!\nОШИБКА: '..tostring(trans_result_msg)); -- Возвращает FALSE return false; else --Транзакция отправлена local OrderNum = nil; --ЖДЕТ пока ЗАЯВКА на ОТКРЫТИЕ сделки будет ИСПОЛНЕНА полностью --Запоминает время начала в секундах local BeginTime = os.time(); while Run and OrderNum == nil do --Перебирает ТАБЛИЦУ ЗАЯВОК for i=getNumberOf('orders')-1, 0, -1 do local order = getItem('orders', i); --Если заявка по отправленной транзакции ИСПОЛНЕНА ПОЛНОСТЬЮ if order.trans_id == trans_id and order.balance == 0 then --Запоминает номер заявки OrderNum = order.order_num; --Прерывает цикл FOR break; end; end; --Если прошло 10 секунд, а заявка не исполнена, значит произошла ошибка --[[ if os.time() - BeginTime > 9 then -- Выводит сообщение с ошибкой message('Робот: Прошло 10 секунд, а заявка не исполнена, значит произошла ошибка'); -- Возвращает FALSE return false; end;]] sleep(10); -- Пауза 10 мс, чтобы не перегружать процессор компьютера end; --ЖДЕТ пока СДЕЛКА ОТКРЫТИЯ позиции будет СОВЕРШЕНА --Запоминает время начала в секундах BeginTime = os.time(); while Run do --Перебирает ТАБЛИЦУ СДЕЛОК for i=0,getNumberOf('trades')-1 do local tradeZak = getItem('trades', i); --Если сделка по текущей заявке if tradeZak.order_num == OrderNum --[[and getItem ("FUTURES_CLIENT_HOLDING",0).totalnet==0 ]] then --Возвращает фАКТИЧЕСКУЮ ЦЕНУ открытой сделки --if Type == 'BUY' then Napravlenie_Sdelki='ПОЗИЯ КУПЛЕНА, ОТКРЫТА' elseif Type == 'SELL' then Napravlenie_Sdelki='ПОЗИЯ ПРОДАНА, ОТКРЫТА' end -- флаг направления позиции ROBOT_STATE = 'В ПОИСКЕ ТОЧКИ ВХОДА'; return tradeZak.price; end; end; --Если прошло 10 секунд, а сделка не совершена, значит на демо-счете произошла ошибка --[[ if os.time() - BeginTime > 9 then -- Выводит сообщение с ошибкой message('Робот: Прошло 10 секунд, а сделка не совершена, значит на демо-счете произошла ошибка'); -- Возвращает FALSE return false; end;]] sleep(10); -- Пауза 10 мс, чтобы не перегружать процессор компьютера end; end; end; end |