Контроль и модификация ордеров по типу OrderType()

 
Добрый вечер.

Нужна ваша помощь с отслеживанием и контролем выставленных ордеров по типу...
Накатал я вот что: (пишу с сотового, нет кнопки вставить как код)

WorkOrders();
if(Type==4) ES=OrderModify(Ticket,Enter,SL,TP,0,CLR_NONE);
else EB=OrderSend(Symbol(),OP_BUYSTOP,Lot,Enter,0,SL,TP,0,magic,0,CLR_NONE);

WorkOrders();
if(Type==5) ES=OrderModify(Ticket,Enter,SL,TP,0,CLR_NONE);
else ES=OrderSend(Symbol(),OP_SELLSTOP,Lot,Enter,0,SL,TP,0,magic,0,CLR_NONE);

bool WorkOrders(){
//for (int i=OrdersTotal()-1;i>=0;i--){
for(int i=0;i if (!OrderSelect(i,SELECT_BY_POS)) continue;
if (OrderSymbol()!=Symbol()) continue;
if (OrderMagicNumber()!=magic) continue;
if (OrderType() //OpenPrise=OrderOpenPrice();
Type =OrderType();
Ticket =OrderTicket();
return(true);}
return(false);
}

Суть такая... Если есть открытый ордер, то его не трогаем. А вот стоп ордера проверяем и если их нет, то ставим, если есть уже такой ордер, то переносим его вместо установки нового... В итоге стоп ордеров максимум должно быть всего два - сел и бай, а открытых хоть сколько, их не трогать.

Результат моего творения работает не так, сначала все хорошо и даже модификация отрабатывает... Но потом, что-то происходит и стоп ордера остаются на месте, начинают ставиться каждый раз новые.

Заранее спасибо.
 
WorkOrders();
      if(Type==4) ES=OrderModify(Ticket,Enter,SL,TP,0,CLR_NONE);
      else ES=OrderSend(Symbol(),OP_BUYSTOP,Lot,Enter,0,SL,TP,0,magic,0,CLR_NONE);

WorkOrders();
      if(Type==5) ES=OrderModify(Ticket,Enter,SL,TP,0,CLR_NONE);
      else ES=OrderSend(Symbol(),OP_SELLSTOP,Lot,Enter,0,SL,TP,0,magic,0,CLR_NONE);

bool WorkOrders(){
      //for (int i=OrdersTotal()-1;i>=0;i--){
      for(int i=0;i<=OrdersTotal();i++){
      if (!OrderSelect(i,SELECT_BY_POS))  continue;
      if (OrderSymbol()!=Symbol())        continue;
      if (OrderMagicNumber()!=magic)      continue;
      if (OrderType()<4)                  continue;
      //OpenPrise=OrderOpenPrice();
      Type     =OrderType();
      Ticket   =OrderTicket();
      return(true);}
return(false);
}
Добрался до ПК.
 
bool WorkOrders(){
      int countB, countSS, ordertype;
      for (int i=OrdersTotal()-1;i>=0;i--){
      if (!OrderSelect(i,SELECT_BY_POS))  continue;
      if (OrderSymbol()!=Symbol())        continue;
      if (OrderMagicNumber()!=magic)      continue;
      ordertype=OrderType();
      if (ordertype==4||ordertype==5){
          Ticket   =OrderTicket();
          ES=OrderModify(Ticket,Enter,SL,TP,0,CLR_NONE); // лучше ссылку на сам блок с модификацией где и реквоти и обработка ошибок, sl, tp .........
          if (ordertype==4) countBS++;
          if (ordertype==5) countSS++;
          continue;
          }
      }
    if (countBS==0)ES=OrderSend(Symbol(),OP_BUYSTOP, Lot,Enter,0,SL,TP,0,magic,0,CLR_NONE);// и опять, лучше ссылку на блок с открытием ордера
    if (countSS==0)ES=OrderSend(Symbol(),OP_SELLSTOP,Lot,Enter,0,SL,TP,0,magic,0,CLR_NONE);
    return;
}
что-то типа етого повернее вашего должно быть
 

Спасибо Сергей. Кажется все работает как надо... буду тестировать дальше.

В чем мои ошибки были?

1 - Цикл в обратном направлении

2- Новый ордер только, если нет отложенника в данном направлении

...

 
ALex2008:

Спасибо Сергей. Кажется все работает как надо... буду тестировать дальше.

В чем мои ошибки были?

1 - Цикл в обратном направлении

2- Новый ордер только, если нет отложенника в данном направлении

...

Я не сильно опытен, но перед написанием чего-то, всегда лучше потратить лишнюю минуту на построение плана (в голове или на бумажке или на компе) а так же обдумать детали будущего кода (лаконичность, оперативность),

чем нестись на пролом и писать что-то некоректное в котором дальнейше надо найти и понять причину неисправности.

3) логическая ошибка цыкла перебора (выход с цыкла как только находит ордер типа 4 или 5 а вдруг 5-й самый последний??? или 4-й???);

4) использование несколько раз цыкла перебора ( можно все в одном организовать);

5) на бай и селл разные стопы тейки и цены должны быть, обработка ошибок, реквот, ....... (не знаю или вы все ето организовывали)

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