А помогите разобраться с OnOrder. Пытаюсь вести контроль открытых заявок и сделок, чтобы не вылазить за риск. При новой заявке просто добавляю количество из заявки, а при изменении уже открытой смотрю, что пришло. Если изменение по активной, то убираю количество исполненного, если по снятой, то убираю весь объем снятой.
Вот код:
Код |
---|
OnOrderCl ock={}
CheckedOrderNum={}
function OnOrder(order)
OnOrderClock[#OnOrderClock+1]=os.clock()
for i=1,#CheckedOrderNum do
local find = false
-- если пришла заявка из массива
if CheckedOrderNum[i] == order.order_num then
find = true
-- если время между заявками меньше определенного, выходим из функции
if OnOrderClock[#OnOrderClock]-OnOrderClock[#OnOrderClock-1] < 0.15 then return end
-- иначе обрабатываем
-- если это активная заявка
if not TestBit(order.flags, 1) then
... уменьшаем на количество исполненных заявок
return
-- если это снятая заявка
elseif TestBit(order.flags, 1) then
... уменьшаем на количество лотов снятой заявки
return
end
end
end
-- иначе пришла новая заявка
if not find then
... добавляем заявки
CheckedOrderNum[#CheckedOrderNum+1] = order.order_num
end
end
function TestBit(x, bit_num)
local p = 2 ^ bit_num
return x % (p + p) >= p
end |
Но есть проблема. Я отправляю ордер и начинаю его двигать, чтобы проверить. Так понял, когда я на графике передвигаю ордер, старая заявка автоматом снимается и выставляется новая.
Почему-то проверка флага работает с перебоями. Т.е. двину ордер, функция TestBit видит, что заявка снятая и количество заявок уменьшается, а при появлении новой - добавляется и все нормально. А иногда, после переноса ордера, функция TestBit видит, что заявка не снятая, а активная и, соответственно, расчет идет уже не верно.
Всегда ли при изменении заявки первой приходит инфо по снимаемой заявке, а уже потом по новой? Не бывает так, что сначала приходит инфо по новой, а следом по снимаемой старой? (аккаунт демо)