Советник работает только в визуальном тестере MT5: что проверить
Если советник EA работает только при визуальном тестировании в MT5, сначала выясните, откуда он берет входные значения: из данных расчета или из нарисованного объекта. Линия на экране не должна незаметно заменять явное значение сигнала. До изменения стратегии сопоставьте режим, версии, данные и первую разницу в журнале. Пример ниже не запускает MT5 и не размещает сделок: он показывает, почему отсутствие значения нужно отличать от числа ноль.
Чем отличается визуальный режим
В документации тестера MQL5 описано ограничение графических объектов: при тестировании и оптимизации вне визуального режима они не отображаются, а обращения к свойствам созданного объекта возвращают нулевые значения. Для визуального режима указано исключение. Это документированное поведение платформы, а не результат нашего опыта с вашим советником. Из него не следует, что все расхождения тестов имеют одну причину.
Если программа читает цену линии или состояние кнопки, отметьте это как отдельный источник входа. Сначала установите, существует ли ожидаемое значение в выбранном режиме и успешна ли конкретная операция. Статус недоступности может приостановить расчет до того, как технический ноль будет принят за цену. Само наличие видимого графика не доказывает готовность всех данных стратегии.
Как отделить число от объекта на графике
Зададим положительный сигнал 1.1050 и порог 1.1040. Правило — «сигнал строго больше порога». Это условные значения, а не котировки или журнал MT5. В числовом пути сравнение дает true, то есть условие выполнено. В другом пути чтение объекта объявлено недоступным: наша учебная модель обозначает это null и не вычисляет условие.
Нет данных — не значит нулевая цена
| Путь | Вход | Результат |
|---|---|---|
| Явно заданный сигнал | 1.1050 | 1.1050 > 1.1040: true, условие выполнено. |
| Недоступное чтение объекта | null: значения нет | unknown: условие не оценивается. |
| Ошибочная подстановка | 0 вместо отсутствия значения | 0 > 1.1040: false, внешне обычный отрицательный результат. |
Последняя строка показывает ошибочную версию, а не поведение защищенного расчета. Ноль — число; null — выбранное здесь обозначение отсутствия входа. При обратном условии «сигнал ниже порога» подставленный ноль даже создает видимость выполненного условия. Исправление не должно незаметно подставлять произвольное или прежнее значение.
Проверяемый пример без подключения к счету
Для самостоятельной проверки используйте явно заданные положительные конечные числа с десятичной точкой в диапазоне 10⁻⁸–10⁸, до 15 цифр. Исходные значения: сигнал 1.1050, порог 1.1040. В условном невизуальном режиме объект недоступен; в условном визуальном он несет то же значение сигнала. Это правила учебной модели, а не имитация всех операций MQL5.
При равных значениях 1.1040 и 1.1040 числовой путь дает false — строгое «больше» не выполнено. Недоступный объект при этом остается null с результатом unknown. В условном визуальном режиме доступный объект также дает false. Этот разбор можно выполнить без JavaScript, торгового счета, пароля и реальных заявок. Пример не читает график и не устанавливает причину сбоя конкретного EA.
Как записать режим без торговли
Флаги MQL_TESTER, MQL_VISUAL_MODE и MQL_OPTIMIZATION описывают среду выполнения программы. TERMINAL_BUILD сообщает номер сборки терминала. Сохраняйте реальные показания, а не определяйте режим по внешнему виду окна. Одни флаги еще не доказывают равенство входных данных и параметров двух запусков.
Ниже сохранен отдельный диагностический пример MQL5: он записывает конфигурацию в OnInit, а его OnTick пуст. Он не вычисляет торговый сигнал, не отправляет и не меняет ордера, не управляет открытыми позициями. Сохраните отдельный файл MQ5 и скомпилируйте его в собственном MetaEditor. Здесь проверены текст и назначение фрагмента по документации; запуск и компиляция в MT5 не заявляются.
#property strict
int OnInit()
{
PrintFormat("tester=%d visual=%d optimization=%d build=%d symbol=%s period=%d",
(int)MQLInfoInteger(MQL_TESTER),
(int)MQLInfoInteger(MQL_VISUAL_MODE),
(int)MQLInfoInteger(MQL_OPTIMIZATION),
(int)TerminalInfoInteger(TERMINAL_BUILD),
_Symbol, (int)_Period);
return INIT_SUCCEEDED;
}
void OnTick() {}
Не добавляйте второй OnInit в существующий советник и не заменяйте его инициализацию этим примером. Диагностический вывод должен сохранять прежний порядок работы. Общая страница PrintFormat сообщает об ограничении при оптимизации; раздел документации тестера уточняет исключение для OnInit. Отсутствие сообщений из других этапов не доказывает, что эти этапы не выполнялись.
Как найти первую разницу, а не сравнивать только прибыль
Составьте парную запись запусков: визуальный или невизуальный режим, версии терминала и кода, параметры, символ и период графика, способ получения тиков, запрошенное и фактическое начало, снимок данных, расходы и исходное состояние. Сохраните файлы настроек и идентификаторы версий. Если эти сведения различаются, нельзя приписать весь результат наличию окна графика. Сопоставление двух тестов на английском помогает организовать запись.
Ищите первый этап с различием: успех получения записи, ее время, готовность индикатора, сигнал, условие или решение. Сообщение «прибыль 120 вместо 80» не называет этот этап. Сохраните оригиналы журналов и сделайте рядом небольшую таблицу. Нельзя дописывать в прошлый журнал значения, которых программа тогда не сохраняла.
Для сопоставления нужны устойчивый идентификатор наблюдения, запрошенный вход и его время либо номер в последовательности. Фиксируйте также, принят ли вход программой. Иначе одинаковые цены легко принять за одно событие. Бесконечный журнал без способа связать записи может скрыть первую разницу; сама регистрация еще не выявляет все зависимости автоматически.
Дополнительный пример: разные статусы при похожем итоге
Пусть в трех независимых наблюдениях с порогом 1.1040 получены: №17 — вход недоступен; №18 — доступно 1.1040; №19 — доступно 1.1050. Корректная последовательность оценок: unknown, false, true. Имеются два оцененных условия: одно выполнено и одно нет; первое не входит в число оцененных. После ошибочной замены пропуска нулем получится false, false, true. Число true осталось одним, но состояние уже расходится в записи №17. Доля выполненных среди действительно оцененных — 1/2, а не 1/3 от всех наблюдений. Это только учет заданных проверок, не вероятность успеха и не торговая статистика.
Как изменить устройство сигнала
Расчет должен возвращать явное значение вместе со статусом доступности; графический слой может отображать его. Тогда отключение рисования не обязано намеренно менять источник расчета. Проверьте модуль на контролируемых входах: обычное число, равенство порогу и отсутствие значения. Устранение одной зависимости от рисования не гарантирует совпадения всего теста: версии, данные, расходы и прочие ветви кода остаются существенными.
Без исходного кода передайте автору советника парную запись и первую документированную разницу. Последовательность пробных реальных ордеров не заменяет диагностику. Подготовка тестов MT4 и MT5 на английском описана отдельно.
Порядок самостоятельной проверки
- Зафиксируйте одну пару режимов: код, сборку, параметры, данные, диапазон, расходы и начальное состояние. Неизвестные поля явно отметьте. Одинаковый файл EA не доказывает равенство остальных условий.
- Сравните 1.1050 с 1.1040, затем равные 1.1040. В обоих случаях недоступный объект остается null; его условие не вычисляется. Различайте отрицательный результат и невозможность оценки.
- В отдельной демо-конфигурации или тестере сохраните диагностические записи без торговых операций. Сверьте идентификаторы и первый изменившийся вход, статус либо результат. Диагностика не подтверждает прибыльность и не является инвестиционным сигналом.
Проверьте понимание
Порог равен 1.1040, а чтение объекта недоступно. Как учебная модель проверяет «значение больше порога»?
Ответ и объяснения без JavaScript
Правильный ответ: Сохраняет null и не оценивает условие.
Подставляет ноль и получает false.
Это скрывает отсутствие входа как обычный отрицательный результат. Ноль — число, а не статус доступности.
Сохраняет null и не оценивает условие.
Так явно обозначается отсутствие входного значения в нашей модели. Это не утверждение, что функция MT5 возвращает null.
Берет число с предыдущего графика.
Модель не заменяет неизвестный вход прежним значением без явного правила.
Вопросы и ответы
Означает ли null, что функция объекта MT5 возвращает null?
Нет. Документация описывает нулевые значения свойств объектов вне визуального тестирования. null — наше явное обозначение недоступного входа в учебной модели. Оно отделяет сообщение платформы от вывода о наличии данных. Реальному советнику нужны проверка конкретной функции, ее успеха, режима и ожидаемого значения. Это не описание всех случаев MQL5.
Подтверждает ли true открытие сделки?
Нет. Здесь сопоставляются заданные числа без подключения к терминалу или счету. Выполненное условие не подтверждает готовность остальных входов, все критерии стратегии, права или исполнение заявки. Модель не создает инвестиционный сигнал, не воспроизводит тестер MT5 и не доказывает эффективность программы.
Гарантирует ли отказ от графических объектов одинаковые тесты?
Нет. Он устраняет одну возможную зависимость. Сохраняются версии, параметры, снимки данных, способы получения тиков, расходы и начальное состояние. Сначала зафиксируйте оба запуска и найдите первую разницу. Не меняйте несколько элементов одновременно и не оценивайте исправление только по конечной прибыли. Неподтвержденные поля следует назвать явно.
Готов ли небольшой пример OnInit к торговле?
Нет. Это отдельный диагностический файл с записью конфигурации и пустым OnTick. Он не отправляет и не меняет ордера, не рассчитывает сигнал и не управляет позициями. Результат компиляции и журнал следует получить в собственном MetaEditor. Нельзя добавлять второй OnInit в существующий EA или без понимания заменять его инициализацию. Проверка флагов не подтверждает безопасность либо прибыльность другого кода.
Источники и пределы применения
- Тестирование MQL5: графические объекты и вывод журнала
Ограничение свойств объектов вне визуального режима и исключение для PrintFormat в OnInit при оптимизации. Это документация платформы, а не проведенный здесь тест терминала.
- MQL5: свойства выполняемой программы
Назначение флагов MQL_TESTER, MQL_OPTIMIZATION и MQL_VISUAL_MODE.
- MQL5: свойства клиентского терминала
TERMINAL_BUILD — номер сборки клиентского терминала.
- MQL5: инициализация OnInit
Сигнатура int OnInit и код успешной инициализации INIT_SUCCEEDED.
- MQL5: форматированный вывод PrintFormat
Форматная строка и соответствие числа, порядка и типов аргументов спецификаторам. Уточнение исключения OnInit читается вместе с разделом тестера.
Документация относится к MetaTrader5/MQL5; русский язык не определяет страну читателя или доступность продукта.