Трэлинг для отложенных ордеров. - страница 2

 
khorosh:
Тралить рыночные ордера нельзя было никогда, можно тралить только стоплосс и тейкпрофит рыночного ордера.)

Ну Я же выложил ссылку на кимовский советник, у него их 2 вида, один для стоповых, второй для лимиток. Суть советника проста как пять копеек, тащить за ценой ордер, точно так-же, как таскаются стопы (трейлинг) От этого и название - трал отложек.

Так-же у него когда-то был бот, который выставлял отложки по времени и сразу их тащил за ценой, при срабатывании одной отложки, противоположная удалялась, и этот советник даже зарабатывал довольно неплохо на новостях, но недолго.

Ну а вот и сами кимовские функции, если не ошибаюсь, то писал он их в 2008г. и они работают по сей день

int   TrailingStopOrders  = 20;        // Фиксированный размер трала StopOrders
int   TrailingStepStop    = 3;         // Шаг трала StopOrders
int   TrailingLimitOrders = 30;        // Фиксированный размер трала LimitOrders
int   TrailingStepLimit   = 3;         // Шаг трала LimitOrders
color clModifyBuyOrder  = clrNONE;     // Цвет значка модификации покупки
color clModifySellOrder = clrNONE;     // Цвет значка модификации продажи
//===============================================================================================
//------------------------- Сопровождение Stop ордеров простым тралом --------------------------+
//===============================================================================================
void TrailingStopOrder(string symb="0",int type=-1,int mg=-1) {
double di=0, pa=0, pb=0, p=0, sl=0, tp=0;
if(symb=="0") { symb=Symbol();}
  p=MarketInfo(symb,MODE_POINT);
  int msl=(int)MarketInfo(symb, MODE_STOPLEVEL);
  if(TrailingStopOrders<msl) {
   Alert("TrailingStopOrder(): Значение меньше допустимого=",TrailingStopOrders/Sign,", Минимум=",msl/Sign);
   TrailingStopOrders=msl;} else {TrailingStopOrders=TrailingStopOrders;}
  for(int i=0; i<OrdersTotal(); i++) {
   if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
    if((OrderSymbol()==symb||symb=="")&&(type<0||OrderType()==type)&&(mg<0||OrderMagicNumber()==mg)) {
     if(OrderType()==OP_BUYSTOP) {
      pa=MarketInfo(symb,MODE_ASK);
      if(OrderOpenPrice()-pa>(TrailingStopOrders+TrailingStepStop-1)*p) {
       di=OrderOpenPrice()-pa-(TrailingStopOrders*p);
       if(OrderStopLoss()>0) sl=OrderStopLoss()-di; else sl=0;
       if(OrderTakeProfit()>0) tp=OrderTakeProfit()-di; else tp=0;
         ModifyOrder(symb,pa+(TrailingStopOrders*p), sl, tp, clModifyBuyOrder);
     }}
     if(OrderType()==OP_SELLSTOP) {
      pb=MarketInfo(symb,MODE_BID);
      if(pb-OrderOpenPrice()>(TrailingStopOrders+TrailingStepStop-1)*p) {
       di=pb-OrderOpenPrice()-(TrailingStopOrders*p);
       if(OrderStopLoss()>0) sl=OrderStopLoss()+di; else sl=0;
       if(OrderTakeProfit()>0) tp=OrderTakeProfit()+di; else tp=0;
         ModifyOrder(symb,pb-(TrailingStopOrders*p), sl, tp, clModifySellOrder);
     }}
}}}}
//===============================================================================================
//------------------------- Сопровождение Limit ордеров простым тралом -------------------------+
//===============================================================================================
void TrailingLimitOrder(string symb="0",int type=-1,int mg=-1) {
double di=0, pa=0, pb=0, p=0, sl=0, tp=0;
if(symb=="0") { symb=Symbol();}
  p=MarketInfo(symb,MODE_POINT);
  int msl=(int)MarketInfo(symb, MODE_STOPLEVEL);
  if(TrailingLimitOrders<msl) {
   Alert("TrailingLimitOrder(): Значение меньше допустимого=",TrailingLimitOrders/Sign,", Минимум=",msl/Sign);
   TrailingLimitOrders=msl; } else { TrailingLimitOrders=TrailingLimitOrders; }
  for(int i=0; i<OrdersTotal(); i++) {
   if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
    if((OrderSymbol()==symb||symb=="")&&(type<0||OrderType()==type)&&(mg<0||OrderMagicNumber()==mg)) {
     if(OrderType()==OP_BUYLIMIT) {
      pa=MarketInfo(symb,MODE_ASK);
      if(pa-OrderOpenPrice()>(TrailingLimitOrders+TrailingStepLimit-1)*p) {
       di=pa-OrderOpenPrice()-(TrailingLimitOrders*p);
       if(OrderStopLoss()>0) sl=OrderStopLoss()+di; else sl=0;
       if(OrderTakeProfit()>0) tp=OrderTakeProfit()+di; else tp=0;
         ModifyOrder(symb,pa-(TrailingLimitOrders*p), sl, tp, clModifyBuyOrder);
     }}
     if(OrderType()==OP_SELLLIMIT) {
      pb=MarketInfo(symb,MODE_BID);
      if(OrderOpenPrice()-pb>(TrailingLimitOrders+TrailingStepLimit-1)*p) {
       di=OrderOpenPrice()-pb-(TrailingLimitOrders*p);
       if(OrderStopLoss()>0) sl=OrderStopLoss()-di; else sl=0;
       if(OrderTakeProfit()>0) tp=OrderTakeProfit()-di; else tp=0;
         ModifyOrder(symb,pb+(TrailingLimitOrders*p), sl, tp, clModifySellOrder);
     }}
}}}}
 

Всё это утопия работающая только в тестере!

#property strict
//--------------------------------------------------------------------
extern int     Stoploss             = 5,     //Стоплосс, если 0 то не изменяется
               Takeprofit           = 50;    //Тейкпрофит, если 0 то не изменяется
extern int     TrailingStop         = 3;     //Длинна тралла, если 0 то нет тралла
extern int     TrailingStart        = 0;     //Когда включать тралл, например после достижения 40 п прибыл
extern int     StepTrall            = 2;     //Шаг тралла - перемещать стоплосс не ближе чем StepTrall
extern int     NoLoss               = 0,     //Перевод в безубыток при заданном кол-ве пунктов прибыли, если 0 то нет перевода в безубыток
               MinProfitNoLoss      = 0;     //Минимальная прибыль при переводе вбезубыток
extern int     Magic                = 1;     //Идентификатор ордера эксперта
extern int     Step                 = 10;    //Расстояние от цены
extern double  Risk                 = 1;     //Процент потери депозита при срабатывании StopLoss в отрицательной зоне
extern int     TimeModify           = 15;    //Кол-во секунд раньше которого запрещено изменять ордер
extern int     slippage             = 3;     //Допустимое проскальзование цены
//--------------------------------------------------------------------
int  STOPLEVEL,TimeBarB,TimeBarS;
//--------------------------------------------------------------------
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
if(_Digits==3 || _Digits==5)
   {
      Stoploss          *= 10;
      Takeprofit        *= 10;
      TrailingStop      *= 10;
      TrailingStart     *= 10;
      StepTrall         *= 10;
      NoLoss            *= 10;
      MinProfitNoLoss   *= 10;
      Step              *= 10;
      slippage          *= 10;
   }

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
//---
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+  
void OnTick()
  {//-Start-

   STOPLEVEL=(int)MarketInfo(Symbol(),MODE_STOPLEVEL);
  
   double OSL,OTP,StLo,PriceB=0,PriceS=0,OOP,SL,TP;
   int b=0,s=0,TicketB=0,TicketS=0,OT;
  
   for (int i=0; i<OrdersTotal(); i++)
   {
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
         if (OrderSymbol()==Symbol() && Magic==OrderMagicNumber())
         {
            OT = OrderType();
            OSL = NormalizeDouble(OrderStopLoss(),Digits);
            OTP = NormalizeDouble(OrderTakeProfit(),Digits);
            OOP = NormalizeDouble(OrderOpenPrice(),Digits);
            SL=OSL;
            TP=OTP;
            if (OT==OP_BUY)
            {
               b++;
               if (OSL<OOP && NoLoss!=0)
               {
                  StLo = NormalizeDouble(OOP+MinProfitNoLoss*Point,Digits);
                  if (StLo > OSL && StLo <= NormalizeDouble(Bid - STOPLEVEL * Point,Digits)) SL = StLo;
               }

               if (TrailingStop>=STOPLEVEL && TrailingStop!=0 && (Bid - OOP)/Point >= TrailingStart)
               {
                  StLo = NormalizeDouble(Bid - TrailingStop*Point,Digits);
                  if (StLo>=OOP && StLo > OSL+StepTrall*Point) SL = StLo;
               }

               if (SL > OSL)
               {
                  if (!OrderModify(OrderTicket(),OOP,SL,TP,0,clrNONE)) Print("Error ",GetLastError(),"   Order Modify Buy   SL ",OSL,"->",SL);
                  else Print("Order Buy Modify   SL ",OSL,"->",SL);
               }
            }
            if (OT==OP_SELL)
            {
               s++;
               if ((OSL>OOP || OSL==0) && NoLoss!=0)
               {
                  StLo = NormalizeDouble(OOP-MinProfitNoLoss*Point,Digits);
                  if ((StLo < OSL || OSL==0) && StLo >= NormalizeDouble(Ask + STOPLEVEL * Point,Digits)) SL = StLo;
               }

               if (TrailingStop>=STOPLEVEL && TrailingStop!=0 && (OOP - Ask)/Point >= TrailingStart)
               {
                  StLo = NormalizeDouble(Ask + TrailingStop*Point,Digits);
                  if (StLo<=OOP && (StLo < OSL-StepTrall*Point || OSL==0)) SL = StLo;
               }

               if ((SL < OSL || OSL==0) && SL!=0)
               {
                  if (!OrderModify(OrderTicket(),OOP,SL,TP,0,clrNONE)) Print("Error ",GetLastError(),"   Order Modify Sell   SL ",OSL,"->",SL);
                  else Print("Order Sell Modify   SL ",OSL,"->",SL);
               }
            }
            if (OT==OP_BUYSTOP)  {PriceB=OOP; TicketB=OrderTicket();}
            if (OT==OP_SELLSTOP) {PriceS=OOP; TicketS=OrderTicket();}
         }
      }
   }
   if (b+TicketB==0)
   {
      if (Stoploss>=STOPLEVEL && Stoploss!=0) SL = NormalizeDouble(Bid-Stoploss * Point,Digits); else SL=0;
      if (Takeprofit>=STOPLEVEL && Takeprofit!=0) TP = NormalizeDouble(Ask+Takeprofit * Point,Digits); else TP=0;
      if (OrderSend(Symbol(),OP_BUYSTOP,LotSize(Stoploss,Risk),NormalizeDouble(Ask+Step * Point,Digits),slippage,SL+Step*Point,TP+Step*Point,"",Magic,0,clrNONE)!=-1) TimeBarB=(int)TimeCurrent();
   }
   if (s+TicketS==0)
   {
      if (Stoploss>=STOPLEVEL && Stoploss!=0) SL = NormalizeDouble(Ask+Stoploss * Point,Digits); else SL=0;
      if (Takeprofit>=STOPLEVEL && Takeprofit!=0) TP = NormalizeDouble(Bid-Takeprofit * Point,Digits); else TP=0;
      if (OrderSend(Symbol(),OP_SELLSTOP,LotSize(Stoploss,Risk),NormalizeDouble(Bid-Step * Point,Digits),slippage,SL-Step*Point,TP-Step*Point,"",Magic,0,clrNONE)!=-1) TimeBarS=(int)TimeCurrent();
   }
   if (TicketB!=0)
   {
      if (TimeBarB<TimeCurrent()-TimeModify && MathAbs(NormalizeDouble(Ask+Step * Point,Digits)-PriceB)/Point>StepTrall)
      {
         if (Stoploss>=STOPLEVEL && Stoploss!=0) SL = NormalizeDouble(Bid-Stoploss * Point,Digits); else SL=0;
         if (Takeprofit>=STOPLEVEL && Takeprofit!=0) TP = NormalizeDouble(Ask+Takeprofit * Point,Digits); else TP=0;
         if (OrderModify(TicketB,NormalizeDouble(Ask+Step * Point,Digits),SL+Step*Point,TP+Step*Point,0,clrNONE)) TimeBarB=(int)TimeCurrent();
      }
   }
   if (TicketS!=0)
   {
      if (TimeBarS<TimeCurrent()-TimeModify && MathAbs(NormalizeDouble(Bid-Step * Point,Digits)-PriceS)/Point>StepTrall)
      {
         if (Stoploss>=STOPLEVEL && Stoploss!=0) SL = NormalizeDouble(Ask+Stoploss * Point,Digits); else SL=0;
         if (Takeprofit>=STOPLEVEL && Takeprofit!=0) TP = NormalizeDouble(Bid-Takeprofit * Point,Digits); else TP=0;
         if (OrderModify(TicketS,NormalizeDouble(Bid-Step * Point,Digits),SL-Step*Point,TP-Step*Point,0,clrNONE)) TimeBarS=(int)TimeCurrent();
      }
   }
}

//============== Функции =============================================
//+------------------------------------------------------------------------+
//+- Расчет лота в зависимости от расстояния до StopLoss (c) BeerGod 2015 -+
//+------------------------------------------------------------------------+
double LotSize(int SL, double MR)// SL-StopLoss MR-MaxRisk
{
   if (SL == 0) return(0); // исключение деления на ноль
   double Free    =AccountBalance();
   double LotVal  =MarketInfo(Symbol(),MODE_TICKVALUE);//стоимость 1 пункта 1 лота
   double Min_Lot =MarketInfo(Symbol(),MODE_MINLOT);
   double Max_Lot =MarketInfo(Symbol(),MODE_MAXLOT);
   double LStep   =MarketInfo(Symbol(),MODE_LOTSTEP);
   double Lot     =MathFloor((Free*MR/100)/(SL*LotVal)/LStep)*LStep;
   if(Lot<Min_Lot)  Lot=Min_Lot;
   if(Lot>Max_Lot)  Lot=Max_Lot;
   return(Lot);
}
//END


 

На реале проскальзование на NDD счетах сведет всё в минус, на обычных счетах не даст открыть ордер на быстрых движениях рынка.

Файлы:
PacMan.mq4  16 kb
 
Vitaly Muzichenko:

Ну Я же выложил ссылку на кимовский советник, у него их 2 вида, один для стоповых, второй для лимиток. Суть советника проста как пять копеек, тащить за ценой ордер, точно так-же, как таскаются стопы (трейлинг) От этого и название - трал отложек.

Так-же у него когда-то был бот, который выставлял отложки по времени и сразу их тащил за ценой, при срабатывании одной отложки, противоположная удалялась, и этот советник даже зарабатывал довольно неплохо на новостях, но недолго.

Ну а вот и сами кимовские функции, если не ошибаюсь, то писал он их в 2008г. и они работают по сей день

int   TrailingStopOrders  = 20;        // Фиксированный размер трала StopOrders
int   TrailingStepStop    = 3;         // Шаг трала StopOrders
int   TrailingLimitOrders = 30;        // Фиксированный размер трала LimitOrders
int   TrailingStepLimit   = 3;         // Шаг трала LimitOrders
color clModifyBuyOrder  = clrNONE;     // Цвет значка модификации покупки
color clModifySellOrder = clrNONE;     // Цвет значка модификации продажи
//===============================================================================================
//------------------------- Сопровождение Stop ордеров простым тралом --------------------------+
//===============================================================================================
void TrailingStopOrder(string symb="0",int type=-1,int mg=-1) {
double di=0, pa=0, pb=0, p=0, sl=0, tp=0;
if(symb=="0") { symb=Symbol();}
  p=MarketInfo(symb,MODE_POINT);
  int msl=(int)MarketInfo(symb, MODE_STOPLEVEL);
  if(TrailingStopOrders<msl) {
   Alert("TrailingStopOrder(): Значение меньше допустимого=",TrailingStopOrders/Sign,", Минимум=",msl/Sign);
   TrailingStopOrders=msl;} else {TrailingStopOrders=TrailingStopOrders;}
  for(int i=0; i<OrdersTotal(); i++) {
   if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
    if((OrderSymbol()==symb||symb=="")&&(type<0||OrderType()==type)&&(mg<0||OrderMagicNumber()==mg)) {
     if(OrderType()==OP_BUYSTOP) {
      pa=MarketInfo(symb,MODE_ASK);
      if(OrderOpenPrice()-pa>(TrailingStopOrders+TrailingStepStop-1)*p) {
       di=OrderOpenPrice()-pa-(TrailingStopOrders*p);
       if(OrderStopLoss()>0) sl=OrderStopLoss()-di; else sl=0;
       if(OrderTakeProfit()>0) tp=OrderTakeProfit()-di; else tp=0;
         ModifyOrder(symb,pa+(TrailingStopOrders*p), sl, tp, clModifyBuyOrder);
     }}
     if(OrderType()==OP_SELLSTOP) {
      pb=MarketInfo(symb,MODE_BID);
      if(pb-OrderOpenPrice()>(TrailingStopOrders+TrailingStepStop-1)*p) {
       di=pb-OrderOpenPrice()-(TrailingStopOrders*p);
       if(OrderStopLoss()>0) sl=OrderStopLoss()+di; else sl=0;
       if(OrderTakeProfit()>0) tp=OrderTakeProfit()+di; else tp=0;
         ModifyOrder(symb,pb-(TrailingStopOrders*p), sl, tp, clModifySellOrder);
     }}
}}}}
//===============================================================================================
//------------------------- Сопровождение Limit ордеров простым тралом -------------------------+
//===============================================================================================
void TrailingLimitOrder(string symb="0",int type=-1,int mg=-1) {
double di=0, pa=0, pb=0, p=0, sl=0, tp=0;
if(symb=="0") { symb=Symbol();}
  p=MarketInfo(symb,MODE_POINT);
  int msl=(int)MarketInfo(symb, MODE_STOPLEVEL);
  if(TrailingLimitOrders<msl) {
   Alert("TrailingLimitOrder(): Значение меньше допустимого=",TrailingLimitOrders/Sign,", Минимум=",msl/Sign);
   TrailingLimitOrders=msl; } else { TrailingLimitOrders=TrailingLimitOrders; }
  for(int i=0; i<OrdersTotal(); i++) {
   if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
    if((OrderSymbol()==symb||symb=="")&&(type<0||OrderType()==type)&&(mg<0||OrderMagicNumber()==mg)) {
     if(OrderType()==OP_BUYLIMIT) {
      pa=MarketInfo(symb,MODE_ASK);
      if(pa-OrderOpenPrice()>(TrailingLimitOrders+TrailingStepLimit-1)*p) {
       di=pa-OrderOpenPrice()-(TrailingLimitOrders*p);
       if(OrderStopLoss()>0) sl=OrderStopLoss()+di; else sl=0;
       if(OrderTakeProfit()>0) tp=OrderTakeProfit()+di; else tp=0;
         ModifyOrder(symb,pa-(TrailingLimitOrders*p), sl, tp, clModifyBuyOrder);
     }}
     if(OrderType()==OP_SELLLIMIT) {
      pb=MarketInfo(symb,MODE_BID);
      if(OrderOpenPrice()-pb>(TrailingLimitOrders+TrailingStepLimit-1)*p) {
       di=OrderOpenPrice()-pb-(TrailingLimitOrders*p);
       if(OrderStopLoss()>0) sl=OrderStopLoss()-di; else sl=0;
       if(OrderTakeProfit()>0) tp=OrderTakeProfit()-di; else tp=0;
         ModifyOrder(symb,pb+(TrailingLimitOrders*p), sl, tp, clModifySellOrder);
     }}
}}}}

То что можно тралить отложки я узнал 10 лет назад.) А вот то, что "можно тралить" рыночные ордера я узнал только сегодня из этого сообщения:

Sergey Gritsay 2016.12.31 14:50      RU
Vasiliy Pushkaryov:

Больше обратил внимание на цель

Подскажите пожалуйста... есть ли такой скрипт.который бы передвигал отложенный ордер за ценой. типо трелинг ... что позволит наилучше войти в позицию.....

А встроенный трейлинг по сути и есть такой скрипт, может ТС о нем не знает.

Встроенный трейлинг не тралит отложки только рыночные 

 
khorosh:

То что можно тралить отложки я узнал 10 лет назад.) А вот то, что можно тралить рыночные ордера я узнал только сегодня из этого сообщения:

Sergey Gritsay 2016.12.31 14:50      RU

Встроенный трейлинг не тралит отложки только рыночные 

Не будет столь критичны, немного опечатался Сергей. Зная его как не новичка, можно предположить только одно: на носу праздник, и ему просто некогда было до конца изложить свою мысль)

Всех с наступающим!!! 

 
Vitaly Muzichenko:

Не будет столь критичны, немного опечатался Сергей. Зная его как не новичка, можно предположить только одно: на носу праздник, и ему просто некогда было до конца изложить свою мысль)

Всех с наступающим!!! 

Взаимно )))
 
Vladimir Zubov:

Всё это утопия работающая только в тестере!

На реале проскальзование на NDD счетах сведет всё в минус, на обычных счетах не даст открыть ордер на быстрых движениях рынка.

а может мне надо чтоб именно в тестере хорошо работал
 
trader781:
а может мне надо чтоб именно в тестере хорошо работал

Забирай код, в тестере отлично работает, по поводу праздника нашел в заброшенном архиве у себя.

P.S. Коду года два, скоро будет три ))) вникать в подробности и логику небуду и не помню уже что там и зачем.  

 
Vladimir Zubov:

Забирай код, в тестере отлично работает, по поводу праздника нашел в заброшенном архиве у себя.

P.S. Коду года два, скоро будет три ))) вникать в подробности и логику небуду и не помню уже что там и зачем.  

ничего страшного, собираю себе коллекцию, может этот куда то и пригодицца
 
trader781:
ничего страшного, собираю себе коллекцию, может этот куда то и пригодицца

Однозначно пригодится, когда взбредёт идея, что отложки на пробой достаточно тралить через определенное количество времени на определенном расстоянии от цены, при резком движении в одну из сторон одна сработатает, а вторая удалится и дальше только тралить прибыль) Этот код так и работает, но из за торговых условий на реале всё сводится к нулю и минусу, но в тестере прекрасно )))

С праздником !!! 

 
trader781:
ничего страшного, собираю себе коллекцию, может этот куда то и пригодицца
Да Я уже на реал поставил, запустил терминал и сижу жду первые котировки. Ох чувствую в конце 2017г. куплю самолёт, на заработанные советником деньги)
Причина обращения: