Отключение безубытка, если сработал трейлинг-стоп

 

Коллеги, сейчас, когда у меня срабатывает трейлинг стоп, видно как стоп начинает прыгать от значения безубытка к трейлингу..как сделать так, что бы если сделка начала трейлиться, стоп безубытка на использовался? 

 

 

init (){

   if(D1_Breakout==true) TimeCandle = 1440; 

   TimeCandle = next_period(TimeCandle);

   STOPLEVEL = MarketInfo(Symbol(),MODE_STOPLEVEL);

   if (SL < STOPLEVEL) SL = STOPLEVEL;

   if (TP < STOPLEVEL) TP = STOPLEVEL;

   if (NoLoss   < STOPLEVEL && NoLoss   != 0) NoLoss   = STOPLEVEL;

   if (trailing < STOPLEVEL && trailing != 0) trailing = STOPLEVEL; 

}

void TrailingStop(int trailing)

{

   double StLo,OSL,OOP;

   int tip;

   bool error=true;

   color col;


   for (int i=0; i<OrdersTotal(); i++) 

   {

      if (OrderSelect(i, SELECT_BY_POS))

      {

         tip = OrderType();

         if (tip<2 && OrderSymbol()==Symbol() && OrderMagicNumber()==magic)

         {

            OSL   = NormalizeDouble(OrderStopLoss(),Digits);

            OOP   = NormalizeDouble(OrderOpenPrice(),Digits);

            if (tip==0)        

            {  

               StLo = NormalizeDouble(Bid - trailing*Point,Digits);

               if (StLo < OOP) continue;

               if (StLo > OSL)

                  error=OrderModify(OrderTicket(),OrderOpenPrice(),StLo,OrderTakeProfit(),0,White);


            }                                         

            if (tip==1)    

            {                                         

               StLo = NormalizeDouble(Ask + trailing*Point,Digits);           

               if (StLo > OOP) continue;

               if (StLo < OSL || OSL==0 )

                  error=OrderModify(OrderTicket(),OrderOpenPrice(),StLo,OrderTakeProfit(),0,White);

            } 

            if (!error) Alert("Error TrailingStop ",GetLastError(),"   ",Symbol(),"   SL ",StLo);

         }

      }

   }

}


//------------------------------------------------------------------+

void No_Loss(int NoLoss)

{

   double StLo,OSL,OOP;

   int tip;

   bool error=true;

   color col;

   int STOPLEVEL = (MarketInfo(Symbol(),MODE_STOPLEVEL))*2;

   for (int i=0; i<OrdersTotal(); i++) 

   {

      if (OrderSelect(i, SELECT_BY_POS))

      {

         tip = OrderType();

         if (tip<2 && OrderSymbol()==Symbol() && OrderMagicNumber()==magic)

         {

            OSL   = NormalizeDouble(OrderStopLoss(),Digits);

            OOP   = NormalizeDouble(OrderOpenPrice(),Digits);

            if (tip==0)        

            {  

               StLo = NormalizeDouble(OrderOpenPrice()+ NoLoss*Point,Digits);

               if (Bid > OrderOpenPrice()+(NoLoss*Point)+ STOPLEVEL && !CompareDoubles(OrderStopLoss(),StLo))

                  error=OrderModify(OrderTicket(),OrderOpenPrice(),StLo,OrderTakeProfit(),0,White);


            }                                         

            if (tip==1)    

            {                                         

               StLo = NormalizeDouble(OrderOpenPrice() - NoLoss*Point,Digits);          

               if (Ask < OrderOpenPrice()-(Point*NoLoss)-STOPLEVEL && !CompareDoubles(OrderStopLoss(),StLo))

                  error=OrderModify(OrderTicket(),OrderOpenPrice(),StLo,OrderTakeProfit(),0,White);

            } 

            if (!error) Alert("Error NoLoss ",GetLastError(),"   ",Symbol()," Bid ", Bid, " Order Type ", tip," OrderOpenPrice ", OrderOpenPrice(), "  OrderStopLoss ", OrderStopLoss(), "   NoLoss ",StLo);

         }

      }

   } 

 

Перед тем как ставить стоп в без убыток проверяйте находится он уже в без убытке или нет.

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

Для ордеров на продажу аналогично. Только стоп если он не в без убытке  выше цены открытия ордера, а если в без убытке то он ниже цены открытия.

 
Vitalii Ananev:

Перед тем как ставить стоп в без убыток проверяйте находится он уже в без убытке или нет.

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

Для ордеров на продажу аналогично. Только стоп если он не в без убытке  выше цены открытия ордера, а если в без убытке то он ниже цены открытия.

спасибо

помогло