Модификация двух позиций

 

Приветствую! Прошу помощи, т.к. сам не решил данный вопрос.

Есть функция модификации двух позиций в составе общей функции по модификации стопов.
Когда одна позиция стопы модифицируются, также модифицируется и одна из двух позиций когда в рынке их 2.

А чтобы модифицировались обе ничего не получается что бы я ни делал. Перепробовал множество вариантов и никак.

   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
              {              
               if(CountTrades()==2)
                 {
                  sl=NormalizeDouble(FirstPrice()-StopLoss*_Point*2,_Digits);
                  tp=NormalizeDouble(FirstPrice(),_Digits);
                 }
              }
..........................
//+------------------------------------------------------------------+
//|  Модификация стопов                                              |
//+------------------------------------------------------------------+
void StopMode()
  {
   bool m=1;
   double sl=0,tp=0;

   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
              {
               if(CountTrades()==1)
                 {
                  sl=NormalizeDouble(OrderOpenPrice()-StopLoss*_Point,_Digits);
                  tp=NormalizeDouble(OrderOpenPrice()+TakeProfit*_Point,_Digits);
                 }
               
               if(CountTrades()==2)
                 {
                  sl=NormalizeDouble(FirstPrice()-StopLoss*_Point*2,_Digits);
                  tp=NormalizeDouble(FirstPrice(),_Digits);
                 }

               if(OrderStopLoss()!=sl || OrderTakeProfit()!=tp)
                 {
                  m=OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0,Yellow);
                 }
              }

            if(OrderType()==OP_SELL)
              {
               if(CountTrades()==1)
                 {
                  sl=NormalizeDouble(OrderOpenPrice()+StopLoss*_Point,_Digits);
                  tp=NormalizeDouble(OrderOpenPrice()-TakeProfit*_Point,_Digits);
                 }

               if(CountTrades()==2)
                 {
                  sl=NormalizeDouble(FirstPrice()+StopLoss*_Point*2,_Digits);
                  tp=NormalizeDouble(FirstPrice(),_Digits);
                 }

               if(OrderStopLoss()!=sl || OrderTakeProfit()!=tp)
                 {
                  m=OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0,Yellow);
                 }
              }
           }
        }
     }
  }

код эксперта целиком:

//+------------------------------------------------------------------+
//|                                                   Usrednitel.mq4 |
//|                                              Copyright 2018, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property strict

//--- Inputs
extern double Lots       = 0.1;      // торговый объем ордера
extern int StopLoss      = 500;      // лось
extern int TakeProfit    = 500;      // язь
extern int BuySell       = 1;        // 1-buy 2-sell 0-no
extern int Step          = 400;      // шаг
extern int Slip          = 30;       // реквот
extern int Magic         = 0;        // магик
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price)
  {
   int r=0;
   color clr=Green;
   double sl=0,tp=0;

   if(type==1 || type==3 || type==5)
     {
      clr=Red;
     }

   if(type==0 || type==2 || type==4)
     {
      clr=Blue;
     }

   r=OrderSend(NULL,type,Lots,NormalizeDouble(price,Digits),Slip,sl,tp,"",Magic,0,clr);
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountTrades()
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()<2) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int FindOrderType()
  {
   int oticket,ticketNumber=0,type=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            oticket=OrderTicket();
            if(oticket>ticketNumber)
              {
               ticketNumber=oticket;
               type=OrderType();
              }
           }
        }
     }
   return(type);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double FindLastBuyPrice()
  {
   int oticket,ticketNumber=0;
   double oprice=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderType()==OP_BUY && OrderMagicNumber()==Magic)
           {
            oticket=OrderTicket();
            if(oticket>ticketNumber)
              {
               ticketNumber=oticket;
               oprice=OrderOpenPrice();
              }
           }
        }
     }
   return(oprice);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double FindLastSellPrice()
  {
   int oticket,ticketNumber=0;
   double oprice=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderType()==OP_SELL && OrderMagicNumber()==Magic)
           {
            oticket=OrderTicket();
            if(oticket>ticketNumber)
              {
               ticketNumber=oticket;
               oprice=OrderOpenPrice();
              }
           }
        }
     }
   return(oprice);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double FirstPrice()
  {
   double pr=0;
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            pr=OrderOpenPrice();
            break;
           }
        }
     }
   return(pr);
  }
//+------------------------------------------------------------------+
//| Закрытие позиции по типу ордера                                  |
//+------------------------------------------------------------------+
void CloseAll(int ot=-1)
  {
   bool cl;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==0 && (ot==0 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),Slip,White);
              }
            if(OrderType()==1 && (ot==1 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),Slip,White);
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|  Модификация стопов                                              |
//+------------------------------------------------------------------+
void StopMode()
  {
   bool m=1;
   double sl=0,tp=0;

   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
              {
               if(CountTrades()==1)
                 {
                  sl=NormalizeDouble(OrderOpenPrice()-StopLoss*_Point,_Digits);
                  tp=NormalizeDouble(OrderOpenPrice()+TakeProfit*_Point,_Digits);
                 }
               
               if(CountTrades()==2)
                 {
                  sl=NormalizeDouble(FirstPrice()-StopLoss*_Point*2,_Digits);
                  tp=NormalizeDouble(FirstPrice(),_Digits);
                 }

               if(OrderStopLoss()!=sl || OrderTakeProfit()!=tp)
                 {
                  m=OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0,Yellow);
                 }
              }

            if(OrderType()==OP_SELL)
              {
               if(CountTrades()==1)
                 {
                  sl=NormalizeDouble(OrderOpenPrice()+StopLoss*_Point,_Digits);
                  tp=NormalizeDouble(OrderOpenPrice()-TakeProfit*_Point,_Digits);
                 }

               if(CountTrades()==2)
                 {
                  sl=NormalizeDouble(FirstPrice()+StopLoss*_Point*2,_Digits);
                  tp=NormalizeDouble(FirstPrice(),_Digits);
                 }

               if(OrderStopLoss()!=sl || OrderTakeProfit()!=tp)
                 {
                  m=OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0,Yellow);
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if((BuySell==1 && CountTrades()<1) || (FindOrderType()==0 && (FindLastBuyPrice()-Ask)/Point>=Step && CountTrades()<2)) PutOrder(0,Ask);
   if((BuySell==2 && CountTrades()<1) || (FindOrderType()==1 && (Bid-FindLastSellPrice())/Point>=Step && CountTrades()<2)) PutOrder(1,Bid);

   StopMode();

   Comment("\n First Price: ",FirstPrice(),
           "\n Count Trades : ",CountTrades());
  }
//+------------------------------------------------------------------+
 

В функции StopMode() не вызывайте функцию CountTrades() внутри цикла for. Независимо от цикла в StopMode(), после работы функции  CountTrades() всегда оказывается выделенным последний ордер.

Сделайте вызов  CountTrades() один раз в начале функции StopMode(), с присвоением результата переменной, а дальше пользуйтесь значением из переменной. 

 
Dmitry Fedoseev:

В функции StopMode() не вызывайте функцию CountTrades() внутри цикла for. Независимо от цикла в StopMode(), после работы функции  CountTrades() всегда оказывается выделенным последний ордер.

Сделайте вызов  CountTrades() один раз в начале функции StopMode(), с присвоением результата переменной, а дальше пользуйтесь значением из переменной. 

Переписал с переменной  начале функции StopMode(). Результат тот же. Модифицируется первый ордер.

//+------------------------------------------------------------------+
//|  Модификация стопов                                              |
//+------------------------------------------------------------------+
void StopMode()
  {
   bool m=1;
   double sl=0,tp=0;
   int count=CountTrades();

   for(int i=OrdersTotal();i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
              {
               if(count==1)
                 {
                  sl=NormalizeDouble(OrderOpenPrice()-StopLoss*_Point,_Digits);
                  tp=NormalizeDouble(OrderOpenPrice()+TakeProfit*_Point,_Digits);
                 }

               if(count==2)
                 {
                  sl=NormalizeDouble(FirstPrice()-StopLoss*_Point*2,_Digits);
                  tp=NormalizeDouble(FirstPrice(),_Digits);
                 }

               if(OrderStopLoss()!=sl || OrderTakeProfit()!=tp)
                 {
                  m=OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0,Yellow);
                 }
              }

            if(OrderType()==OP_SELL)
              {
               if(count==1)
                 {
                  sl=NormalizeDouble(OrderOpenPrice()+StopLoss*_Point,_Digits);
                  tp=NormalizeDouble(OrderOpenPrice()-TakeProfit*_Point,_Digits);
                 }

               if(count==2)
                 {
                  sl=NormalizeDouble(FirstPrice()+StopLoss*_Point*2,_Digits);
                  tp=NormalizeDouble(FirstPrice(),_Digits);
                 }

               if(OrderStopLoss()!=sl || OrderTakeProfit()!=tp)
                 {
                  m=OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0,Yellow);
                 }
              }
           }
        }
     }
  }
 

Попробовал и такой вариант.Здесь по идее должны модифицироваться все ордера а изменился снова только первый:

//+------------------------------------------------------------------+
//|  Модификация стопов                                              |
//+------------------------------------------------------------------+
void StopMode()
  {
   bool m=1;
   double sl=0,tp=0;

   if(CountTrades()==2)
     {
      for(int i=OrdersTotal();i>=0;i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
           {
            if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
              {
               if(OrderType()==OP_BUY)
                 {
                  sl=NormalizeDouble(FirstPrice()-StopLoss*_Point*2,_Digits);
                  tp=NormalizeDouble(FirstPrice(),_Digits);
                 }

               if(OrderStopLoss()!=sl || OrderTakeProfit()!=tp) m=OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0,Yellow);
              }
           }
        }
     }
  }


 
Тоже самое надо сделать с функцией FirstPrice() - не вызывать ее внутри цикла, а вызывать один раз в начале функции.
 
Dmitry Fedoseev:
Тоже самое надо сделать с функцией FirstPrice() - не вызывать ее внутри цикла, а вызывать один раз в начале функции.

Заработало!

void StopMode()
  {
   bool m=1;
   int count=CountTrades();
   double sl=0,tp=0,pr=FirstPrice();

   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
              {
               if(count==2)
                 {
                  sl=NormalizeDouble(pr-StopLoss*_Point*2,_Digits);
                  tp=NormalizeDouble(pr,_Digits);
                 }
               if(OrderStopLoss()!=sl || OrderTakeProfit()!=tp) m=OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0,Yellow);
              }
           }
        }
     }
  }

Премного благодарен!