sam063rus, да, я его переделал. Вынес создание за цикл, резюмировал в итоге только тогда когда статус - dead.
Вот сейчас это выглядит так: (то, что относится к корутине)
Код |
---|
function OnOrder(trans_order)
PrintDbgStr("В онордере прошло событие flag ="..tostring(flag))
PrintDbgStr("статус в онордере " .. tostring(coroutine.status(co)))
--if coroutine.status(co) == "running" then coroutine.resume(co) end
if flag and trans_order["sec_code"] == SECCODE and trans_order["brokerref"] == COMMENT_ALL and trans_order["class_code"] == CLASSCODE then
table.sinsert(ORDER_TABLE,1,trans_order)
PrintDbgStr("Прошли по условию в онордер")
flag = false
--if coroutine.status(co) == "normal" or coroutine.status(co) == "suspended" then coroutine.resume(co) end
coroutine.resume(co)
end
end
|
закомментированы разные варианты, я пробую то так то эдак.. Flag, что бы при двойном подтверждении два раза не срабатывал резюм.
Код |
---|
function bots()
PrintDbgStr("В BOTS скрипте даем команду на продажу")
PrintDbgStr(tostring(coroutine.status(co)))
--_SellOpt(TRID_TRADE,2000,QTY,MODE,COMMENT_ALL)
flag = true
_SellOpt(TRID_TRADE,2000,QTY,MODE,COMMENT_ALL)
PrintDbgStr("BOTS залип после продажи")
coroutine.yield()
PrintDbgStr("BOTS отлип после продажи")
--sleep (5000)
PrintDbgStr("приступаем к удалению")
PrintDbgStr(tostring(coroutine.status(co)))
--sleep(1000)
num2 = _GetActiveOrdersNum()[1]
PrintDbgStr("Выставлена заявка №".. tostring(num2))
flag = true
_KillOrder(num2,TRID_KILL)
PrintDbgStr("BOTS залип после удаления")
coroutine.yield()
PrintDbgStr("BOTS отлип после удаления")
--coroutine.resume(co)
end
is_run=true
flag = true
PrintDbgStr(COMMENT_ALL..": Инициализация прошла")
co = coroutine.create(bots)
function main( ... )
first = true
PrintDbgStr(tostring(coroutine.status(co)))
while is_run do
PrintDbgStr("В основном скрипте пошел прогон")
PrintDbgStr(tostring(coroutine.status(co)))
if first then coroutine.resume(co)
first = false
end
if coroutine.status(co) == "dead" then
co = coroutine.create(bots)
end
PrintDbgStr(tostring(coroutine.status(co)))
sleep(200)
end
end
|
и лог в итоге:
Скрытый текст |
---|
00000001 0.00000000 [9384] SR6500BF5//SCRYPT: Инициализация прошла 00000002 0.00055721 [9384] suspended 00000003 0.00062351 [9384] В основном скрипте пошел прогон 00000004 0.00070361 [9384] suspended 00000005 0.00077565 [9384] В BOTS скрипте даем команду на продажу 00000006 0.00083352 [9384] running 00000007 0.00097225 [9384] SR6500BF5//SCRYPT: Проверка цены на существенный выход. Цена в установленных пределах _VerifyPriceToTheor(price,direction) 00000008 0.00130182 [9384] SR6500BF5//SCRYPT: Отправляю команду в терминал на Продажу _SellOpt(trid,price,qty,mode,comment) 00000009 0.00482790 [9384] BOTS залип после продажи 00000010 0.00490033 [9384] suspended 00000011 0.20509318 [9384] В основном скрипте пошел прогон 00000012 0.20515488 [9384] suspended 00000013 0.20520814 [9384] suspended 00000014 0.36994475 [9384] В онордере прошло событие flag =true 00000015 0.37005705 [9384] статус в онордере suspended 00000016 0.37009996 [9384] Прошли по условию в онордер 00000017 0.37016127 [9384] BOTS отлип после продажи 00000018 0.37022066 [9384] приступаем к удалению 00000019 0.37028122 [9384] running 00000020 0.37132820 [9384] В онордере прошло событие flag =false 00000021 0.37138492 [9384] статус в онордере dead 00000022 0.40539524 [9384] В основном скрипте пошел прогон 00000023 0.40549716 [9384] dead 00000024 0.40567231 [9384] suspended 00000025 0.60553598 [9384] В основном скрипте пошел прогон 00000026 0.60559422 [9384] suspended 00000027 0.60565478 [9384] suspended 00000028 0.80577093 [9384] В основном скрипте пошел прогон 00000029 0.80582190 [9384] suspended 00000030 0.80587631 [9384] suspended 00000031 1.00597680 [9384] В основном скрипте пошел прогон 00000032 1.00604546 [9384] suspended 00000033 1.00611746 [9384] suspended 00000034 1.21077490 [9384] В основном скрипте пошел прогон 00000035 1.24667192 [9384] suspended 00000036 1.26349628 [9384] suspended . . . . 00000085 4.54232550 [9384] SR6500BF5//SCRYPT: Скрипт остановлен пользователем |
вот это место:
00000017 0.37016127 [9384] BOTS отлип после продажи
00000018 0.37022066 [9384] приступаем к удалению
00000019 0.37028122 [9384] running
00000020 0.37132820 [9384] В онордере прошло событие flag =false
00000021 0.37138492 [9384] статус в онордере dead
с чего вдруг когда отлипает BOTS, скрипт проходит дальше,статус руннинг, и как заходит в num2 = _GetActiveOrdersNum()[1], появляется событие в онордере, flag пустить не должен на резюм, а статус уже DEAD. Что может два раза резюмировать или даже три!!! чтобы корутина померла так досрочно..