Трейлинг, TrailingStop
Спасибо)
Идеальное объяснение!
Тот же советник, только трейлинг вынесен полностью в отдельную функцию:
//| Trailing позиции |
//| При таком подходе ожидается, что позиция УЖУ ВЫБРАНА и |
//| произвели обновление цен в методе RefreshRates() |
//+------------------------------------------------------------------+
void TrailingStop(const ulong ticket,const double trailing,const double step)
при таком подходе ожидается, что:
позиция УЖУ ВЫБРАНА и произвели обновление цен в методе RefreshRates()
Выбор позиция стандартен:
if(m_position.SelectByIndex(i))
if(m_position.Symbol()==Symbol() && m_position.Magic()==m_magic)
TrailingStop(m_position.Ticket(),ExtTrailingStop,ExtTrailingStep);
Советник "TrailingStopSeparateFunction.mq5", версия "1.001": исправлено поведение для SELL позиции
Трейлинг (точнее модификация) отложенных ордеров.
Вариантов уйма, а пока, чтобы не забыть, какие вообще могут быть отложенные ордера:
Владимир обнаружил у вас в коде ошибку в обоих вариантах она присутствует
//| Trailing позиции |
//| При таком подходе ожидается, что позиция УЖУ ВЫБРАНА и |
//| произвели обновление цен в методе RefreshRates() |
//+------------------------------------------------------------------+
void TrailingStop(const ulong ticket,const double trailing,const double step)
{
//--- TrailingStop -> подтягивание StopLoss у ПРИБЫЛЬНОЙ позиции
if(m_position.PositionType()==POSITION_TYPE_BUY)
{
//--- когда у позиции ещё нет StopLoss
if(m_position.StopLoss()==0)
{
//--- пока StopLoss равен 0.0, TrailingStep не учитываем
if(m_symbol.Bid()-ExtTrailingStop>m_position.PriceOpen())
{
//--- модификация позиции
m_trade.PositionModify(m_position.Ticket(),m_position.PriceOpen(),0.0);
}
}
//--- у позиции уже есть StopLoss
else
{
//--- теперь TrailingStep нужно учитывать, иначе мы будет модифицировать
//--- поизцию НА КАЖДОМ ТИКЕ, а это ПЛОХО
if(m_symbol.Bid()-ExtTrailingStop-ExtTrailingStep>m_position.StopLoss())
{
//--- модификация позиции
m_trade.PositionModify(m_position.Ticket(),
NormalizeDouble(m_symbol.Bid()-ExtTrailingStop,m_symbol.Digits()),0.0);
}
}
}
if(m_position.PositionType()==POSITION_TYPE_SELL)
{
//--- когда у позиции ещё нет StopLoss
if(m_position.StopLoss()==0)
{
//--- пока StopLoss равен 0.0, TrailingStep не учитываем
if(m_symbol.Ask()+ExtTrailingStop<m_position.PriceOpen())
{
//--- модификация позиции
m_trade.PositionModify(m_position.Ticket(),m_position.PriceOpen(),0.0);
}
}
//--- у позиции уже есть StopLoss
else
{
//--- теперь TrailingStep нужно учитывать, иначе мы будет модифицировать
//--- поизцию НА КАЖДОМ ТИКЕ, а это ПЛОХО
if(m_symbol.Bid()+ExtTrailingStop+ExtTrailingStep<m_position.StopLoss())
{
//--- модификация позиции
m_trade.PositionModify(m_position.Ticket(),
NormalizeDouble(m_symbol.Ask()+ExtTrailingStop,m_symbol.Digits()),0.0);
}
}
}
}
.......
Часто спрашивают про трейлинг и всё чаще хотят что-то универсальное. Так вот - универсальность - враг хорошего :).
Итак трейлинг - это "подтягивание" уровня StopLoss для прибыльной позиции. [не совсем врено]
Карпутов, вы конечно поясняете со всей тщательностью, но уже как неоднократный факт, по своему обыкновению, вообще не прорабатываете детали.
Как по мне, если создавать специальные поясняющие ветки (что стали делать вы в последнее время), то надо давать исчерпывающее по правильности и точности пояснение.
В противном случае, правильный ответ будет размыт в диалоге.
А неточный или неправильный ответ в вашем первом посту -- будет обесценивать наш ресурс как FAQ
На самом деле -- трейлинг-стоп (а не "трейлинг") дословно с английского переводится как "перемещаемая остановка" -- и его назначение, это следование стоп-лосса в направлении движении цены на указанном расстоянии.
Конкретно к прибыльной позиции трейлинг-стоп имеет отношение только в частном случае, исходя из того как он будет функционально организован. Можно стоп-лосс тралить как с позиции безубытка (только прибыльную позицию), а можно тралить с любой позиции (безотносительно прибыльная или убыточная позиция).
Нет никаких жёстких правил и ограничений в MQL5 творчестве. Решения рождаются под конкретные задачи - поэтому и открыта ветка - здесь можно писать разнообразные варианты.
Карпутов -- вам лично творить никто не мешает, ровно как ресурс mql5 творчеству только способствует.
Как я всё понимаю -- я нахожу по поиску "трейлинг-стоп" вашу эту ветку -- читаю кто автор -- читаю "модератор" -- и понимаю ваш ответ как абсолютно правильный и исчерпывающий. Так я отношусь к ответам Рената, Роша, Стринго и любого модератора из сервисдеска. Для меня их ответы исчерпывающие и окончательные. У верен, что не только для меня.
Но вот лично ваши ответы -- извините, с тучей ошибок и неточностей -- у меня вызывают разочарование. Разочарование не в ваших ответах -- а разочарование что вы, как модератор, даёте новичкам неверную установку, с которой потом в том же фрилансе приходится "бороться" и пояснять, что вы пояснили тот или иной момент не верно или с ошибкой.
p.s. Карпутов, вы не простой пользователь -- вы модератор -- и за свои слова и за свои пояснения с вас лично спрос выше чем с любого другого. Два равных ответа -- мой и ответ ваш как модератора -- ваш ответ будет восприниматься априори как ответ авторитетней моего. Не понятно, почему вы этого не понимаете.
//--- поизцию НА КАЖДОМ ТИКЕ, а это ПЛОХО
и в трейлинг-стопе -- стоп-лосс меняется не с каждым тиком -- а при движении цены в заданном направлении.
если с каждым тиком у позиции БАЙ цена будет двигаться вверх -- то да, на каждом тике будет отдаваться приказ на модификацию
что в этом плохого?
например, штатный терминальный трейлинг-стоп -- модифицирует стоп-лосс на каждом тике при движении цены в заданном направлении, у него шаг =1 и вообще нет возможности менять это значение

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Часто спрашивают про трейлинг и всё чаще хотят что-то универсальное. Так вот - универсальность - враг хорошего :).
Итак трейлинг - это "подтягивание" уровня StopLoss для прибыльной позиции.
В общем здесь будут примеры реализации трейлинга. И первый образец - TrailingStop версия "1.00". Учитывает ситуацию когда у позиции StopLoss равен нулю (например при открытии позиции StopLoss не был задан) и когда StopLoss не равен нулю (такое может быть, когда при открытии позиции StopLoss был задан сразу или после модификации StopLoss'a). В данной реализации модификация позиций встроена в цикл перебора позиций.
Всего два параметра:
TrailingStop - собственно отступ между ценой и уровнем StopLoss
TrailingStep - защита от чрезмерно частой модификации позиции.
Как работает TrailingStop (трейлинг, TrailingStop) - на примере позиции Buy:
сначала у позиции StopLoss равен нулю, ждем выполнения условия
- то есть когда цена Bid минус TrailingStop больше, чем цена открытия позиции PriceOpen:
в результате переносим StopLoss на уровень цены открытия позиции PriceOpen:
теперь, когда у позиции есть StopLoss (точнее когда StopLoss не равен нулю), ждём выполнения условия:
- то есть когда цена Bid минус TrailingStop минус TrailingStep больше, чем цена StopLoss. Обратите внимание, здесь уже в проверку вводим значение TrailingStep - это нужно чтобы не допустить модификации позиции НА КАЖДОМ ТИКЕ:
в результате переносим StopLoss на уровень Bid минус TrailingStop:
а теперь наглядно, зачем нужна была защита в виде TrailingStep:
TrailingStop.mq5 version "1.001": исправлено поведение для SELL позиции