Советник Безубыток ShowMeBe

  • Стратегии Форекс начинающим
  • Простые стратегии Forex
  • Скальпирующие стратегии (Скальпинг)
  • Индикаторные стратегии
  • Стратегии по методу Скользящих Средних
  • Японские Свечи — Стратегии
  • Стратегии Боллинджера
  • Стратегии Мартингейла
  • Стратегия Ишимоку
  • Паттерн стратегия
  • Экономический Календарь Трейдера
  • Советники Форекс
  • Индикаторы для трейдинга (скачать)
  • Обучающее видео
  • Доверительное управление и Инвестиции
  • Аналитика рынка Форекс на сегодня
  • Прогноз форекс на сегодня
  • Бонусы

советникЧто такое советник Безубыток? Это торговый робот, позволяющий автоматически выставлять безубыток (подтягивать стоп лоссы) по всем сделкам, которые открыты на одном торговом счёте.

Каждый торгующий на бирже Форекс трейдер рано или поздно понимает необходимость выставления стоп лоссов на уровне безубытка. Безубыток – это такой уровень цены, когда по данной позиции не будет получена прибыль или убыток. Фактически, сделка закрывается в ноль, т.е. спрэд компенсируется движением в пару пунктов в нужную нам сторону.

Если позиций много, то трейдеру легко запутаться. Выставление безубыточных стоп лоссов можно легко автоматизировать, используя советник Безубыток — ShowMeBe. Фактически, это даже не советник, а скрипт – программа, которая выполнила определённые действия и выключилась, хотя технически он работает как советник.

советник

Если трейдер работает исключительно на одном активе (валютной паре) и открывает не более одной позиции одновременно, то такой робот ему не нужен. Но большинство трейдеров торгуют сразу несколько валютных пар, усредняются и т.д., что может привести к путанице с ордерами и стоп лоссами. В таких случаях советник Безубыток просто незаменим. Особенно это касается торговли на небольших таймфреймах – от М1 до М15.

Надёжные брокеры для торговли Alpari.

Советник Безубыток – технические моменты

Выше уже было сказано, что данная программа – это торговый робот, а не скрипт. Недостаток скрипта в данном конкретном случае один – после выполнения заданного алгоритма он самоудаляется. Советник же продолжит свою работу, среагировав, например, на открытие Вами новой торговой позиции. Трейдер может банально не заметить, что скрипт самоудалился, с советником же такая ситуация не произойдёт.

Также очень удобной является возможность точной настройки робота. Робот может работать как со всеми открытыми сделками на торговом счёте, так и с отдельными. Последний вариант реализуется через разные Magic numbers каждого ордера либо включения функцией работы с конкретными валютными парами.

Важный момент: робот устанавливается на любой график любой валютной пары, открытый в торговом терминале МТ4. При этом робот будет работать с любыми выбранными (например, только Buy или только Sell) или всеми открытыми позициями на счету трейдера, в зависимости от его настроек.

Настройки робота. Указав Magic number для управляемых позиций, мы выделим конкретные сделки, которые будут переведены в безубыток советником. Если же мы желаем, чтобы робот отслеживал все текущие ордера, то указываем параметр “-1”.

Дальше нужно указать уровень прибыли (в пунктах). Когда цена дойдет до указанного уровня, робот автоматически сделает перенос стоп лосса.

Также для удобства можно настроить звуковые алерты (оповещения).

Параметры советника Безубыток

  • Magic – мэджик, т.е. работать с конкретным ордером. Если параметр равен 0 – советник работает со всеми ордерами, даже открытыми вручную.
  • Direction – задаёт направление торговли. 0 – buy, 1 – sell. После того, как был задан этот параметр, выводит TP BE на график даже при закрытом рынке.

Также советник может модифицировать пирамиды сделок.

  • Change TP – возможно значение либо false, либо true. По умолчанию параметр отключен.
  • CustomTP – задает желаемый TakeProfit, который трейдер хотит выставить для сетки (формат пятизнак, например, 1,12345).
  • TP_BE_plus_PIPs – или жде если параметр CustomTP равен 0, то советник выставит безубыток плюс BE_plus_PIPs (четырехзнак). Также советник может сопровождать любые ордера, пересчитывая ВЕ каждые 30 сек, учитывая при этом комиссии и своп.
  • ChangeSL – либо false, либо true. По умолчанию отключен, не будет ничего модифицировать.
  • CustomSL – задает желаемый размер StopLoss. Если невозможно выставить SL_BE, то советник будет использовать данный параметр.
  • SL_BE_plus_PIPs – желаемое значение BE + пункты.
  • SL_BE_Distance – расстояние в пунктах, которое должна пройти котировка от уровня SL_BE, чтобы выставить SL_BE. Минимально равно 3 пунктам, если выставить ниже – советник всё равно поставит 3.
  • AllowModifyColor – определяет цвет интерактивной текстовой метки, т.н. AllowModify. Чтобы изменить метку, нужно выделить её, после чего переместить в любое место.
  • AllowModify – либо false, либо true. Параметр разрешает либо запрещает советнику модифицировать сделки. По умолчанию советник будет работать исключительно в информационном режиме.

Важный момент: робот не проверяет значения, вводимые Вами – поэтому важно перед торговлей на реальные деньги убедиться, что настраиваемые параметры соответствуют ожидаемым Вами.

Робот стандартно работает в торговом терминале МТ4. Установка – как и для других советников. Копируем файл робота в папку с терминалом – меню Файл – Открыть каталог данных – MQL4 — Experts, после чего робот становится доступен во вкладке Навигатор — Советники.

Советник не нуждается в тестировании или оптимизации – по понятным причинам. Перед применением робота на реальном счёте советуем попрактиковаться на демо.

Итоги

Советник Безубыток будет полезным для активных трейдеров, работающих с несколькими инструментами одновременно. Робот упрощает переносы стоп лоссов на уровень безубытка, защищает Ваш депозит и является хорошим подспорьем в торговле для большинства трейдеров в применении различных стратегий.

Зарабатывайте с умом, и помните, что прибыльность торговли очень сильно зависит от выбранного вами брокера!

Кроссплатформенный торговый советник: Пользовательские стопы, Безубыток и Трейлинг

Enrico Lambino

Оглавление

  1. Введение
  2. Пользовательские стоп-уровни
  3. Изменение стоп-уровней
  4. Безубыток
  5. Трейлинг-стоп
  6. Трейлинг уровня тейк-профита
  7. Реализация
  8. CTrails (Контейнер)
  9. Расширение CTrail
  10. Примеры

Введение

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

В этой статье мы и обсудим, как использовать класс CStop для определения стоп-уровней, выраженных в цене на графике. Также покажем, как можно изменять эти уровни с использованием специальной библиотеки. Кроме того, вводится новый класс CTrail, который очень похож на реализацию пользовательских стоп-уровней. Однако, в отличие от пользовательских стопов, CTrail используется для последовательного изменения стоп-уровней с течением времени.

Пользовательские стоп-уровни

Итак, мы уже знаем, как реализовать в кроссплатформенном советнике стоп-лосс/тейк-профит, выраженный в пунктах или пипсах. Но есть стратегии, которые требуют динамического вычисления стоп-уровней, обычно на основе данных таймсерий (OHLC) и по данным технических индикаторов.

Динамический расчет стоп-лосса и тейк-профита можно настроить в классе CStop через два его метода, StopLossCustom и TakeProfitCustom. Они являются перегрузками методов, уже существующих в этом классе. Вот их код:

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

Ниже перечислены альтернативные методы, которые возвращают значение типа bool:

Обе функции возвращают true, если отдельный член класса (или m_stoploss, или m_takeprofit) имеет нулевое значение. Их назначение мы обсудим ниже.

Рассмотрим сценарий, по которому CStop рассчитывает стоп-уровень. Для описания следующих шагов предположим, что мы работаем со стоп-лоссом (m_stoploss).

  1. Если m_stoploss равен 0, используем для расчета StopLossCustom.
  2. Если m_stoploss не равен 0, используем именно его, чтобы рассчитать текущий стоп-лосс сделки по отношению к цене входа.
Вам будет интересно  Лучшие Форекс советники 2020: скачать бесплатно

Такая же последовательность действий используется для расчета тейк-профита с помощью метода TakeProfitCustom и члена класса m_takeprofit.

Эти четыре метода могут быть локализованы в двух местах, в зависимости от того, для чего они используются. Для главных стоп-уровней метод вызывается из менеджера ордеров (COrderManager). Для остальных стопов — из экземпляра каждого ордера.

В случаях, когда главные стоп-уровни отправлены брокеру вместе с торговым запросом, советнику требуется эта информация уже в момент отправки торгового запроса, а не после того, как успешно отправлена начальная сделка. Это верно для брокерских стопов в MetaTrader 4 и хеджингового режима MetaTrader 5. В этих режимах информация по стоп-лоссу и тейк-профиту должна быть включена в торговый запрос для функции OrderSend (MQL4, MQL5), и эти стоп-уровни применяются только к основной торговой сделке.

Внутри метода TradeOpen менеджера ордеров находится вызов двух методов CStop. Ниже показан код для версии MQL4:

Ниже представлен код для версии MQL5:

Несмотря на то, что имплементация TradeOpen раздельная, мы можем найти общий знаменатель в том, каким способом две версии метода рассчитывают главные стоп-уровни. Сначала рассчитываются стоп-лосс и тейк-профит (sl и tp, соответственно) с учетом основного стоп-уровня. Это делается независимо от того, требовались ли стоп-лосс и тейк-профит в текущем первоначальном торговом запросе, поскольку информация также может понадобиться для расчета объема лота (при мани-менеджменте).

После того, как объем лота рассчитан, в некоторых случаях сбросить стоп-уровни к 0. Так, например, в MQL4 переменные sl и tp приравниваются к 0, если главный стоп не является брокерским.

В MQL5 мы стараемся избегать использования стоп-лосса и тейк-профита в неттинговом режиме, поскольку они будут применены ко всему объему позиции, а не только к объему вводимой сделки. Поэтому переменные устанавливаются на 0, если стоп не является брокерским, или платформа находится в неттинговом режиме.

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

Для сделок с несколькими уровнями стоп-лосса и тейк-профита эти уровни обрабатываются, как только успешно обработана главная сделка. В стоп-уровнях нет смысла, если главная сделка еще не введена в рынок, поэтому она должна быть обработана первой. Эти дополнительные стоп-уровни генерируются во время инициализации экземпляра COrder, доступного из метода CreateStops (через COrderBase, поскольку имплементация в MQL4 и MQL5 одинакова):

Как показано в этом коде, экземпляр COrderStop создается для каждого экземпляра CStop, найденного экспертом. Эти дополнительные стоп-уровни, однако, создаются только после того, как главная сделка успешно открыта на рынке.

Изменение стоп-уровней

У CStop есть собственный отдельный экземпляр CTradeManager, а значит, и CExpertTradeX (расширение класса CExpertTrade из Стандартной Библиотеки MQL5). Этот экземпляр независим от экземпляра, находящегося в менеджере ордеров (COrderManager) и использующегося исключительно для обработки входов в основные сделки.

То есть, изменение стоп-уровней управляется не СOrderManager, а только собственным экземпляром CStop. Однако мы знаем, что стоп-уровни для каждого ордера должны изменяться по отдельности. Значит, изменение должно вызываться из сделки, которая, в свою очередь, сама должна изменяться — то есть, из экземпляра COrder, представляющего эту сделку.

Мониторинг стоп-уровней начинается с метода CheckStops класса COrder, код которого приведен ниже:

Здесь просто вызывается метод Check одного из членов класса, который является экземпляром COrderStops. Как мы знаем из предыдущей статьи, СOrderStops — контейнер указателей на экземпляры COrderStop.

Рассмотрим метод Check класса COrderStops. Он показан в нижеследующем фрагменте кода:

Как мы видим из кода, метод Check выполняет как минимум пять действий над каждым экземпляром COrderStop.

  1. Проверяет, закрыт ли уже отдельный экземпляр COrderStop (метод IsClosed). Это необходимо для определения дальнейших действий над стоп-уровнем: если он закрыт, то в дальнейшем советник больше не должен его проверять.
  2. Обновляет стоп-уровни на основании назначенных для него экземпляров трейлинг-стопа, если они есть (метод CheckTrailing). Это действие относится только к трейлингу стоп-лосса или тейк-профита.
  3. Обновляет стоп-уровень (метод Update). Метод используется, когда стоп-уровень изменен не внутри советника, а извне (например, при перетаскивании линии виртуального стопа).
  4. Проверяет, не достигла ли цена определенного стоп-уровня (метод Check).
  5. Проверяет, представляет ли новый тикет собой сделку. Функция используется только в MetaTrader 4, потому что только в этой платформе эксперт меняет ID позиции при ее частичном закрытии. Имплементация для MetaTrader 5 в этом случае проще, потому что эта платформа сохраняет всю историю развития сделки.

Экземпляр COrderStop представляет стоп-уровень сделки как определенный в CStop. Значит, любое перетаскивание стоп-уровня приведет в итоге к изменению экземпляра этого объекта класса.

Метод CheckTrailing представлен ниже:

Из этого кода мы видим, что он следует основной идее: нельзя изменить стоп-уровень, если он уже закрыт. Если ордер для стоп-уровня еще действующий, то вызывается метод CheckTrailing соответствующего экземпляра CStop.

Посмотрим метод CheckTrailing класса CStop:

Здесь CStop вызывает метод Check одного из его членов класса, m_trails. m_trails — контейнер для указателей на объекты трейлинга. Код метода показан ниже:

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

Теперь вернемся к методу CheckTrailing класса COrderStop, потому что именно из него выполняется фактический вызов для изменения стоп-уровня:

Метод возвращает значение типа bool. Оно представляет собой результат изменения стоп-уровня методом Modify класса COrderStop (возвращает true в случае успеха). Но прежде чем отправить запрос на изменение, метод проверяет, действительны ли еще стоп-лосс и тейк-профит. Для этого используются методы IsStopLossValid и IsTakeProfitValid. Если предложенное значение недействительно, оно обнуляется.

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

После оценки стоп-лосса и тейк-профита вызывается метод Modify класса COrderStop. Он показан ниже:

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

Но может быть и по-другому. Каждый виртуальный стоп-уровень и стоп на основе отложенных ордеров должен обрабатываться индивидуально: отдельно стоп-лосс и отдельно — тейк-профит. Код для изменения обоих значений представлен в следующих методах:

Задача метода ModifyStops — вызвать остальные два метода. С этого момента начинается раздельная имплементация. Она основывается на двух важных факторах: это тип компилятора (MQL4 или MQL5) и тип стопа (брокерский, отложенный или виртуальный). Если мы имеем дело с брокерским стопом, результатом будет торговый запрос на изменение главной позиции. В случае стопов на основе отложенных ордеров эксперт должен будет сдвинуть цену открытия отложенного ордера. Если стоп виртуальный, советник просто обновит свои внутренние данные, относящиеся к стоп-уровню.

У COrderStop нет торговых объектов (или указателей на них) в качестве членов класса, и поэтому он по своей природе не способен изменять собственные стоп-уровни. Чтобы сделать это, ему по-прежнему нужен экземпляр CStop. Следовательно, результатом любого изменения стоп-уровня будет вызов метода в CStop.

Вам будет интересно  Что такое лот на Форексе и как его рассчитывать?

Безубыток

Безубыток — это точка, в которой выручка и расходы равны. В трейдинге выручка — это текущий профит по сделке, а расходы — это спред и/или комиссия. Иными словами, в точке безубытка сделка закрывается с нулевыми прибылями/потерями. В случае маркетмейкеров или брокеров, которые не взимают комиссий, точка безубытка обычно соответствует цене входа в сделку.

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

При работе с безубытком у советника есть как минимум два ограничения:

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

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

С учетом этих ограничений, в разработке функции для безубытка мы должны учитывать как минимум два фактора:

  1. Цену срабатывания.
  2. Новый стоп-лосс при срабатывании.

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

После срабатывания советник должен передвинуть стоп-лосс в точку безубытка. Обычно (но не всегда!) она будет совпадать с ценой открытия позиции. Для брокеров, которые взимают комиссию, точка безубытка будет выше входной цены для длинных позиций и ниже — для коротких.

Эти значения обычно вычисляются с учетом другого значения — например, текущей рыночной цены и цены входа в сделку.

На рисунке ниже показана блок-схема расчета точки безубытка способом, описанным выше. Вычисляются три значения — активация, дезактивация и новый стоп-уровень. Если уровень текущей цены выше или равен минимальной цене, требуемой для начального этапа (установки стоп-лосса к уровню безубытка), тогда стоп-уровень, рассчитанный ранее, будет использоваться как предварительный новый стоп-уровень. В противном случае результатом будет 0. Следующим шагом нужно проверить, находится ли новый стоп-уровень пределах текущего стоп-уровня брокера. Проверка всегда возвращает true при удовлетворении предыдущего условия. Таким образом, в качестве конечного итога будет возвращен рсссчитанный стоп-уровень.

Безубыток

Трейлинг-стоп

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

  1. Цену срабатывания.
  2. Новый стоп-лосс при срабатывании.
  3. Частоту трейлинга.

Функция трейлинг-стопа имеет две общих переменных с безубытком. Однако, в отличие от безубытка, цена при активации трейлинг-стопа может находиться в точке, где сделка находится в состоянии нереализованной потери или “out of the money”. Пока сделка остается убыточной, ее стоп-лосс можно изменять, а также отслеживать в динамике. Когда это происходит, достижение текущего стоп-лосса сделки все еще будет приводить к потерям, поскольку он еще не удовлетворяет предпосылкам для достижения безубыточности или даже получения прибыли.

Третий фактор — частота трейлинг-стопа, или «шаг». Он определяет расстояние (в пунктах или пипсах) от текущего стоп-лосса до следующего, после первого передвижения стоп-лосса. Она почти аналогична первой переменной — цене активации. Однако, в отличие от цены активации, цена, рассчитанная по этой третьей переменной, изменяется с каждым шагом трейлинга.

В некоторых трейлинг-стопах есть четвертый фактор — цена дезактивации. По достижению этой точки советник прекращает передвигать стоп-лосс. Это тоже рассчитывается отдельно для каждой сделки.

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

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

Трейлинг-стоп

Трейлинг уровня тейк-профита

Трейлинг, или трейлинг-стоп, обычно подразумевает под собой подтаскивание стоп-лосса, но возможен и трейлинг тейк-профита сделки. В этом случае, если цена подбирается к уровню тейк-профита, он плавно передвигается дальше (противоположность трейлинг-стопа). Теоретически, цена никогда не должна достигнуть тейк-профита, который подвергается трейлингу. Однако иногда это возможно: — например, при внезапных скачках цен и ценовых разрывах. Словом, это любое условие, при котором рынок движется быстрее, чем советник может на это отреагировать.

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

  1. Цена активации должна находиться внутри текущего уровня тейк-профита. Если цена активации выходит за пределы текущего уровня тейк-профита, цена рынка должна пробить этот уровень прежде, чем цену активации. И как только тейк-профит будет достигнут, сделка покинет рынок задолго до того, как может начаться трейлинг этого уровня. Для длинных позиций цена активации должна быть ниже уровня тейк-профита. Для коротких позиций цена активации должна находиться выше, чем тейк-профит.
  2. Цена, на котором произойдет следующее срабатывание трейлинга, должна находиться в пределах текущего уровня тейк-профита. Суть здесь та же, что в первом условии, с тем лишь различием, что второе применяется ко второму и дальнейшим срабатываниям.
  3. В идеале, трейлинг должен быть как можно менее частым. Дистанция между уровнями (шаг) должна быть достаточно широкой. Большая частота трейлинга тейк-профита уменьшает шансы на то, что рынок достигнет уровня тейк-профита, потому что он отодвигается от текущей цены на каждом этапе трейлинга.

Реализация

CTrailBase, который служит базовым классом для CTrail, показан в коде ниже:

Метод Set позволяет нам изменять настройки экземпляра CTrails. Он работает как обычный конструктор класса. Если необходимо, можно также объявить пользовательский конструктор, который вызывает этот метод:

CTrail в своих расчетах опирается на данные по рынку. Таким образом, у него есть экземпляр менеджера символов (CSymbolManager) в качестве одного из членов класса. Прежде чем осуществить дальнейшие расчеты, необходимо обновить символ.

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

Цена дезактивации рассчитывается по тому же плану, но используется член класса m_end class.

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

Метод Price рассчитывает новое значение стоп-лосса или тейк-профита, если условия в настоящий момент позволяют трейлинг стоп-лосса:

Вам будет интересно  Отложенный ордер: стратегии форекс на отложенных ордерах

Теперь поговорим о методе Check. Конкретный экземпляр СTrail может отслеживать стоп-лосс либо тейк-профит. Поэтому в CTrail нам нужна возможность указывать, какой именно из стопов сделки он отслеживает. Для этого пригодится перечисление ENUM_TRAIL_TARGET. Его объявление находится в MQLxCommonEnumENUM_TRAIL_TARGET.mqh, а код приведен ниже:

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

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

CTrails (Контейнер)

CTrail также имеет контейнер — CTrails. Его определение показано в коде ниже:

Контейнер должен взаимодействовать с CStop и объектами CTrail, на которые он ссылается. Будет у него и собственный метод Check:

CTrails, как и другие контейнеры, использованные в статьях этой серии, является наследником CArrayObj, который разработан для хранения многочисленных указателей на экземпляры СObject и его наследников. Так, CTrails может хранить более одного экземпляра CTrail.Если CTrails содержит множественные указатели на экземпляры CTrail, при вызове метода Сheck он будет вызывать методы Check всех этих экземпляров. Но только ближайшее к текущему рынку значение цены будет возвращено в качестве окончательного результата. Такое поведение можно изменить, расширив СTrails.

Классы CTrail и CTrails были сведены к чистому расчету. Это означает, что все методы закодированы в базовом классе (CTrailBase), а не в какой-либо его конкретной специфичной для языка имплементации. Когда вызывается проверка статуса трейлинг-стопа (CStop), он получает новое значение для стоп-уровня, а CStop, соответственно, изменяет этот уровень.

Расширение CTrail

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

Примеры

Пример №1: Пользовательские стопы

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

Сначала объявим наследник класса CStop. В этом экземпляре вызовем наследник CCustomStop. Его определение показано ниже:

Мы должны расширить методы StopLossCustom и TakeProfitCustom. Метод StopLossCustom выглядит так:

Сначала мы используем функции CopyLow и CopyHigh для расчета стоп-лосса в зависимости от типа сделки (покупка это или продажа). Получаем абсолютное значение его расстояния от цены входа в пунктах. Если оно ниже необходимого минимума, то устанавливаем стоп-лосс не на рассчитанный уровень, а на этот необходимый минимум.

Метод TakeProfitCustom повторяет похожий процесс:

Члены класса CStop, ответственные за присвоенные значения стоп-лосса и тейк-профита в пунктах (m_stoploss и m_takeprofit), по умолчанию инициализированы как 0. Таким образом, нам нужно только закомментировать следующие строки внутри функции OnInit:

Экземпляр CStop будет использовать пользовательский расчет только в том случае, если стоп-лоссу и тейк-профиту присвоены значения 0.

Пример № 2: Безубыток

Для функции безубытка мы также модифицируем главный заголовочный файл из третьего примера предыдущей статьи. Но на этот раз не будем расширять объекты классов. Вместо этого просто объявим экземпляры CTrail и CTrails:

Последняя строка очень важна. Нам надо добавить экземпляр CTrails к уже созданному экземпляру CStop. Таким образом, поведение будет применено именно к этому отдельному экземпляру.

Третий аргумент метода Set класса CTrail — шаг. Его значение по умолчанию 1 (1 пункт). Поскольку нам только нужно использовать функцию безубытка, присвоим ей значение 0.

Код, показанный выше, переменной breakeven_start, которая представляет собой цену активации (в пунктах от входной цены), и breakeven_value, которая представляет собой новое расстояние стоп-лосса (в пунктах) от цены активации. Объявим входные параметры для этих двух переменных:

С этой настройкой, как только цена сдвинется минимум на 200 пунктов в направлении сделки, стоп-лосс тоже передвинется на 200 пунктов от цены активации. 200 — 200 = 0, и таким образом новым рассчитанным стоп-лоссом становится цена входа в сделку.

Пример № #3: Трейлинг-стоп

Теперь рассмотрим реализацию трейлинг-стопа. Этот пример очень похож на предыдущий. Напомним, что в предыдущем примере мы вставили в функцию OnInit следующий код:

При использовании трейлинг-стопа процедура не изменяется:

На этот раз, метод Set класса CTrail использует три параметра. Первые два из них идентичны приведенным в предыдущем примере. Третий параметр — шаг, который представляет собой частоту трейлинга после активации. В предыдущей статье этот параметр метода имеет значение по умолчанию 0, и это означает, что после начальной пктивации больше не будет никаких добавочных перетаскиваний. Затем объявим в советнике входные параметры trail_value, trail_start и trail_step.

Пример №4: Пользовательский трейлинг

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

Чтобы создать этот советник, расширим сначала CTrail. Назовем этот класс-наследник CCustomTrail. Его определение показано ниже:

Теперь расширим метод Check. Отметим, что в этом случае метод не проверяет, к чему именно применяется трейлинг — к стоп-лоссу или к тейк-профиту. По умолчанию для CTrail назначен трейлинг стоп-лосса:

Как видим, расчет почти такой же, как мы уже видели среди методов CCustomStop. Кроме того, в заключительной части кода мы добавляем проверку возвращаемого значения: новый стоп-лосс должен быть на 100 пунктов (10 пипсов) больше предыдущего. Это нужно, чтобы предотвратить «блуждающий» в зависимости от значения недавнего максимума или минимума стоп-лосс. Вместо того, чтобы стоп-лосс колебался вверх-вниз вслед за значением локальных максимумов/минимумов, мы устанавливаем настройку, в соответствии с которой новый уровень стоп-лосса должен быть больше, чем заменяемый (выше для длинных позиций, ниже — для коротких).

Заключение

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

https://forex-invest.tv/stati-foreks/sovetnik-bezubytok-showmebe.html
https://www.mql5.com/ru/articles/3621