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

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

Страницы: Пред. 1 2
Последовательность обработки функций обратного вызова
 
nikolz, я то думал у вас там тест чистого LUA, тогда нее, не хочу такое. Вот и я предполагал, что будет как в п.4 для небольших обработчиков.
Последовательность обработки функций обратного вызова
 
Цитата
такая скорость Вас устроит?
Да, вполне. Но на коллбеках она все же выше?  
Последовательность обработки функций обратного вызова
 
Цитата
В идеале нужно записывать данные в таблицу с индексом и сразу возвращать управление, всю обработку производить уже в main.
Это все хорошо, когда БА двигается медленно. Но если нам надо успеть выставить новую заявку за доли секунды после срабатывания предыдущей. Иначе можем нарваться на комиссию биржи.
В main можно делать только медленные запросы на сервер, требующие ожидания ответа. Если смешать всё в main, то все станет медленным из-за ожидания ответов. Из-за этого еще может потребоваться делать задержки в main.
И перенос в main требует держать глобальные переменные или таблицы в памяти.
В разумных пределах выгоднее высокочастотное делать в OnTrade. И очередь из коллбеков НЕ может расти бесконечно, так как новые заявки не успевают выставиться.
Самое главное, меня интересует, будет ли эта очередь выполнятся строго последовательно?
Последовательность обработки функций обратного вызова
 
Цитата
Функции обратного вызова обрабатываются в основном потоке терминала QUIK.
Я так понял, что они все ставятся в одну очередь на обработку независимо от функции? Или у каждой функции своя очередь или есть приоритет в обработке?
И пока не выполнится предыдущая полностью, следующая не вызывается?
Если я например в OnTrade создам заявку и она сразу выполнится, то меня новая OnTrade не прервет?
И функция может выполнятся сколь угодно долго и даже задержки в ней можно ставить (но лучше так не делать)?
Или лучше по возможности максимально все в main переносить?
Значения цены в таблице заявок
 
Код
if (tostring(C) == tostring(TRADE_CLASS_CODE)) and (tostring(S) == tostring(TRADE_SEC_CODE)) and (F & 0x1 ~= 0) and (tostring(P) == tostring(fPrice)) then 
заработало вроде
разрабы, вы бы проверили, это явно не нормальная ситуация с типами
Значения цены в таблице заявок
 
Цитата
nikolz написал:
а где fPrice?
и как понять какие условия сработали ,а какие нет.
myLog('KillOrderPrice: C='..tostring©..'=='..tostring(TRADE_CLASS_CODE)..' and S='..tostring(S)..'=='..tostring(TRADE_SEC_CODE)..' and F='..tostring(F)..' and P='..tostring(P)..'=='..tostring(fPrice))
Похоже, не находит заявки на продажу, только на покупку.
Значения цены в таблице заявок
 
Цитата
nikolz написал:
if (C == TRADE_CLASS_CODE) and (S == TRADE_SEC_CODE) and (bit.band(F, 0x1) ~= 0) and (P == fPrice) then return true end
не помогло
пример лога со всеми вызовами функции myFindPrice
нормально:
Код
Thu May 25 15:09:40 2023; KillOrderPrice: C=FUTSPREAD==FUTSPREAD and S=NGK3NGM3==NGK3NGM3 and F=25 and P=0.208==0.208;
Thu May 25 15:09:40 2023; KillOrderPrice: C=FUTSPREAD==FUTSPREAD and S=NGK3NGM3==NGK3NGM3 and F=29 and P=0.231==0.208;
Thu May 25 15:09:40 2023; KillOrderPrice: C=FUTSPREAD==FUTSPREAD and S=NGK3NGM3==NGK3NGM3 and F=25 and P=0.219==0.208;
Thu May 25 15:09:40 2023; KillOrderPrice: C=FUTSPREAD==FUTSPREAD and S=NGK3NGM3==NGK3NGM3 and F=29 and P=0.232==0.208;
Thu May 25 15:09:40 2023; OnTransReply 1685016561 Заявка на спрэд фьючерсов 2012575310734055100 снята. Снятое количество: 1.;

а 0,243, например, просто не находит:

Код
Thu May 25 15:11:53 2023; KillOrderPrice: C=FUTSPREAD==FUTSPREAD and S=NGK3NGM3==NGK3NGM3 and F=29 and P=0.242==0.243;
Thu May 25 15:11:53 2023; KillOrderPrice: C=FUTSPREAD==FUTSPREAD and S=NGK3NGM3==NGK3NGM3 and F=25 and P=0.22==0.243;
Thu May 25 15:11:53 2023; KillOrderPrice: C=FUTSPREAD==FUTSPREAD and S=NGK3NGM3==NGK3NGM3 and F=29 and P=0.243==0.243;
Thu May 25 15:11:53 2023; Не найдены активные заявки NGK3NGM3=0.243;

Значения цены в таблице заявок
 
вот лог скрипта:
Код
Wed May 24 11:15:17 2023; script Monitor: L Transaction SELL 0.235;
Wed May 24 11:15:17 2023; OnTransReply 1684916125 Заявка на спрэд фьючерсов 2012575306438912367 успешно зарегистрирована.;
Wed May 24 11:15:18 2023; Отмена заявки - NGK3NGM3 = 0.211;
Wed May 24 11:15:18 2023; OnTransReply 1684916126 Заявка на спрэд фьючерсов 2012575306438911628 снята. Снятое количество: 1.;
Wed May 24 11:15:19 2023; Отмена заявки - NGK3NGM3 = 0.235;
Wed May 24 11:15:19 2023; Не найдены активные заявки NGK3NGM3;

Wed May 24 11:15:21 2023; Отмена заявки - NGK3NGM3 = 0.235;
Wed May 24 11:15:21 2023; Не найдены активные заявки NGK3NGM3;

Wed May 24 11:15:23 2023; Отмена заявки - NGK3NGM3 = 0.235;
Wed May 24 11:15:23 2023; Не найдены активные заявки NGK3NGM3;
Значения цены в таблице заявок
 
кусок кода выполняющий поиск заявки по цене:
Код
function KillOrderPrice(ordtable, TRADE_CLASS_CODE, TRADE_SEC_CODE, fPrice)
    function myFindPrice(C,S,F,P)
       return (C == TRADE_CLASS_CODE) and (S == TRADE_SEC_CODE) and (bit.band(F, 0x1) ~= 0) and (P == fPrice)
    end    
    local orders = SearchItems(ordtable, 0, getNumberOf(ordtable)-1, myFindPrice, "class_code,sec_code,flags,price")
    if (orders ~= nil) and (#orders > 0) then
...
Значения цены в таблице заявок
 
Пытаюсь искать заявки по равенству значения поля price в таблице orders цене типа 0.213. Использую функцию SearchItems. Но работает через раз. Причем этот же скрипт нормально работает на обычныйх фьючах и через раз на спредах фьючей. Заявки выставляю в формате цены, как выше писал.
Соответсвует ли формат цены в этой таблице той, что в терминале? В чем причина такого поведения? Кривое округление или его отсутствие?
QUIK (версия 7.0.1.5), function OnTrade(trade), трехкратный вызов на одно событие.
 
Ясно, знкчит нужно городить таблицу и поиск по ней.
А случайно в OnTrade не добавили уникальный номер ответа? Вроде даже запрос делали на добавление, чтоб ответы повторяющиеся группировать?
QUIK (версия 7.0.1.5), function OnTrade(trade), трехкратный вызов на одно событие.
 
Цитата
nikolz написал:
Цитата
Cyber написал:
Так я не понял, если торгуем только одним инструментом во всем терминале, то достаточно проверки
if(TradeId>lastTradeId) ?
Номера идут по возрастанию всегда?
А если несколько скриптов, каждый по одному инструменту, то тоже достаточно этого условия?
что такое "TradeId"?
TRANS_ID
QUIK (версия 7.0.1.5), function OnTrade(trade), трехкратный вызов на одно событие.
 
Так я не понял, если торгуем только одним инструментом во всем терминале, то достаточно проверки
if(TradeId>lastTradeId) ?
Номера идут по возрастанию всегда?
А если несколько скриптов, каждый по одному инструменту, то тоже достаточно этого условия?
не работает таблица futures_client_holding и функция getFuturesHolding для FUTSPREAD
 
не работает таблица futures_client_holding и функция getFuturesHolding для FUTSPREAD
для SPBFUT код ниже прекрасно работает, для FUTSPREAD не хочет
функция getFuturesHolding тоже не выдает реальные значения
для SPBFUT все работает нормально
openbuys и opensells должны же для FUTSPREAD что-то выдавать, там же стакан отдельный. Понятно что другие параметры могут не выдавать, например totalnet, так как фьючи, а не спреды уже будут в портфеле.
Код
function GetFutPos(class_code, sec_code)
    local onb uys = 0
    local onse lls = 0
    if class_code == 'SPBFUT' or class_code == 'SPBOPT' or class_code == 'FUTSPREAD' then
        for i = 0,getNumberOf('futures_client_holding') - 1 do
          local futures_client_holding = getItem('futures_client_holding',i)
          if futures_client_holding.sec_code == sec_code then
             onb uys = futures_client_holding.openbuys
             onse lls = futures_client_holding.opensells
          end
       end
    end      
    return onbuys, onsells
end

Нигде больше не смог найти рабочий пример для FUTSPREAD. Может я не правильно что-то делаю? Как для FUTSPREAD посмотреть активные заявки?
Страницы: Пред. 1 2
Наверх