Эксперт, торгующий в ночное время: реализация трейлинг стопа
На данный момент я разобрал практически весь код "ночного" эксперта. Мне осталось рассказать лишь о реализации трейлинг-стопа.
Напомню, что 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
А вот собственно та часть кода, которая отвечает за сопровождение позиции.
for(cnt=0;cnt<OrdersTotal();cnt++) { OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES); if(OrderType()<=OP_SELL && OrderSymbol()==Symbol()) { if(OrderType()==OP_BUY) { if(TrailingStop>0) { if(Bid-OrderOpenPrice()>Point*(TrailingStop+TrailingPodtyag)) { if(OrderStopLoss()<Bid-Point*(TrailingStop+TrailingPodtyag)) { OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop, OrderTakeProfit(),0,Green); return(0); } } } } else { if(TrailingStop>0) { if((OrderOpenPrice()-Ask)>(Point*(TrailingStop+TrailingPodtyag))) { if((OrderStopLoss()>Ask+Point*(TrailingStop+TrailingPodtyag))|| (OrderStopLoss()==0)) { OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop, OrderTakeProfit(),0,Red); return(0); } } } } } }Автор: 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