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

Пять символов из Market Watch, M15, по 5 000 закрытых баров на каждый; проверка занимает около секунды. Sess% — это столбец, на который следует обратить внимание: 99,80 для XAUUSD против 100,00 для остальных четырёх, — в то время как Grid% варьируется в диапазоне 68–100 и в основном показывает, какую долю выходных дней занимает каждый символ. Это тот же самый аудит, что и в блоке журнала ниже, повторенный через две минуты на втором графике для скриншота, поэтому префикс файла отличается; все остальные цифры идентичны. Файл результатов был отключен для этого, а «csv rows» подсчитывает строки этого файла, поэтому рядом с 85 результатами отображается 0. Поставляемая панель представляет собой светлый текст на тёмном фоне, а здесь она была перекрашена в чёрный на белом фоне.
Проблема
Отсутствующий бар невидим. Свечи располагаются на графике рядом друг с другом независимо от того, составляет ли интервал между ними один период или три часа, поэтому пробел в истории выглядит точно так же, как спокойный рынок. Тестер стратегий также не предупреждает об этом: он моделирует то, что ему предоставляется, и стратегия, тестируемая с учетом пробела, тестируется на рынке, который пропустил тот час, в котором она понесла бы убытки.
Существенные дефекты не являются чем-то экзотическим. Бар, цена закрытия которого находится выше собственного максимума, проходит тест стоп-лосса, который в реальности бы провалился. Дублирующееся время бара приводит к тому, что каждый расчет «на X баров назад» указывает на неправильный бар. Бар с нулевым тиком — это цена, которую рынок никогда не котировал. Таймфрейм, бары которого не совпадают с собственными M1-барами брокера, означает, что два ваших индикатора анализируют два разных прошлых периода.
Обычный тест на всё это заключается в прокрутке графика и проверке, не выглядит ли что-нибудь странно. Этот тест ничего не обнаруживает, и не обнаруживает ничего убедительным образом.
Что он измеряет
Шесть независимых проверок за последние N закрытых баров одного таймфрейма для одного символа, списка или всего содержимого панели «Market Watch». Каждая проверка имеет определение, которое можно пересчитать вручную, и каждый результат записывается в файл CSV с указанием времени бара, так что отчет можно проверить, а не просто поверить ему на слово.
- Согласованность OHLC. high < low, цена открытия или закрытия вне диапазона [low, high], либо любая из четырёх цен равна нулю или ниже нуля. Один результат на бар за каждое нарушенное условие: инвертированный бар законно генерирует несколько результатов, поскольку в этом случае цена открытия и закрытия одновременно находятся выше максимума и ниже минимума.
- Время баров. Время, которое не увеличивается от одного бара к следующему (дубликат или бар, расположенный не по порядку), а также бар, время открытия которого не находится на сетке периода — time % PeriodSeconds() != 0 — именно так проявляется история, сформированная в результате некорректного импорта или сбоя сеанса сервера.
- Отсутствующие бары по сравнению с собственными сессиями символа. Для каждой пары последовательных баров инструмент вычисляет, сколько точек открытия сетки отсутствует между ними. Затем — и именно эта часть делает полученное число пригодным для использования — он запрашивает SymbolInfoSessionQuote, должен ли был рынок котироваться в момент каждого отсутствующего открытия. Отсутствующие открытия вне каждой сессии котировок *объясняются* (ночи, выходные, праздники в таблице сессий); отсутствующие открытия внутри сессии остаются необъясненными и учитываются отдельно. Символ, для которого вообще отсутствуют записи о сессиях, отмечается как «неклассифицированный» — он никогда не классифицируется как «объясненный» без соответствующего уведомления. Ни этот случай, ни пустое окно M1 не встречались у брокера, данные которого приведены ниже; такие ситуации обрабатываются, но не демонстрируются.
- Пустые и плоские бары. tick_volume == 0 — это бар, построенный из нулевых тиков. open == high == low == close с тиками внутри — это плоский бар: допустим в «мертвый» час, подозрителен в ликвидном и о нём стоит знать, прежде чем индикатор будет делить значение на диапазон бара.
- Перекрестная проверка M1. Каждый проверяемый бар восстанавливается из баров M1 внутри его собственного окна — первое открытие, максимальный максимум, минимальный минимум, последнее закрытие, суммарный объем тиков — и сравнивается с баром, который брокер предоставляет для более высокого таймфрейма. Сравниваются только те окна, которые фактически охватывает история M1; окна, выходящие за пределы охвата M1, отмечаются как «вне охвата», а окна внутри охвата, в которых вообще отсутствуют бары M1, получают собственный счетчик. Отклонения измеряются в пунктах с возможностью установки допустимого отклонения.
- Проверка достоверности спредов. Количество баров, у которых сохраненный спред равен нулю, количество баров со спредом выше установленного вами предела, а также максимальный и средний спред по проверенным барам. История, заполненная нулевыми спредами, — это история, которая не может дать ответа ни на один вопрос, касающийся стоимости.
Основной показатель — это охват сессии: доля открытий, которые, согласно собственной таблице сессий брокера, должны существовать, но на самом деле имеют бар. Рядом с ним отображается показатель охвата сетки — тот же коэффициент по каждому интервалу времени, включая ночные часы и выходные, — поскольку сам по себе он в основном показывает, сколько выходных вы проверили.
Пример расчёта
Пять символов из Market Watch одного демо-терминала Exness (сборка 6230), таймфрейм M15, последние 5 000 закрытых баров по каждому из них, проверенные примерно за секунду 02.10.2026 в 08:07 по серверному времени.
| символ | бары | промежуток, дни | разрывы | пропущенные открытия | пропуски в ходе сессии | OHLC | дефекты времени | пустой / без изменений | M1: сопоставлен / несопоставлен / макс. отклонение | покрытие сетки | сессионная корреляция |
|---|---|---|---|---|---|---|---|---|---|---|---|
| XAUUSD | 5 000 | 76,5 | 55 | 2 342 | 10 | 0 | 0 | 0 / 0 | 5 000 / 0 / 0,0000 баллов | 68,10 % | 99,80 % |
| EURUSD | 5 000 | 72,1 | 10 | 1 920 | 0 | 0 | 0 | 0 / 0 | 5 000 / 0 / 0,0000 баллов | 72,25 % | 100,00 % |
| BTCUSD | 5 000 | 52,1 | 0 | 0 | 0 | 0 | 0 | 0 / 0 | 5 000 / 0 / 0,0000 баллов | 100,00 % | 100,00 % |
| GBPUSD | 5 000 | 72,1 | 10 | 1 920 | 0 | 0 | 0 | 0 / 0 | 5 000 / 0 / 0,0000 баллов | 72,25 % | 100,00 % |
| USDJPY | 5 000 | 72,1 | 10 | 1 920 | 0 | 0 | 0 | 0 / 0 | 5 000 / 0 / 0,0000 баллов | 72,25 % | 100,00 % |
Сравните данные двух столбцов по охвату, ведь именно в этом и заключается весь аргумент в пользу их разделения. Охват сетки составляет 68–72 % для каждого валютного символа и 100 % для BTCUSD, что не отражает ничего, кроме того, что валютный рынок закрывается на выходных, а криптовалютный — нет. Покрытие сессий — тот же показатель, рассчитанный только по открытиям, указанным в собственной таблице сессий брокера, — показывает 100,00 % четыре раза и 99,80 % для XAUUSD. Одно число в этой паре столбцов является ошибкой; остальное обусловлено календарём.
Эти 0,20 % — это единственный разрыв, и он достаточно мал, чтобы проверить его вручную. В файле результатов для него есть одна строка:
символ;период;проверка;индекс_бара;время_бара;поле;подробности;значение XAUUSD;M15;C3_GAP;3304;07.09.2026 18:30:00;пробел;класс=необъяснимый in_session=10;14
В строке C3_GAP параметр bar_time обозначает время первого отсутствующего открытия, а bar_index — индекс (с нуля, отсчитываемый от самого старого проверенного бара) бара, следующего за пробелом, поэтому эта строка означает: в понедельник 07.09.2026 за баром, открывшимся в 18:15, следует бар, открывшийся в 22:00, а четырнадцать открытий с 18:30 по 21:45 отсутствуют. Сессии котировок по золоту в понедельник, согласно данным этого брокера, — 00:00–20:58 и 22:00–24:00. Десять из отсутствующих открытий — с 18:30 до 20:45 — приходятся на первую сессию; остальные четыре — с 21:00 до 21:45 — приходятся на заявленный перерыв. Десять необъяснимых, четыре объяснимых — именно это и отражено в строке. Два с половиной часа ликвидного понедельничного вечера, которые каждый бэктест на этом терминале молча пропускает, а на графике это две свечи, стоящие рядом.
Остальные 2 332 пропущенных открытия XAUUSD объясняются календарём: одиннадцать выходных по 196 открытий в каждом, 43 ежедневных перерыва по четыре и четыре открытия в рамках этого «понедельничного пробела» — 2 156 + 172 + 4. Те 1 920 для каждой валютной пары — это десять выходных, и ничего больше: 10 × 192 открытия по 15 минут — это ровно 1 920. Именно эти цифры делают покрытие сеткой бесполезным, и их всё же стоит распечатать, потому что символ, чьи «объяснённые» открытия не совпадают с его таблицей сессий, говорит вам о том, что таблица сессий неверна.
Остальная часть аудита ничего не выявила, что также является результатом: на протяжении 25 000 баров не было ни одного невозможного значения OHLC, ни дублирующихся или выпадающих за пределы сетки временных отметок, ни пустых, ни плоских баров, и все 25 000 баров совпадали с собственной серией M1 брокера до последней цифры — с максимальным отклонением в 0,0000 пункта. BTCUSD заслуживает ещё одной строчки: нулевое количество гэпов за 52 дня и спред, равный ровно 700 пунктам на всех 5 000 барах. Фиксированный спред — это не дефект, но и не показатель, а стратегия, настроенная на него, настраивается на постоянную величину.

XAUUSD M15, 5 000 баров: каждый пропущенный бар открывается в час серверного дня, в соответствии с тем, что указано в собственной таблице сессий брокера для этого часа. Штрихованные бары — это открытия вне котировочных сессий: одиннадцать выходных, поэтому они охватывают каждый час, плюс ежедневный перерыв в 21:00. Десять сплошных баров — это единственные открытия в 25 000 барах, которые таблица сессий не может объяснить; все они приходятся на один понедельник вечером. Данные взяты из дампа баров и дампа сессий данного прогона; сам инструмент записывает цифры, а не рисунок.
Те же пять символов на M1 с лимитом спреда, установленным на 20 пунктов, представляют собой страницу противоположного типа и заслуживают отдельного абзаца, поскольку показывают, как выглядят проверки, когда они срабатывают: 10 613 находок, плоские бары 20 / 22 / 40 на EURUSD / GBPUSD / USDJPY, спред выше 20 пунктов на всех 5 000 барах по золоту и BTCUSD, а также 25 / 28 / 20 отсутствующих открытий в пределах сессии на тех трёх парах, у которых их не было на M15. Последний показатель не является противоречием: 5 000 баров M1 охватывают три с половиной дня одной недели — это совершенно иное временное окно, и одноминутный пробел в пределах сессии встречается гораздо чаще, чем пятнадцатиминутный. На M1 две колонки покрытия также сходятся — 99,44 и 99,44 для GBPUSD — поскольку столь короткий период не включает выходных, которые могли бы «украсить» показатели сетки.

Тот же инструмент на M1 с ограничением спреда в 20 пунктов: Flat и SprHi теперь содержат цифры, InSess находит пробелы на парах, которые на M15 были чистыми, а столбец M1bad выводит отрицательное значение — поскольку на M1 ниже проверяемого периода ничего нет, поэтому перекрестная проверка сообщает о сбое — таблица результатов никогда не показывает ноль для того, что не измерялось.
Независимая проверка отчёта
Вышеуказанные счетчики проверяются программой, не имеющей общего кода с данным инструментом. Скрипт на Python считывает только исходные данные — дамп баров и дамп сессии, которые записывает советник, — пересчитывает каждый счетчик проверок OHLC, времени, гэпа, пустоты/плоскости и спреда в соответствии с приведенными выше определениями и сравнивает результат с собственным файлом сводки советника.
В ходе тестов, лежащих в основе этой статьи — 15 аудитов по символам и периодам на M1, M15 и W1 — было сопоставлено 215 счетчиков и зафиксировано 0 несоответствий, включая десять случаев открытия гэпа во время сессии, упомянутых выше, пересчитанных исключительно на основе времени баров и таблицы сессий.
Есть две вещи, которые пересчёт не охватывает. Перекрёстная проверка M1 не входит в эти 215 показателей: скрипт может извлечь серию M1 из самого терминала и восстановить бары, но этот путь не был запущен для приведённых здесь цифр, поэтому сравнение 5000 / 0 несоответствий основано на собственном подсчёте советника. А счетчик, равный нулю с обеих сторон, подтверждается только как ноль — ни в одном из прогонов не было невозможных значений OHLC, не было неувеличивающегося времени или времени вне сетки, не было разрыва, не являющегося целым числом периодов, не было пустого бара, не было несоответствий на M1, не было окон внутри зоны покрытия M1 без бара M1 в них, и не было отклонений, которые допускались бы в пределах допустимой погрешности. Эти ветви никогда не срабатывали на измеренных здесь данных.
Определения дефектов, которые этот брокер никогда не генерирует, закрепляются вторым, более мелким тестом самого скрипта пересчёта: синтетическая история из 12 баров с дефектами, вписанными вручную, и ожидаемыми значениями, указанными рядом с ними — 29 утверждений, без участия терминала. ЭА применяет те же предикаты в том же порядке, и это скорее сравнение двух источников бок о бок, чем измерение. Именно из этого тестового набора берутся два решения, заложенные в данном инструменте: во-первых, что инвертированный бар должен генерировать пять результатов, а не один, поскольку при переворачивании интервала цены открытия и закрытия находятся одновременно выше максимума и ниже минимума; во-вторых, что единственный неразделенный показатель покрытия практически лишен смысла.
Инструмент также проверяет собственные вычисления и выводит обе части каждого тождества, поэтому отчёт можно проверить совершенно без использования Python:
аудит 1 : бары 25000 + пропущенные 8102 = 33102, ожидаемое_количество_открытий 33102 -> OK проверка 1 : ожидаемое_количество_открытий 33102, количество открытий в сетке в проверяемых интервалах 33102 -> OK (5 символов OK, 0 — нет) аудит 2 : C1 0 + C2 0 + C3 85 + C4 0 + C5 0 + C6 0 = 85, общее количество находок 85 -> OK аудит 2 : результаты переданы в отчет 85, строк в файле результатов 85, отброшенных системой защиты 0 -> OK
Входные данные
| Входные данные | По умолчанию | Описание |
|---|---|---|
| Символы: пустое поле = символ графика, * = Market Watch, в остальных случаях — список, разделенный запятыми или точками с запятой | пусто | Символ, неизвестный терминалу, пропускается с одной строкой журнала на обычном уровне и не получает строку счетчика вообще, поэтому при повторном подсчете никогда не возникает ситуации, когда вывод данных по барам сопоставляется со строкой, в которой ничего не измерялось. |
| Период для проверки (0 = текущий период графика) | Текущий | Любой таймфрейм из списка. Проверка сетки отключается, начиная с D1 и выше, где открытия не приходятся на фиксированную секундную сетку, а проверка гэпов отключается на MN1, где расстояние между двумя открытиями не является постоянным. |
| Количество баров для проверки по каждому символу (закрытые бары, сначала самые новые) | 5000 | Только закрытые бары. Формирующийся бар по определению меняется и будет отмечен как дефект рынка, а не истории. |
| C1: проверка согласованности OHLC | true | максимум < минимум, цена открытия или закрытия за пределами диапазона самого бара, любая из четырёх цен равна нулю или ниже нуля. Одно нарушение на бар за каждый нарушенный предикат. |
| C2: проверка времени открытия баров (порядок, дубликаты, сетка) | true | Время, которое не увеличивается от одного бара к следующему, и время открытия, которое не является кратным периоду. |
| C3: проверка отсутствующих баров по отношению к сессиям котировок | true | Проверка, на основе которой формируется показатель в заголовке. Для неё требуется таблица сессий по символу; без неё пробелы отражаются как «неклассифицированные», а не как «объясненные». |
| C4: подсчёт пустых (без тиков) и плоских баров | true | tick_volume == 0, и open == high == low == close, содержащие тики. |
| C5: перестроить каждый бар из M1 и сравнить | true | Эта проверка ресурсоемкая, и стоит предупредить: на M15 с более чем 5 000 баров она занимает около секунды для пяти символов, но на W1 с 55-летней историей требует одного запроса M1 на каждые четыре бара и заняла более семи минут для четырёх символов, причём почти всё это время ушло на собственные запросы терминала к истории. Отключите эту функцию при первом проходе по длинной истории. |
| C5: игнорировать отклонения до такого количества пунктов | 0,0 | Допуск для брокера, чьи более высокие таймфреймы строятся с округлением. Значение 0 фиксирует каждое расхождение. |
| C6: помечать бары со спредом выше этого значения (0 = выключено) | 0 | Подсчитывает бары, превышающие предел. Независимо от того, установлен ли предел, в отчёте указываются количество баров с нулевым спредом, максимальный и средний спреды. |
| Журнал: пример результатов, выводимых при каждой проверке | 5 | Количество реальных строк каждого чека, которые печатаются полностью, чтобы в журнале отображались сами дефекты, а не только их количество. |
| Записывать по одной строке CSV на каждый результат проверки | true | Файл результатов проверки: одна строка на каждый дефект с указанием времени проверки, чтобы отчет можно было проверить, а не просто поверить ему на слово. |
| Также выгружайте каждый проверенный такт (для независимого пересчёта) | false | Записывает такты точно так, как их подавал терминал, плюс таблицу сеанса, что и делает возможным независимый пересчет. Отключение этой опции удаляет дамп предыдущего запуска, при этом на каждый файл приходится по одной строке журнала: дамп из 5 000 баров, расположенный рядом со строкой счетчика из 500 баров, — это именно тот незаметный неверный показатель, для выявления которого и существует данный инструмент. |
| Отобразить таблицу результатов на графике | true | В тестере без графического интерфейса эта опция отключается автоматически с записью в журнале вместо выдачи ошибки. |
| Угол панели | Левый верхний | Угол привязки таблицы. |
| Размер шрифта панели | 8 | Таблица шире, чем может отобразить одна метка диаграммы, поэтому она рисуется в виде нескольких столбцов меток; уменьшите размер при использовании небольшой диаграммы. |
| Смещение панели по оси X, пикселей | 10 | Положение. |
| Смещение панели по оси Y, пикселей | 18 | Положение. |
| Повторная проверка каждые N минут (0 = проверка один раз) | 0 | Для оставленного на графике. Используются собственные часы терминала, поэтому эта же настройка работает и в Тестере стратегий. |
Отчет
Все данные, измеренные инструментом, попадают в журнал одним блоком, и те же цифры экспортируются в CSV. Ниже приведён этот блок для прогона из таблицы выше, дословно, причём часть по символам показана только для XAUUSD — для остальных четырёх символов повторяются те же десять строк.
=== Аудитор целостности истории ============================================ символы: 5 (Market Watch) период: M15 баров на символ: 5000 (закрытые бары, сначала самые новые) проверки: C1 на C2 на C3 на C4 на C5 на C6 предел: 0 пунктов допуск C5: 0,00 пунктов количество примеров в журнале на каждую проверку: 5 обновление: один раз префикс файла: HistoryIntegrityAuditor\MarketWatch_M15_62879570657522_*.csv символ 1 из 5 : XAUUSD символ 2 из 5 : EURUSD символ 3 из 5 : BTCUSD символ 4 из 5 : GBPUSD символ 5 из 5: USDJPY =================================================================== HistoryIntegrityAuditor: прохождение 1 начинается с 5 символов, M15, время по серверу 02.10.2026 08:07:11 HistoryIntegrityAuditor: Пример C3_GAP 1 из 5: XAUUSD, бар M15, 17.07.2026 21:00:00, класс разрыва = объясненный, in_session = 0, 196 [... примеры со 2 по 5 той же проверки ...] === Аудитор целостности истории — результат 1-го прогона ======== Символ Бары Grid% Sess% OHLC Время Гэпы InSess Пустой Плоский M1bad SprHi XAUUSD 5000 68,10 99,80 0 0 55 10 0 0 0 - EURUSD 5000 72,25 100,00 0 0 10 0 0 0 0 - BTCUSD 5000 100,00 100,00 0 0 0 0 0 0 0 - GBPUSD 5000 72,25 100,00 0 0 10 0 0 0 0 - USDJPY 5000 72,25 100,00 0 0 10 0 0 0 0 - XAUUSD M15: 5000 баров с 17.07.2026 20:30:00 по 02.10.2026 07:45:00, 76,47 дней, 10 сессий, шаг 0,001, 0 открытий с отставанием от серверного времени XAUUSD M15: сессии котировок Вс 22:01–24:00 | Пн 00:00–20:58, 22:00–24:00 | вт. 00:00–20:58, 22:00–24:00 | ср. 00:00–20:58, 22:00–24:00 | Чт 00:00–20:58, 22:00–24:00 | Пт 00:00–20:58 XAUUSD M15: количество открытий в сетке 7342 = 5000 баров + пропущенные 2342, идентичность в норме, охват сетки 68,10%, охват сессии 99,80% XAUUSD M15: C1 включен, итого 0 (максимум < минимум 0, открытие > максимум 0, открытие < минимум 0, закрытие > максимум 0, закрытие < минимум 0, неположительные значения 0) XAUUSD M15: C2 включен, итого 0 (не растущие 0, вне сетки 0), шаги, не являющиеся целым числом периодов 0 XAUUSD M15: C3 включен, разрывы 55 (объясненные 54, необъясненные 1, неклассифицированные 0), пропущенные 2342, в сессии 10, неклассифицированные 0, самый большой разрыв 196 слотов после 17.07.2026 20:45:00 XAUUSD M15: C4 включен, пусто 0, плоский 0 XAUUSD M15: C5 включен, покрытие M1 с 23.06.2026 03:04:00 по 02.10.2026 08:07:00, сравнили 5000, несовпадений 0, окно пустое 0, вне покрытия 0, максимальное отклонение 0,0000 пунктов XAUUSD M15: C6 лимит выключен, спред равен нулю 0, выше лимита —, макс. 238 пунктов, среднее 175,1568 пунктов XAUUSD M15: результаты по данному символу 55 [... те же десять строк для EURUSD, BTCUSD, GBPUSD и USDJPY ...] символы: 5 проверено, 0 пропущено, итоги: баров 25000, отсутствующих 8102, в сессии 10, результатов 85, аудит 1: баров 25000 + отсутствующих 8102 = 33102, ожидаемых открытий 33102 -> OK аудит 1: ожидаемое количество открытий 33 102, количество открытий в сетке в проверенных интервалах 33 102 -> OK (5 символов OK, 0 — нет) аудит 2: C1 0 + C2 0 + C3 85 + C4 0 + C5 0 + C6 0 = 85, общее количество результатов проверки 85 -> OK проверка 2: результаты переданы в отчёт 85, строк в файле результатов 85, отброшенных системой защиты 0 -> OK обзор файла: HistoryIntegrityAuditor\MarketWatch_M15_62879570657522_overview.csv (5 строк) результаты проверки в файле: HistoryIntegrityAuditor\MarketWatch_M15_62879570657522_findings.csv (85 строк) сводка по файлам: 5 файлов, 5 строк; сеансы: 5 файлов, 35 строк; бары 5 файлов, 25000 строк; шаблон файла: HistoryIntegrityAuditor\MarketWatch_M15_62879570657522_<символ>_{summary,sessions,bars}.csv панель: 1452 × 294 пикселей, 16 меток, самая широкая строка — 119 символов ===================================================================
Обратите внимание на SprHi — в таблице и на значение выше предела — в строке C6. Предел спреда равен 0, что означает, что проверка отключена, поэтому в столбце печатается тире, а не ноль. Инструмент применяет это правило ко всем столбцам таблицы результатов и ко всем значениям в строках по символам: проверка, которая не запускалась, печатает «-», проверка, которая запускалась и ничего не обнаружила, печатает «0», и эти два символа никогда не совпадают. Это важнее, чем кажется — при отключенной проверке пробелов показатель охвата, рассчитанный как «бары» / («бары» + «пропущенные»), будет равен уверенным 100,00 %.
В результате прогона в папке MQL5\Files\HistoryIntegrityAuditor\ создаётся пять файлов:
- <префикс>_overview.csv — по одной строке на каждый символ из списка, включая символы, которые не удалось проверить, с указанием их статуса.
- <prefix>_findings.csv — по одной строке на каждый дефект: символ;период;проверка;индекс_бара;время_бара;поле;подробности;значение.
- <prefix>_<symbol>_summary.csv — все счетчики одного символа, 62 столбца, включая арифметическую идентичность.
- <prefix>_<symbol>_sessions.csv — сессии котировок символа в том виде, в котором их объявляет брокер; это входные данные, определяющие, объясняется ли разрыв.
- <prefix>_<symbol>_bars.csv — опционально, проверенные бары в том виде, в каком их предоставил терминал.
Именно последние два файла позволяют проверять отчёт с помощью других средств, помимо данного инструмента, что и является темой предыдущего раздела. Префикс содержит метку символа, таймфрейм и идентификатор графика, поэтому два графика не могут перезаписать данные друг друга, а запуск тестера записывает данные в собственную «песочницу» агента, а не в файлы реального запуска.
Как использовать
- Прикрепите файл к графику с символом и таймфреймом, на которых вы действительно проводите тестирование, установите количество баров не меньше диапазона, используемого в ваших бэктестах, и просмотрите журнал.
- Начните с показателей «Покрытие сессии » и «Пропуски в сессии». Эти два числа определяют, проводились ли ваши бэктесты на реальном рынке или на его приблизительной модели.
- Отсортируйте строки C3_GAP в файле результатов по часу в поле bar_time. Пробелы, сконцентрированные в один час дня, обычно указывают на проблему с сервером или сессией; равномерно распределенные пробелы, как правило, свидетельствуют о неполной загрузке данных.
- Нажмите «Обновить» в диалоговом окне «Символы» терминала (или удалите историю и дождитесь повторной загрузки) и запустите аудит заново. Разница между результатами двух прогонов — это то, чего не хватало локально в вашем терминале, а не то, чего не хватает у брокера.
- Включите перекрёстную проверку M1 для таймфрейма, на котором торгует ваш советник. Несоответствие, сохраняющееся после обновления истории, стоит обсудить с брокером: это означает, что две его собственные серии не совпадают.
- Запустите проверку заново после смены брокера, сервера или каких-либо настроек получения истории. Качество данных зависит от конкретного терминала в конкретный момент времени, а не от символа.
Ограничения, сказанные прямо
- Он проверяет историю, хранящуюся в вашем терминале, — именно ту историю, которую используют ваши тесты, — а не то, что сервер брокера ещё может отправить. Обновление истории может изменить все цифры здесь, и шаг 4 выше существует именно по этой причине.
- Пробел, который объясняют вызовы таблицы сеансов, всё равно может быть реальной лакуной, поскольку таблица сеансов также является отчётом брокера. Инструмент показывает обе цифры, чтобы эти два утверждения можно было сравнить, а не смешивать.
- Перекрестная проверка M1 может дать результат только в пределах, охватываемых историей M1. По замыслу она не учитывает более старые бары, а количество пропущенных окон отображается рядом с количеством, которое было подвергнуто сравнению.
- Данные тиков не подвергаются аудиту. Бэктесты на реальных тиках используют второй набор данных, имеющий собственные недостатки, и данный инструмент его не учитывает.
- Он предоставляет отчеты, но не исправляет ошибки. Ничто здесь не записывает данные в историю, и ни один обнаруженный факт сам по себе не доказывает вину брокера — терминал, который был отключен в течение часа, приводит к таким же пропущенным барам, как и остановка канала данных.
- Никаких торговых функций, никаких DLL, никакого доступа к сети, никаких внешних файлов: он считывает бары и записывает CSV-файлы в папку MQL5\Files.
Перевод с английского произведен MetaQuotes Ltd.
Оригинальная публикация: https://www.mql5.com/en/code/77919
Mirror Hedge EA (Same terminal and account only)
Зеркально копирует сделки, открытые, измененные и закрытые другим советником на том же хеджирующем счете, выбранном по «магическому номеру». По умолчанию он меняет направление (Покупка ↔ Продажа, SL ↔ TP), что позволяет проводить форвард-тестирование стратегии в обратном направлении с учетом реальных спредов, проскальзывания и исполнения.
Alpha Engine: Intrinsic-Time Coastline Trader
Портированная версия движка Alpha Engine группы Олсена: восемь агентов, работающих с лимитными ордерами, торгуют изменениями направления движения в «внутреннем времени» на хеджирующем счете. Они увеличивают позиции при переходе цены за уровень и сокращают их при получении прибыли на разворотах.
WaveMaster Pro EA
Автоматизация на основе сигналов для осциллографа WaveMaster. Механизм автоматического выполнения для осциллографа WaveMaster. Считывает буферы сигналов в режиме реального времени. Встроенные функции полного управления рисками, трейлинг и установка уровня безубыточности.
Closed Trades Exporter MAE MFE
Функция экспорта сохраняет данные по сделкам в файл CSV с указанием максимального неблагоприятного отклонения (MAE) и максимального благоприятного отклонения (MFE) в пунктах и денежном выражении, рассчитанных на основе истории M1, а также с указанием процента от доступного колебания, который была зафиксирована каждой сделкой.