Магический номер (Magic Number) – это целочисленный идентификатор, который присваивается каждому открытому ордеру советником (экспертом). Он позволяет различать ордера, открытые разными советниками, разными стратегиями или даже вручную, и является ключевым элементом для корректной работы автоматических торговых систем в MetaTrader 4 и MetaTrader 5.
Что такое магический номер?
В терминалах MetaTrader каждый ордер имеет набор атрибутов: символ, тип, объём, цена открытия, стоп‑лосс, тейк‑профит, комментарий и magic number. Последний задаётся при отправке ордера функцией OrderSend (MQL4) или OrderSend/Trade.Transaction (MQL5) и сохраняется в журнале сделок.
Согласно информации из интернета:
- «MagicNumber MQL для MetaTrader это магический идентификатор открытого ордера, который чаще всего используется для корректной совместной работы форекс экспертов друг с другом или с трейдером в торговом терминале MetaTrader 4» (ForTraders.org).
- «В MQL5 имеется возможность задавать магический номер выставляемому ордеру, чтобы затем использовать эту информацию для идентификации ордера» (Статьи по MQL5).
Зачем нужен магический номер?
- Разделение ордеров разных советников – если на одном графике работают несколько экспертов, каждый из них может помечать свои сделки уникальным magic number, чтобы не вмешиваться в чужую позицию.
- Фильтрация при анализе истории – при переборе открытых ордеров советник может проверять
OrderMagicNumber(MQL4) илиPositionGetInteger(POSITION_MAGIC)(MQL5) и обрабатывать только те ордера, которые принадлежат ему. - Защита от ошибочного закрытия – при ручном вмешательстве трейдер может увидеть magic number и понять, к какому советнику относится ордер.
- Упрощение отладки и логирования – запись magic number в журнал упрощает трассировку того, какой эксперт открыл или изменил позицию.
- Выбирайте диапазоны – например, один советник использует номера от 1000 до 1999, другой – от 2000 до 2999 и т.д.
- Добавляйте префикс символа – вычисляйте хеш от названия символа и смешивайте его с базовым magic number, как показано выше.
- Не используйте magic = 0 – это зарезервировано для ордеров, открытых вручную, и может привести к путанице.
- Документируйте выбранные номера – ведите таблицу «Советник → Magic Number» в комментариях к коде или во внешнем файле.
- Проверяйте при инициализации – при старте советника можно просканировать все открытые ордера и предупредить, если обнаружен конфликт с другим советником.
- Обязательно задавайте magic number при каждом открытии ордера – никогда не полагайтесь на значение по умолчанию.
- При модификации ордера (например, изменении SL/TP) сохраняйте исходный magic number – не перезаписывайте его.
- При закрытии ордера проверяйте, что magic number совпадает с ожидаемым, чтобы избежать случайного закрытия чужой позиции.
- Если советник работает с несколькими символами, рассмотрите использование комбинированного magic number:
magic = base_magic * 1000 + symbol_index. - В MQL5 используйте свойства позиции
POSITION_MAGICи ордераORDER_MAGIC– они доступны напрямую и не требуют дополнительных функций. - Логируйте magic number вместе с другими параметрами ордера в собственный журнал – это упрощает отладку и анализ.
- корректно задавать и получать magic number в MQL4 и MQL5;
- избегать конфликтов между советниками;
- строить надёжные и масштабируемые автоматические торговые системы.
Как задать магический номер в 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;
Как избежать конфликтов магических номеров
Лучшие практики работы с магическим номером
Магический номер – простой, но чрезвычайно мощный механизм, позволяющий обеспечить изолированную работу множества экспертов на одном терминале. Правильное использование magic number избавляет трейдера от многих проблем: случайного закрытия чужой позиции, смешивания сигналов разных стратегий и сложностей при анализе истории торгов.
С учётом информации из интернета и рекомендаций, приведённых выше, вы сможете:
Помните: магический номер – это не просто произвольное число, а часть архитектуры вашего торгового робота, которая напрямую влияет на его стабильность и безопасность.