Количество активных заявок одной командой

Страницы: 1
RSS
Количество активных заявок одной командой, Количество активных заявок одной командой
 
Здравствуйте.

Подскажите, пожалуйста, а можно как-то покороче получить число активных заявок, не перебирая всю таблицу orders?

Что-то типа tonumber(getFuturesHolding(fClass, Account, fFirst, 0).totalnet) - для получения текущей позиции по инструменту?
 
Ключевое слово активных
 
just, Никак. В смысле, из таблицы orders - никак. Но можно отслеживать их количество самим скриптом. Например, мой скрипт ведёт свой собственный стек активных заявок (точнее, не активных в смысле торговли, а ещё не обслуженных самим скриптом), и его размер сразу говорит об их количестве.  
 
Я хочу использовать его как индикатор того, что алгоритм работает правильно, а заявок много планируется, постоянно перелопачивать их не хочется...
 
Что лишних заявок не наплодили...
 
Вы, конечно, можете постоянно не сканировать активные заявки по таблице. При первичной постановке ордера необходимо один раз найти ордер в таблице ордеров и запомнить индекс таблицы. Тогда последующие обращения уже будут простые, без поиска.
Если же речь про то, чтобы вообще не искать ордера, то для лимитных ордеров - это не лучшая затея, т.к. в клиринг их снимут и необходимо предпринять какие-то действия. Да, можете по колбеку получить новое состояние ордера и отреагировать, но это если этот колбек не был пропущен.
 
Цитата
Nikolay написал:
Вы, конечно, можете постоянно не сканировать активные заявки по таблице. При первичной постановке ордера необходимо один раз найти ордер в таблице ордеров и запомнить индекс таблицы. Тогда последующие обращения уже будут простые, без поиска.
Если же речь про то, чтобы вообще не искать ордера, то для лимитных ордеров - это не лучшая затея, т.к. в клиринг их снимут и необходимо предпринять какие-то действия. Да, можете по колбеку получить новое состояние ордера и отреагировать, но это если этот колбек не был пропущен.
не все так просто.
Например,  уже есть активные заявки до включения скрипта.
либо произошел разрыв соединения и восстановление через несколько минут и часть активных заявок сработали.
Ну и т д
 
я например сканирую таблицу лишь при включении скрипта.
после этого к таблицам квика заявок и стоп заявок  скрипт не обращается вообще.  
 
в итоге на регистрацию или снятие заявки уходит не более 10 мкс.  
 
поправлю на запись о регистрации или снятии (исполнении) заявки уходит не более 10 мкс
---------------
на формирование и отсылки транзакции на снятие заявки уходит до  300 мкс
----------------------------
на формирование  и отсылку транзакции на новую заявку уходит 400 мкс
 
Цитата
nikolz написал:
не все так просто.
Например,  уже есть активные заявки до включения скрипта.
либо произошел разрыв соединения и восстановление через несколько минут и часть активных заявок сработали.
Ну и т д
Конечно не просто. Собственно это и было написано, что необходимо свои заявки опрашивать. Также скрипт должен хранить свое состояние, чтобы при перезапуске, восстановлении соединения и т.д., проверить себя, что изменилось. Может быть так, что терминал упал вчера, а восстановился только сегодня. Поэтому все такие ситуации необходимо предусматривать. И закладывать архитектуру на колбеках - не самое надежное решение.
 
Цитата
nikolz написал:
поправлю на запись о регистрации или снятии (исполнении) заявки уходит не более 10 мкс
---------------
на формирование и отсылки транзакции на снятие заявки уходит до  300 мкс
----------------------------
на формирование  и отсылку транзакции на новую заявку уходит 400 мкс
Это при летной погоде. Надеяться на такие времена всегда - плохая затея. Мой наблюдаемый рекорд от отправки транзакции до появления ордера - 10 минут.
 
Цитата
Nikolay написал:
Цитата
Это при летной погоде. Надеяться на такие времена всегда - плохая затея. Мой наблюдаемый рекорд от отправки транзакции до появления ордера - 10 минут.
10 минут - это жестко.

Ну вот и я хочу использовать число активных заявок как индикатор наличия таких косяков...

Не знаю, лучше ли это, чем просто в цикле перебрать заявки. Но как вариант можно такую функцию сварганить.

function getNumActiveOrders(from,to)
  local index_table = SearchItems("orders",
      from or 0,
      to or getNumberOf("orders")-1,
      function(t)
          return bit.band(t.flags, 1)==1
      end)
return #index_table
end
 
Вот такой возврат только правильнее будет
  if index_table==nil then
     return 0
  else
     return #index_table
  end

function getNumActiveOrders(from,to)
  local index_table = SearchItems("orders",
      from or 0,
      to or getNumberOf("orders")-1,
      function(t)
          return bit.band(t.flags, 1)==1
      end)
  if index_table==nil then
     return 0
  else
     return #index_table
  end
end
 
Постоянно сканировать таблицу orders - не лучшая затея: при большом числе заявок гарантированы тормоза.
Самый простой вариант - работать с колбеками OnOrder и OnCleanup.
В OnOrder проверяете статус заявки, если активна добавляете в таблицу. Если заявка исполнена или снята (в т.ч. в клиринг), вы получите об этом OnOrder и удалите из таблицы активных.
После смены сессии при получении OnCleanup таблицы активных полностью очищаете.
Все возможные варианты (разрыв соединения, исполнение заявки пока терминал находился офлайн, восстановление соединения через день, месяц, год, задержка ответа по заявке на 10 мин и пр.) будут полность покрыты этими двумя колбеками.
Надо делать так, как надо. А как не надо - делать не надо.
 
Ах да, при старте скрипта, как написали выше, конечно, нужно однократно просканировать таблицу заявок.
Надо делать так, как надо. А как не надо - делать не надо.
 
Nikolay,
Цитата
Может быть так, что терминал упал вчера, а восстановился только сегодня.
Убей, не понимаю, зачем нужно искать на свою жопу приключений.  Посмотрим на постулаты (ну или гипотезы):
1. Скрипт непрерывно работает часами (или даже днями, неделями).
2. Всё время, пока он работает, он мониторит состояние рынка, портфеля, кошелька и т.п.
3. В любой момент своей работы он может послать заявку на совершение сделки - с тем тикером и по такой цене, которая его устраивает здесь и сейчас.
4. Количество сделок, которые скрипт совершает в сутки, может варьироваться от единиц (при такой частоте, собссно, скрипт вообще не нужен) до десятков тысяч (при сотнях Квик наверняка сдохнет, да и при десятках спорный вопрос), т.е. допустимый диапазон десятки-сотни-тысячи сделок в сутки.
5. Количество ошибок при сделках в сутки (по любым причинам) может исчисляться ну никак не больше, чем единицами (иначе такой софт нужно просто выбросить на помойку), а потому интервалы между процедурами выявления таких ошибок должны составлять минуты, десятки минут, часы, но никак не секунды.
6. Чем позже принимается решение о сделке, тем (потенциально) у скрипта больше информации для его принятия.
7. Чем позже исполняется принятое решение о сделке, тем больше вероятность, что ситуация изменилась, и это решение уже устарело, что оно не было бы принято в тот момент, когда заявка исполнилась.
Вопрос: ТАК ЗА КАКИМ ХЕРОМ заниматься всем этим онанизмом? Что, трудно сбросить к чертям собачьим все открытые заявки при остановке или включении скрипта? Или посылать заявки именно тогда, когда скрипт посчитает нужным их совершить? У меня 90% заявок исполняются в течение нескольких секунд, а не исполненные снимаются через 3 минуты активности - всё, поезд ушёл, решение устарело! Зачем искать на свою жопу приключений? НЕ ПОНИМАЮ!
 
Цитата
just написал:
Здравствуйте.

Подскажите, пожалуйста, а можно как-то покороче получить число активных заявок, не перебирая всю таблицу orders?

Что-то типа tonumber(getFuturesHolding(fClass, Account, fFirst, 0).totalnet) - для получения текущей позиции по инструменту?
можно так :
Код
local t=SearchItems(S,0,getNumberOf("orders")-1,function(flag) if bit.band(flag,3)~=1  then return false end return true end, "flags") -- #t -число активных заявок
 
исправил опечатку:
Код
local S="orders"; local t=SearchItems(S,0,getNumberOf(S)-1,function(flag) if bit.band(flag,3)~=1  then return false end return true end, "flags") -- #t -число активных заявок
 
Цитата
Владимир написал:
Nikolay,  
Цитата
Может быть так, что терминал упал вчера, а восстановился только сегодня.
Убей, не понимаю, зачем нужно искать на свою жопу приключений.  Посмотрим на постулаты (ну или гипотезы):
1. Скрипт непрерывно работает часами (или даже днями, неделями).
2. Всё время, пока он работает, он мониторит состояние рынка, портфеля, кошелька и т.п.
3. В любой момент своей работы он может послать заявку на совершение сделки - с тем тикером и по такой цене, которая его устраивает здесь и сейчас.
4. Количество сделок, которые скрипт совершает в сутки, может варьироваться от единиц (при такой частоте, собссно, скрипт вообще не нужен) до десятков тысяч (при сотнях Квик наверняка сдохнет, да и при десятках спорный вопрос), т.е. допустимый диапазон десятки-сотни-тысячи сделок в сутки.
5. Количество ошибок при сделках в сутки (по любым причинам) может исчисляться ну никак не больше, чем единицами (иначе такой софт нужно просто выбросить на помойку), а потому интервалы между процедурами выявления таких ошибок должны составлять минуты, десятки минут, часы, но никак не секунды.
6. Чем позже принимается решение о сделке, тем (потенциально) у скрипта больше информации для его принятия.
7. Чем позже исполняется принятое решение о сделке, тем больше вероятность, что ситуация изменилась, и это решение уже устарело, что оно не было бы принято в тот момент, когда заявка исполнилась.
Вопрос: ТАК ЗА КАКИМ ХЕРОМ заниматься всем этим онанизмом? Что, трудно сбросить к чертям собачьим все открытые заявки при остановке или включении скрипта? Или посылать заявки именно тогда, когда скрипт посчитает нужным их совершить? У меня 90% заявок исполняются в течение нескольких секунд, а не исполненные снимаются через 3 минуты активности - всё, поезд ушёл, решение устарело! Зачем искать на свою жопу приключений? НЕ ПОНИМАЮ!
сегодня на тесте скрипт  по 36 акциям за час выставил и снял 64 тысячи заявок.
мог бы и больше, то тестовый сервер обновляет данные раз в секунду.
И КВИК не сдох.
----------------------  
Сейчас на бирже несколько тысяч инструментов.
----------------------  
Есть различные стратегии торговли.
Одна из них - на основе сканирования рынка и обнаружения начала тренда.
В этом случае надо просматривать быстро эти тысячи.
Поэтому скорость работы скрипта имеет значение.
-----------------------  
Кроме того, на КВИКЕ можно даже HFT робота сделать,
но его надо  размещать в дата центре.
--------------------------------  
Поэтому запас скорости никому не помешает.
=======================  
Но есть и любители ехать на телеге.  
Каждому-свое.
 
Цитата
Старатель написал:
Постоянно сканировать таблицу orders - не лучшая затея: при большом числе заявок гарантированы тормоза.
Самый простой вариант - работать с колбеками OnOrder и OnCleanup.
В OnOrder проверяете статус заявки, если активна добавляете в таблицу. Если заявка исполнена или снята (в т.ч. в клиринг), вы получите об этом OnOrder и удалите из таблицы активных.
После смены сессии при получении OnCleanup таблицы активных полностью очищаете.
Все возможные варианты (разрыв соединения, исполнение заявки пока терминал находился офлайн, восстановление соединения через день, месяц, год, задержка ответа по заявке на 10 мин и пр.) будут полность покрыты этими двумя колбеками.
Если заявки выставлены до запуска скрипта, то колбек на них не реагирует, пока  они не изменятся.
------------------
 
nikolz, Лапуль, Вы вообще читаете, что я пишу? Я говорил О СДЕЛКАХ, а не о заявках. У меня, например, более 90% заявок исполняются. Думаю, даже более 95%. Это во-первых. Во-вторых, если "скрипт по 36 акциям за час выставил и снял 64 тысячи заявок", то это ИДИОТИЗМ. Но тут ещё и вопрос: он просто ставил и снимал заявки или ещё и ОТСЛЕЖИВАЛ их? Ведь на каждую такую заявку приходит целая колода прерываний, и при тех цифрах их количество должно быть 30-50 в секунду, если не больше. Как дубли ловить будем? Или хрен бы с ними - главное послать, а там хоть трава не расти? А вот если Вы будете обслуживать свои заявки, то Квик СДОХНЕТ! АДНАЗНАЧНА!

И что с того, что "сейчас на бирже несколько тысяч инструментов"? У Финама, кстати, несколько ДЕСЯТКОВ тысяч. А лично меня интересует лишь несколько сотен. А подавляющее большинство участников этого форума (полагаю, включая лично Вас) и того меньше: несколько десятков или даже несколько штук. Что сказать-то хотели?

Ну, "различные стратегии торговли" я могу обсуждать разве что с Борисом - он профессионал в торговле. А Ваши жалкие "стратегии" меня не интересуют от слова "совсем". Не вижу никаких проблем с "обнаружением начала тренда", причём на нескольких таймфреймах сразу и для всех тикеров, которые обслуживаются скриптом. Информирую, что для этого НЕ НАДО "просматривать быстро эти тысячи". И уже говорил, что пару тысяч тикеров мой скрипт уж как-нибудь сумеет обслужить даже на самом дохлом процессоре. И уже говорил, что делать на Квике HFT робота - это ИДИОТИЗМ. И что толку "размещать его в дата центре", если там используется интерпретируемый язык?
 
Цитата
nikolz написал:
исправил опечатку:
Код
   local  S =  "orders" ;  local  t =  SearchItems (S, 0 , getNumberOf (S) -  1 , function (flag)  if   bit.band (flag, 3 )~ =  1    then   return   false   end   return   true   end ,  "flags" )  -- #t -число активных заявок 
  
Спасибо.
1. А меняет ли что-то именно такая процедура в сравнении с простым перебором в цикле?

2. Для проверки активной заявки у Вас используется кроме бита активной заявки еще и бит "заявка снята", это же, не обязательно?

3. А вообще в моем случае вопрос можно решить очень просто. Ответ можно найти, просто внимательно изучив вопрос... :) Большое спасибо ВСЕМ за участие и советы...

tonumber(getFuturesHolding(fClass, Account, fFirst, 0).openbuys)+tonumber(getFuturesHolding(fClass, Account, fFirst, 0).opensells)
 
Цитата
just написал:
Цитата
nikolz написал:
исправил опечатку:  
Код
      local   S  =   "orders" ;   local   t  =    SearchItems  (S,  0  ,  getNumberOf  (S)  -    1  ,  function  (flag)   if     bit.band  (flag,  3  )~  =    1      then     return     false     end     return     true     end  ,  "flags" )   -- #t -число активных заявок  
    
 
Спасибо.
1. А меняет ли что-то именно такая процедура в сравнении с простым перебором в цикле?

2. Для проверки активной заявки у Вас используется кроме бита активной заявки еще и бит "заявка снята", это же, не обязательно?

3. А вообще в моем случае вопрос можно решить очень просто. Ответ можно найти, просто внимательно изучив вопрос... :) Большое спасибо ВСЕМ за участие и советы...

tonumber(getFuturesHolding(fClass, Account, fFirst, 0).openbuys)+tonumber(getFuturesHolding(fClass, Account, fFirst, 0).opensells)
1.  быстрее.
2. бывает так, что приходит заявка с установленными 0 и вторым битом.   такая заявка снята. Но бит активности есть. Проверка исключает эту ситуацию.  
Страницы: 1
Читают тему
Наверх