Группа: Администраторы
Сообщений: 9790
Награды: 42
Статус: Оффлайн
|
приветствую,
возьмите мой код:
внешние переменные: Код extern string Trailing_="Настройки трейлингстопа"; extern bool TrailingStopUSE=false; // Использовать трейлингстоп extern bool IfProfTrail=false; // Использовать только дял профитных позиций - режим безубытка extern int TrailingStop=0; // Дистанция трейлинга = 0 - минимально допустимый extern int TrailingStep=1; // Шаг дистанции
в старте или OnTick Код if(TrailingStopUSE)SimpleTrailing(Symbol(),-1,Magic);
Функция трала: Код //+----------------------------------------------------------------------------+ //| Описание : Сопровождение позиций простым тралом | //+----------------------------------------------------------------------------+ //| Параметры: | //| sy - наименование инструмента ( "" - любой символ, | //| NULL - текущий символ) | //| op - операция ( -1 - любая позиция) | //| mn - MagicNumber ( -1 - любой магик) | //+----------------------------------------------------------------------------+ void SimpleTrailing(string sy="",int op=-1,int mn=-1) { double po,pp; int i,k=OrdersTotal(); string Autor=" Автор функции для шаблона : www.expforex.com";
if(sy=="0") sy=Symbol(); if(TrailingStop==0)TrailingStop=MarketInfo(Symbol(),MODE_STOPLEVEL); for(i=0;i<k;i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) { po=MarketInfo(OrderSymbol(),MODE_POINT); if(mn<0 || OrderMagicNumber()==mn) { if(OrderType()==OP_BUY) { pp=MarketInfo(OrderSymbol(),MODE_BID); if((!IfProfTrail && OrderProfit()>0) || pp-OrderOpenPrice()>TrailingStop*po) { if(OrderStopLoss()<pp-(TrailingStop+TrailingStep-1)*po) { ModifyOrder(-1,pp-TrailingStop*po,-1); } } } if(OrderType()==OP_SELL) { pp=MarketInfo(OrderSymbol(),MODE_ASK); if((!IfProfTrail && OrderProfit()>0) || OrderOpenPrice()-pp>TrailingStop*po) { if(OrderStopLoss()>pp+(TrailingStop+TrailingStep-1)*po || OrderStopLoss()==0) { ModifyOrder(-1,pp+TrailingStop*po,-1); } } } } } } } }
Функция модификации Код void ModifyOrder(double pp=-1,double sl=0,double tp=0,datetime ex=0) { bool fm; double op,pa,pb,os,ot; int dg=MarketInfo(OrderSymbol(),MODE_DIGITS),er,it; string Autor=" Автор функции для шаблона : www.expforex.com";
if(pp<=0) pp=OrderOpenPrice(); if(sl<0 ) sl=OrderStopLoss(); if(tp<0 ) tp=OrderTakeProfit();
pp=NormalizeDouble(pp, dg); sl=NormalizeDouble(sl, dg); tp=NormalizeDouble(tp, dg); op=NormalizeDouble(OrderOpenPrice() , dg); os=NormalizeDouble(OrderStopLoss() , dg); ot=NormalizeDouble(OrderTakeProfit(), dg);
if(pp!=op || sl!=os || tp!=ot) { for(it=1; it<=3; it++) { if(!IsTesting() && (!IsExpertEnabled() || IsStopped())) break; RefreshRates(); fm=OrderModify(OrderTicket(),pp,sl,tp,ex); if(fm) { break; } else { er=GetLastError(); pa=MarketInfo(OrderSymbol(), MODE_ASK); pb=MarketInfo(OrderSymbol(), MODE_BID); Print("Error(",er,") modifying order: ",", try ",it); Print("Ask=",pa," Bid=",pb," sy=",OrderSymbol(), " op="+OrderType()," pp=",pp," sl=",sl," tp=",tp); } } } }
gestureс Уважением, Владислав Expforex
|