Потеря тиковых данных на срочном рынке Московской биржи. - страница 3

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Aleksey Vyazmikin
15941
Aleksey Vyazmikin  

OnTick() правильно делает, что без буфера - если подумать, то какой смысл в расчетах, которые всё сильней будут отставать от рынка!?

Если расчеты быстрые то всегда можно запросить информацию по тикам и все пересчитать.

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

madpower2000
67
madpower2000  
Ilya Baranov:

Советник может обработать все тики, только для этого ему нужно не только проверять последний тик в обработчике события OnTick, а запрашивать некоторый участок прошедшей истории.

См. вот эту ветку, там описание как это делается, в конце решения для обхода некоторых нюансов.

https://www.mql5.com/ru/forum/317990

Но даже если каждый раз запрашивать историю тиков с помощью функции CopyTicksRange(), получается разное поведение одного и того же кода в бэктестере и реальных торгах, т.к. событие OnTick() вызывается каждый раз в бэктестере, а в реальных торгах нет, поэтому есть опасность, что бэктест даже близко не будет соответствовать реальному рынку.

Вообще было бы здорово кроме трансляции признака агрессора (флага покупки/продажи) в тиковой истории иметь признак окончания транзакции - когда один большой ордер поражает несколько сделок, иначе со стороны клиента это выглядит как разные трейды, а на самом деле это одна атомарная операция.

madpower2000
67
madpower2000  
Aleksey Vyazmikin:

OnTick() правильно делает, что без буфера - если подумать, то какой смысл в расчетах, которые всё сильней будут отставать от рынка!?

Если расчеты быстрые то всегда можно запросить информацию по тикам и все пересчитать.

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

По первому пункту вы немного не правы, если код грамотно написан, все работает со скоростью света, и не блокирует выполнение программы, бэктест выполняется молниеносно, хотя как я уже писал выше, вызывает OnTick() каждый раз. Хотелось бы контролировать ситуацию возможно было бы выставлять какую-то глобальную переменную, чтобы включить буферизацию. И опять же  OnBookEvent() буферезация реализована без проблем;

Запрос информации - это как раз ненужные накладные расходы времени при выполнении кода.

Насчет тестов - см. мой комментарий выше.

prostotrader
8053
prostotrader  
madpower2000:


А как Вы хотите торговать на ФОРТС?

Одним инструментом, парный трейдинг, календарный спрэд или еще как-то?

Aleksey Vyazmikin
15941
Aleksey Vyazmikin  
madpower2000:

По первому пункту вы немного не правы, если код грамотно написан, все работает со скоростью света, и не блокирует выполнение программы, бэктест выполняется молниеносно, хотя как я уже писал выше, вызывает OnTick() каждый раз. Хотелось бы контролировать ситуацию возможно было бы выставлять какую-то глобальную переменную, чтобы включить буферизацию. И опять же  OnBookEvent() буферезация реализована без проблем;

Запрос информации - это как раз ненужные накладные расходы времени при выполнении кода.

Насчет тестов - см. мой комментарий выше.

Вы не объективны в своих суждениях. Во первых надо понимать, что MT5 используют в большинстве не дипломированные программисты, а энтузиасты трейдеры и в 99% случаев код написан не оптимально. Кроме того, большая часть советников использует в коде информацию от индикаторов, и их число может быть значительным, а индикаторам часто так же требуется время на расчет. И, я вот занимаюсь машинным обучением, у меня генерируется более 500 предикторов, а код только тела советника, без классов, более 36 000 строк и если торговать фьючерсом Si, то велик шанс к концу клиринга опоздать на пару минут.

Поэтому такие глобальные предложения нельзя рассматривать субъективно, ведь суть исполнения в OnTick()  - как можно меньше во времени отставать от реальных событий, а не в последовательных и кропотливых расчетах.

Alexey Kozitsyn
8856
Alexey Kozitsyn  
madpower2000:

Вообще было бы здорово кроме трансляции признака агрессора (флага покупки/продажи) в тиковой истории иметь признак окончания транзакции - когда один большой ордер поражает несколько сделок, иначе со стороны клиента это выглядит как разные трейды, а на самом деле это одна атомарная операция.

Этот признак - время прихода тика в миллисекундах. У тиков одной пачки одинаковое направление и время.

madpower2000
67
madpower2000  
Aleksey Vyazmikin:

Вы не объективны в своих суждениях. Во первых надо понимать, что MT5 используют в большинстве не дипломированные программисты, а энтузиасты трейдеры и в 99% случаев код написан не оптимально. Кроме того, большая часть советников использует в коде информацию от индикаторов, и их число может быть значительным, а индикаторам часто так же требуется время на расчет. И, я вот занимаюсь машинным обучением, у меня генерируется более 500 предикторов, а код только тела советника, без классов, более 36 000 строк и если торговать фьючерсом Si, то велик шанс к концу клиринга опоздать на пару минут.

Поэтому такие глобальные предложения нельзя рассматривать субъективно, ведь суть исполнения в OnTick()  - как можно меньше во времени отставать от реальных событий, а не в последовательных и кропотливых расчетах.

Не буду вступать с Вами в полемику по данному вопросу, да наверное у разной аудитории разные цели и задачи и в почтении склоняю шляпу перед Вашими 500 предикаторами. Я просто хотел обратить внимание разработчиков, что поведение одного и того же кода в бэктестрее и реальных торгах коде отличается, что по моему скромному мнению не есть хорошо.

madpower2000
67
madpower2000  
Alexey Kozitsyn:

Этот признак - время прихода тика в миллисекундах. У тиков одной пачки одинаковое направление и время.

Справедливое замечание, но вы можете понять, что текущая транзакция окончилась, только если уже пришел следующий тик и вы сравнили  их  timestamp. Т.е. Вам нужно ждать следущий тик и возможно этот тик тоже часть уже другой транзакции.  Иначе получается что вы запускаете торговую логику в середине атомарной транзакции, бэктестер эмулирует исполнение вашего ордера по ценам не имеющего никого отношения к реальности. Так что получается, что  OnTick() логично чтобы вызывался по окончании транзакции. Мне кажется это FX - наследие, т.к. MT5 изначально под него разрабатывался, а микроструктура у LOB/Биржевого рынка и FX все-таки различна, от этого все вышеперечисленные проблемы и вопросы.

P.S. Хотелось чтобы уже кто-то из разработчиков MetaQuotes уже вернулся с Лимассольского пляжа и уже прокомментировал свое видение ситуации :)

madpower2000
67
madpower2000  
prostotrader:

А как Вы хотите торговать на ФОРТС?

Одним инструментом, парный трейдинг, календарный спрэд или еще как-то?

Немножко интимный вопрос конечно, но хочу все из вышеперечисленного Вами списка :)

Aleksey Vyazmikin
15941
Aleksey Vyazmikin  
madpower2000:

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

Конечно, посыл верный, что б различий было как можно меньше.

Однако, пропуски зависят в первую очередь от железа - насколько быстро оно справляется с кодом, а значит тут нужен индивидуальный подход и всё равно условные значения, ведь даже замерив производительность железа, к примеру 100 тиков в секунду, никто не гарантирует, что компьютер не будет при торговле под нагрузкой или фризом и опять произойдет в связи с этим расхождение и пропуск тиков.

Получается, что для создания реальных условий Вам нужно прореживать тики, убирая те, которые Ваша машина не успевает обработать, и делать из оставшихся пользовательский символ и уже на нем тестироваться.

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий