Дата публикации: 23:58 ()
Если вы когда‑нибудь запускали торговый робот (советник) в MetaTrader, то наверняка сталкивались с параметром Magic Number – «магическим номером». Несмотря на простую формулировку, его значение трудно переоценить: без правильного использования магический номер приводит к конфликтам, потере позиций и даже к полному «съеданию» счета.
Содержание - Что такое Magic Number?
- Зачем он нужен?
- Основные правила назначения
- Работа нескольких советников на одном счете
- Взаимодействие с ручными ордерами
- Динамические магические номера и сеточные советники
- Пример кода с использованием Magic Number
- Типичные ошибки и способы их устранения
- Краткое резюме
Что такое Magic Number?
Magic Number – это целочисленный идентификатор, присваиваемый каждому ордеру, открываемому советником. В терминале MetaTrader каждый ордер (покупка, продажа, отложенный ордер) имеет поле magic, которое хранит именно это число.
Основные свойства:
- Является уникальным для конкретного советника (или группы советников).
- Сохраняется в истории сделок и в открытых позициях.
- Для ордеров, открытых вручную,
magic = 0и изменить его невозможно.
Зачем нужен Magic Number?
Главная задача магического номера – разделить ордера между разными советниками и/или между советником и ручной торговлей. Благодаря этому советник может:
- Отслеживать только свои позиции (например, управлять трейлинг‑стопом, модифицировать стоп‑лосс).
- Игнорировать чужие ордера, открытые другими роботами или трейдером.
- Корректно закрывать только свои сделки, не затрагивая чужие.
Если магический номер одинаковый у двух советников, они «видят» ордера друг друга как свои, что часто приводит к конфликтам (неожиданное закрытие, двойное открытие и т.д.).
Основные правила назначения магического номера - Уникальность на счете. Каждый советник, работающий одновременно с другими, должен иметь собственный номер.
- Не меняйте номер «на лету». Если на счете уже есть открытые позиции с определённым магическим номером, изменение параметра приведёт к тому, что советник перестанет их сопровождать.
- Не используйте 0. Магический номер 0 зарезервирован для ручных ордеров. Если ваш советник будет работать совместно с ручной торговлей, задайте ему любое положительное число.
- Размер числа. В MQL4/MQL5 тип
int – 32‑битный, поэтому диапазон от -2 147 483 648 до 2 147 483 647. Рекомендуется использовать положительные числа от 1 до 2 000 000 000. - Запоминайте схему. Если у вас несколько советников, удобно вести таблицу:
EA1 – 101, EA2 – 102, EA3 – 103 и т.д.
Работа нескольких советников на одном счете
int – 32‑битный, поэтому диапазон от -2 147 483 648 до 2 147 483 647. Рекомендуется использовать положительные числа от 1 до 2 000 000 000.EA1 – 101, EA2 – 102, EA3 – 103 и т.д.Существует три типовых сценария:
Один советник – один инструмент
Если каждый советник привязан к отдельному символу (например, EURUSD, GBPJPY), то магический номер может оставаться по умолчанию. Сортировка ордеров будет происходить по инструменту, и конфликтов не возникнет.
Несколько советников на одном инструменте
В этом случае обязательно задавайте разные магические номера. Иначе первый советник может открыть позицию, а второй воспримет её как свою и закроет.
Мультивалютные советники
Если один советник работает сразу с несколькими символами (мультивалютный робот), то магический номер должен быть уникальным относительно всех остальных советников, иначе возникнут те же конфликты, что и в пункте 4.2.
Взаимодействие с ручными ордерами
Открытые вручную ордера всегда имеют magic = 0. Это приводит к двум типичным ситуациям:
- Ручные ордера «невидимы» для советника. Если советник настроен работать только со своим магическим номером (например, 5), он не будет управлять ордерами с магиком 0.
- Утилиты и скрипты. Некоторые внешние утилиты (например, трейлинг‑стопы, менеджеры позиций) могут работать только с ордерами, у которых задан определённый магический номер. Чтобы они «видели» ручные сделки, в настройках указывается
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 или вы хотите поделиться своим опытом, оставляйте комментарии ниже. Удачной торговли!