Как правильно установить один отложенник?

 

Прошу прощения, поймал клина.

Нужно чтобы на конкретном ценовом уровне стоял только один отложенник (stop или limit).

А у меня программа постояннонасыпает их целую кучу.

Фильтрация по времени открытия нового бара не годится.

 
bool isOrderOnPrice(double calcPrice){

        boor res = false;
        //---
           int t = OrdersTotal();
           for(int i = t; i >= 0; i--){
              //======
                 if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;    //если вдруг такой позиции не существует
                 //---
                 if(OrderSymbol() != Symbol()) continue; //если не наш инструмент
                 //---
                 if(OrderMagicNumber() != MagicNumber) continue; //если не наш магик 
                 //---
                 if(OrderType() <= 1) continue; //отсеиваем рыночные ордера (OP_BUY & OP_SELL) 
                 //---
                 if(NormalizeDouble(OrderOpenPrice(), Digits) != NormalizeDouble(calcPrice, Digits)) continue; // если цена открытия не равна расчетной цене открытия
              //======
              return(true);
           }
        //---
        return(res);
}

Вызывай эту функцию перед выставлением ордера.

она возвращает false если ордера на ценовом уровне нет.

 
artamir:

Вызывай эту функцию перед выставлением ордера.

она возвращает false если ордера на ценовом уровне нет.



Спасибо за код, artamir. А еще вместь calcPrice можно вставить диапазон, в пределах которого дополнительные ордера открываться не будут.

Также встречал системы, где для этих целей использовались серии magic-номеров (101, 102, etc.). Но не для всех случаев это подходит (например при трейлинге портфеля ордеров).

Может кто-то еще подскажет идеи (можно без кода).

 
bool isOrderOnPrice(double calcPrice, int diap){

        boor res = false;
        //---
           int t = OrdersTotal();
           for(int i = t; i >= 0; i--){
              //======
                 if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;    //если вдруг такой позиции не существует
                 //---
                 if(OrderSymbol() != Symbol()) continue; //если не наш инструмент
                 //---
                 if(OrderMagicNumber() != MagicNumber) continue; //если не наш магик 
                 //---
                 if(OrderType() <= 1) continue; //отсеиваем рыночные ордера (OP_BUY & OP_SELL) 
                 //---
                 if(NormalizeDouble(OrderOpenPrice(), Digits) >= NormalizeDouble(calcPrice-diap*Point, Digits) &&
                    NormalizeDouble(OrderOpenPrice(), Digits) <= NormalizeDouble(calcPrice+diap*Point, Digits)) continue; // если цена открытия не попадает в диапазон расчетной цены +- diap pip открытия
              //======
              return(true);
           }
        //---
        return(res);
}

Вызывай эту функцию п
 
artamir:


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

Спасибо большое.

 
всегда рад помочь. :)