Заметки на полях. Модификация множества позиций на MQL5

18 марта 2018, 16:14
Almat Kaldybay
0
80

Неправильный код модификации сразу множества позиций: 

   if(PositionsTotal()>0)
     {
      if(PositionSelect(_Symbol))
        {
         OP_double=double (PositionGetDouble(POSITION_PRICE_OPEN));
         TP_double=double (PositionGetDouble(POSITION_TP));
         P_type=int(PositionGetInteger(POSITION_TYPE));
         P_opentime=int(PositionGetInteger(POSITION_TIME));
         if(P_type==0 && Sar_array_base[1]>OP_double && Sar_array_base[1]<Low_base[1] && Sar_time_base[1]>P_opentime)
           {
            trade.PositionModify(_Symbol,Sar_array_base[1],TP_double);
           }
         if(P_type==1 && Sar_array_base[1]<OP_double && Sar_array_base[1]>High_base[1] && Sar_time_base[1]>P_opentime)
           {
            trade.PositionModify(_Symbol,Sar_array_base[1],TP_double);
           }
        }
     }

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

  1. Нет счетчика - перебора позиции (это по невнимательности);
  2. Выбор позиции по символу   - это вообще неудачный вариант выбора позиций, так как это приводит к тому, что советник выбирает для работы только одну позицию из множества.

А теперь, на мой взгляд, наиболее правильный вариант:

   double OP_double,TP_double;
   int P_type,P_opentime;
   string P_symbol;
   if(PositionsTotal()>0)
     {
      for(int i=PositionsTotal();i>=0;i--)
        {
         if(PositionGetTicket(i))
           {
            OP_double=double (PositionGetDouble(POSITION_PRICE_OPEN));
            TP_double=double (PositionGetDouble(POSITION_TP));
            P_type=int(PositionGetInteger(POSITION_TYPE));
            P_opentime=int(PositionGetInteger(POSITION_TIME));
            P_symbol=string(PositionGetString(POSITION_SYMBOL));
            if(P_symbol==Symbol())
              {
               if(P_type==0 && Sar_array_base[1]>OP_double && Sar_array_base[1]<Low_base[1] && Sar_time_base[1]>P_opentime)
                 {
                  trade.PositionModify(PositionGetInteger(POSITION_TICKET),Sar_array_base[1],TP_double);
                 }
               if(P_type==1 && Sar_array_base[1]<OP_double && Sar_array_base[1]>High_base[1] && Sar_time_base[1]>P_opentime)
                 {
                  trade.PositionModify(PositionGetInteger(POSITION_TICKET),Sar_array_base[1],TP_double);
                 }
              }
           }
        }
     }

Таким образом, перебираются все позиции, далее в случае совпадения символа, модифицируются.

Поделитесь с друзьями: