Тоже напоролся на некоторое непонимание работы OnTrade. Требуется совет) Не работает колбек.
В моём роботе в OnTrade в переменную записывается цена рыночной покупки из main.
В main идёт покупка по рынку и выставление стопа (цена совершенной сделки из переменной в онтрейд минус 0,5, к примеру), далее sleep пока текущая чистая позиция не = 0.
В итоге первый цикл получается как и задумано (покупка по рынку->срабатывает онтрейд и фиксирует цену сделки->выставляется стоп с учётом этой цены), а каждый следующий цикл main для выставления стопа берётся не текущая цена из онтрейд, а цена из предыдущего цикла. Будто ontrade перестаёт работать как колбек, а начинается работать последовательно после цикла main.
Хотя вставлял сообщение при вызове онтрейд и там в середине цикла в переменную записывается текущая цена, т.е. всё ОК. А вот в мейне почему-то отображается цена из предыдущего цикла.
Причем переменные, хранящие цену делал и локальными и глобальными, разницы нет.
Код |
---|
local ID_Order = 1001 --id ордера
local Status_Order --id статуса ордера
local Num_Order --номер ордера
local State_Order --id проверки статуса заявки для OnOrder
Price_Stop = 0
Trade_Price = 0
local classcod = ".."
local seccod = ".."
local Depo = "..."
is_run = true
function OnStop()
is_run = false
return 500
end
function OnTransReply(order)
if order.trans_id == ID_Order then
Status_Order = order.status
Num_Order = order.order_num
end
end
function OnOrder(order)
if Num_Order == order.order_num then
if bit.band(order.flags, 0x1) == 0 and bit.band(order.flags, 0x2) == 0 then
State_Order = "Исполнена"
end
end
end
function OnTrade(trade)
if trade.order_num == Num_Order then
Trade_Price = trade.price
end
end
function main()
while is_run do
if getItem("FUTURES_CLIENT_HOLDING",0).totalnet == 0 then --покупка по рынку, если позиция пуста
local MarketOrderBuy = {
["ACTION"] = "NEW_ORDER",
["ACCOUNT"] = Depo,
["OPERATION"] = "B",
["CLASSCODE"] = classcod,
["SECCODE"] = seccod,
["PRICE"] = "0",
["QUANTITY"] = "1",
["TRANS_ID"] = tostring(ID_Order),
["TYPE"] = "M",
}
local Err_Order = sendTransaction(MarketOrderBuy)
while Status_Order == nil and Err_Order == "" do
sleep(100)
end
if Status_Order == 3 then
while State_Order ~= "Исполнена" do
sleep(100)
end
message("Покупка по рынку исполнена")
end
Price_Stop = Trade_Price - 0.5
-- здесь высталвение стопа с учетом Price_Stop
sleep(5000)
ID_Order = ID_Order + 1 --смена id ордера для следующей сделки
end
sleep(5000)
end
sleep(10)
end
|