Магический номер советника

Дата публикации:  23:58 ()

Если вы когда‑нибудь запускали торговый робот (советник) в MetaTrader, то наверняка сталкивались с параметром Magic Number – «магическим номером». Несмотря на простую формулировку, его значение трудно переоценить: без правильного использования магический номер приводит к конфликтам, потере позиций и даже к полному «съеданию» счета.


Содержание
  1. Что такое Magic Number?
  2. Зачем он нужен?
  3. Основные правила назначения
  4. Работа нескольких советников на одном счете
  5. Взаимодействие с ручными ордерами
  6. Динамические магические номера и сеточные советники
  7. Пример кода с использованием Magic Number
  8. Типичные ошибки и способы их устранения
  9. Краткое резюме

Что такое Magic Number?

Magic Number – это целочисленный идентификатор, присваиваемый каждому ордеру, открываемому советником. В терминале MetaTrader каждый ордер (покупка, продажа, отложенный ордер) имеет поле magic, которое хранит именно это число.

Основные свойства:

  • Является уникальным для конкретного советника (или группы советников).
  • Сохраняется в истории сделок и в открытых позициях.
  • Для ордеров, открытых вручную, magic = 0 и изменить его невозможно.

Зачем нужен Magic Number?

Главная задача магического номера – разделить ордера между разными советниками и/или между советником и ручной торговлей. Благодаря этому советник может:

  • Отслеживать только свои позиции (например, управлять трейлинг‑стопом, модифицировать стоп‑лосс).
  • Игнорировать чужие ордера, открытые другими роботами или трейдером.
  • Корректно закрывать только свои сделки, не затрагивая чужие.

Если магический номер одинаковый у двух советников, они «видят» ордера друг друга как свои, что часто приводит к конфликтам (неожиданное закрытие, двойное открытие и т.д.).

Основные правила назначения магического номера
  1. Уникальность на счете. Каждый советник, работающий одновременно с другими, должен иметь собственный номер.
  2. Не меняйте номер «на лету». Если на счете уже есть открытые позиции с определённым магическим номером, изменение параметра приведёт к тому, что советник перестанет их сопровождать.
  3. Не используйте 0. Магический номер 0 зарезервирован для ручных ордеров. Если ваш советник будет работать совместно с ручной торговлей, задайте ему любое положительное число.
  4. Размер числа. В MQL4/MQL5 тип int – 32‑битный, поэтому диапазон от -2 147 483 648 до 2 147 483 647. Рекомендуется использовать положительные числа от 1 до 2 000 000 000.
  5. Запоминайте схему. Если у вас несколько советников, удобно вести таблицу: EA1 – 101, EA2 – 102, EA3 – 103 и т.д.

Работа нескольких советников на одном счете

Существует три типовых сценария:

Один советник – один инструмент

Если каждый советник привязан к отдельному символу (например, EURUSD, GBPJPY), то магический номер может оставаться по умолчанию. Сортировка ордеров будет происходить по инструменту, и конфликтов не возникнет.

Несколько советников на одном инструменте

В этом случае обязательно задавайте разные магические номера. Иначе первый советник может открыть позицию, а второй воспримет её как свою и закроет.

Мультивалютные советники

Если один советник работает сразу с несколькими символами (мультивалютный робот), то магический номер должен быть уникальным относительно всех остальных советников, иначе возникнут те же конфликты, что и в пункте 4.2.

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

Взаимодействие с ручными ордерами

Открытые вручную ордера всегда имеют magic = 0. Это приводит к двум типичным ситуациям:

  1. Ручные ордера «невидимы» для советника. Если советник настроен работать только со своим магическим номером (например, 5), он не будет управлять ордерами с магиком 0.
  2. Утилиты и скрипты. Некоторые внешние утилиты (например, трейлинг‑стопы, менеджеры позиций) могут работать только с ордерами, у которых задан определённый магический номер. Чтобы они «видели» ручные сделки, в настройках указывается magic = 0.

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

Динамические магические номера и сеточные советники

Некоторые стратегии требуют присваивать ордерам разные номера в зависимости от их роли в сетке:

  • Номера могут кодировать уровень сетки (например, 1000 + шаг).
  • Можно использовать битовые маски для быстрого определения типа ордера (первичный, вторичный, стоп‑ордера).

В таких случаях советник сам генерирует магический номер в момент открытия ордера. Пример:

// Пример генерации динамического магического номера
int baseMagic = 2000; // базовый номер советника
int gridStep = 10; // шаг сетки
int magic = baseMagic + gridStep * orderIndex; // orderIndex – порядковый номер ордера в сетке
OrderSend(Symbol, OP_BUY, Lots, Ask, 3, StopLoss, TakeProfit, "Grid", magic, 0, clrGreen);

При таком подходе важно, чтобы все ордера, открытые этим советником, имели магический номер, начинающийся с одного префикса (например, 2000). Это упрощает фильтрацию в аналитических скриптах.

Пример кода с использованием Magic Number

Ниже – минимальный советник на MQL4, открывающий позицию при пересечении цены и простой скользящей средней (MA). В качестве демонстрации показано, как правильно работать с магическим номером.

//+------------------------------------------------------------------+
//| SimpleEA.mq4 |
//| Пример использования Magic Number |
//+------------------------------------------------------------------+
#property strict

extern int MagicNumber = 101; // уникальный идентификатор советника
extern double Lots = 0.1;
extern int MA_Period = 14;
extern int MA_Method = MODE_SMA;
extern int MA_Applied = PRICE_CLOSE;
extern int Slippage = 3;

//--- функция инициализации
int OnInit
 {
 Print("Советник запущен, MagicNumber = ",MagicNumber);
 return(INIT_SUCCEEDED);
 }
//--- основной цикл
void OnTick
 {
 // проверяем, нет ли уже открытой позиции с нашим MagicNumber
 if(PositionSelect(Symbol) && PositionGetInteger(POSITION_MAGIC)==MagicNumber)
 return; // позиция уже есть – ничего не делаем

 double ma = iMA(Symbol,0,MA_Period,0,MA_Method,MA_Applied,0);
 double price = Close[0];

 // простое условие: цена выше MA – открываем BUY
 if(price > ma)
 {
 int ticket = OrderSend(Symbol,OP_BUY, Lots, Ask, Slippage, 0, 0,
 "SimpleEA", MagicNumber, 0, clrBlue);
 if(ticket<0)
 Print("Ошибка открытия BUY: ",GetLastError);
 else
 Print("Открыт BUY, ticket=",ticket," Magic=",MagicNumber);
 }
 }
//+------------------------------------------------------------------+

Ключевые моменты:

  • Магический номер задаётся как extern‑переменная, чтобы трейдер мог менять его в настройках.
  • Перед открытием новой позиции советник проверяет, нет ли уже позиции с тем же MagicNumber (чтобы не открывать дубли).
  • В OrderSend параметр MagicNumber передаётся в поле magic.

Типичные ошибки и способы их устранения
Ошибка Причина Решение
Советник закрывает свои же позиции У двух советников одинаковый Magic Number Назначьте уникальные номера каждому советнику.
Советник не управляет открытыми вручную ордерами У ручных ордеров magic = 0, а советник фильтрует только свой номер Либо отключите фильтрацию по magic, либо откройте ордера через скрипт с нужным номером.
После изменения Magic Number в настройках советник «забывает» открытые позиции Изменённый номер не совпадает с магическим номером уже открытых ордеров Не меняйте magic, пока есть открытые позиции, либо закройте их перед изменением.
Ошибка ERR_TRADE_CONTEXT_BUSY при попытке открыть ордер Одновременно несколько советников пытаются отправить ордер с одинаковым magic Синхронизируйте работу советников (например, через глобальные переменные) и используйте разные magic.

Краткое резюме
  • Magic Number – уникальный целочисленный идентификатор ордера, задаваемый советником.
  • Он нужен для разделения ордеров между разными роботами и ручной торговлей.
  • Для корректной работы советника необходимо задавать уникальный номер и не менять его «на лету», пока есть открытые позиции.
  • Если на счете работает более одного советника, каждый из них обязан иметь свой magic.
  • Ручные ордера имеют magic = 0; если нужен совместный контроль, используйте скрипты для переустановки номера.
  • В сложных стратегиях (сеточные, мультивалютные) допускаются динамические магические номера, но они всегда должны сохранять общий префикс, позволяющий быстро отфильтровать ордера.

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


Если у вас возникли вопросы по настройке Magic Number или вы хотите поделиться своим опытом, оставляйте комментарии ниже. Удачной торговли!