Проблема модификации позиций при хеджинге

 

 Советник открывает последовательно две позиции. При попытке установить стоп-лосс, модифицирует только первую открывшеюся позицию.

Вторая позиция модифицируется после закрытия первой. Позиции разнонаправленные. Пробовал по всякому: выбрать через тикет, выбрать символ по инексу позиции и тд. Счет хеджинговый. билд 1643. Что не так? и Што делать?

 
//+------------------------------------------------------------------+
//| Check for long position SL                                       |
//+------------------------------------------------------------------+
bool CSampleExpert::LongSL(void)
  {  
   bool res=false;
   double sl=0;
   if((ENUM_ACCOUNT_MARGIN_MODE)AccountInfoInteger(ACCOUNT_MARGIN_MODE)==ACCOUNT_MARGIN_MODE_RETAIL_HEDGING)
   {
   for(int i=PositionsTotal()-1;i>=0;i--)     
         if(!position.SelectByIndex(i)) continue;
           
         if(_Symbol==PositionGetString(POSITION_SYMBOL) && MAGIC==PositionGetInteger(POSITION_MAGIC))
         if((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
           {
   sl=NormalizeDouble(position.PriceOpen()-symbol.Point()*StopLoss,symbol.Digits());
   if(symbol.Bid()-sl<symbol.StopsLevel()*symbol.Point()) sl=NormalizeDouble(symbol.Bid()-symbol.StopsLevel()*symbol.Point()-10*symbol.Point(),symbol.Digits());
     {
//--- check
      if(symbol.Bid()-sl>symbol.StopsLevel()*symbol.Point() && symbol.Bid()>sl)
         if(PositionGetDouble(POSITION_SL)==0 && position.PriceOpen()-sl>symbol.StopsLevel()*symbol.Point())

            //--- modify position
            if(trade.PositionModify(Symbol(),sl,0))
               printf("Long position by %s to be modified,SL=%f",Symbol(),sl);
            else
              {
               printf("Error modifying position by %s : '%s'",Symbol(),trade.ResultComment());
               printf("Modify parameters : SL=%f",sl,0);
              }
            //--- modified and must exit from expert
            res=true;  
            }   
     }
  }
//--- result
   return(res);
  }
//+------------------------------------------------------------------+
//| Check for short position SL                                      |
//+------------------------------------------------------------------+
bool CSampleExpert::ShortSL(void)
  {   
   bool   res=false;
   double sl=0;
   if((ENUM_ACCOUNT_MARGIN_MODE)AccountInfoInteger(ACCOUNT_MARGIN_MODE)==ACCOUNT_MARGIN_MODE_RETAIL_HEDGING)
   {
   for(int i=PositionsTotal()-1;i>=0;i--)      
         if(!position.SelectByIndex(i))   continue;
           
         if(_Symbol==PositionGetString(POSITION_SYMBOL) && MAGIC==PositionGetInteger(POSITION_MAGIC))
         if((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
           {
   sl=NormalizeDouble(position.PriceOpen()+symbol.Point()*StopLoss,symbol.Digits());
   if(sl-symbol.Ask()<symbol.StopsLevel()*symbol.Point()) sl=NormalizeDouble(symbol.Ask()+symbol.StopsLevel()*symbol.Point()+10*symbol.Point(),symbol.Digits()); 
     {
//--- check
      if(sl-symbol.Ask()>symbol.StopsLevel()*symbol.Point() && symbol.Ask()<sl)
         if(PositionGetDouble(POSITION_SL)==0 && sl-position.PriceOpen()>symbol.StopsLevel()*symbol.Point())

            //--- modify position
            if(trade.PositionModify(Symbol(),sl,0))
               printf("Short position by %s to be modified,SL=%f",Symbol(),sl);
            else
              {
               printf("Error modifying position by %s : '%s'",Symbol(),trade.ResultComment());
               printf("Modify parameters : SL=%f",sl,0);
              }
            //--- modified and must exit from expert
            res=true;   
            }
     }
  }
//--- result
   return(res);
  }       
 
trade.PositionModify(Symbol(),sl,0)
trade.PositionModify(PositionGetInteger(POSITION_TICKET),sl,0)
 
fxsaber:
Премного благодарен! Я был невнимателен.