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 с учетом шага цены.




