Магический номер в MetaTrader: назначение и использование в MQL4 и MQL5

Магический номер помогает советникам не запутаться в ордерах. Узнайте, как этот идентификатор управляет торговлей и почему без него автоматические стратегии не работают.

Магический номер (Magic Number) – это целочисленный идентификатор, который присваивается каждому открытому ордеру советником (экспертом). Он позволяет различать ордера, открытые разными советниками, разными стратегиями или даже вручную, и является ключевым элементом для корректной работы автоматических торговых систем в MetaTrader 4 и MetaTrader 5.


Что такое магический номер?

В терминалах MetaTrader каждый ордер имеет набор атрибутов: символ, тип, объём, цена открытия, стоп‑лосс, тейк‑профит, комментарий и magic number. Последний задаётся при отправке ордера функцией OrderSend (MQL4) или OrderSend/Trade.Transaction (MQL5) и сохраняется в журнале сделок.

Согласно информации из интернета:

  • «MagicNumber MQL для MetaTrader это магический идентификатор открытого ордера, который чаще всего используется для корректной совместной работы форекс экспертов друг с другом или с трейдером в торговом терминале MetaTrader 4» (ForTraders.org).
  • «В MQL5 имеется возможность задавать магический номер выставляемому ордеру, чтобы затем использовать эту информацию для идентификации ордера» (Статьи по MQL5).

Зачем нужен магический номер?

  1. Разделение ордеров разных советников – если на одном графике работают несколько экспертов, каждый из них может помечать свои сделки уникальным magic number, чтобы не вмешиваться в чужую позицию.
  2. Фильтрация при анализе истории – при переборе открытых ордеров советник может проверять OrderMagicNumber (MQL4) или PositionGetInteger(POSITION_MAGIC) (MQL5) и обрабатывать только те ордера, которые принадлежат ему.
  3. Защита от ошибочного закрытия – при ручном вмешательстве трейдер может увидеть magic number и понять, к какому советнику относится ордер.
  4. Упрощение отладки и логирования – запись magic number в журнал упрощает трассировку того, какой эксперт открыл или изменил позицию.
  5. Как задать магический номер в MQL4

    В MQL4 магический номер передаётся как параметр magic функции OrderSend:

    int ticket = OrderSend(
     Symbol, // символ
     OP_BUY, // тип операции
     Lots, // объём
     Ask, // цена
     Slippage, // проскальзывание
     StopLoss, // стоп‑лосс
     TakeProfit, // тейк‑профит
     "Мой советник", // комментарий
     MagicNumber, // магический номер
     0, // expiration (0 – без срока)
     clrGreen // цвет стрелки на графике
    );
    

    Важно помнить, что если в функции объявлены статические переменные, то функция становится непригодной для вызова с другими параметрами (символом и магическим номером). Как отмечено в источниках:

    «В функции объявлены статические переменные, что делает функцию непригодной для вызова с другими параметрами (символом и магическим номером). Если бы это был MQL4, можно было бы сделать копию функции с другим именем и вызывать её для другой пары символ‑магический номер, или объявить переменные … как общие переменные – свои для каждой пары символ‑магический номер и передавать их в функцию.»

    Поэтому рекомендуется выносить такие переменные за пределы функции или делать их нестатическими.

    Как задать магический номер в MQL5

    В MQL5 используется объектно‑ориентированный подход. Для рыночного ордера:

    MqlTradeRequest request;
    MqlTradeResult result;
    
    ZeroMemory(request);
    ZeroMemory(request);
    
    request.action = TRADE_ACTION_DEAL;
    request.symbol = Symbol;
    request.volume = Lots;
    request.type = ORDER_TYPE_BUY;
    request.price = SymbolInfoDouble(Symbol, SYMBOL_ASK);
    request;deviation= Slippage;
    request.magic = MagicNumber; // <-- магический номер
    request.comment = "Мой советник";
    request.type_time= ORDER_TIME_GTC;
    request.type_filling= ORDER_FILLING_IOC;
    
    if(!OrderSend(request,result))
    {
     Print("OrderSend failed. Error=",GetLastError);
    }
    else
    {
     Print("Order opened. Ticket=",result.order);
    }
    

    Для отложенных ордеров аналогично задаётся поле request.magic.

    Как получить магический номер ордера

    MQL4

    for(int i=OrdersTotal-1;i>=0;i--)
    {
     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
     {
     if(OrderSymbol==Symbol && OrderMagicNumber==MagicNumber)
     {
     // обрабатываем только свои ордера
     Print("Ticket=",OrderTicket," Magic=",OrderMagicNumber);
     }
     }
    }
    

    MQL5

    ulong positions_total = PositionsTotal;
    for(ulong i=0;i

    Использование маски для разделения магических номеров по символам

    В некоторых библиотеках применяется маска, например 0xFFF0FFFF, где старшие биты reserved для идентификатора символа, а младшие – для самого magic number.

    // MQL5 пример из статьи
    ulong mask = 0xFFF0FFFF;
    ulong magic = (SymbolHash(Symbol) << 16) | (MyBaseMagic & 0xFFFF);
    request.magic = magic & mask;
    

    Как избежать конфликтов магических номеров

    • Выбирайте диапазоны – например, один советник использует номера от 1000 до 1999, другой – от 2000 до 2999 и т.д.
    • Добавляйте префикс символа – вычисляйте хеш от названия символа и смешивайте его с базовым magic number, как показано выше.
    • Не используйте magic = 0 – это зарезервировано для ордеров, открытых вручную, и может привести к путанице.
    • Документируйте выбранные номера – ведите таблицу «Советник → Magic Number» в комментариях к коде или во внешнем файле.
    • Проверяйте при инициализации – при старте советника можно просканировать все открытые ордера и предупредить, если обнаружен конфликт с другим советником.

    Лучшие практики работы с магическим номером

    1. Обязательно задавайте magic number при каждом открытии ордера – никогда не полагайтесь на значение по умолчанию.
    2. При модификации ордера (например, изменении SL/TP) сохраняйте исходный magic number – не перезаписывайте его.
    3. При закрытии ордера проверяйте, что magic number совпадает с ожидаемым, чтобы избежать случайного закрытия чужой позиции.
    4. Если советник работает с несколькими символами, рассмотрите использование комбинированного magic number: magic = base_magic * 1000 + symbol_index.
    5. В MQL5 используйте свойства позиции POSITION_MAGIC и ордера ORDER_MAGIC – они доступны напрямую и не требуют дополнительных функций.
    6. Логируйте magic number вместе с другими параметрами ордера в собственный журнал – это упрощает отладку и анализ.

    Магический номер – простой, но чрезвычайно мощный механизм, позволяющий обеспечить изолированную работу множества экспертов на одном терминале. Правильное использование magic number избавляет трейдера от многих проблем: случайного закрытия чужой позиции, смешивания сигналов разных стратегий и сложностей при анализе истории торгов.

    С учётом информации из интернета и рекомендаций, приведённых выше, вы сможете:

    • корректно задавать и получать magic number в MQL4 и MQL5;
    • избегать конфликтов между советниками;
    • строить надёжные и масштабируемые автоматические торговые системы.

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