Ставь лайки и следи за новостями
Поставь на него ссылку - пусть другие тоже оценят
Оцени его работу в терминале MetaTrader 5
- Просмотров:
- 20
- Рейтинг:
- Опубликован:
-
Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу
Бэктест в режиме «Каждый тик на основе реальных тиков» не совершает сделок на основе видимых свечей. Он воспроизводит историю тиков, хранящуюся в терминале, по одному котированию за раз, и на основе этих тиков принимаются решения по каждому стопу, каждому отложенному ордеру и каждому фильтру спреда. Этот инструмент проверяет данную историю тиков: он считывает тики за последние несколько дней для одного символа, списка или всего окна «Market Watch» и выявляет в них пять классов проблем — невозможные котировки, поврежденные временные метки, развороты цены на один тик, измеряемые в кратных значениях медианного спреда, провалы в котировках во время сессий брокера и минуты, когда тики и бары M1 не совпадают.

Пять символов из панели «Market Watch», по три дня для каждого, один проход в 02:51:02 по серверному времени в воскресенье, 1,3 с. S pts — медианный спред в пунктах, Rev≥10S учитывает развороты на один тик, равные как минимум десяти медианным спредам, Silence unexpl. учитывает провалы длительностью более 60 с, которые не объясняются собственной таблицей сеансов брокера, а последние три столбца представляют собой проверки соответствия тиков и M1. Снимок сделан при размере шрифта панели 4, чтобы поместиться на страницу; по умолчанию — 8.
Проблема
Свеча — это сводка. Она сохраняет четыре цены за минуту и игнорирует порядок их поступления, поэтому котировка, которая упала на два доллара и сразу же вернулась, отображается на графике в лучшем случае как тень — а если остальная часть минуты уже охватывает этот диапазон, то и вовсе ничего. Тестер не видит свечу. Он видит котировку, и стоп-лосс, расположенный внутри этого диапазона, исполняется по ней.
Никто не отслеживает тики на глаз, потому что их слишком много: по символу золота, показанному ниже, терминал фиксирует примерно 300 000 тиков за торговый день. Поэтому вопросы, определяющие, является ли бэктест с реальными тиками измерением или вымыслом, обычно остаются незаданными. Бывают ли котировки, где цена «продажи» ниже цены «покупки»? Бывает ли, что время течет в обратную сторону? Бывают ли отрезки сессии, когда тиков нет вовсе? Совпадают ли бары M1, которые считывают индикаторы, с тиками, по которым торгует тестер?
Этот инструмент задаёт эти вопросы менее чем за две секунды для пяти символов и трёх дней и отвечает числами, временными метками в миллисекундах и строками CSV, а не процентом качества.
Что он измеряет
Пять проверок в окне [последний тик – (N дней, последний тик)], оба конца округлены до минуты. Окно заканчивается на самом последнем тике символа, а не по часам, поэтому запуск в воскресенье проверяет последние дни только что завершившейся недели. Каждое из приведенных ниже определений является точным, и каждый результат записывается в файл CSV с отметкой времени в миллисекундах, поэтому отчет можно пересчитать самостоятельно, а не просто поверить ему на слово.
- Котировки (K1). Тик с bid <= 0 или ask <= 0; перекрестная котировка, ask < bid; заблокированная котировка, ask == bid. Заблокированные котировки учитываются, но не считаются нарушениями — в некоторых каналах данных такие совпадения возможны по законным причинам.
- Временные метки (K2). Тик, время которого (time_msc) раннее, чем у предыдущего тика (в обратном порядке); повтор — одинаковые значения time_msc, bid и ask, как у предыдущего тика; а также тик, поле времени которого не совпадает со значением time_msc / 1000.
- Развороты за один тик (K3). В последовательности тиков, изменяющих цену на графике, три последовательных цены p0, p1, p2 образуют разворот, когда движение к p1 и движение от него имеют противоположные знаки, а p2 оказывается в пределах одной четверти от расстояния движения от p0. Размер — это меньшее из двух движений в пунктах, и он указывается в кратных величинах S — собственного медианного спреда символа за окно: подсчет производится при 2, 5, 10 и 20 спредах, и каждый разворот, составляющий не менее InpReversalMult спредов (по умолчанию 10), считается находкой. Десять спредов по золоту и десять спредов по EURUSD в данном случае — одно и то же.
- Периоды тишины (K4). Два последовательных тика, расстояние между которыми превышает InpSilenceSeconds (по умолчанию 60). Инструмент запрашивает SymbolInfoSessionQuote о каждой минуте паузы и о её последней секунде: если какая-либо из них выходит за пределы сессий котировок, пауза объясняется (дневной перерыв, выходные); если все они находятся внутри, она остается необъясненной и считается находкой. Символ, по которому вообще отсутствуют записи о сессиях, отмечается как «неклассифицированный», но никогда как «объясненный».
- Тики по отношению к барам M1 (K5). Для каждой минуты окна максимальная и минимальная цена на графике за каждый тик этой минуты сравниваются с максимумом и минимумом бара M1 брокера. Учитываются все тики, а не только те, которые повлияли на цену: первый тик минуты часто изменяет только цену «аск», а цена «бид» по-прежнему соответствует цене открытия бара. Учет только тиков, изменяющих цену, привел к 144 ложным несоответствиям за один день по паре EURUSD во время разработки данного инструмента; учет всех тиков не выявил ни одного. Бар M1, под которым нет ни одного тика, считается несоответствием — то есть это минута, в которой Тестер стратегий должен «придумывать» тики, — равно как и минута с тиками, но без бара, а также минута, максимальная или минимальная цена которой отличается более чем на InpBarTolPoints.
Инструмент проверяет собственные арифметические вычисления и выводит обе стороны для каждого символа: количество «находок» должно равняться сумме одиннадцати счётчиков «находок», а количество строк, записанных в файл «находок» для данного символа, должно равняться обеим величинам.
Пример измерений
Пять символов Market Watch одного демо-терминала Exness (сборка 6230), по три дня для каждого, проверены за один проход 04.10.2026 в 02:51 по серверному времени. Это воскресенье, поэтому окна форекс и золота заканчиваются на последнем тике пятницы, а BTCUSD, торгующийся в выходные, заканчивается в момент запуска. За 1 297 мс было прочитано 1 962 511 тиков.
| символ | окно (по серверному времени) | тиков | S, пункты | развороты >= 2 S / 5 S / 10 S | наибольший разворот, пункты | паузы > 60 с: объясненные / необъясненные | необъяснимые секунды (самые длительные) | Бар M1 / минуты с тиками | Несоответствия M1 | результаты |
|---|---|---|---|---|---|---|---|---|---|---|
| XAUUSD | 29.09 20:57 — 10.02 20:57 | 907 660 | 168 | 532 / 16 / 3 | 2 400 | 3 / 0 | 0 | 4 134 / 4 134 | 0 | 3 |
| EURUSD | 29.09 20:58 — 02.10 20:58 | 177 962 | 6 | 13 / 2 / 0 | 58 | 0 / 6 | 1 514,073 (439,640) | 4 299 / 4 299 | 0 | 6 |
| GBPUSD | 29.09 20:58 — 10.02 20:58 | 215 516 | 7 | 14 / 8 / 2 | 75 | 0 / 4 | 1 602,183 (741,443) | 4 295 / 4 295 | 0 | 6 |
| USDJPY | 29.09 20:58 — 02.10 20:58 | 321 026 | 7 | 124 / 23 / 0 | 67 | 0 / 11 | 1 397,153 (307,393) | 4 305 / 4 305 | 0 | 11 |
| BTCUSD | 10.01 02:51 — 10.04 02:51 | 340 347 | 700 | 34 / 0 / 0 | 3 084 | 0 / 0 | 0 | 4 320 / 4 320 | 0 | 0 |
Большая часть данных чиста. На протяжении 1 962 511 тиков нет котировок, равных нулю или ниже него, нет пересекающихся и заблокированных котировок, нет тиков, уходящих в прошлое, нет повторяющихся тиков и нет тиков, у которых два временных поля не совпадают. Каждый из 21 353 баров M1 имеет тики под собой, каждая минута с тиками имеет бар, а максимум и минимум бара равны экстремальной цене спроса его тиков до последней точки. На этом сервере бары, которые считывают индикаторы, и тики, которые воспроизводит тестер, совпадают по каждому максимуму и минимуму. Об этом стоит знать, и не следует делать таких предположений в отношении сервера, который не был протестирован.
Таблица сессий и поток данных не совпадают по каждому вечеру в данном окне. Для пар EURUSD, GBPUSD и USDJPY этот брокер указывает одну котировочную сессию с 00:00 до 24:00 с понедельника по четверг. Тики свидетельствуют об обратном. В каждый из этих трех вечеров последний тик перед дневным переходом поступает в промежутке от 20:59:52 до 20:59:58, а следующий — в промежутке от 21:04:28 до 21:12:18: от 4,5 до 12,4 минут полного отсутствия котировок в рамках того, что брокер называет «открытой сессией». Самый длительный период наблюдался у пары GBPUSD 01.10.2026 — 741,443 секунды, с 20:59:57,249 до 21:12:18,692. USDJPY демонстрирует вторую картину после переноса позиций 29.09.2026: между 21:15 и 21:29 он «замолкает» чуть более чем на минуту семь раз, по 60,001–60,007 секунд каждый раз, откуда и взяты семь из одиннадцати обнаруженных случаев. Золото на том же сервере фиксирует перерыв с 20:58 до 22:00, поэтому его три периода затишья во время перехода на новую сессию объясняются и не считаются сигналами.
Это имеет значение везде, где советник полагается на таблицу сессий, чтобы определить, открыт ли рынок. Барные графики совпадают с тиками — в эти минуты также отсутствуют бары M1, поэтому при бэктесте наблюдается тот же разрыв, — но советник, который анализирует сессии котировок для принятия решений о действиях, считает, что рынок котируется в 21:02, хотя ни в один из девяти вышеупомянутых вечеров по символам этого не происходило.
Все самые значительные развороты приходятся на публикацию данных из США. Все пять разворотов с разбросом не менее десяти медианных значений — три по XAUUSD, два по GBPUSD — происходят в течение восьми секунд после 12:30 по серверному времени 30.09.2026 и 02.10.2026. В собственном экономическом календаре терминала публикация данных по США указана на 12:30 в оба дня. Самый значительный разворот по золоту составляет три тика в пределах одной миллисекунды:
символ;проверка;время_мс;время;значение1;значение2;подробности XAUUSD;разворот;1790771407860;30.09.2026 12:30:07.860;2400;141;p0 4198,315 p1 4195,774 p2 4198,174 d1 -2541 d2 2400 S 168
Цена предложения падает на 2,541 и возвращается на 2,400, заканчивая на 0,141 ниже начальной отметки (значение2) в пределах одной миллисекунды. Это соответствует 14,3 медианным спредам. На графике M1 этого не видно: бар 12:30 простирается от 4192,325 до 4209,799, поэтому на свече нет никаких следов этого движения. При тестировании на реальных тиках стоп-ордер на продажу или стоп-лосс, находившийся в тот момент в диапазоне от 4195,774 до 4198,174 — например, скользящий стоп, следующий за ралли, — срабатывает из-за этого единственного тика.

XAUUSD, 29 последовательных тиков вокруг самого значительного разворота движения, в порядке поступления. Три тика с отметкой 12:30:07.860 имеют значения 4198,315; 4195,774; 4198,174. Остальные 26 тиков, с 12:30:07.610 по 12:30:08.663, представляют собой быстрое, но обычное новостное движение амплитудой 7,7 доллара. Данные взяты из тиков, считанных через собственный сервер MCP MetaTrader 5, а не из файлов инструмента.
На основании одних только данных невозможно определить, является ли такой тик ошибочным значением или реальной сделкой в условиях низкой ликвидности, и инструмент не пытается этого делать. Он просто подсчитывает их, сопоставляет их величину со спредом данного инструмента и предоставляет вам временную метку, чтобы вы могли выяснить, зависит ли результат бэктеста от нескольких таких тиков. Распределение имеет крутой наклон: по золоту — 532 разворота размером не менее двух спредов, 16 — не менее пяти и 3 — не менее десяти.
Независимая проверка отчета
Каждый счетчик в приведенной выше таблице был пересчитан программой, не имеющей общего кода с данным инструментом и получающей тики и бары из интерфейса, к которому инструмент никогда не обращается. Скрипт на Python считывает из файлов советника только окно, точку символа и режим графика, четыре пороговых значения и таблицу сессий, а необработанные тики и бары M1 извлекает самостоятельно через встроенный в MetaTrader 5 сервер MCP (get_chart_ticks_history, get_chart_history). Затем он применяет приведенные выше определения и проводит сравнение.
Результаты, приведенные в таблице: получено 1 962 511 тиков, 31 поле сводки на каждый символ плюс 24-часовая таблица каждого символа (72 ячейки на символ), 0 несоответствий. Эти 31 поле включают 29 счетчиков, количество строк в файле результатов и идентификатор. Были обнаружены обе намеренно внесенные ошибки — один счетчик увеличен на 1, одно значение количества тиков за час увеличено на 1. Одно поле не пересчитывается: для проверки поля времени требуется элемент времени MqlTick, которого нет в строках MCP, поэтому его нулевое значение зависит исключительно от советника. Скрипт также не может проверить символ, график которого построен на ценах Last; ни один из пяти таких символов не подходит.
Собственные определения скрипта закреплены тестом на 13 тиков, созданных вручную, причём каждое ожидаемое значение было рассчитано на бумаге — одно повторение, один разворот на 49 пунктов, один тик вне порядка, одна пересекающаяся и одна заблокированная котировка, одна котировка с нулевым ценой спроса, два периода молчания внутри сессии и один — через разрыв сессии — плюс случай с двумя тиками, в котором только последняя секунда молчания выпадает за пределы сессии. 45 утверждений, подсчитанных самим тестом. То, что советник применяет те же предикаты, подтверждается пересчётом на реальных данных, а не этим тестом.
Ноль, подтверждённый с обеих сторон, — это всего лишь ноль. Ни одного перекрёстного, обратного, повторяющегося или отрицательного тика, а также ни одного несоответствия M1 не произошло ни в одном из прогонов, лежащих в основе этой статьи, поэтому эти ветви определены и пересчитаны, но на этом сервере их срабатывание никогда не наблюдалось.
Как этим пользоваться
- Прикрепите его к любому графику; проверяется собственный символ графика, если в InpSymbols не указаны другие символы или не стоит * (Market Watch). Просмотрите журнал или панель.
- Установите InpDays так, чтобы охватить интересующий вас период бэктеста. Окно всегда заканчивается на последнем тике, хранящемся в терминале.
- Сначала обратите внимание на необъяснимые провалы в данных и проверьте их временные метки в файле результатов. Провалы, повторяющиеся каждый день в одну и ту же минуту, связаны с несоответствием расписания сервера его таблице сеансов; рассеянные провалы стоит сверить с журналом подключений вашего собственного терминала.
- Обратите внимание на развороты, соответствующие десяти и более спредам, а затем оцените показатели 2S и 5S для определения формы распределения. Если стоп-уровни стратегии находятся в пределах нескольких спредов от цены, запустите бэктест заново, исключив отмеченные минуты, и сравните результаты.
- Любое несовпадение на M1 или бар M1 без тиков — это минута, в которой тестер и график не совпадают, или в которой тестер «выдумывает» цены. По поводу таких случаев стоит обратиться к брокеру.
- Запустите тест заново после смены брокера или сервера: качество тиков зависит от истории конкретного терминала в конкретный момент времени, а не от символа.
Входные данные
| входные данные | по умолчанию | значение |
|---|---|---|
| InpSymbols | "" | Символы: пустое поле = символ графика, * = «Наблюдение за рынком», в остальных случаях — список в формате CSV |
| InpDays | 3 | Количество дней истории тиков для проверки (заканчивается последним тиком) |
| InpCheckQuotes | true | K1: отрицательные / пересекающиеся / заблокированные котировки |
| InpCheckTimes | true | K2: обратные, повторяющиеся и несогласованные временные метки |
| InpCheckReversals | true | K3: развороты цены на один тик (скачки) |
| InpReversalMult | 10,0 | K3: развороты флага, составляющие не менее этого количества медианных спредов |
| InpReversalReturnFrac | 0,25 | K3: максимальное расстояние до начала, в процентах от амплитуды движения |
| InpCheckSilences | true | K4: промежутки между тиками в рамках котировочных сессий |
| InpSilenceSeconds | 60 | K4: пауза — это промежуток, длительность которого превышает указанное значение в секундах |
| InpCheckBars | true | K5: сравнить максимум/минимум тика с барами M1 |
| InpBarTolPoints | 0 | K5: игнорировать отклонения от максимума/минимума в пределах данного количества пунктов |
| InpChunkMinutes | 360 | Тики считываются блоками по столько минут |
| InpMaxExamples | 5 | Журнал: количество результатов, выводимых при каждой проверке |
| InpWriteCsv | true | Запись файлов CSV с сводкой, сессиями, часами и результатами |
| InpShowPanel | true | Отобразить таблицу результатов на графике |
| InpPanelCorner | CORNER_LEFT_UPPER | Угол панели |
| InpPanelFontSize | 8 | Размер шрифта панели |
| InpPanelX | 10 | Смещение панели по оси X, пикселей |
| InpPanelY | 18 | Смещение панели по оси Y, пикселей |
| InpRefreshMinutes | 0 | Повторная проверка каждые N минут (0 = проверка один раз) |
Выходные файлы
Все файлы записываются в папку MQL5\Files\TickIntegrityAuditor\; они разделены символом «;», содержат строку заголовка и имеют префикс <symbols>_<days>d_<chart id>, благодаря чему два экземпляра никогда не перезаписывают друг друга.
- <префикс>_<символ>_summary.csv — по одной строке на каждый символ: окно в миллисекундах, все вышеуказанные счетчики, использованные параметры и результат проверки идентичности. При отключенной проверке ячейки остаются пустыми вместо записи 0.
- <префикс>_<символ>_sessions.csv — сессии котировок, объявленные брокером, по одной строке на сессию (день недели, от, до в секундах).
- <prefix>_<symbol>_hours.csv — по часам работы сервера: тики, необъяснимые паузы и их продолжительность в секундах, отмеченные развороты.
- <prefix>_findings.csv — по одной строке на каждый результат проверки с указанием символа, проверки, time_msc, времени чтения, двух значений и текстовой детализации. Для разворота значение1 — это его амплитуда, а значение2 — расстояние до p0, оба в пунктах; для паузы значение1 — это её продолжительность в секундах, а значение2 — time_msc тика, который её завершил.
Ограничения, изложенные просто
- Он проверяет тики, хранящиеся в вашем терминале. Обновлённая или заново загруженная история может изменить все значения, а терминал, находившийся в автономном режиме, генерирует паузы, которых у брокера никогда не было.
- Таблица сеансов — это собственное заявление брокера. Объясненный пробел объясняется лишь в том смысле, что брокер заявил, что котировок не будет; необъясненный пробел — это несоответствие между двумя заявлениями брокера, а не доказательство ошибки.
- Разворот — это паттерн, а не вердикт. Инструмент не может отличить ложный тик от реальной сделки; он измеряет объем и время, а суждение оставляет за вами.
- Окно ограничено количеством дней InpDays (не более 365). Тики считываются блоками, поэтому объем занимаемой памяти остается небольшим, но обработка длинного окна для активного символа занимает пропорционально больше времени.
- Символы, графики которых строятся по цене «Last», проверяются по цене «Last». На данном сервере таких символов не было, поэтому соответствующая ветвь реализована, но никогда не запускалась, а независимый пересчёт охватывает только символы, графики которых строятся по цене «Bid».
- Без торговых функций, без DLL, без доступа к сети: она считывает тики, бары и таблицы сессий, а также записывает CSV-файлы в папку MQL5\Files.
Перевод с английского произведен MetaQuotes Ltd.
Оригинальная публикация: https://www.mql5.com/en/code/78008
87.8 Percent from 2021 to YTD at 8.5 Percent MaxDD. The Nikkei EA That Only Buys When Volume Is Quiet
Бесплатный, полностью открытый советник для JPN225 (Nikkei 225) на таймере M15. Открывает позиции на покупку, когда цена имеет восходящую тенденцию, импульс не перенапряжен, а объем торгов низкий. Бэктест за период с 2022 по 2026 год: коэффициент прибыльности 1,68, +18,5% в год, прошел 15 стресс-тестов. К 17:00 баланс в нуле.
Session Sweep Boxes
Отображает диапазоны азиатской, лондонской и нью-йоркской сессий и отмечает «свепы» ликвидности: закрытый бар, у которого тени выходят за пределы максимума или минимума завершившейся сессии, но закрытие происходит в пределах этого диапазона. Стрелки, не подверженные перерисовке, расширенные уровни сессий, оповещения и буферы, готовые к использованию с iCustom.
YURAZ_RSAXEL Скрипт рисует уровни Рудолфа Акселя
Скрипт рисует уровни Рудолфа Акселя
YURAZ_MCCH
Индикатор рассчитывает % роста или падения относительно CLOSE, написан с применением ООП, и легко интегрируется в любой советник или иной индикатор.