🔢 Magic-номер
  • Помогает советнику найти свои сделки.
  • Работает вместе с символом.
  • У разных стратегий номера не должны пересекаться.

У меня на одном счёте жили два советника. Первый торговал EURUSD, второй - EURUSD и GBPUSD. Через день первый закрыл позицию второго: плюс 18 долларов превратились в минус 4. В коде стояло закрытие по символу, без проверки magic. В момент закрытия рынок уже развернулся, и сделка ушла в минус.

Что такое magic

СимволMagicРезультат
EURUSD101Сделка принадлежит советнику A
EURUSD202Советник A её пропускает
GBPUSD101Другой символ, отдельный фильтр
Схема фильтрации сделок по символу и magic-номеру
Как советник узнает свою сделку

Magic - это целое число от 0 до 2 147 483 647, которое советник записывает в каждый свой ордер. Терминал хранит его вместе с позицией, и по нему можно отличить сделки одного эксперта от сделок другого и от ручных. Сам по себе magic ничего не делает. Он работает только там, где код его проверяет.

Как фильтровать

Для каждой позиции читается POSITION_MAGIC, и если число не совпало с константой советника, позиция пропускается. В MQL5 это две строки: получить тикет через PositionGetTicket и сравнить PositionGetInteger(POSITION_MAGIC) со своей константой. Без этой проверки любой цикл по позициям затрагивает чужие сделки. Именно так один советник закрывает то, что открыл другой. Проверять нужно каждое место, где код перебирает позиции: закрытие по стопу, перенос в безубыток, подсчёт просадки. Достаточно одной функции без фильтра, и она сведёт на нет все остальные проверки.

Номера, которые не пересекаются

Рабочая схема - блок номеров на проект: 1000001 для первого советника, 1000002 для второго, 1000003 для сетки. Ноль оставить ручной торговле. Почему не подряд 1 и 2: при копировании кода на второй счёт легко забыть поменять константу, а с блочными номерами видно, откуда советник. Ещё один довод за блоки: номер попадает в комментарий к ордеру, и в истории счёта сразу видно, какая программа открыла сделку. При разборе спорной ситуации это экономит полчаса переписки с брокером.

Три ошибки

  • Ноль у советника. Тогда он не отличает свои сделки от ручных и при удобном случае закроет вашу ручную позицию.
  • Забытый magic в OrderSend. Ордер уходит с нулём, и советник перестаёт видеть собственную позицию: открывает новую, старая висит без сопровождения.
  • Одинаковый magic у двух копий. Две копии на разных графиках считают чужие позиции своими и удваивают объём.

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

Когда magic не нужен

Если на счёте одна программа и вы не торгуете руками, magic можно оставить нулевым: фильтр по нулю пропустит всё, и советник будет работать как раньше. Это работает ровно до первого второго советника. Ещё случай: тестовый счёт на демо, где кроме советника ничего нет. Там проверка magic не даст ничего, кроме лишних строк. Но переносить эту привычку на реальный счёт не стоит - второй советник появляется неожиданно.

Как проверить

Схема таблицы с ID эксперта и magic-номером
Как советник узнаёт свою сделку

Откройте вкладку «Торговля» и посмотрите колонку Comment и свойства позиции: magic виден в деталях. Если у советника там ноль и у ручных сделок тоже ноль, различать их нечем, и это первое, что стоит исправить. Если у позиций советника стоит 0, а у ручных тоже 0 - вы уже в зоне риска. Дальше одна строка в лог при каждом закрытии: тикет, magic, причина. Через неделю видно, кто что закрывает, и вопрос «почему пропала позиция» перестаёт быть загадкой. Магик-номер - это не формальность для сертификации. Это способ сказать терминалу «эта сделка моя», когда на счёте работает больше одной программы. Даже если сегодня программа одна.