сравнение балансов - страница 5

 
void CheckForClose()
  {

int tiket=0;
double stop=-200;
   





   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;
      if(OrderMagicNumber()!=MAGIC || OrderSymbol()!=Symbol()) continue;
      //---- check order type 
      if(OrderType()==OP_BUY)
        {
        if((Ask-OrderOpenPrice())<stop*Point) tiket=OrderTicket();
        
        }
      if(OrderType()==OP_SELL)
           {      
         if ((OrderOpenPrice()-Bid)<stop*Point) tiket=OrderTicket();
           }
      }    
      
         
         for(int j=OrdersTotal()-1;j>=0;j--)
     {
      if(OrderSelect(j,SELECT_BY_POS,MODE_TRADES)==false)        break;
      if(OrderMagicNumber()!=MAGIC || OrderSymbol()!=Symbol() || OrderTicket()!=tiket) continue;
      //---- check order type 
      if(OrderType()==OP_BUY) OrderClose(OrderTicket(),OrderLots(),Bid,3,White);
       
      if(OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(),Ask,3,White);
     }   
               
 }              
     
сделал так, вроде работает. все, что движется, по стоплоссу закрывает =)
 
Jequile:
ps. ордера открываются без СЛ и ТП. тест проводится на одновременном открытии разнонаправленных позиций.

Сделал так, чтобы в функцию передавались параметры. sy - символ, по которому смотрим позиции, mn - магик этих позиций, ts - размер прибыли в пунктах. Почему у вас целое количество пунктов сделано как double остаётся загадкой, я сделал int.

Функцию не проверял, так что ошибки вполне могут быть.

//+----------------------------------------------------------------------------+
void CheckForClose(string sy, int mn, int ts) {
   double p1, p2;
   int i, k, ty, tiket=0;
   k=OrdersTotal();
   for (i=0; i<k; i++) {
      if(OrderSelect(i,SELECT_BY_POS)) {
         ty=OrderType();
         if (OrderMagicNumber()!=mn)   continue; 
         if (OrderSymbol()!=sy)        continue;
         if (ty>1)                     continue;
         //---- check order type 
         if(ty==OP_BUY) {p1=MarketInfo(OrderSymbol(),MODE_BID); p2=OrderOpenPrice();}
         else {p2=MarketInfo(OrderSymbol(),MODE_BID); p1=OrderOpenPrice();}
         if ((p1-p2)>ts*Point) {
            tiket=OrderTicket();
            // модификация стопа
            break;
            }
         }    
      }
   if (tiket>0) {
      k=OrdersTotal()-1;    
      for(i=k; i>=0; i--) {
         if (OrderSelect(i, SELECT_BY_POS)) {
            ty=OrderType();
            if (OrderMagicNumber()!=mn)   continue;
            if (OrderTicket()==tiket)     continue;
            if (OrderSymbol()!=sy)        continue;
            if (ty>1)                     continue;
            //---- check order type 
            if (ty==OP_BUY) p1=MarketInfo(OrderSymbol(),MODE_BID);
            else p1=MarketInfo(OrderSymbol(),MODE_ASK);
            OrderClose(OrderTicket(),OrderLots(),p1,3,White);
            }  
         }
      }
   return;
}    
//+----------------------------------------------------------------------------+

ну и

OrderClose(OrderTicket(),OrderLots(),p1,3,White);

нужно заменить на полноценную функцию с обработкой ошибок сервера

Причина обращения: