Заметки на полях. Ограничение количества создаваемых отложенных ордеров.

31 мая 2019, 10:03
Almat Kaldybay
0
23

Пускай будет у меня в блоге, чтобы я не забыл. 

Ордер и позиция  - это разные вещи. 

Сначала проверяем наличие ордеров. Далее, если ордер найден, производим проверку, и в логическую переменную записываем условие контроля.

   if(OrdersTotal()>0)
     {
      for(i=0;i<=OrdersTotal();i++)
        {
         if(OrderGetTicket(i))
           {
            O_type=int(OrderGetInteger(ORDER_TYPE));
            O_symbol=string(OrderGetString(ORDER_SYMBOL));
            O_opentime=int(OrderGetInteger(ORDER_TIME_SETUP));
            if(O_symbol==Symbol() && O_type==3)
              {
               Bar_sell_base_tf=iBarShift(Symbol(),base_tf,O_opentime);
               //--- верхний уровень
               for(n=Bar_sell_base_tf+1;n<bars_base_tf;n++)
                 {
                  j1=High_base_tf[n+1]-High_base_tf[n];
                  if(j1<0)
                    {
                     j1=j1*-1;
                    }
                  if(j1*f<=k)
                     break;
                 }
               UpperLevel_1_base_tf_sell=n;
              }
            Third_downtrend_control_bool=(Time_base_tf[UpperLevel_1_base_tf_sell]==Time_base_tf[UpperLevel_1_base_tf]);
           }
        }
     }

Далее после срабатывания ордера, открывается позиция, но контроль все равно должен работать. При этом ордер уходит в историю и мне нужно его оттуда вытащить через функцию HistoryOrderSelect(), используя свойство позиции POSITION_IDENTIFIER. Нужно обратиться к свойству именно ордера, а не позиции. Так как контроль привязан к времени установки ордера, а не времени открытия позиции. 

//--- если ордера нет, но сработала позиция
   if(OrdersTotal()==0)
     {
      if(PositionsTotal()>0)
        {
         for(i=0;i<=PositionsTotal();i++)
           {
            if(PositionGetTicket(i))
              {
               //--- определяем символ, тип и время открытия позиции
               P_symbol=string(PositionGetString(POSITION_SYMBOL));
               P_type=int(PositionGetInteger(POSITION_TYPE));
               P_opentime=int(PositionGetInteger(POSITION_TIME));
               P_identifier=int(PositionGetInteger(POSITION_IDENTIFIER));
               //--- если символ позиции совпадает с текущим графиком и тип сделки "sell"
               if(P_symbol==Symbol() && P_type==1)
                 {
                  if(HistoryOrderSelect(P_identifier))
                    {
                     O_opentime=ORDER_TIME_SETUP;
                     //--- находим бар, на котором была открыта позиция
                     Bar_sell_base_tf=iBarShift(Symbol(),base_tf,O_opentime);
                     //--- верхний уровень
                     for(n=Bar_sell_base_tf+1;n<bars_base_tf;n++)
                       {
                        j1=High_base_tf[n+1]-High_base_tf[n];
                        if(j1<0)
                          {
                           j1=j1*-1;
                          }
                        if(j1*f<=k)
                           break;
                       }
                     UpperLevel_1_base_tf_sell=n;
                    }
                  Third_downtrend_control_bool=(Time_base_tf[UpperLevel_1_base_tf_sell]==Time_base_tf[UpperLevel_1_base_tf]);
                 }
              }
           }
        }
     }


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