Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Serg
11
Serg  

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

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

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

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

Artiom Morochin
301
Artiom Morochin  
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 если ордера на ценовом уровне нет.

Serg
11
Serg  
artamir:

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

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



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

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

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

Artiom Morochin
301
Artiom Morochin  
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);
}

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


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

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

Artiom Morochin
301
Artiom Morochin  
всегда рад помочь. :)
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий