Советник MQL5 с нуля: события, данные и подтверждение приказов

После этой статьи вы сможете

Советник MQL5 (Expert Advisor, EA) — программа, реагирующая на события в MetaTrader 5. При разрешённой торговле она может оценивать правила и отправлять торговые запросы. Установка на график, вызов обработчика и даже успешное принятие запроса — разные этапы; сами по себе они не доказывают совершённую сделку или прибыльность.

Что такое советник MQL5 на практике?

MetaEditor компилирует исходный файл MQ5 в исполняемый EX5. Купленный EX5 может не раскрывать исходный алгоритм. Советник получает события терминала и может посылать разрешённые торговые запросы. Индикатор также может вычислять значения и сообщать о них, но его события и ограничения на торговые функции отличаются. Советники MT4 используют другой язык и интерфейс; название EA не делает программы взаимозаменяемыми.

Нулевой индекс буфера не всегда означает последний закрытый бар

Вымышленная модель. Пусть CopyBuffer(handle, 0, 1, 3, values) успешно вернул три значения в обычный массив без AS_SERIES. Выбраны закрытые бары со сдвигами 1, 2, 3, но в физической памяти старейший из скопированных элементов стоит первым: values[0]=103 (сдвиг 3), values[1]=101 (сдвиг 2), values[2]=102 (сдвиг 1). Последний закрытый бар здесь — индекс 2. Проверка >102,5 дала бы разные ответы для 103 и 102.

Обычный массив CopyBuffer: индекс 0 хранит старейший скопированный бар shift 3, индекс 2 — последний закрытый shift 1
Индекс 2 относится к последнему закрытому бару только при показанных параметрах и обычном массиве. Сдвиг 0 не копировали.

Записывайте start_pos, количество фактически скопированных элементов и режим индексации массива. Проверка «вернулось три значения» без проверки их порядка не устраняет ошибку выбора бара. Не переносите индекс 2 автоматически на другие настройки массива или число элементов.

Как советник общается с терминалом: OnInit, OnTick и OnDeinit

OnInit выполняет инициализацию и должен сообщить о критическом сбое подготовки. Это событие жизненного цикла, а не обещание, что инициализация случится ровно один раз за всё время использования. OnDeinit получает причину завершения или переинициализации; ресурсы и сохраняемое состояние следует обрабатывать явно.

OnTick обрабатывает событие нового тика символа графика. Если тик уже обрабатывается или стоит в очереди, следующий такой же не добавляется. Советник может использовать и другие события, например таймер или торговую транзакцию. Тик прикреплённого символа не доказывает свежесть котировок всех символов в многовалютном алгоритме.

Запрет AutoTrading блокирует новые торговые запросы советника, но не останавливает само исполнение его кода и не прерывает текущий обработчик. Уже существующие серверные ордера и локальные правила выхода требуют отдельной проверки. Перед паузой запишите, что продолжает работать на сервере, а что зависит от запущенного терминала.

Как отправляется приказ: OrderSend и CTrade

OrderCheck проверяет запрос до отправки, но не обещает будущего исполнения. Возврат true из OrderSend означает успешную базовую проверку/постановку запроса в торговую систему, а не подтверждение сделки. Проверяйте result.retcode, при необходимости retcode_external, затем фактические ордера, исполнения и позиции. Методы класса CTrade, включая Buy, Sell и PositionClose, также требуют проверки результата сервера.

Вымышленный сценарий отказа связи. Советник отправил покупку 0,10 лота и не получил локального подтверждения. Повторная отправка без сверки может привести к 0,20 лота, если обе заявки исполнятся. Отсутствие ответа у клиента не является доказательством отказа сервера. После неопределённого исхода восстановите состояние из истории и открытых позиций, только затем решайте, нужен ли новый запрос.

События OnTradeTransaction могут приходить в разном порядке. Представьте два подтверждённых исполнения покупки D1=0,04 и D2=0,06 лота, исходной позиции нет. Сумма покупок — 0,10 в обоих порядках. Счётчик, который обнуляется при ORDER_DELETE, после последовательности D1, D2, ORDER_DELETE покажет ноль, а после ORDER_DELETE, D1, D2 — 0,10. Удаление ордера и экспозиция счёта — разные факты. Реальный журнал должен учитывать продажи, развороты, частичные исполнения и режим учёта счёта.

Что проверять в Strategy Tester?

Тестер MT5 может использовать режимы генерируемых тиков или доступные реальные тики брокера. Зафиксируйте источник данных, часы, настройки контракта, спред, комиссии, свопы и модель исполнения. Название режима «реальные тики» не означает единого универсального ценового ряда для всех брокеров.

Подбор параметров на тех же данных, по которым затем оценивают качество, ослабляет вывод. Сохраните отдельный неиспользованный для выбора период, фиксируйте версии правил и повторные попытки исследования. Положительный тест не измеряет будущую доходность; отложенная проверка также не воспроизводит все условия живого рынка.

Ключевая проверка: до оценки сигнала убедитесь, что выбран именно нужный бар и скопировано ожидаемое число значений. Полный буфер всё ещё может указывать не на тот исторический момент.

Когда советник помогает, а когда добавляет риск?

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

Планируйте реакции на пропуск данных, перезапуск, недопустимый шаг объёма, неопределённый ответ сервера и ручное изменение позиции. Не полагайтесь на старый локальный сигнал при восстановлении: сначала прочитайте фактическую экспозицию. На неттинговом счёте стратегии по одному символу делят общую нетто-позицию; Magic Number не создаёт отдельного капитала или маржи.

Стоит ли писать собственного советника?

Небольшой учебный EA помогает проверить, реализованы ли ваши точные правила. Срок обучения определяется задачей и навыками; покупка готового файла или написание своего кода не гарантирует лучший результат. Для автономной работы нужны инфраструктура, разрешения, журнал событий и восстановление после отказа.

Локальная кнопка AutoTrading не закрывает уже открытые позиции. Обычный принятый сервером стоп может оставаться активным после закрытия локального терминала; выход, который вычисляет только EA, требует работающей программы и связи. MetaQuotes Virtual Hosting — отдельная перенесённая среда, а Windows VPS — другой сервис; их состояние проверяется отдельно от локальной кнопки.

Есть handle — готово ли значение индикатора?

Четыре отдельные проверки данных

Создание handle не доказывает, что рассчитан нужный бар. Проверьте: (1) handle не равен INVALID_HANDLE; (2) BarsCalculated сообщает достаточное количество рассчитанных значений, а не −1; (3) CopyBuffer вернул ровно ожидаемое число; (4) значение в нужном буфере и баре не равно маркеру отсутствия. EMPTY_VALUE по умолчанию связан с DBL_MAX, поэтому одна проверка «число конечно» недостаточна; пользовательский индикатор может иметь собственный маркер.

Последовательность проверки: действительный handle, рассчитанные бары, число скопированных элементов, допустимое значение
Нулевое значение не заменяет состояние «данные не готовы».

Вымышленный тест: A — неверный handle, чтения нет; B — handle есть, но скопировано 0 значений, ждём; C — скопировано 1 значение EMPTY_VALUE, сигнал отсутствует; D — скопировано 1 допустимое значение 45, правило можно оценить. Число 45 не является торговой рекомендацией.

Что сделать завтра на демосчёте?

  1. Установите MT5 из официального или предоставленного вашим брокером источника и изучите встроенный тестер на учебном примере. Проверьте происхождение данных и настройки расходов.
  2. Прочитайте официальные страницы OnInit, OnTick, CopyBuffer и OrderSend. Для начала достаточно понять входы, результаты и ошибки.
  3. Запишите вход, выход, размер, запретные условия и то, какие решения пока остаются дискреционными.
  4. Создайте проверки на отсутствие данных, перезапуск, неопределённую отправку и ручную позицию. Тестируйте их на демо до любого реального риска.

Короткое упражнение

Handle создан и CopyBuffer вернул один элемент, но это EMPTY_VALUE. Можно ли сравнить его с порогом стратегии? Нет: проверьте буфер, бар и маркер отсутствия, запишите «данные недоступны» и повторите чтение в подходящем событии. Ноль подставлять нельзя.

Частые вопросы

Означает ли OrderSend=true, что сделка исполнилась?

Нет. Проверьте код ответа сервера и фактические ордера, исполнения и позицию.

Всегда ли values[0] — последний закрытый бар?

Нет. Это зависит от start_pos, количества элементов и режима индексации массива.

Отключение AutoTrading останавливает EA?

Оно запрещает новые торговые запросы, но программа продолжает обрабатывать события; серверные ордера и удалённая среда требуют отдельной проверки.

Это учебное объяснение работы платформы; примеры чисел вымышлены. Проверяйте условия своего брокера и счёта. Тестер и демосчёт не гарантируют живое исполнение или прибыль.

Проверьте понимание

CopyBuffer вернул 3 элемента с start_pos=1 в обычный массив без AS_SERIES. Где значение последнего закрытого бара?

Ответ и объяснения без JavaScript

Правильный ответ: В элементе с индексом 2 при этих параметрах.

В элементе с индексом 2 при этих параметрах.

Верно: старейший скопированный элемент лежит первым в физической памяти.

Всегда в элементе с индексом 0.

Индекс зависит от параметров и режима массива.

В сдвиге 0.

Сдвиг 0 не входил в запрос start_pos=1.

Вопросы и ответы

Подтверждает ли OrderSend=true исполнение?

Нет. Нужна проверка retcode и фактических исполнений/позиций.

Источники и пределы применения

  1. MQL5 Reference — CopyBuffer

    Порядок физической памяти и start_pos.

  2. MQL5 Reference — BarsCalculated

    Количество рассчитанных значений и −1 при ошибке.

  3. MQL5 Reference — OrderSend

    Возврат true и необходимость проверки retcode/исполнения.

  4. MQL5 Reference — OnTradeTransaction

    Торговые события и отсутствие гарантии порядка уведомлений.

  5. MQL5 Reference — CTrade

    Методы торгового класса и результат сервера.

  6. MQL5 Reference — PositionSelect

    Различие неттингового и хеджингового учёта, свежесть данных позиции.

MQL5/MetaTrader 5; учебные данные, не готовый торговый алгоритм