AAlex (Все сообщения пользователя)

Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Не срабатывает колбек OnTrade
 
Старатель, вроде заработало, спасибо)
Вначале думал обнулять абсолютно все переменные после выставления стопа и ухода в спячку, но набросал код и всё вроде работало как надо по алгоритму, возникла только эта проблема с запаздывающей на 1 цикл ценой сделки. Думал тут проблема сложнее... В общем мне ещё экспериментировать и экспериментировать))
Не срабатывает колбек OnTrade
 
Тоже напоролся на некоторое непонимание работы 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
Страницы: 1
Наверх