Проверяем цены для стоп–лосса и тейк–профита в MQL4

Стоп-лосс, тейк-профит и цены открытия отложенных ордеров должны находиться на минимальном расстоянии от цен Bid или Ask. Если они размещены слишком близко к текущей цене, возникнет ошибка, и ордер не будет размещен. Это одна из наиболее распространенных торговых ошибок, и ее легко можно предотвратить, если трейдер будет устанавливать свои стоп-лоссы, тейк-профиты и отложенные ордера на достаточном расстоянии от цены.

Однако в периоды повышенной волатильности данные цены могут быть признаны недействительными за счет расширения спредов. Разные брокеры имеют разные уровни спредов, поэтому стоп-лосс, действительный для одного брокера, может оказаться слишком близким для другого. Некоторые торговые системы устанавливают цены для стоп-лоссов и отложенных ордеров на основании показаний индикаторов, максимумов или минимумов или других методов рассчета, когда минимальное расстояние до цены не всегда проверяется.

По этим причинам всегда полезно убедиться, что цена для стоп-лосса, тейк-профита или отложенных ордеров действительна и не размещается слишком близко к текущей рыночной цене.

Уровни стопов

Уровень стопов — это количество пунктов от текущей цены Bid или Ask, на которое должны быть выставлены все стопы и отложенные ордера. Для большинства брокеров минимальный стопов составляет примерно 3-4 пункта. У ECN-брокеров, как правило, очень узкие уровни стопов, в то время как у других брокеров они более широкие и могут составлять не менее 8 пунктов.

уровни стопов

Стоп-лосс, тейк-профит и отложенные ордера должны быть размещены за пределами обозначенных выше границ.

Мы можем использовать функцию MarketInfo() с параметром MODE_STOPLEVEL для получения уровня стопов. Уровень стопов выражается как целое число, и его нужно будет преобразовать в дробное значение с помощью Point.

Для 4-значной валюты со стоп-уровнем в 3 пункта функция MarketInfo() с MODE_STOPLEVEL вернет 3. Для 5-значной валюты со стоп-уровнем в 3 пипса MarketInfo() вернет 30 из-за дополнительного десятичного числа. Вот код для получения уровня стопов и преобразования его в десятичное значение:

double StopLevel = MarketInfo (Symbol(), MODE_STOPLEVEL) * Point;

Обратите внимание, что мы используем предопределенную переменную Point для того, чтобы умножить уровень стопа на фактическое значение Point. Для валюты из 4 цифр один пункт будет составлять 0,0001, а для валюты из 5 цифр один пункт будет составлять 0,00001. Если уровень стопа составляет 3 пункта, как показано выше, тогда дробное значение будет 0,0003.

Теперь, когда мы выяснили, как найти уровень стопа, нам нужно вычислить минимальное и максимальное значения для нашего стоп-лосса, тейк-профита и цены отложенного ордера. Мы сделаем это, добавляя или вычитая уровень стопа из наших текущих цен Bid и Ask.

Следующий код вычисляет минимально допустимую цену для тейк-профита на покупку, стоп-лосса на продажу, стоп-ордер на покупку или лимитного ордер на продажу. Мы будем использовать значение StopLevel, которое мы рассчитали выше.

double UpperStopLevel = Ask + StopLevel;

Если наша цена Ask составляет 1,4650, а StopLevel равен 0,0003 пункта, как рассчитано выше, то минимальная цена стоп-уровня будет 1,4653. Если мы размещаем тейк-профит на покупку с этим ордером, то он должен быть размещен выше этой цены.

Следующий код рассчитывает максимально допустимую цену для тейк-профита на продажу, стоп-лосса на покупку, стоп-ордера на продажу или лимитного ордер на продажу. Обратите внимание, что мы используем Bid вместо Ask и вычитаем вместо добавления.

double LowerStopLevel = Bid ​​- StopLevel;

Перед размещением ордера используйте приведенные выше значения UpperStopLevel и LowerStopLevel, чтобы проверить стоп-лосс, тейк-профит и цену отложенного ордера.

Проверяем цены для стоп-лосса и тейк-профита

Минимальный тейк-профит в пунктах будет равен цене открытия ордера плюс или минус минимальный уровень стопа. Если уровень стопа составляет 3 пункта, а цена открытия ордера — 1.4500, цена тейк-профита для ордера на покупку должна быть выше 1.4503.

Однако минимальный стоп-лосс в пунктах для рыночного ордера будет включать текущий спред, поэтому минимальный стоп-лосс будет больше минимального тейк-профита. Например, если уровень стопа составляет 3 пункта, спред составляет 2 пункта, а цена открытия ордера составляет 1,4500, стоп-лосс для ордера на покупку на рынке должен быть ниже 1,4495.

Это не относится к отложенным ордерам, поэтому при проверке стоп-лосса для отложенных ордеров указывать спред не обязательно. Таким образом, если вы выставляете отложенный ордер на 1.4500, а уровень стопа составляет 3 пункта, то стоп-лосс можно разместить в любом месте ниже 1.4497.

Вот пример, где мы проверяем стоп-лосс и тейк-профит для ордера на покупку, чтобы убедиться, что цены действительны. Если цена для стоп-лосса или тейк-профита недействительны, мы автоматически изменяем их, чтобы они находилась в нескольких пунктах за пределами минимального уровня.

double MinStop = 5 * UsePoint;
if (BuyStopLoss>LowerStopLevel) BuyStopLoss = LowerStopLevel - MinStop;
if (BuyTakeProfit<UpperStopLevel) BuyTakeProfit = UpperStopLevel + MinStop;

Переменная MinStop добавляет или вычитает 5 пунктов от уровня стопа, чтобы гарантировать, что наши проверенные цены не станут недействительными из-за проскальзывания. Вы можете настроить это значение для обеспечения достаточного минимального уровня стоп-лосса или тейк-профита с помощью внешней переменной.

Вторая строка сравнивает наш стоп-лосс с LowerStopLevel. Если стоп-лосс больше нижнего стоп-уровня, мы знаем, что стоп-лосс недействителен. В этом случае мы настраиваем стоп-лосс так, чтобы он был всего на несколько пунктов ниже нашего стоп-уровня. Третья строка делает то же самое для тейк-профита.

Чтобы проверить стоп-лосс и тейк-профит для ордера на продажу, мы просто изменим расчеты:

if (SellTakeProfit>LowerStopLevel) SellTakeProfit = LowerStopLevel - MinStop;
if (SellStopLoss<UpperStopLevel) SellStopLoss = UpperStopLevel + MinStop;

Вместо автоматической корректировки недопустимой цены вы также можете отобразить сообщение об ошибке и остановить выполнение программы.

    if (BuyStopLoss>LowerStopLevel)
      {
Alert ("Стоп-лосс слишком мал!");
Return (0); }

Если рассчитанный стоп-лосс находится выше уровня стопа и, следовательно, слишком близко к цене, функция Alert() отобразит всплывающее сообщение для пользователя. Оператор return выходит из текущей функции и гарантирует, что ордер не будет размещен.

Проверяем цену для отложенного ордера

Вот как мы проверяем цену отложенного ордера для стоп-ордера на покупку или продажу. Переменная PendingPrice хранит нашу цену отложенного ордера:

if (PendingPrice<UpperStopLevel) PendingPrice = UpperStopLevel + MinStop;

Обратите внимание на то, что логика здесь идентична приведенному выше коду, который проверяет нашу цену на покупку и тейк-профит, а также продажу по стоп-лоссу. А вот код для проверки цены отложенного ордера для стоп-ордера на продажу или ордера на покупку:

if (PendingPrice>UpperStopLevel) PendingPrice = UpperStopLevel - MinStop;
Комментарии (1)
  1. Хорошие объяснения- ещё бы всё это добро снабдить видео заипсанным с экрана- было бы совсем хорошо;-) Большое спавсибо за труд- надеюсь поможетмне сейчас исправить мою ошибку инвалиод стоплосс)))