Exchange Ticks Corrections
- Утилиты
-
Aleksei Kuznetsov
Расширенный отчет оптимизации (Advanced Optimization Report)
Оптимизируете торговые стратегии в Meta Trader 5 (MT5)? Используйте расширенное и более наглядное представление результатов оптимизации с преимуществами интерактивных HTML страниц.
Коротко о преимуществах: - Версия: 1.0
- Активации: 5
Корректировка тиков для MQ тестера, которая позволит тестировать стратегии для биржевых инструментов и получать результаты более близкие к реальной торговле, чем получается в тестере на сохраненных тиках.
Проверено на MOEX через брокера F..am. Логика работы на других биржах не проверялась, но возможно аналогичная проблема имеется и у них.
Первые 10 продаж по $30, потом по $50.
Принцип работы:
- скрипт считывает сохраненные тики текущего инструмента
- автоматически определяются по определенным признакам тики из не-торговой сессии и вырезаются. Определяются утренняя и вечерняя остановка торгов. Начало сессий менялось: утренняя сначала начиналась в 10:00, с 2025 года стала с 07:00, а вечерняя остановка торгов была с 18:40 до 19:05, сейчас укладываются за 5 минут с 18:55 до 19:00. Так как расписание менялось, то использование одной из таблиц торговых сессий будет неверным, поэтому и написал автоматический определитель. Возможно в будущем сделаю вариант с прописыванием торговых сессий вручную, оно надежнее, но нужно больше предварительной работы по составлению графика изменений расписаний (возможно будет сложно найти все даты изменений).
- так как тики Ask и Bid часто не соответствуют тикам Last до и после, то все тики Ask и Bid удаляются
- создаются новые Ask и Bid цены, на основе Last тиков из предположения, что все Last тики срабатывают по ценам Ask и Bid. Цены записываются не отдельным тиком, а дописываются к изменившим их Last тикам
- если произошла большая серия тиков Last за одну миллисекунду с разными ценами, то цены Ask или Bid добавляются только к последнему тику в этой миллисекунде, так как ни один робот не успеет поставить свою сделку в эту миллисекунду. Такие серии сделок происходят из за рыночной сделки большим объемом, который сразу разбирает несколько уровней в стакане.
- все Last тики с одинаковыми направлением и ценой объединяются в один тик с объемом = сумме объемов всех объединенных тиков. Такой тик может формироваться как за 1 миллисекунду, так и несколько секунд. Цена может не меняться и несколько минут, но для того, чтобы совпадал свечной график, тики создаются не реже чем раз в минуту, если был хотя бы 1 тик в этой минуте.
- для созданных Ask и Bid цен производится корректировка: в случае если Ask <= Bid, то делается Ask > Bid на 1 пункт или по Last.
- полученные тики сохраняются в кастомный символ, на котором нужно производить тестирование
- перед запуском скрипта, нужно скачать реальные тики нужного инструмента, для этого запустите в тестере любой эксперт на нужный период времени, тестер закачает все выбранные тики, через 2-5 минут повторите тест, так как тестер может некоторое время докачивать тики
- запустите скрипт на графике нужного инструмента
- заполните входные параметры (дата старта, Action - полная перезагрузка или докачка свежих тиков, PostFix - для имени создаваемого кастомного символа, LoadByYears - если у вас мало памяти, то этот вариант будет работать блоками по 1 году, а не сразу за 5-10 лет, например GAZP за 5 лет скачал в память 11 Гб тиковых данных, при работе по 1 году всего 3Гб)
- запустите скрипт и дождитесь окончания его работы (GAZP за 5 лет работал почти 2 минуты)
- можно начать тестирование в тестере на созданном кастомном символе
Описание проблем с НЕ-торговой сессией которые есть в сохраненных котировках:
1) Так как в котировках не удалены тики из не торговой сессии, то тестер работает и на них, а биржа отклонит любые команды в это время.
Примеры:
с 18:40 до 19:05 торговля не производится, но в тестере сделки исполняются в это время https://www.mql5.com/ru/forum/516827/page11#comment_60568825
if(Tick.time== D'2024.06.07 18:49:55'){ OrderSend(_Symbol, OP_SELL, 1.0, n(Tick.bid), 0, n(130.0),0,NULL,3);}
2) Если сделка была открыта в торговое время и не была закрыта до окончания торговой сессии и проходит через не торговые тики, то ТП/СЛ и другие отложенные ордера могут сработать в не торговое время в тестере (но не на бирже). А так как в не торговое время биржа (или брокер) ставила Bid > Ask на расстоянии в несколько дневных свечей, то тестер получает огромные положительные проскальзывания и делает даже примитивную стратегию тестерным граалем. Пример в скриншотах.
Вырезание не торговых тиков поможет избавиться от этих проблем. В скрипте происходит автоматическое определение не торговых тиков и их удаление.
Важное примечание: Так как будут вырезаны несколько минут из истории, то индикаторы МА и другие будут рассчитываться без этих баров и значения будут отличаться.
Описание проблем с имеющимися Ask и Bid тиками в сохраненных котировках:
1) Ask и Bid не достаточно часто обновляются, в результате сделки совершенные по одной цене Last имеют результат по устаревшим Ask или Bid.
2) Иногда Ask и Bid тики не совпадают с ценами Last до и после них, а Last тики срабатывают именно по Ask и Bid и они должны совпадать. Бывает отличие на 10 и больше пунктов, в скриншотах показано отличие в 30 пунктов.
По этим причинам скрипт полностью удаляет сохраненные Ask и Bid тики и создает новые на основе Last.
Все ошибки сообщены разработчикам, возможно они их исправят. Но пока можно тестировать с помощью кастомных символов созданных этим скриптом. Бонусом будет ускорение тестирования в 4-5 раз за счет объединения Last тиков с одинаковой ценой и того, что Ask и Bid цены добавлены не отдельными тиками, а дописаны к тикам Last с добавлением нужных флагов.
Проблемы которые не возможно решить даже с помощью этого скрипта.
Точного совпадения результатов торговли невозможно добиться по следующим причинам:
1) Биржа или дилер в реальной торговле присылает Ask и Bid тики через 10-30 мс после изменяющих их тиков Last. Пример:
FP 0 16:55:35.242 test_trail (GAZP,H1) 2026.10.30 16:55:35.51 bid:117.22 ask:117.23 last:117.25 vol:64 flags:1080 BUY LAST VOL
MR 0 16:55:35.252 test_trail (GAZP,H1) 2026.10.30 16:55:35.61 bid:117.23 ask:117.25 last:117.25 vol:64 flags:1030 BID ASK
В сохраненных тиках Ask и Bid обновляются реже и цены часто не соответствуют.
В скорректированных тиках Ask и Bid дописываются к тику изменившему их, то есть применяются на той же миллисекунде.
Имеем отличие в обоих вариантах. В варианте с скорректированными тиками отличие меньше и результаты ближе к реальной торговле.
2) Биржа или дилер в реальной торговле присылает прореженные тики раз в несколько миллисекунд, пропускаются почти все тики внутри серии тиков за одну миллисекунду или за несколько. OnTick вызывается реже, а в тестере на каждом сохраненном тике.
В скорректированных тиках в тестере OnTick вызывается так же на каждом тике и тоже будут отличия от реальной торговли, например тестер исполнит команду по цене, которая была пропущена в реальной торговле.
3) Биржа или дилер в реальной торговле исполняет все команды с сетевой задержкой в несколько миллисекунд, в тестере мгновенно.
4) Тестер исполняет лимитные ордера только при полном выкупе уровня в стакане с первым тиком следующего уровня из предположения, что ваша заявка последняя в очереди. В реальной торговле ваша заявка может быть не последней и будет исполнена при касании ценой уровня и откатом назад, тестер от касания не сработает, только при переходе на следующую цену. Заметил эту особенность при сравнении исполнения своего тестового примера https://www.mql5.com/ru/forum/518455/page12#comment_60642029
То есть полного совпадения достичь невозможно, но тестирование на скорректированных тиках дает результаты ближе к реальным, чем тестирование на сохраненных тиках.
При создании и проверки работы скрипта использовался код https://www.mql5.com/ru/market/product/206598/comments#comment_60673660, который точно воспроизводит входы в реальной торговле на бирже и в тестере по скорректированным тикам (см. скриншоты), благодаря лимитным ордерам и округлению цены для исполнения ордера. Затем сделки завершаются по СЛ или по СЛ после тралла. Отличия в результатах есть: большие для теста по сохраненным тикам и меньшие для скорректированных тиков.
Скриншоты:
1) В верхней части 8 сделок от реальной торговли с результатом за день -3.4 рубля, в нижней части тест на скорректированных тиках с результатом -4.2 рубля, разница -0.8 рубля
2) В верхней части те же реальные сделки в представлении позиций, результат -3.4 рубля, в нижней части тест по сохраненным тикам с результатом +1 рубль, разница +4.4 рубля. Причины: сделок больше, так как Ask и Bid тики не адекватны ценам Last и из за редкого их добавления сделки завершаются по устаревшим Ask и Bid с положительным проскальзыванием.
3) Пример срабатывания СЛ в тестере в неторговое время по ценам на несколько дневных баров ниже текущих цен, все сделки Sell, "зарабатывают" и на падении рынка и на росте. "Выигрыш" - несколько тысяч рублей.
4) Пример срабатывания СЛ в тестере в неторговое время по ценам на несколько дневных баров выше текущих цен, все сделки Buy, "зарабатывают" и на падении рынка и на росте. "Выигрыш" - несколько тысяч рублей.
5) Пример срабатывания СЛ в тестере на скорректированных тиках с удаленными не торговыми тиками, все сделки Sell. Тестерная граальность исчезла и получили небольшой проигрыш.
6) Пример срабатывания СЛ в тестере на скорректированных тиках с удаленными не торговыми тиками, все сделки Buy. Выигрыш приближенный к реальному около 120 рублей.
7) Сравнение распечаток тиков GAZP (255 тиков) и скорректированных GAZP_Fixed (41 тик) за 2 секунды.
Слева GAZP имеет Ask и Bid тики которые неадекватно выше тиков Last, примерно на 30 пунктов, это один из примеров, почему решил их удалять. Видим множество Last тиков по одной цене - это все сделки на бирже.
Справа скорректированные GAZP_Fixed. Из за удаленных Ask и Bid первым идет Last тик, который изменил цену и к нему добавлена цена Ask, объем равен сумме двух тиков GAZP 1+3=4. Все Last тики с одинаковой ценой объединены в один с суммарным объемом.
Так же видно большую серию тиков в одной миллисекунде из за покупки около 36000 лотов, которая выбрала несколько уровней в стакане. Ask для них записаны только в первом и последнем тике.
В обсуждениях приложил больше подробностей и файлов для воспроизведения.
Если кто-то хочет самостоятельно всё проверить и сравнить тики, прикладываю:
- экспорт тиков сохраненных в терминале GAZP за 30 октября 2026 года,
- экспорт скорректированных GAZP_Fixed за 30 октября 2026 года, можете импортировать тики в свой терминал и запустить эксперт для проверки работы.
- распечатку тиков полученных в OnTick() при реальной торговле за 30 октября 2026 года.
- лог сделок и торговых команд за этот день. Эти сделки вы видите на скриншотах и в описании.
- код эксперта который работал на реальном счете и в тестере и файл настроек теста за 30 октября 2026
- экспорт скорректированных тиков за январь-май 2026 года и файл настроек эксперта для проверки тестерной граальности на тиках от дилера и его устранения для скорректированных тиков.
