Ну трал-то, вставить недолго.
Вот отсюда можно взять образец (2 посл. советника на страничке).
http://www.kimiv.ru/index.php?option=com_remository&Itemid=13&func=select&id=4&orderby=2&page=2
А вот "...SL сделать меньше если понятно что рынок идёт сразу против открытой позиции." - это я даже и не соображу сразу...
ключевая фраза "если понятно" - понятна только вам
если вы можете расшифровать её в виде каких то условий для эксперта, то напишите эти условия.
и вопрос в догонку - "если понятно" что цена идет против позиции - не проще ли закрыть позицию вообще?
До init(start)
//+------------------------------------------------------------------+ //| ТРЕЙЛИНГ СТАНДАРТНЫЙ-ЗАТЯГИВАЮЩИЙСЯ | //| Функции передаётся тикет позиции, исходный трейлинг (пунктов) и | //| 2 "уровня" (значения профита, пунктов), при которых трейлинг | //| сокращаем, и соответствующие значения трейлинга (пунктов) | //| Пример: исходный трейлинг 30 п., при +50 - 20 п., +80 и больше - | //| на расстоянии в 10 пунктов. | //+------------------------------------------------------------------+ void TrailingUdavka(int ticket,int trl_dist_1,int level_1,int trl_dist_2,int level_2,int trl_dist_3) { double newstop = 0; // новый стоплосс double trldist; // расстояние трейлинга (в зависимости от "пройденного" может = trl_dist_1, trl_dist_2 или trl_dist_3) // проверяем переданные значения NormalizePrice(Ask,true); NormalizePrice(Bid,true); if ((trl_dist_1<MarketInfo(Symbol(),MODE_STOPLEVEL)) || (trl_dist_2<MarketInfo(Symbol(),MODE_STOPLEVEL)) || (trl_dist_3<MarketInfo(Symbol(),MODE_STOPLEVEL)) || (level_1<=trl_dist_1) || (level_2<=trl_dist_1) || (level_2<=level_1) || (ticket==0) || (!OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))) { Print("Трейлинг функцией TrailingUdavka() невозможен из-за некорректности значений переданных ей аргументов."); return(0); } // если длинная позиция (OP_BUY) NormalizePrice(Ask,true); NormalizePrice(Bid,true); if (OrderType()==OP_BUY) { // если профит <=trl_dist_1, то trldist=trl_dist_1, если профит>trl_dist_1 && профит<=level_1*Point ... if ((Bid-OrderOpenPrice())<=level_1*Point) trldist = trl_dist_1; if (((Bid-OrderOpenPrice())>level_1*Point) && ((Bid-OrderOpenPrice())<=level_2*Point)) trldist = trl_dist_2; if ((Bid-OrderOpenPrice())>level_2*Point) trldist = trl_dist_3; // если стоплосс = 0 или меньше курса открытия, то если тек.цена (Bid) больше/равна дистанции курс_открытия+расст.трейлинга if ((OrderStopLoss()==0) || (OrderStopLoss()<OrderOpenPrice())) { if (Bid>(OrderOpenPrice() + trldist*Point)) newstop = Bid - trldist*Point; } // иначе: если текущая цена (Bid) больше/равна дистанции текущий_стоплосс+расстояние трейлинга, else { if (Bid>(OrderStopLoss() + trldist*Point)) newstop = Bid - trldist*Point; } // модифицируем стоплосс if ((newstop>OrderStopLoss()) && (newstop<Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point)) { if (!OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration())) Print("Не удалось модифицировать стоплосс ордера №",OrderTicket(),". Ошибка: ",Error(GetLastError())); } } // если короткая позиция (OP_SELL) if (OrderType()==OP_SELL) { // если профит <=trl_dist_1, то trldist=trl_dist_1, если профит>trl_dist_1 && профит<=level_1*Point ... if ((OrderOpenPrice()-(Ask + MarketInfo(Symbol(),MODE_SPREAD)*Point))<=level_1*Point) trldist = trl_dist_1; if (((OrderOpenPrice()-(Ask + MarketInfo(Symbol(),MODE_SPREAD)*Point))>level_1*Point) && ((OrderOpenPrice()-(Ask + MarketInfo(Symbol(),MODE_SPREAD)*Point))<=level_2*Point)) trldist = trl_dist_2; if ((OrderOpenPrice()-(Ask + MarketInfo(Symbol(),MODE_SPREAD)*Point))>level_2*Point) trldist = trl_dist_3; // если стоплосс = 0 или меньше курса открытия, то если тек.цена (Ask) больше/равна дистанции курс_открытия+расст.трейлинга if ((OrderStopLoss()==0) || (OrderStopLoss()>OrderOpenPrice())) { if (Ask<(OrderOpenPrice() - (trldist + MarketInfo(Symbol(),MODE_SPREAD))*Point)) newstop = Ask + trldist*Point; } // иначе: если текущая цена (Bid) больше/равна дистанции текущий_стоплосс+расстояние трейлинга, else { if (Ask<(OrderStopLoss() - (trldist + MarketInfo(Symbol(),MODE_SPREAD))*Point)) newstop = Ask + trldist*Point; } // модифицируем стоплосс if (newstop>0) { if (((OrderStopLoss()==0) || (OrderStopLoss()>OrderOpenPrice())) && (newstop>Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point)) { if (!OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration())) Print("Не удалось модифицировать стоплосс ордера №",OrderTicket(),". Ошибка: ",Error(GetLastError())); } else { if ((newstop<OrderStopLoss()) && (newstop>Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point)) { if (!OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration())) Print("Не удалось модифицировать стоплосс ордера №",OrderTicket(),". Ошибка: ",Error(GetLastError())); } } } } } //+------------------------------------------------------------------+
Автор - Ю.Дзюбан (это не я) и
//+------------------------------------------------------------------+ //| ТРЕЙЛИНГ KillLoss | //| Применяется на участке лоссов. Суть: стоплосс движется навстречу | //| курсу со скоростью движения курса х коэффициент (dSpeedCoeff). | //| При этом коэффициент можно "привязать" к скорости увеличения | //| убытка - так, чтобы при быстром росте лосса потерять меньше. При | //| коэффициенте = 1 стоплосс сработает ровно посредине между уров- | //| нем стоплосса и курсом на момент запуска функции, при коэфф.>1 | //| точка встречи курса и стоплосса будет смещена в сторону исход- | //| ного положения курса, при коэфф.<1 - наоборот, ближе к исходно- | //| му стоплоссу. | //+------------------------------------------------------------------+ void KillLoss(int iTicket,double dSpeedCoeff) { // проверяем переданные значения NormalizePrice(Ask,true); NormalizePrice(Bid,true); if ((iTicket==0) || (!OrderSelect(iTicket,SELECT_BY_TICKET)) || (dSpeedCoeff<0.1)) { Print("Трейлинг функцией KillLoss() невозможен из-за некорректности значений переданных ей аргументов."); return(0); } double dStopPriceDiff; // расстояние (пунктов) между курсом и стоплоссом double dToMove; // кол-во пунктов, на которое следует переместить стоплосс // текущий курс double dBid = MarketInfo(OrderSymbol(),MODE_BID); double dAsk = MarketInfo(OrderSymbol(),MODE_ASK); NormalizePrice(Ask,true); NormalizePrice(Bid,true); // текущее расстояние между курсом и стоплоссом if (OrderType()==OP_BUY) dStopPriceDiff = dBid - OrderStopLoss(); if (OrderType()==OP_SELL) dStopPriceDiff = (OrderStopLoss() + MarketInfo(OrderSymbol(),MODE_SPREAD)*MarketInfo(OrderSymbol(),MODE_POINT)) - dAsk; // проверяем, если тикет != тикету, с которым работали раньше, запоминаем текущее расстояние между курсом и стоплоссом if (GlobalVariableGet("zeticket")!=iTicket) { GlobalVariableSet("sldiff",dStopPriceDiff); GlobalVariableSet("zeticket",iTicket); } else { // итак, у нас есть коэффициент ускорения изменения курса // на каждый пункт, который проходит курс в сторону лосса, // мы должны переместить стоплосс ему на встречу на dSpeedCoeff раз пунктов // (например, если лосс увеличился на 3 пункта за тик, dSpeedCoeff = 1.5, то // стоплосс подтягиваем на 3 х 1.5 = 4.5, округляем - 5 п. Если подтянуть не // удаётся (слишком близко), ничего не делаем. // кол-во пунктов, на которое приблизился курс к стоплоссу с момента предыдущей проверки (тика, по идее) dToMove = (GlobalVariableGet("sldiff") - dStopPriceDiff) / MarketInfo(OrderSymbol(),MODE_POINT); // записываем новое значение, но только если оно уменьшилось if (dStopPriceDiff<GlobalVariableGet("sldiff")) GlobalVariableSet("sldiff",dStopPriceDiff); // дальше действия на случай, если расстояние уменьшилось (т.е. курс приблизился к стоплоссу, убыток растет) if (dToMove>0) { // стоплосс, соответственно, нужно также передвинуть на такое же расстояние, но с учетом коэфф. ускорения dToMove = MathRound(dToMove * dSpeedCoeff) * MarketInfo(OrderSymbol(),MODE_POINT); // теперь проверим, можем ли мы подтянуть стоплосс на такое расстояние if (OrderType()==OP_BUY) { if (dBid - (OrderStopLoss() + dToMove)>MarketInfo(OrderSymbol(),MODE_STOPLEVEL)* MarketInfo(OrderSymbol(),MODE_POINT)) OrderModify(iTicket,OrderOpenPrice(),OrderStopLoss() + dToMove,OrderTakeProfit(),OrderExpiration()); } if (OrderType()==OP_SELL) { if ((OrderStopLoss() - dToMove) - dAsk>MarketInfo(OrderSymbol(),MODE_STOPLEVEL) * MarketInfo(OrderSymbol(),MODE_POINT)) OrderModify(iTicket,OrderOpenPrice(),OrderStopLoss() - dToMove,OrderTakeProfit(),OrderExpiration()); } } } }
Автор - он же. В соответствующем месте советника прописываете эти функции (на мой взгляд, документированы хорошо) - и вперед, за орденами(простите, за ТР(ну, или за плюсовыми SL, что тоже приятно(ИМХО)))

Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Привет всем.
Имеется эксперт, который закрывает сделку жестко по указанным TP или SL . Хотелось бы сделать чтото поинтересней. Например TP поменять на Trailing SL, а SL сделать меньше если понятно что рынок идёт сразу против открытой позиции.
Может у когото есть примерчик с реализованной схожей логикой?
Спасибо