Смотри, как бесплатно скачать роботов
Ищи нас в Telegram!
Ставь лайки и следи за новостями
Интересный скрипт?
Поставь на него ссылку - пусть другие тоже оценят
Понравился скрипт?
Оцени его работу в терминале MetaTrader 5
Советники

Repaint Inspector - эксперт для MetaTrader 5

Quoc Dat Quach
Quoc Dat Quach
Software engineer with 8 years in fintech and mobile, writing MQL4/MQL5 since 2017. I build Expert Advisors, indicators, trade and risk-management panels and utilities for MT4/MT5, and I trade forex and gold on MT5 myself.
| Russian English 中文 Español Deutsch 日本語 Português 한국어 Français Italiano Türkçe
Просмотров:
19
Рейтинг:
(1)
Опубликован:
MQL5 Фриланс Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу

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

repaint-inspector-zigzag-panel

Примеры: 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)01 315 713001715ПЕРЕРИСОВКИ
Примеры\Зигзаг (12,5,3)11 315 7130031ПЕРЕРИСОВКИ
Примеры\Зигзаг (12,5,3)21 315 71300103ПЕРЕРИСОВКИ
Примеры\Пользовательская скользящая средняя (13,0,2)01 305 513000-СТАБИЛЬНО
Примеры\Фракталы, позднее подтверждение01 303 71301303ПЕРЕКРАСКИ
Примеры\Фракталы, позднее подтверждение11 303 71301203ПЕРЕРИСОВКИ

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
MaxShift28
пропущенные проверки / повторные синхронизации0 / 0
строки CSV345 (= 342 + 3)

За один торговый день индикатор ZigZag удалил 342 значения, которые он уже опубликовал на барах, закрытых на тот момент, и одно из этих удалений произошло через 28 баров после закрытия рассматриваемого бара. Три значения появились на уже закрытых свечах. Только одно из этих трех было возвращённым значением: свеча 17:06 потеряла 4126,184, получила точно такое же число обратно двадцать секунд спустя и снова потеряла его через минуту после этого. Именно поэтому значение Max |delta| для данного прогона равно 0,00000000; это измерение, а не разрыв.

перерисовка-инспектор-зигзагообразные-сдвиги

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

repaint-inspector-stable-panel

Примеры\Пользовательская скользящая средняя (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 это и является разрешением инструмента.

repaint-inspector-delta-panel

Тот же самый показатель 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 dpi12Положение. Панель масштабируется в зависимости от разрешения экрана (dpi).
Расстояние по оси Y панели, пикселей при разрешении 96 dpi20Положение.
Размер шрифта, в пунктах (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 событий в полном объёме и приведённую выше сводку при удалении инструмента.

Как этим пользоваться

  1. Поместите индикатор, который хотите проверить, в папку MQL5\Indicators и запишите список его параметров.
  2. Прикрепите Repaint Inspector к графику того символа и таймфрейма, на которых вы действительно торгуете, введите путь и параметры, а также установите количество буферов.
  3. Дайте ему поработать в течение часов, когда вы торгуете. Перерисовка — это свойство рыночной активности, а не времени суток, и тихий воскресный вечер ничего не доказывает.
  4. Сначала ознакомьтесь с параметром MaxShift, затем с распределением между «Changed», «Appeared» и «Vanished», после чего откройте файл CSV и просмотрите несколько строк.
  5. Если индикатор пройдет эту проверку, установите перезагрузку ручки на 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 ATS Liquidity City - liquidity pools and sweeps, drawn as a neon city

Показывает, где, вероятно, находятся стопы, и какие из них только что были сработаны. Пул ликвидности = подтверждённые максимумы и минимумы колебаний, которые цена ещё не пробила, равные максимумы/минимумы (более крупный пул) и вчерашние максимум и минимум. Когда ценовой бар выходит за пределы пула, он помечается как «пройденный», а если этот же бар закрывается обратно внутри пула — как «захваченный и отклоненный». Без перерисовки: свинг учитывается только после N закрытых баров с каждой стороны. Панель представляет собой город с неоновыми вывесками, нарисованный на CCanvas: цена — это летающий автомобиль, стоп-ордера на продажу — башни под ним, стоп-ордера на покупку — плавучие платформы над ним, вчерашние уровни — золотые рекламные щиты, прожектор прочесывает небо, а бегущая строка отображает сегодняшний улов. Два буфера предоставляют ближайший активный пул выше и ниже для использования в советнике. Только индикатор: он никогда не торгует.

Symbol Spec Auditor Symbol Spec Auditor

Панель диаграмм, на которой отображаются подробные характеристики контракта, определяющие размер позиции и торговые издержки (стоимость пункта, стоимость спреда, маржа, своп, правила исполнения) в валюте счета, предупреждает о настройках брокера, которые незаметно нарушают правила определения размера лота, а также экспортирует отчет по каждому символу из панели «Market Watch» в формат CSV.

YURAZ_RSAXEL Скрипт рисует уровни Рудолфа Акселя YURAZ_RSAXEL Скрипт рисует уровни Рудолфа Акселя

Скрипт рисует уровни Рудолфа Акселя

YURAZ_MCCH YURAZ_MCCH

Индикатор рассчитывает % роста или падения относительно CLOSE, написан с применением ООП, и легко интегрируется в любой советник или иной индикатор.