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

Примеры: ZigZag(12,5,3) на XAUUSD M1. Снимок панели сделан на 1 ч 25 мин 12 с работы, за 87 секунд до остановки, поэтому итоговые значения в таблице ниже немного выше. Для скриншота цвета панели были установлены как «чёрный на белом»; по умолчанию используется светлый текст на тёмной панели.
Проблема
«Отсутствие перерисовки» — это самое частое утверждение в описаниях индикаторов и то, которое сложнее всего проверить. Обычный тест заключается в том, чтобы посмотреть на график, запомнить примерно, где находились стрелки, перезагрузить индикатор и посмотреть снова. Этот тест упускает два случая, которые на самом деле обходятся в деньги.
Первый — это изменение значения на баре, закрывшемся некоторое время назад, при том что график остаётся открытым. Глаз этого не замечает: стрелка сдвигается на несколько пикселей или исчезает, пока внимание сосредоточено на правом крае графика.
Второй случай — это индикатор, который ведет себя определенным образом, пока он активен, но после перезагрузки публикует иную историю данных, что как раз и происходит при смене таймфрейма, перезапуске терминала или открытии нового графика.
Оба явления поддаются измерению. Нужно что-то, что записывает данные, опубликованные индикатором при первом обновлении, а затем постоянно проверяет их.
Что измеряется
- Бар идентифицируется по времени открытия, а не по его смещению, поэтому новые бары, прокрутка и обновление истории не могут быть ошибочно приняты за изменение.
- Сравниваются только закрытые бары, со сдвигом 1 и выше. Бар, который ещё формируется, по определению изменяется и ничего не говорит о перерисовке.
- Первое значение, зафиксированное для закрытого бара, становится эталоном. Каждое последующее значение сравнивается с предыдущим, что регистрируется как событие, а также с первым значением, что позволяет измерить отклонение.
- Три вида событий учитываются отдельно, поскольку они не одинаково негативны:
- «Изменилось» — значение сменилось на другое.
- Появилось — пустое место получило значение, то есть сигнал материализовался на уже закрытом баре.
- Исчез — опубликованное значение было удалено. Это самый плохой вид: сигнал, на который реагировал трейдер, больше отсутствует в истории, которую видит следующий читатель.
- Ключевым показателем является MaxShift — максимальное смещение, при котором когда-либо наблюдалось какое-либо событие. Индикатор, который перерисовывает только последний закрытый бар, — это совсем не то же самое, что индикатор, переписывающий пятнадцать баров истории.
- Каждое событие записывается в файл CSV с указанием времени бара, буфера, сдвига при обнаружении, а также старого и нового значения, чтобы отчет можно было проверить, а не просто поверить ему на слово.
- Тестируемый индикатор создается с помощью IndicatorCreate на основе проанализированного списка параметров, поэтому любой пользовательский индикатор можно проверить без редактирования или перекомпиляции. Проанализированные параметры выводятся в журнал при запуске, что позволяет обнаружить неверный список параметров, а не игнорировать его.
- По желанию дескриптор освобождается и создаётся заново каждые N минут. Записанная история намеренно не сбрасывается, поэтому запуск также фиксирует индикатор, который не генерирует сигналов в течение всего времени своего существования и публикует иную историю после перезагрузки.
- Проверка отбрасывается и считается пропущенной, а не доказательством, если дескриптор индикатора ещё не существует, индикатор ещё не рассчитан, количество закрытых баров меньше, чем запрашиваемая глубина, буфер не может быть скопирован или ряд данных смещается между моментами считывания времени и считывания значений.
При этом возникает следующий эффект: значение, существующее в течение времени, меньшего, чем интервал проверки, может быть пропущено. Это реальное ограничение, и его оценка приведена ниже.
Пример измерения
Во всех примерах ниже используются индикаторы, входящие в состав терминала, поэтому любой желающий может их повторить.
В реальном времени, XAUUSD M1, 1 час 26 минут
Четыре экземпляра на четырёх графиках одного и того же терминала с одним и тем же источником данных, 30.09.2026 с 02:19 до 03:46 по серверному времени, проанализировано 300 закрытых баров, одна проверка в секунду.
| Тестируемый индикатор | Буфер | Сравнения | Изменено | Появился | Исчез | MaxShift | Вердикт |
|---|---|---|---|---|---|---|---|
| Примеры\ZigZag (12,5,3) | 0 | 1 315 713 | 0 | 0 | 17 | 15 | ПЕРЕРИСОВКИ |
| Примеры\Зигзаг (12,5,3) | 1 | 1 315 713 | 0 | 0 | 3 | 1 | ПЕРЕРИСОВКИ |
| Примеры\Зигзаг (12,5,3) | 2 | 1 315 713 | 0 | 0 | 10 | 3 | ПЕРЕРИСОВКИ |
| Примеры\Пользовательская скользящая средняя (13,0,2) | 0 | 1 305 513 | 0 | 0 | 0 | - | СТАБИЛЬНО |
| Примеры\Фракталы, позднее подтверждение | 0 | 1 303 713 | 0 | 13 | 0 | 3 | ПЕРЕКРАСКИ |
| Примеры\Фракталы, позднее подтверждение | 1 | 1 303 713 | 0 | 12 | 0 | 3 | ПЕРЕРИСОВКИ |
4387, 4353 и 4347 проверок соответственно, 0 / 0 / 1 пропущенных проверок, 0 пересинхронизаций, 0 перезагрузок дескрипторов. Файлы событий содержат 30, 0 и 25 строк, что в каждом случае соответствует сумме трех столбцов событий.
Числа сравнений не являются круглыми и не должны ими быть: во время выполнения открылось 87 новых баров M1, а у только что открывшегося бара ещё нет истории закрытых баров. Для каждого экземпляра выражение (проверки — 1) × 300 — 87 точно воспроизводит указанное число сравнений.
Три разных сигнатуры в одной таблице:
- ZigZag удаляет своё собственное прошлое. 17 значений были удалены из буфера ZigZag, отображаемого на графике, одно из них — через 15 баров после закрытия этого бара, и ещё 13 — из двух буферов расчёта, расположенных позади него. Ничего не сдвинулось: экстремум ZigZag — это максимум или минимум соответствующего бара, и он не может смещаться, поэтому он удаляется и повторно публикуется в другом месте. Именно поэтому события исчезают, а столбец «дельта» остаётся пустым.
- Скользящее среднее по закрытым барам не сдвигается. 1 305 513 сравнений — ни одного события.
- Фракталы — это третий случай, и инструмент отделяет его от первого. 25 событий, все из них «Появились», ни одно не «Изменилось», ни одно не «Исчезло», все со сдвигом 3. Это не перерисовка, а запоздалое подтверждение: фракталу требуется ещё два бара, прежде чем его можно будет нарисовать, поэтому значение законно появляется на три бара назад и затем остаётся. В столбце «Вердикт» по-прежнему указано «REPAINTS», поскольку инструмент сообщает о том, что он увидел, а суждение оставляет за читателем. Индикатор, все события которого «Появились» в одном фиксированном сдвиге, можно использовать с этой встроенной задержкой; индикатор, события которого «Исчезли» в разбросанных по времени сдвигах, — нет.
Тестер стратегий, тот же расчет за десять секунд
Примеры\ZigZag(12,5,3), XAUUSD M1, с 28.09.2026 по 29.09.2026, 1-минутное моделирование OHLC, проанализировано 300 закрытых баров:
| счётчик | значение |
|---|---|
| вердикт | ПЕРЕРИСОВКИ |
| проверки | 5 512 |
| сравнений по закрытым столбцам | 1 651 923 |
| изменились / появились / исчезли | 0 / 3 / 342 |
| уникальных столбцов, у которых исчезло значение | 341 |
| уникальных столбцов, в которых произошло хотя бы одно событие | 343 |
| MaxShift | 28 |
| пропущенные проверки / повторные синхронизации | 0 / 0 |
| строки CSV | 345 (= 342 + 3) |
За один торговый день индикатор ZigZag удалил 342 значения, которые он уже опубликовал на барах, закрытых на тот момент, и одно из этих удалений произошло через 28 баров после закрытия рассматриваемого бара. Три значения появились на уже закрытых свечах. Только одно из этих трех было возвращённым значением: свеча 17:06 потеряла 4126,184, получила точно такое же число обратно двадцать секунд спустя и снова потеряла его через минуту после этого. Именно поэтому значение Max |delta| для данного прогона равно 0,00000000; это измерение, а не разрыв.

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

Примеры\Пользовательская скользящая средняя (13,0,2), тот же символ и то же окно прогона, что и у индикатора ZigZag выше: 1 291 114 сравнений на момент создания скриншота и ни одного изменившегося значения. Количество сравнений специально отображается рядом с вердиктом — значение «СТАБИЛЬНО» имеет смысл только в совокупности с цифрой, стоящей рядом.
Что меняет параметр «Рассматривать 0,0 как отсутствие значения» и насколько велик разрыв в выборке
Четвёртая копия запускала тот же ZigZag с отключенным этим параметром, поэтому 0,0 считается обычным значением: 1 308 513 сравнений, 18 + 3 + 11 = 32 события, все из них с изменением, тот же MaxShift, равный 15, и Max |delta|, равный 4184,08800000 в главном буфере. Это число является «золотым стандартом», поскольку «изменение» представляет собой замену пика на 0,0. Обе настройки описывают одну и ту же перерисовку; настройка по умолчанию называет её правильно.
Обе копии видели не совсем один и тот же список, и об этом стоит знать. Четвёртая копия зарегистрировала два события, которые пропустила первая: бар 03:32:00 в буферах 0 и 2, обнаруженный в 03:33:01. Две копии запустились с разницей в 14 секунд, и значение существовало менее одного интервала проверки, поэтому одна из них его зафиксировала, а другая — нет. При интервале в одну секунду на M1 это и является разрешением инструмента.

Тот же самый показатель ZigZag со значением 0,0 учитывался как значение. Каждое удаление теперь отображается как «Изменено» с дельтой, равной величине цены. Полезно для перекрестной проверки, но вводит в заблуждение как описание.
Проверка цифр
Счётчики тоже не принимались на веру. Независимая переработка Examples\ZigZag на Python, запущенная на необработанных свечах, полученных из терминала, была сопоставлена с файлами событий:
- Реальный запуск: для каждого из 17 баров, где на графике буфер потерял значение, это значение отсутствует в сегодняшнем воспроизведении, и для всех 17 последнее показание инструмента равно воспроизведённому значению.
- Запуск тестера: 343 бара с событиями, те же две проверки, никаких несоответствий — 341 утраченное значение отсутствует в воспроизведении, и 343 из 343 последних показаний равны ему.
Входные данные
| Входные данные | По умолчанию | Описание |
|---|---|---|
| Индикатор для проверки (пользовательский путь, без .ex5; пример: Examples\ZigZag) | пусто | Путь к пользовательскому индикатору относительно папки MQL5\Indicators без расширения, точно так, как этого ожидает iCustom. Пустое поле указано намеренно: если поле не заполнено, инструмент сообщает об этом в журнале и на панели и ничего не измеряет, вместо того чтобы указывать на индикатор, которого может не быть на вашем терминале. Если путь указан неверно на реальном графике, инструмент остается прикрепленным и повторяет попытку каждые 30 секунд, поэтому вводные данные можно исправить, не удаляя его. Измерение на XAUUSD M1 с неверным путем: инструмент один раз выдал код ошибки, терминал добавлял свою строку «не удается загрузить» при каждой попытке (с интервалом 30,4 и 30,7 секунд), а исправление пути запустило измерение без отсоединения чего-либо. |
| Параметры, разделенные запятыми (пустое значение = значения по умолчанию индикатора) | пусто | Список входных данных тестируемого индикатора, например 12,5,3. Каждый элемент типизируется по своему содержанию: true и false становятся bool, число, содержащее точку или экспоненту, становится double, простое число становится int, всё остальное становится строкой, а кавычки удаляются. Проанализированный список выводится в журнал в начале, поэтому неверный список сразу же становится видимым. Пустое значение означает, что индикатор работает со своими собственными значениями по умолчанию. |
| Количество буферов для мониторинга (1..32) | 1 | Количество считываемых буферов. В число учитываются также буферы расчётов. Отсутствие буфера, которого нет у индикатора, приводит к сбою всей проверки: это считается пропущенной проверкой, и первые несколько таких случаев записываются в журнал с кодом ошибки, чтобы это было заметно, а не осталось незамеченным. |
| Символ (пустое значение = символ графика) | пусто | Проверить индикатор на другом символе, не открывая его график. |
| Таймфрейм | Текущий | Просмотреть индикатор на другом таймфрейме. |
| Наблюдаемые закрытые свечи (сдвиг 1..N) | 300 | Глубина проверки. Количество баров, умноженное на количество буферов, ограничено 200 000 слотами; при превышении этого значения глубина уменьшается, и в журнал записывается одна строка. |
| Минимальное время в секундах между проверками, моделируемое время в тестере (0 = каждый тик) | 1 | Регулировка. Интервал в одну секунду позволяет уловить любое обновление, на которое может отреагировать человек, и требует гораздо меньших затрат процессорного времени, чем проверка при каждом тике, однако значение, существующее в течение времени, меньшего, чем этот интервал, может быть пропущено. В Strategy Tester вместо реального времени используются моделируемые часы, поэтому там действует та же настройка. |
| Игнорировать |изменения|, меньшие, чем это значение (0 = учитывать каждое изменение) | 0,0 | Абсолютный допуск в единицах буфера для индикатора, который пересчитывается на основе чисел с плавающей запятой и имеет колебания в последних разрядах. Значение 0 учитывает каждое отличие. Изменение, не превышающее допуска, не фиксируется вообще — ни события, ни строки в CSV, ни вклада в Max |delta|. |
| Рассматривать 0,0 как «отсутствие значения» (буферы типа arrow/ZigZag) | true | Многие сигнальные индикаторы публикуют 0,0 вместо EMPTY_VALUE для обозначения «отсутствия сигнала». Если этот параметр включен, 0,0 считается пустым значением, и такие события регистрируются как «Появилось» и «Исчезло». Отключите его для буфера, в котором точно ноль является допустимым значением. |
| Пересоздавать дескриптор индикатора каждые N минут (0 = никогда) | 0 | Освобождает дескриптор и запрашивает у терминала новый, что запускает полный перерасчет, если только другая программа не удерживает тот же индикатор с теми же параметрами. Записанная история не очищается, поэтому именно это позволяет уловить индикатор, который ведет себя стабильно во время работы, но по-разному после перезагрузки. |
| Прекратить измерение через N минут (0 = работать до удаления) | 0 | Прекращает измерение и фиксирует отчёт, что удобно для автозапуска. |
| Записывать каждое событие в папку MQL5\Files (CSV) | true | Файл событий. |
| Имя файла CSV (пустое значение = автоматический выбор) | пусто | Автоматические имена формируются на основе символа, таймфрейма и времени начала. Если файл с таким именем в данный момент открыт, поскольку в той же минуте запущена другая копия, добавляется числовой суффикс вместо того, чтобы копия работала без файла вообще. Закрытый файл с таким же именем, оставшийся от предыдущего запуска в той же минуте, будет перезаписан, поэтому указывайте собственное имя, если результат запуска важен. |
| Прекратить запись после этого количества строк | 100000 | Защита от индикатора, который перерисовывается при каждом тике. Подсчёт продолжается после достижения предела; просто файл перестаёт расти, и об этом сообщается одной строкой в журнале. |
| Показать панель отчёта на графике | true | Отключите её для автозапуска или тестирования. |
| Расстояние до панели X, пикселей при разрешении 96 dpi | 12 | Положение. Панель масштабируется в зависимости от разрешения экрана (dpi). |
| Расстояние по оси Y панели, пикселей при разрешении 96 dpi | 20 | Положение. |
| Размер шрифта, в пунктах (4 и более; панель масштабируется в зависимости от разрешения экрана) | 9 | Панель представляет собой таблицу, набранную моноширинным шрифтом. Уменьшите размер шрифта на экране с высоким dpi или в небольшой диаграмме; на скриншотах выше используется размер 4. |
| Угол панели | Левый верхний | Угол привязки. |
| Цвет фона панели | темно-серый | Цвета панели. По одной копии на график, как и для любого советника; на нескольких графиках могут одновременно работать несколько копий. |
| Цвет рамки панели | темно-серый | |
| Цвет текста панели | светло-серый | |
| Цвет заголовка, когда все буферы стабильны | салатово-зелёный | |
| Цвет заголовка, когда буфер перерисовывается | томатный |
Отчет
Это блок сводки, который инструмент вывел в журнал при остановке приведенного выше реального запуска ZigZag; текст скопирован дословно. Панель на графике показывает ту же таблицу, при этом время работы выровнено по правому краю:
=== Сводка Repaint Inspector ===================================== Repaint Inspector Examples\ZigZag (12,5,3) XAUUSD M1 Проанализировано 300 закрытых баров Время работы: 01:26:39 проверок 4 387 пропущенных 0 пересинхронизаций 0 обработка перезагрузок 0 Буфер Вердикт Сравнения Изменилось Появилось Исчезло MaxShift Max |delta| 0 ПЕРЕРИСОВКИ 1 315 713 0 0 17 15 - 1 ПЕРЕРИСОВКИ 1 315 713 0 0 3 1 - 2 REPAINTS 1 315 713 0 0 10 3 - CSV: RepaintInspector_XAUUSD_M1_20260930_0219.csv (30 строк) запущено 30.09.2026 в 02:19:31 по серверному времени, 4387 проверок, 0 пропущенных, 0 повторных синхронизаций, 0 перезагрузок обработчика всего событий 30, строк в CSV 30 буфер 0: REPAINTS, сравнений 1315713, изменений 0, появлений 0, исчезновений 17, затронутых баров 17 буфер 0: максимальный сдвиг 15 (ИСЧЕЗНУЛО на баре 30.09.2026 02:59) буфер 0: максимальное |delta| отсутствует буфер 0: первое событие 30.09.2026 02:23:02, последнее событие 30.09.2026 03:46:03
Файл событий в папке MQL5\Files содержит по одной строке на каждое событие:
detect_time;bar_time;shift_at_detect;buffer;event;old_value;new_value;delta;drift_from_first;after_reload 28.09.2026 17:11:20;28.09.2026 17:06:00;5;0;VANISHED;4126.18400000;EMPTY;;;0
Пустое значение записывается как EMPTY, а неопределённая разница оставляется пустой, чтобы читатель не мог принять отсутствующее число за ноль. Второй файл, <name>_summary.csv, содержит по одной строке на каждый буфер со всеми счетчиками, а также индикатором, его параметрами, символом, таймфреймом и глубиной; он обновляется каждые 15 секунд во время работы, так что цифры можно пересчитать из файла событий без разбора журнала. Журнал получает стартовый блок, первые 20 событий в полном объёме и приведённую выше сводку при удалении инструмента.
Как этим пользоваться
- Поместите индикатор, который хотите проверить, в папку MQL5\Indicators и запишите список его параметров.
- Прикрепите Repaint Inspector к графику того символа и таймфрейма, на которых вы действительно торгуете, введите путь и параметры, а также установите количество буферов.
- Дайте ему поработать в течение часов, когда вы торгуете. Перерисовка — это свойство рыночной активности, а не времени суток, и тихий воскресный вечер ничего не доказывает.
- Сначала ознакомьтесь с параметром MaxShift, затем с распределением между «Changed», «Appeared» и «Vanished», после чего откройте файл CSV и просмотрите несколько строк.
- Если индикатор пройдет эту проверку, установите перезагрузку ручки на 30 минут и запустите его снова.
Ограничения, изложенные прямо
- Индикатор не может доказать отсутствие перерисовки. Он может лишь не обнаружить её за измеряемый период, поэтому рядом с каждым результатом указано количество сравнений.
- Он производит выборку с заданным интервалом проверки. Значение, которое появляется и исчезает в пределах одного интервала, может быть пропущено, и приведенное выше измерение показывает, что это происходит дважды за полтора часа.
- Он измеряет то, что индикатор публикует через свои буферы. Индикатор, который рисует объекты на графике вместо заполнения буферов, для него невидим.
- Тестер стратегий полезен в данном случае, поскольку он сжимает сутки до секунд, но перерисовка в тестере и перерисовка в реальном времени не всегда совпадают. Если результат имеет значение, запускайте тест в реальном времени.
- В Тестере стратегий тестируемый индикатор должен быть подключен и скомпилирован до начала запуска. Тестер рассматривает сбой в вызове IndicatorCreate как критическую ошибку и выгружает эксперта, и никакая обработка ошибок внутри инструмента не может это изменить: при измерении с намеренно неправильным путем создание дескриптора в OnInit приводит к «ошибке создания индикатора», а затем к «критической ошибке OnInit», а создание его при первой проверке вместо этого дает те же шесть записей об ошибках, заканчивающихся «критической ошибкой OnTester». На реальном графике тот же неверный путь не является фатальным: инструмент остался подключенным и повторил попытку, а исправленный путь начал измерение на месте.
- Это ничего не говорит о том, является ли индикатор прибыльным. Индикатор без перерисовки всё равно может оказаться бесполезным, а некоторые индикаторы с перерисовкой используются целенаправленно и правильно.
- Не требует торговых функций, DLL, доступа к сети или внешних файлов. Он считывает буферы и записывает CSV-файлы в папку MQL5\Files.
Перевод с английского произведен MetaQuotes Ltd.
Оригинальная публикация: https://www.mql5.com/en/code/77842
ATS Liquidity City - liquidity pools and sweeps, drawn as a neon city
Показывает, где, вероятно, находятся стопы, и какие из них только что были сработаны. Пул ликвидности = подтверждённые максимумы и минимумы колебаний, которые цена ещё не пробила, равные максимумы/минимумы (более крупный пул) и вчерашние максимум и минимум. Когда ценовой бар выходит за пределы пула, он помечается как «пройденный», а если этот же бар закрывается обратно внутри пула — как «захваченный и отклоненный». Без перерисовки: свинг учитывается только после N закрытых баров с каждой стороны. Панель представляет собой город с неоновыми вывесками, нарисованный на CCanvas: цена — это летающий автомобиль, стоп-ордера на продажу — башни под ним, стоп-ордера на покупку — плавучие платформы над ним, вчерашние уровни — золотые рекламные щиты, прожектор прочесывает небо, а бегущая строка отображает сегодняшний улов. Два буфера предоставляют ближайший активный пул выше и ниже для использования в советнике. Только индикатор: он никогда не торгует.
Symbol Spec Auditor
Панель диаграмм, на которой отображаются подробные характеристики контракта, определяющие размер позиции и торговые издержки (стоимость пункта, стоимость спреда, маржа, своп, правила исполнения) в валюте счета, предупреждает о настройках брокера, которые незаметно нарушают правила определения размера лота, а также экспортирует отчет по каждому символу из панели «Market Watch» в формат CSV.
YURAZ_RSAXEL Скрипт рисует уровни Рудолфа Акселя
Скрипт рисует уровни Рудолфа Акселя
YURAZ_MCCH
Индикатор рассчитывает % роста или падения относительно CLOSE, написан с применением ООП, и легко интегрируется в любой советник или иной индикатор.