Индикатор спреда для MT4 и MT5
Спред — единственная издержка, которую вы платите в каждой сделке без исключения, и терминал прячет её в колонке «Обзор рынка», куда никто не смотрит. Вывод на график занимает десяток строк.
Спред — это разрыв между ценой, по которой вы можете продать, и ценой, по которой можете купить. Тихим утром на EURUSD он бывает полпункта, а в момент решения по ставке та же пара показывает двадцать. Если ваш стоп пятнадцать пунктов, это не деталь.
Два способа его прочитать, и они расходятся
MetaTrader отдаёт спред дважды, и значения совпадают не всегда.
// 1. Что заявляет брокер
double declared = MarketInfo(Symbol(), MODE_SPREAD); // в пунктах
// 2. Что на самом деле следует из текущей котировки
double actual = (Ask - Bid) / Point;
На счёте с фиксированным спредом первое число постоянно, и второе за ним следует. На счёте с плавающим спредом MODE_SPREAD может запаздывать или отдавать номинальное значение, пока живая котировка уже ушла. Доверяйте Ask - Bid — именно по этой цене вас исполнят.
У пятизначных брокеров один пункт равен десяти пойнтам. Спред в 12 пойнтов на EURUSD — это 1.2 пункта, а не 12. Путаница между ними и есть самая частая причина, почему показания спреда выглядят абсурдно.
Минимальный вывод на график
// SpreadInfo.mq4 — текущий спред в углу графика
#property indicator_chart_window
input int CornerX = 10;
input int CornerY = 18;
input color NormalColor = clrGray;
input color WideColor = clrOrangeRed;
input double WideThresholdPips = 2.0;
string tag = "spreadinfo_label";
int OnInit()
{
ObjectCreate(0, tag, OBJ_LABEL, 0, 0, 0);
ObjectSetInteger(0, tag, OBJPROP_CORNER, CORNER_LEFT_UPPER);
ObjectSetInteger(0, tag, OBJPROP_XDISTANCE, CornerX);
ObjectSetInteger(0, tag, OBJPROP_YDISTANCE, CornerY);
return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason) { ObjectDelete(0, tag); }
int OnCalculate(const int rates_total, const int prev_calculated,
const datetime &time[], const double &open[],
const double &high[], const double &low[],
const double &close[], const long &tick_volume[],
const long &volume[], const int &spread[])
{
double pts = (Ask - Bid) / Point;
double pips = (Digits == 3 || Digits == 5) ? pts / 10.0 : pts;
ObjectSetString(0, tag, OBJPROP_TEXT, 0,
StringFormat("спред %.1f п. (%.0f пойнтов)", pips, pts));
ObjectSetInteger(0, tag, OBJPROP_COLOR,
pips >= WideThresholdPips ? WideColor : NormalColor);
return(rates_total);
}
В MQL5 та же идея делается через SymbolInfoInteger(_Symbol, SYMBOL_SPREAD) и SymbolInfoDouble для Ask и Bid, но арифметика пунктов не меняется.
Когда спред разлетается
- Ролловер, около полуночи по времени брокера. Ликвидность на несколько минут истончается, и спред способен вырасти десятикратно. Стопы, стоящие чуть дальше цены, снимаются здесь без всякой рыночной причины.
- Плановые новости. NFP, инфляция, решения центробанков. Расширение начинается за секунды ДО публикации, а не после.
- Открытие воскресенья. Первые минуты недели стабильно показывают худший спред за всю неделю.
- Экзотика — всегда. Четыре пункта на USDTRY это не аномалия, а состояние покоя.
Логировать полезнее, чем смотреть
Ярлык показывает спред сейчас. А знать вы хотите, каким он обычно бывает в тот час, когда вы торгуете. Пишите значение в файл раз в минуту две недели, а потом посмотрите распределение по часам.
Большинство обнаруживает две вещи: типичный спред их брокера хуже рекламной цифры, и час, в который им нравится торговать, — не тот час, когда условия лучшие.
Счёт с «нулевым спредом» не бесплатен. Издержка переехала в комиссию, а иногда и в худшее исполнение. Сравнивайте полную стоимость круга, а не спред отдельно.
Что с этим числом делать
Использовать как фильтр, а не как украшение. Советник должен отказываться открывать позицию, когда спред выше порога, а ручному трейдеру красный ярлык — повод подождать полминуты.
Поведение спреда у разных брокеров различается драматически, и рекламное число редко переживает встречу с реальным счётом. Логируйте его на демо две недели перед тем, как что-то решать: распределение по часам скажет больше любой цифры в проспекте.