Наши рекомендации:

  1. Главная
  2. Уроки MQL4
  3. 4.0 Добавляем разные вариации Трайлинг Стопа в Советник

4.0 Добавляем разные вариации Трайлинг Стопа в Советник

trailing stop mql4

Всем привет! Добро пожаловать в четвертый раздел по программированию на языке MQL4.

В третьем разделе мы научились писать советники и даже переводить Стоп Лосс в безубыток. Пришло время попробовать ввести Траллинг Стоп в наш код mql4. Что такой тралл? Если простыми словами, то это последовательный перенос Стоп Лосса вслед за ценой. Цель этого действия — сократить убытки, вначале перенеся СЛ на уровень безубытка, а затем на положительную отметку, постепенно ее увеличивая.

О плюсах и минусах trailing stop в торговли можно спорить бесконечно, но факт в том, что вы не узнаете нужен ли он в вашей торговой системе, пока не попробуете. Так давайте же напишем отдельную функцию траллинга всех открытых ордеров.

Я сказал одну функцию? Нет уж, давайте напишем две… хотя, лучше три разных вариации тралла в одном советнике с возможностью выбора одного из них в настройках.

Создаем простой советник

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

Суть советника крайне проста — быстрая МА пересекла медленную снизу вверх — входим в покупки. Продажи зеркально. О прибыльности данного метода философствовать мы не будем, советник нужен только для примера.

Создаем новый проект в Meta Editor, выбираем тип «Советник». Указываем ему свойства и внешние переменные. Сразу добавим перечисление enum trail, которое позволит выбрать один из трех траллов. Настройки самого тралла внесем позже.

Добавляем в функцию обработки событий OnInit условие для перевода в пятизнак старых пунктов. Функция OnDeinit нам не нужна.

Основной код в функции OnTick будет проверять раз в свечу сигнал на вход и открывать ордера. Ну и не забываем про проверку на ошибки.

Подсчет количества ордеров в рынке в заданном направлении будет выполнять функция CountOrder():

Открытие и модификацию ордеров выполняет функция OpenTrade():

Все, советник готов. Просто вставьте этот код в ваш редактор, скомпилируйте и вы увидите, что в нем нет абсолютно ничего сложного.

«Простота есть необходимое условие прекрасного» © Лев Николаевич Толстой

Добавляем настройки trailing stop

Мы определились, что у нас будет три Трайлинг Стопа, а именно:

  1. Классический тралл по канонам отцов основателей.
  2. Усложненный тралл, где отдельно рассчитывается расстояние до активации, дистанция и шаг, и все это в процентах.
  3. Тралл по индикатору терминала Parabolic SAR.

Для каждого из них нужно добавить внешние переменные на глобальном уровне, а именно вариант выбора ChooseTrail, отвечающий за то, какой тралл будет сейчас активен, настройки дистанции, шага и индикатора:

Не забудем значения в пунктах перевести в пятизнак в функции OnInit:

Создаем классический Траллинг Стоп

Стандартный Трайлинг Стоп разработан компанией MetaQuotes и встроен в терминал MetaTrader 4.

trailing stop

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

Давайте добавим в самый вверх OnTick условие активации функции для этого первого варианта:

Соответственно каждый тик советник будет запускать функцию ClassicTrail() и проверять, нужно ли передвинуть Стоп Лосс.

Создаем пользовательскую функцию ClassicTrail(). Ее суть — перебором пройтись по всем ордерам и сравнить расстояние от текущей цены до установленного Стоп Лосса.

В коде выше видно, что цикл for выделяет каждый открытый ордер по очереди и если выделение невозможно, то пропускает его. Далее идет проверка, чтобы символ ордера был таким же, как символ текущего графика, на котором установлен советник. Потом следует проверка на магик номер ордера, условие, чтобы ордер был в плюсе, его Стоп Лосс был выставлен и тип данного ордера был рыночным.

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

Рассмотрим условие выше для ордера на покупку. Вначале мы высчитываем новый Стоп Лосс  NewSL, он должен быть на расстоянии TrailingDist от текущей цены. Нужно заметить, что для покупок мы учитываем цену Ask, тогда как для продаж цену Bid, так же, как и при открытии ордеров. Далее происходит сравнение расчетного и текущего Стоп Лосса. Если расчетный получился выше фактического, то мы понимаем, что текущая цена уже сместились выше и нам необходимо передвинуть наш Стоп Лосс.

Продажи модифицируются зеркально: если расчетный СЛ ниже существующего, значит пора передвигать текущий.

Все, теперь как только цена пройдет расстояние TrailingDist от цены открытия ордера — произойдет модификация, которая будет продолжаться каждый тик, пока рынок это позволит делать. В итоге ордер будет зажат между Тейк Профитом и Стоп Лоссом, и один из них сработает.

Усложненный Трайлинг Стоп по процентам

Первый вариант тралла уже можно считать устаревшим, ведь он абсолютно не гибкий в настройках. Следующий complex тралл содержит уже три параметра: расстояние для активации, дистанция самого тралла и его шаг.

Мы долгое время думали с командой, как лучше рассчитывать тралл и пришли к мнению, что правильнее использовать не пункты, а значение в процентах от Тейк Профита. Тут все просто. При оптимизации советника генетический алгоритм прогоняет тысячи вариантов в тестере и если указывать ТП и тралл в пунктах, то очень часто попадаются варианты, когда цена активации тралла оказывается больше значения Тейка. В таком случае данный тралл просто не будет работать, он не сможет активироваться, соответственно такой прогон будет в пустую. Да и варианты, когда ТП в 100 пунктов, а тралл активируется при прохождении 15 пунктов не очень привлекательные. По этой причине мы будем задавать его в процентах.

Добавляем в функцию OnTick второе условия для активации данного тралла:

Я сразу выложу полный код функции ComplexTrail() и по порядку опишу, что происходит в нем.

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

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

Если оба условия соблюдены в первый раз, то советник выдает нам принт в журнал об этом и далее блокирует функцию принта с помощью bool переменной PrintTrailingMessageB. Далее следует расчет нового СЛ, который равен разнице между текущей ценой и нашей дистанцией. Значение переменной NewSL будет точно выше существующего СЛ из-за проверки, что была до этого, поэтому просто модифицируем ордер с новым СЛ и выдаем об этом принт в журнал.

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

Нужно заметить, что тралл для покупок не может опускаться назад за ценой, если она идет вниз, он либо стоит на месте, либо растет вслед за ней, когда расстояние увеличивается. То же самое зеркально для продаж.

Давайте посмотрим в журнале, что у нас получилось:

trailing stop mql4

В настройках ТП = 30пп, тралл активируется на расстоянии 50% до ТП, дистанция его от цены равна 40%, шаг 1 пункт.

  1. Советник открыл ордер на покупку по цене 0.94778.
  2. Через какое-то время тралл активировался по цене 0.94928, т.к. цена прошла (0.94928-0.94778)*10000 = 15 старых пунктов (50% от ТП). Дистанция установки СЛ равна 40% от 30пп, т.е. 12 пунктам.
  3. Первый СЛ был выставлен по цене 0.94808, потому что расстояние от цены активации (0.94928) до данного СЛ как раз равно 12 пунктам. Далее мы видим, что как только цена проходила расстояние больше или равное 1 пункту Стоп Лосс подтягивался ближе к ней.
  4. Цена не дошла до Тейк Профита и сработал Стоп Лосс по цене 0.94889, которая и была рассчитана при последней модификации тралла.

Трайлинг Стоп по Параболик САР

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

Соответственно, когда у нас ордер на покупку, мы будем переносить Стоп Лосс по точкам, которые находятся ниже свечей и текущей цены и наоборот для продаж.

Точки параболика хранятся в данных буфера, плюс это стандартный индикатор Meta Trader, поэтому мы просто не можем не попробовать его в нашем коде.

Так как значения индикатора закрепляются только после закрытия свечи, то данный тралл должен работать только один раз при открытии новой свечи. Поэтому в функцию обработки событий OnTick в условие, которые соблюдается только раз в свечу добавляем следующий код:

Создаем функцию третьего тралла:

Смотрим код. Изначально нужно получить данные индикатора PSAR, для этого воспользуемся функцией iSAR. Все передаваемые параметры понятны: символ, ТФ, шаг изменения цены и максимальный шаг берется из внешних настроек. Импорт данных буфера будет происходить на первой закрытой свече.

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

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

Заключение

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

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

На этом все, всем профитов!

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

0. Начало работы

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Заполните поле
Заполните поле
Пожалуйста, введите корректный адрес email.
Вы должны согласиться с условиями для продолжения

Меню