Система принятия решений и/или Нечеткая логика(FuzzyLogic)

Страницы: Пред. 1 ... 13 14 15 16 17
RSS
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
VPM написал:
В моем нынешнем варианте (который пытаюсь довести "до ума") скорость цикла main делаю адаптивной к загрузке очереди.
   Можно сделать паузу адаптивной к длительности основного цикла скрипта (это учтет все, в том числе и длительность обработки очереди):
Код
 
run = true 

function main()
   local function GetMilliseconds()  -- Милисекунды с 1970г.
      local dt = os.sysdate()
      return os.time(dt) * 1000 + dt.ms
   end
   --  Коды инициализации скрипта --

   local pause = 20 
   local TT = GetMilliseconds()
  
   -- Основной цикл скрипта (while run do)--
   while run do
      --  Выполнение пользовательского кода --
      
      -- Адаптивное ожидание (динамически зависящее от длительности пользовательского цикла обработки)
      local tt = GetMilliseconds() - TT  -- Длительность пользовательского цикла обработки
      tt = tt >= pause and 1 or pause - tt 
      sleep(tt)
      TT = GetMilliseconds()  -- Начало обработки пользовательского кода
   end

end
 
Уточнение: у меня в роботе устанавливается разрешение таймера: 1 млс.
 
TGB, Спасибо, идея понятна обязательно опробую у себя!
 
Цитата
Nikolay написал:
Цитата
VPM написал:
Nikolay ,  Кажется уловил Вашу идею, все дело в буффере. Именно он опять возвращает в событийную модель через опрос + буффер, вместо callbacks + буффер?
И решаются вопросы тайминга?
Вы можете просто ждать колбека. А можете постоянно опрашивать таблицу. Именно, что постоянно. Естественно через проверку числа записей в таблице как триггер.
На вопрос - это же накладно. Ответ - большую часть времени скрипт ничего не делает, так что проверить число записей в таблице - это можно сказать что ничего.
На самом деле все совершенно иначе.
Колбек тем и хорош что его не надо ждать. Он вызывается событием.
Разница огромная если есть множество инструментов.
----------------------------
1) Например, колбек OnOrder уже содержит класс и имя инструмента. т е если состояние заявки изменилось, то получим в скрипте  уже готовую информацию об инструменте и состоянии.
Если же лазить в архив или таблицу, то сначала колбек туда поместит изменение состояния заявки, а потом функция  SearchItems (лезет в архив) или getItem (лезет в таблицу)  будет перебирать все данные и фильтровать их. Обращение к архиву не быстрая операция.  
2)  Если колбека нет, то и телодвижений никаких нет.
А при опросе архива SearchItems  это делается на каждом цикле main есть событие или его нет.  
 
Цитата
nikolz написал:
На самом деле все совершенно иначе.
Это не все иначе, а просто другой подход. Есть колбеки - ок. Используйте. Никто не мешает. Но это не означает, что нельзя делать иначе.
Я привык делать как опрос датчика, например температуры.

А колбеки я использую если данные из Квика обрабатываются через межсетевое взаимодействие. Например тот же торговый алгоритм, написанный на GO.
Но если внутри терминала, где данные есть и доступны всегда, то колбек (именно в этой реализации что есть в Квике) не является единственным и идеальным решением.
 
Цитата
TGB написал:
можно реализовать проверкой (с использованием trans_id) в таблицах order, stop_order. И эту проверку надо выполнять  только, когда изменяется количество записей в них.
Изменение параметров заявки не приводит к изменению количества записей в таблице. Об этом вы узнаете только через колбэк, либо через регулярный опрос уже существующих записей в таблице.
 
Цитата
TGB написал:
Можно сделать паузу адаптивной к длительности основного цикла скрипта (это учтет все, в том числе и длительность обработки очереди):
А что это даёт?
 
Цитата
Йцукен написал:
Изменение параметров заявки не приводит к изменению количества записей в таблице. Об этом вы узнаете только через колбэк, либо через регулярный опрос уже существующих записей в таблице.
Да. Датчик температуры ничего не скажет об её изменении. Спросите - скажет.
 
Цитата
Nikolay написал:
Цитата
Йцукен написал:
Изменение параметров заявки не приводит к изменению количества записей в таблице. Об этом вы узнаете только через колбэк, либо через регулярный опрос уже существующих записей в таблице.
Да. Датчик температуры ничего не скажет об её изменении. Спросите - скажет.
При чём тут датчик температуры?
Если уж приводить аналогию, то, чтобы узнать изменение температуры отслеживаемого датчика, не нужно проверять изменение количества датчиков, а нужно опрашивать конкретный датчик.
 
Он и опрашивается, через запомненный индекс записи в таблице. Когда ордер найден в таблице, то повторно его иска не надо, просто получить запись в таблице с свежими данными.
 
Цитата
Nikolay написал:
Он и опрашивается, через запомненный индекс записи в таблице. Когда ордер найден в таблице, то повторно его иска не надо, просто получить запись в таблице с свежими данными.
В цикле вы дергаете getItem, независимо от того, изменились ли параметры заявки (заявок) или нет?  :what:
 
Цитата
Nikolay написал:
Цитата
nikolz написал:
На самом деле все совершенно иначе.
Это не все иначе, а просто другой подход. Есть колбеки - ок. Используйте. Никто не мешает. Но это не означает, что нельзя делать иначе.
Я привык делать как опрос датчика, например температуры.

А колбеки я использую если данные из Квика обрабатываются через межсетевое взаимодействие. Например тот же торговый алгоритм, написанный на GO.
Но если внутри терминала, где данные есть и доступны всегда, то колбек (именно в этой реализации что есть в Квике) не является единственным и идеальным решением.
Не против использования таблиц. сам делал робота в скрипте индикатора и там использовал именно таблицы, так как это проще и в индикаторах нет колбеков.
Вы же объясняете почему Вы так делаете. Я тоже объяснил почему колбеки быстрее работают.
 
1.  
Цитата
Йцукен написал:
А что это даёт?
  Реальный временной интервал циклов обработки без этого: pause + tt (время ЦП обработки цикла).
  При этом реальный интервал циклов обработки:
  1) pause, если tt  - 1 < pause.
  2) tt + 1, если tt - 1 >= pause.
  Надо ли это использовать, дело ваше.

2.
Цитата
Йцукен написал:
В цикле вы дергаете getItem, независимо от того, изменились ли параметры заявки (заявок) или нет?
   Для просмотра изменений в заявках не надо перебирать все записи orders, stop_orders.
Достаточно во вновь получаемых сделках (по изменению размера) таблицы traders выбирать trans_id (или номера ордеров) и просматривать только соответствующие заявки.
-----
 У меня доступ к таблицам прямой, кэшируется (неизменяемое в таблицах) и затраты на обращение к ним мизерные.
 
Добавление к предыдущему моему комментарию.
   Иллюзией является представление о том, что коллбеки выполняются параллельно с потоком main. Код скрипта, включая функции коллбеков, разделяется основным потоком QUIK и потоком main. Это значит, что когда выполняется один, то другой блокируется. Переключение потоков происходит только при вызове активным потоком сишной функции (в которой нет автоматического управления памятью Lua). Одной из сишных функций является sleep. Также сишными функциями являются стандартные функции Lua.
 В основном потоке выполняется много чего, смотрите по ссылке: https://forum.quik.ru/messages/forum10/message74919/topic8563/#message74919.
 При обработке коллбеков основной поток может блокироваться в моменты выполнения в потоке main lua-кода. При выполнении функций коллбеков он также перестает выполнять всю остальную свою функциональность и блокирует выполнение потока main. Поэтому разработчики QUIK рекомендуют создавать между коллбеками и потоком main очереди, а сами коллбеки делать минимальными.
 В текущей архитектуре QUIK интенсивное использование коллбеков, нагружая основной поток QUIK, как описано выше, негативно влияет на его функционирование и это следует учитывать при написании скриптов.
 Я написал в ветке по ссылке (пункт 2), что можно бы было изменить в QUIK, чтобы уйти от описанных проблем. Там же, в конце, выложен конкретный вариант, как это можно реализовать, на уровне конкретного работающего кода на C++.
 
Цитата
TGB написал:
Для просмотра изменений в заявках не надо перебирать все записи orders, stop_orders.
Достаточно во вновь получаемых сделках (по изменению размера) таблицы traders выбирать trans_id (или номера ордеров) и просматривать только соответствующие заявки.
Вариант удаления заявки вы не рассматриваете?
 
Цитата
Йцукен написал:
Вариант удаления заявки вы не рассматриваете?
  Обрабатываются варианты:
1) удаления заявок;
2) реорганизация используемых таблиц по любой причине;
3) перезапуск робота с восстановлением  продолжения его работы.
 
Цитата
TGB написал:
Для просмотра изменений в заявках не надо перебирать все записи orders, stop_orders.
Цитата
TGB написал:
 Обрабатываются варианты:
1) удаления заявок;

Знаю методы:
1) колбэк;
2) либо регулярная проверка активной заявки в цикле main через getItem.
Во втором случае как раз надо перебирать все активные заявки, которые отслеживает скрипт. Или вы как-то по другому это делаете?
 
Цитата
Йцукен написал:
Во втором случае как раз надо перебирать все активные заявки, которые отслеживает скрипт. Или вы как-то по другому это делаете?
  1. Я как то уже писал, что коллбек OnTransReply при выполнении  транзакций мной используется, т.к. только в нем есть полезная информация о причинах отказа выполнения транзакции.
  2. Для снятия заявки я использую два варианта: синхронный (когда роботу нечего делать)  и асинхронный.
   В любом  случае обрабатывается только снимаемая заявка а не все активные заявки.
 
Цитата
TGB написал:
коллбек OnTransReply при выполнении  транзакций мной используется
OnTransReply вызывается при удалении заявки из Lua-скрипта.

Цитата
TGB написал:
В любом  случае обрабатывается только снимаемая заявка а не все активные заявки.
Тогда при удалении заявки, например, пользователем, брокером или биржей робот будет считать заявку активной.
 
Цитата
Йцукен написал:
Тогда при удалении заявки, например, пользователем, брокером или биржей робот будет считать заявку активной.
  Это у меня обрабатывается в:
Цитата
TGB написал:
2) реорганизация используемых таблиц по любой причине;
 
TGB,
Если без колбэков OnOrder и цикличного опроса активных заявок, то как, поделитесь секретом?
 
Цитата
Йцукен написал:
Если без колбэков OnOrder и цикличного опроса активных заявок, то как, поделитесь секретом?
   Секрета нет.  Контроль реорганизации таблиц заявок (соответствия индексов записей их полям trans_id) я выполняю циклически (других вариантов для надежного контроля возможных мутаций этих таблиц в текущем QUIK я не вижу) с периодом в 5 сек. просмотром активных заявок кэша, ссылающегося на таблицы, и там же, заодно, увижу снятые неизвестно кем заявки робота. Задержка в 5 сек. меня пока устраивает. Не будет устраивать подключу OnOrder.
 
Цитата
TGB написал:
Не будет устраивать подключу OnOrder.
  Но это вряд ли потребуется, т.к. такая ситуация будет обнаружена раньше, при анализе состояния  активных заявок одним оператором: (getItem("Таблица заявок", "Соответствующая таблица кэша"[trans_id]).flags & 2) ~= 0
Страницы: Пред. 1 ... 13 14 15 16 17
Читают тему
Наверх