Эксперт, торгующий в ночное время: реализация трейлинг стопа
На данный момент я разобрал практически весь код "ночного" эксперта. Мне осталось рассказать лишь о реализации трейлинг-стопа.
Напомню, что Trailing Stop (трейлинг стоп) – это алгоритм управления уровнем Stop Loss ордера. После выставления трейлинг-стопа (например, на Х пипсов) происходит следующее:
MetaTrader не предпринимает никаких действий до того момента, пока по открытой позиции не образуется прибыль в Х пипсов. После этого MetaTrader выставляет Stop Loss ордер на расстоянии Х пипсов от текущей цены (в данном случае - на уровне безубыточности).
После выполнения первого шага MetaTrader посылает команду на изменение уровня Stop Loss ордера на расстояние Х пипсов от текущей котировки каждый раз, когда расстояние между ней и старым уровнем ордера превысит Х пипсов. В результате этого Stop Loss ордер «подтягивается» к текущей цене.
Реализация трейлинг стопа в эксперте
Вначале мы перебираем открытые позиции и выставленные ордера и ищем позицию, открытую по данному инструменту и чье магическое число равно MyMagicNumber:
// управление трейлинг стопом for (i=0; i<OrdersTotal(); i++) { if (!OrderSelect(i, SELECT_BY_POS)) { Print("Error ", GetLastError(), ": Start()->OrderSelect(", i, ") [OrderTotal()=", OrdersTotal(),"]"); continue; } if (OrderSymbol()!=Symbol()) continue; if (OrderMagicNumber()!=MyMagicNumber) continue; double diff; if (OrderType() == OP_BUY) { ... } if (OrderType() == OP_SELL) { ... } }
Далее мы рассчитываем для найденных позиций расстояние между текущей ценой и ценой Stop Loss ордера для этой позиции. Если это расстояние превышает TrailingStop пипсов, то эксперт посылает команду на изменение уровня Stop Loss ордера.
Для открытой позиции на покупку:
if (OrderType() == OP_BUY) { diff = Bid-Point*TrailingStop-OrderStopLoss(); if (diff>0) { if (!OrderModify(OrderTicket(), OrderOpenPrice(), Bid-Point*TrailingStop, 0,0)) Print("Error ", GetLastError(), ": Start()->OrderModify() [trailing stop]"); else Print("Trailing stop on #", OrderTicket()," [place stop loss at ", Bid-Point*TrailingStop, "]"); } return(0); }
Для позиции на продажу:
if (OrderType() == OP_SELL) { diff = OrderStopLoss()-Ask-Point*TrailingStop; if (diff>0) { if (!OrderModify(OrderTicket(), OrderOpenPrice(), Ask+Point*TrailingStop,0,0)) Print("Error ", GetLastError(), ": Start()->OrderModify() [trailing stop]"); else Print("Trailing stop on #", OrderTicket()," [place stop loss at ", Ask+Point*TrailingStop, "]"); } return(0); } }
В следующем выпуске я расскажу о сортировке методом пузырька.
Все статьи по теме "Пишем советников для MetaTrader 4".
- Механическая торговая система - миф или реальность?
- С чего начать при написании советника:
- Создаем нового советника - Настраиваем параметры. - Язык MetaQuotes Language 4:
Комментарии по теме "Эксперт, торгующий в ночное время: реализация трейлинг стопа"
Доброго времени суток всем!
Мое мнение:
Использование Trailing Stop (трейлинг стоп) в таком виде ЖЛОБСТВО :-) и не очень оптимально.
Я использую другой способ. Я ни где не встречал его, поэтому сам называю его ПОДТЯЖКИ.
Может где-то кто-то уже его придумал и как-то называет по другому. Извиняйте!
Он более сложный, но не очень :-)
Автор: Driver777 | 28.04.2007 12:27
Кратенько.
При запуске эксперта используются несколько дополнительных параметров.
А именно: 1) Первоначальный StopLoss 2) TrailingStop 3) Собственно Podtyag-ПОДТЯЖКИ 4) И BarLimit-количество баров без движения.
Автор: Driver777 | 28.04.2007 12:36
Идею понял. Согласен, что так эксперт будет делать меньше запросов на сервер и меньше будет тревожить дилеров или сервер.
Если Ваш код не составляет коммерческой тайны, может быть Вы его тут выложите?
Автор: Андрей Ведихин | 07.05.2007 00:26
Нет никокой коммерческой тайны:-) Там все просто.
Неудобно только в формате аля форума это делать.
Попробую небольшими кусочками.
extern int TakeProfit=240;
extern int StopLoss=42;
extern int TrailingStop=24;
extern int TrailingPodtyag=16;
это описание некоторых переменных, с оптимальными(IMHO) параметрами для EUR/JPY H4
Параметры средние- дают хороший результат на тестах за последние два года. Но еще лучше расчитывать их на каждый день исходя из уровней поддержки и сопротивления.
Не все так просто....
Автор: Driver777 | 09.05.2007 02:09
А вот собственно та часть кода, которая отвечает за сопровождение позиции.
Автор: Driver777 | 09.05.2007 02:11
Есть еще один кусочек кода, который особым образом устанавливает
TP( чуть внутри флэтового канала) и SL (чуть снаружи)
если инструмент после тренда перешел во флэт(более трех баров ПОДТЯЖКИ не двигались) и индикаторы "кричат" о наступлении неопределенности или возможном развороте.
Но он сильно усложняет и может запутать, т.к. для него нужно выполнить много дополнительных расчетов на младших временных периодах.
Автор: Driver777 | 09.05.2007 02:11
Вопрос! Зачем я всем этим делюсь? Ведь я понимаю, что такой вариант сопровождения хоть и лучше обычного трейлинга, но тоже далеко не совершенен. Я думаю забросить его (использую все реже и реже)написать что-нибудь
более совершенное.
Для реализации SL по теории BW вообще нужен специальный алгоритм, что-то среднее между трейлингом, стопом-скольжением по линиям баланса, может быть ПОДТЯЖКАМИ и др.
Автор: Driver777 | 09.05.2007 02:14
Спасибо!
Автор: Андрей Ведихин | 27.05.2007 16:14