Неправильное значение Totalnet в функции onTrade()

Страницы: 1
RSS
Неправильное значение Totalnet в функции onTrade()
 
Функция как получаю текущее число открытых позиций:
Код
-- QUIK Получить: текущее кол-во открытх позиций
function _QuikGetTotalnetByIndex(code)
   for i = 0,getNumberOf("futures_client_holding") - 1 do
      if getItem("futures_client_holding",i).sec_code == code then
         return getItem("futures_client_holding",i).totalnet;
      end;
   end;
   return 0;
end;
Сейчас 0 контрактов.
Купили 2 контракта.
Приходит ответ в функции в OnTrade() что куплено 2 контракта.
Но если внутри данной функции сделать запрос на кол-во контрактов _QuikGetTotalnetByIndex() - то будет 0.

Если купить еще 3 контракта, и сделать запрос в OnTrade() - то он выведет значение 2.
Складывается впечатление что таблица ограничений по клиентским счетам "futures_client_holding" обновляется после таблицы сделок, либо чего-то не понимаю?
Торговый привод на Lua http://iv-litovchenko.ru/
 
Просто таблица futures_client_holding еще не обновилась. Изменение записей идут в потоке.
Для каждой таблицы свой поток. Можно релиализовать обработку на событие изменения таблицы futures_client_holding или вести подсчет купленного самостоятельно.
 
Для общего развития хотелось бы понимать:
Последовательность событий OnTrancReply(), OnOrder(), OnTrade(), имеют всегда жесткую последовательность исполнения, или же могут в разном порядке сработать?
Торговый привод на Lua http://iv-litovchenko.ru/
 
Цитата
Иван написал:
Последовательность событий OnTrancReply(), OnOrder(), OnTrade(), имеют всегда жесткую последовательность исполнения, или же могут в разном порядке сработать?
Нет. Фиксированной последовательности нет. Скрипт следует писать так, чтобы он корректно работал при абсолютно любой последовательности вызова этих событий.
Более того, OnOrder() и OnTrade() могут быть вызваны по несколько раз для одной и той же заявки и сделки.

Чисто теоретически OnTrancReply() вовсе может не быть вызван (например, терминал потерял связь после отправки транзакции), но будем считать, что это слишком экзотический случай, хотя и вполне реальный, такие сообщения на форуме были.
 
Цитата
swerg написал:
Цитата
Более того, OnOrder() и OnTrade() могут быть вызваны по несколько раз для одной и той же заявки и сделки.
А как с этим бороться? Полагаю данные приходят одни и те же по несколько раз?
Торговый привод на Lua http://iv-litovchenko.ru/
 
Цитата
Иван написал:
А как с этим бороться?
С этим не надо бороться, это нормальное поведение для event-driven архитектуры, с этим надо работать. Вы отправляете транзакцию (без немедленной ошибки) и уходите заниматься другими делами, а потом происходит что-то из:
- явное подтверждение статуса транзакции (OnTransReply)
- неявное подтверждение статуса транзакции (OnOrder, OnTrade, ...)
- потеря соединения (OnDisconnected)
- таймаут (т.е. никакого ответа вообще не получено за заданное время; это ваша задача, завести таймер)
- крах скрипта (если ошибки ловите и обрабатываете, тут самое развеселье начнется)
Все это может произойти в любом порядке и не один раз, к этому надо быть готовым и все. Заводите объект "транзакция номер id", по колбекам меняете его состояние. Когда состояние стало "консистентным" (все выполнено или все отклонено) - убиваете объект. Возможные дальнейшие события с этим id вас уже не волнуют, игнорируете их. В свою очередь объект "транзакция" может порождать или убивать объект "заявка", у того своя жизнь и свои события. В свою очередь объект "заявка" может влиять на объекты "сделка" и "позиция". Тут уже ближе к верхнему уровню, в конечном итоге все затевалось, чтобы изменить "позицию".
 
Цитата
Anton написал:
Цитата
Иван написал:
А как с этим бороться?
С этим не надо бороться, это нормальное поведение для event-driven архитектуры, с этим надо работать. Вы отправляете транзакцию (без немедленной ошибки) и уходите заниматься другими делами, а потом происходит что-то из:
- явное подтверждение статуса транзакции (OnTransReply)
- неявное подтверждение статуса транзакции (OnOrder, OnTrade, ...)
- потеря соединения (OnDisconnected)
- таймаут (т.е. никакого ответа вообще не получено за заданное время; это ваша задача, завести таймер)
- крах скрипта (если ошибки ловите и обрабатываете, тут самое развеселье начнется)
Все это может произойти в любом порядке и не один раз, к этому надо быть готовым и все. Заводите объект "транзакция номер id", по колбекам меняете его состояние. Когда состояние стало "консистентным" (все выполнено или все отклонено) - убиваете объект. Возможные дальнейшие события с этим id вас уже не волнуют, игнорируете их. В свою очередь объект "транзакция" может порождать или убивать объект "заявка", у того своя жизнь и свои события. В свою очередь объект "заявка" может влиять на объекты "сделка" и "позиция". Тут уже ближе к верхнему уровню, в конечном итоге все затевалось, чтобы изменить "позицию".
Что бы не обрабатывать №одной и той же заявки нашел такое решение.
Код
function OnTrade(trade)

   -- Функция OnTrade() может высываться несколько раз...
   if check_last_trade_num < trade_num then
   check_last_trade_num = trade_num;  -- Запомним номер последнего трейда
Торговый привод на Lua http://iv-litovchenko.ru/
 
Цитата
Иван написал:
Цитата
Anton написал:
 
Цитата
Иван  написал:
А как с этим бороться?
 С этим не надо бороться, это нормальное поведение для event-driven архитектуры, с этим надо работать. Вы отправляете транзакцию (без немедленной ошибки) и уходите заниматься другими делами, а потом происходит что-то из:
- явное подтверждение статуса транзакции (OnTransReply)
- неявное подтверждение статуса транзакции (OnOrder, OnTrade, ...)
- потеря соединения (OnDisconnected)
- таймаут (т.е. никакого ответа вообще не получено за заданное время; это ваша задача, завести таймер)
- крах скрипта (если ошибки ловите и обрабатываете, тут самое развеселье начнется)
Все это может произойти в любом порядке и не один раз, к этому надо быть готовым и все. Заводите объект "транзакция номер id", по колбекам меняете его состояние. Когда состояние стало "консистентным" (все выполнено или все отклонено) - убиваете объект. Возможные дальнейшие события с этим id вас уже не волнуют, игнорируете их. В свою очередь объект "транзакция" может порождать или убивать объект "заявка", у того своя жизнь и свои события. В свою очередь объект "заявка" может влиять на объекты "сделка" и "позиция". Тут уже ближе к верхнему уровню, в конечном итоге все затевалось, чтобы изменить "позицию".
Что бы не обрабатывать №одной и той же заявки нашел такое решение.
Код
   function   OnTrade (trade)

    -- Функция OnTrade() может высываться несколько раз... 
    if  check_last_trade_num  <  trade_num  then 
   check_last_trade_num  =  trade_num;   -- Запомним номер последнего трейда 
  
Сделал проверку в трех функциях:
CheckLastNumOnTrade = 0;
CheckLastNumOnOrder = 0;
CheckLastNumOnStopOrder = 0;
Торговый привод на Lua http://iv-litovchenko.ru/
 
Цитата
Иван написал:
Сделал проверку в трех функциях:CheckLastNumOnTrade = 0;CheckLastNumOnOrder = 0;CheckLastNumOnStopOrder = 0;
И отрезали себе всю логику. По ордеру в 10 контрактов пришел ответ "1 залит", вы списали ордер целиком и забыли про него. Если делать хорошо, то "просто" не получится, а если надо "просто", то и проблем нет, но и результат может удивить в какой-то момент (неприятно).
 
Цитата
swerg написал:
Цитата
Иван написал:
Последовательность событий OnTrancReply(), OnOrder(), OnTrade(), имеют всегда жесткую последовательность исполнения, или же могут в разном порядке сработать?
Нет. Фиксированной последовательности нет. Скрипт следует писать так, чтобы он корректно работал при абсолютно любой последовательности вызова этих событий.
Более того, OnOrder() и OnTrade() могут быть вызваны по несколько раз для одной и той же заявки и сделки.

Чисто теоретически OnTrancReply() вовсе может не быть вызван (например, терминал потерял связь после отправки транзакции), но будем считать, что это слишком экзотический случай, хотя и вполне реальный, такие сообщения на форуме были.
Вот допустим прошла сделка, но Total еще не обновился.
Можно ли как-то понять что после сделки и значение Total тоже актуализировалось. У меня бывают такие случаи что сделка прошла, а тотал еще не обновлен, а я уже использую его значение... Как быть?
Торговый привод на Lua http://iv-litovchenko.ru/
 
Цитата
Иван написал:
Цитата
swerg написал:
 
Цитата
Иван  написал:
Последовательность событий OnTrancReply(), OnOrder(), OnTrade(), имеют всегда жесткую последовательность исполнения, или же могут в разном порядке сработать?
 Нет. Фиксированной последовательности нет. Скрипт следует писать так, чтобы он корректно работал при абсолютно любой последовательности вызова этих событий.
Более того, OnOrder() и OnTrade() могут быть вызваны по несколько раз для одной и той же заявки и сделки.

Чисто теоретически OnTrancReply() вовсе может не быть вызван (например, терминал потерял связь после отправки транзакции), но будем считать, что это слишком экзотический случай, хотя и вполне реальный, такие сообщения на форуме были.
Вот допустим прошла сделка, но Total еще не обновился.
Можно ли как-то понять что после сделки и значение Total тоже актуализировалось. У меня бывают такие случаи что сделка прошла, а тотал еще не обновлен, а я уже использую его значение... Как быть?
Добрый день.

Как уже сказали выше, данные едут разными потоками.
Ограничения по фьючерсам едут с FORTS и не гарантии, что сразу после прихода сделки ограничения обновятся.

Возможно вам подойдет вариант проверять  totalnet после вызова OnFuturesClientHolding()
Страницы: 1
Читают тему (гостей: 1)
Наверх