Как узнать общее количество отложенных ордеров

 

Доброго все времени суток! Не могу разобраться, казалось бы в простых вещах. Собрал простой код для открытия стоповых ордеров. Добавил условие, что бы отложки открывались, если нет других отложек. Но что то не работает! Советник открывает отложки 2 раза. ни больше ни меньше. Причем первый раз срабатывает отложка и перекрывается противоположной. остается одна позиция а второй раз срабатывают обе отложки и остаются еще 2 противоположные позиции. Таким образом всего 3 позиции на тесте.

Код как в учебнике вот такой:

if(OrdersTotal()<=0)

{

   if(Sell==true)

     {

      MqlTradeRequest request={0};

      MqlTradeResult  result={0};

      //--- параметры для установки отложенного ордера

      request.action   =TRADE_ACTION_PENDING;                             // тип торговой операции

      request.symbol   =Symbol();                                         // символ

      request.volume   =0.1;                                              // объем в 0.1 лот

      request.deviation=2;                                                // допустимое отклонение от цены

      request.magic    =EXPERT_MAGIC;                                     // MagicNumber ордера

      int offset = 200;                                                    // отступ от текущей цены для установки ордера, в пунктах

      double price;                                                       // цена срабатывания ордера

      double point=SymbolInfoDouble(_Symbol,SYMBOL_POINT);                // размер пункта

      int digits=(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS);                // кол-во знаков после запятой (точность)

      request.type     =ORDER_TYPE_SELL_STOP;                           // тип ордера

      price=SymbolInfoDouble(Symbol(),SYMBOL_ASK)-offset*point;         // цена для открытия 

      request.price    =NormalizeDouble(price,digits);                  // нормализованная цена открытия 

      if(!OrderSend(request,result))

         PrintFormat("OrderSend error %d",GetLastError());                 // если отправить запрос не удалось, вывести код ошибки

      //--- информация об операции

      PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);

     }

   if(Buy==true)

     {

      MqlTradeRequest request={0};

      MqlTradeResult  result={0};

      //--- параметры для установки отложенного ордера

      request.action   =TRADE_ACTION_PENDING;                             // тип торговой операции

      request.symbol   =Symbol();                                         // символ

      request.volume   =0.1;                                              // объем в 0.1 лот

      request.deviation=2;                                                // допустимое отклонение от цены

      request.magic    =EXPERT_MAGIC;                                     // MagicNumber ордера

      int offset = 200;                                                    // отступ от текущей цены для установки ордера, в пунктах

      double price;                                                       // цена срабатывания ордера

      double point=SymbolInfoDouble(_Symbol,SYMBOL_POINT);                // размер пункта

      int digits=(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS);                // кол-во знаков после запятой (точность)

      request.type =ORDER_TYPE_BUY_STOP;                                // тип ордера

      price        =SymbolInfoDouble(Symbol(),SYMBOL_ASK)+offset*point; // цена для открытия 

      request.price=NormalizeDouble(price,digits);                      // нормализованная цена открытия 

      if(!OrderSend(request,result))

         PrintFormat("OrderSend error %d",GetLastError());                 // если отправить запрос не удалось, вывести код ошибки

      //--- информация об операции

      PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);

     }




Тест выглядит вот так: 

Файлы:
rc0y.jpg  65 kb
 

Проблема думаю вся в функции OrdersTotal() по определению, она используется для общего количества всех отложек и рыночных ордеров. Но у меня она повела себя по другому. Альтернативы для нее я не нашел. 

Подскажите кому не жалко как мне ограничить выставление отложек.

 
vitaliy9999999:

Проблема думаю вся в функции OrdersTotal() по определению, она используется для общего количества всех отложек и рыночных ордеров. Но у меня она повела себя по другому. Альтернативы для нее я не нашел. 

Подскажите кому не жалко как мне ограничить выставление отложек.


Силой воли

Задайте вопрос точно, ничего не ясно

 
vitaliy9999999:

Доброго все времени суток! Не могу разобраться, казалось бы в простых вещах. Собрал простой код для открытия стоповых ордеров. Добавил условие, что бы отложки открывались, если нет других отложек. Но что то не работает! Советник открывает отложки 2 раза. ни больше ни меньше. Причем первый раз срабатывает отложка и перекрывается противоположной. остается одна позиция а второй раз срабатывают обе отложки и остаются еще 2 противоположные позиции. Таким образом всего 3 позиции на тесте.

Код как в учебнике вот такой:

if(OrdersTotal()<=0)

Надо знак поменять на >

 
Alexey Volchanskiy:

Надо знак поменять на >


И вообще все неверно. Надо определять количество ордеров и делать по ним цикл.
 
в цикле мы перебираем ордера, что бы найти последний или предпоследний... для работы с ним. Если мы пишем if(OrdersTotal()<=0) это значит, что если у нас нет ордеров, открытых и отложенных то мы идем дальше по коду. Если есть хоть один ордер то мы ничего не делаем. Мне нужно что бы в момент когда у меня нет отложек вообще у меня вставали 2 отложки и ни одной отложкой больше. Такое чувство, что OrdersTotal() не видит отложенные ордера. В MQL4 все работало но MQL5 нет. Другой функции я не нашел для этого. Но это не значит, что ее нет. помогите!
 
Разобрался сам. Открытые отложки показывает OrdersTotal() а открытые позиции показывает PositionsTotal() знал но тупил сам.
Причина обращения: