Трал для всех открытых позиций

 

Доброго времени суток!

При написании советника столкнулся с такой проблемой:
Открыто несколько позиций, но трелинг стоп двигает стоп лосс только по одной позиции, возможно ли использовать трейлинг для всех позиций одновременно, если да, то как?

 

for(cnt=0;cnt<total;cnt++)
     {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL &&   
         OrderSymbol()==Symbol())  
        {
         if(OrderType()==OP_BUY)   
           {
           
           if((SMMA>MA28) && (SMMA1<MA28_1))
            {
               OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);   
               
               return(0); // exit
            }
         
        
            if(TrailingStop>0)
            {
               if(Bid-OrderOpenPrice()>Point*TrailingStop)
               {
                  if(OrderStopLoss()<Bid-Point*TrailingStop)
                  {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
                   
                     return(0);
                  }
               }
            }
         }

Заранее спасибо! 

 

А зачем там вот это if(OrderType()<=OP_SELL, а потом вот это  if(OrderType()==OP_BUY)??? Как бы что-то лишнее...

Ну и return(0); - тоже лишнее. 

И вообще, закрытие и модификация ордеров должны быть оформлены отдельными циклами, а ещё лучше - отдельными функциями. 

 
Спасибо! Попробую.
 
Vitalie Postolache:

А зачем там вот это if(OrderType()<=OP_SELL, а потом вот это  if(OrderType()==OP_BUY)??? Как бы что-то лишнее...

Ну и return(0); - тоже лишнее. 

И вообще, закрытие и модификация ордеров должны быть оформлены отдельными циклами, а ещё лучше - отдельными функциями. 

Написал так, но увы трал не срабатывает, что я мог еще упустить?

 
Filya1212:
for(int t=0;t<OrdersTotal();t++)
{
int res=OrderSelect(t, SELECT_BY_POS, MODE_TRADES);

if (OrderSymbol()==Symbol() && OrderType() == OP_BUY)
{
             if(TrailingStop>0)
            {
               if(Bid-OrderOpenPrice()>Point*TrailingStop)
               {
                  if(OrderStopLoss()<Bid-Point*TrailingStop)
                  {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
                
                  }
               }
            }  
}  
else
{
    if(TrailingStop>0)
            {
               if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
               {
                  if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
                  {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
                  
                  }
               }
            }
}
}
 
Artem Ashikhmin:

Рекомендую применить этот код трала, а свой удалить:  

extern int  StartTrailing = 0;
extern int  Trailing = 0;

//-----------------------------+
int i;
//-----------------------------+
void start() {
//-----------------------------+
   double buy_last_price  = -1;
   double sell_last_price = -1;

   for(i=OrdersTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) {
      if(OrderType()==OP_BUY) {if(buy_last_price==-1) buy_last_price=OrderOpenPrice();}
      if(OrderType()==OP_SELL){if(sell_last_price==-1)sell_last_price=OrderOpenPrice();}
       }

       //TrailingStart//
  for(i=OrdersTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) {
     if (Trailing>0 && (Bid-buy_last_price)>=StartTrailing*Point && OrderType()==OP_BUY
     && NormalizeDouble(Bid-(Trailing +1)*Point,Digits)>NormalizeDouble(OrderStopLoss(),Digits)
     && NormalizeDouble(Bid-Trailing *Point,Digits)>=NormalizeDouble(OrderOpenPrice(),Digits))
     int modify = OrderModify (OrderTicket(), OrderOpenPrice(), NormalizeDouble(Bid-Trailing *Point,Digits), OrderTakeProfit(), 0, Blue);

     if (Trailing>0 && (sell_last_price-Ask)>=StartTrailing*Point && OrderType()==OP_SELL
     && (NormalizeDouble(Ask+(Trailing +1)*Point,Digits)<NormalizeDouble(OrderStopLoss(),Digits) || OrderStopLoss()==0)
     && NormalizeDouble(Ask+Trailing *Point,Digits)<=NormalizeDouble(OrderOpenPrice(),Digits))
     modify = OrderModify (OrderTicket(), OrderOpenPrice(), NormalizeDouble(Ask+Trailing *Point,Digits), OrderTakeProfit(), 0, Red);
     }  //TrailingEnd//

 


 


 

Спасибо большое, сработало! 
Причина обращения: