Фильтр максимального спреда в MQL4: Защита ночного скальпера

Фильтр максимального спреда в MQL4: Защита ночного скальпера КРЕДИТЫ, ИПОТЕКА и БАНКИ
Пошаговое руководство по реализации фильтра максимального спреда (Max Spread Filter) в MQL4 для защиты ночных скальпинг-стратегий от проскальзываний.
Суть: Реализация жесткого фильтра спреда на основе функции MarketInfo(Symbol(), MODE_SPREAD) с автоматическим приведением к 4/5-значным котировкам. Фильтр блокирует отправку торговых приказов в период ночного клиринга (ролловера), когда ликвидность падает, а спред расширяется в десятки раз.

Исходный код

При торговле внутри ночного флета (обычно с 23:00 до 01:00 по времени торгового сервера) критически важно контролировать транзакционные издержки. Расширение спреда в этот период может мгновенно уничтожить математическое ожидание любой скальпинг-стратегии. Для решения этой проблемы мы используем функцию IsSpreadAcceptable().

Если вы планируете масштабировать свои торговые системы или переходить на более современную платформу MetaTrader 5, вам обязательно пригодится руководство по работе с историческими данными: Обход лимитов HistorySelect в MQL5: Пошаговое руководство.

//+------------------------------------------------------------------+
//|                                            MaxSpreadFilter.mq4   |
//|                                                   QuantDeveloper |
//+------------------------------------------------------------------+
#property strict

// Входные параметры советника
input double InputMaxSpreadPips = 4.5; // Максимальный спред в стандартных пунктах (pips)
input bool   EnableSpreadFilter = true; // Включить фильтр максимального спреда

//+------------------------------------------------------------------+
//| Функция проверки пригодности спреда для открытия позиции         |
//+------------------------------------------------------------------+
bool IsSpreadAcceptable()
{
   // Если фильтр отключен, всегда разрешаем торговлю
   if(!EnableSpreadFilter)
   {
      return(true);
   }

   // Получаем текущий спред по текущему символу в системных пунктах (points)
   double currentSpreadPoints = MarketInfo(Symbol(), MODE_SPREAD);
   
   // Определяем множитель для приведения стандартных пунктов (pips) к системным (points)
   // Для 5-значных котировок 1 pip = 10 points. Для 4-значных 1 pip = 1 point.
   double pointMultiplier = 1.0;
   if(Digits == 3 || Digits == 5)
   {
      pointMultiplier = 10.0;
   }
   
   double maxAllowedSpreadPoints = InputMaxSpreadPips * pointMultiplier;

   // Логируем состояние рынка для последующего анализа в журнале
   PrintFormat("[SpreadFilter] Текущий спред: %.0f pts | Максимальный лимит: %.0f pts", 
               currentSpreadPoints, 
               maxAllowedSpreadPoints);

   // Проверяем условие фильтра
   if(currentSpreadPoints > maxAllowedSpreadPoints)
   {
      PrintFormat("[SpreadFilter] Блокировка входа: текущий спред %.0f превышает лимит %.0f", 
                  currentSpreadPoints, 
                  maxAllowedSpreadPoints);
      return(false);
   }

   return(true);
}

//+------------------------------------------------------------------+
//| Пример интеграции в торговую логику                              |
//+------------------------------------------------------------------+ 
void OnTick()
{
   // Пример условия для открытия сделки BUY
   bool buySignal = true; // Здесь должна быть ваша сигнальная логика

   if(buySignal)
   {
      // Перед вызовом OrderSend обязательно проверяем спред
      if(IsSpreadAcceptable())
      { 
         // Код открытия ордера
         // int ticket = OrderSend(Symbol(), OP_BUY, 0.1, Ask, 3, 0, 0, "Night Scalper", 12345, 0, clrGreen);
         Print("[Trade] Сигнал подтвержден, спред в норме. Открываем позицию.");
      }
      else
      {
         Print("[Trade] Сигнал проигнорирован из-за расширенного спреда.");
      }
   }
}

Разбор параметров

  • InputMaxSpreadPips: Максимально допустимый спред, заданный в стандартных пунктах (четырехзначных пунктах или пипсах). Например, значение 4.5 означает, что при спреде более 45 системных пунктов на пятизнаке сделка будет заблокирована.
  • EnableSpreadFilter: Булевый флаг, позволяющий оперативно включать или выключать фильтрацию спреда в настройках советника без изменения исходного кода.
  • currentSpreadPoints: Локальная переменная, хранящая текущую разницу между ценами Ask и Bid, полученную напрямую от торгового сервера брокера через функцию MarketInfo().
  • pointMultiplier: Коэффициент масштабирования, который автоматически определяет разрядность котировок торгового инструмента и приводит пользовательские настройки к системным единицам измерения.

Как запустить

Для интеграции фильтра спреда в ваш ночной скальпер выполните следующие шаги:

1. Скопируйте представленный код функции IsSpreadAcceptable() и вставьте его в конец вашего файла советника (.mq4).

2. Объявите входные параметры InputMaxSpreadPips и EnableSpreadFilter в глобальной области видимости вашего робота.

3. Внутри функции OnTick() или в блоке принятия торговых решений оберните вызов функции OrderSend() в логическое условие проверки спреда, как показано в примере.

Если вы хотите получать мгновенные уведомления на свой смартфон, когда советник блокирует сделки из-за высокого спреда, рекомендуем изучить статью: Асинхронный Telegram-бот в MQL5 через Socket API.

Также не забывайте о правильном расчете объема позиции. Неверный лот при высоком спреде может привести к критическим потерям. Подробнее о расчете объемов читайте здесь: Расчет лота для фьючерсов MOEX в MQL5 с учетом шага цены.

Оцените статью
FinFluct