OrdersTotal( ) как заставить его работать в MQL5?

 

запарился... не могу заставить его работать...

открывает сделки в тестере пока не закончится депо...

можно конечно обойти этот момент...

но в новом советнике... обязательно нужно проверять наличие открытой позиции...

проверка OrdersTotal()==0 ничего не дает... сделки открываются вновь и вновь 

 

и раз уж пошла такая пьянка... как проверить есть ли открытая позиция для каждой валютной пары в отдельности

пора уж на мультивалютные советники переходить ) 

 

По всей видимости Вы перепутали OrdersTotal с функцией PositionsTotal().

Чтобы определить, какие позиции открыты, надо использовать PositionsXXX функции. 

Документация по MQL5: Торговые функции / PositionsTotal
Документация по MQL5: Торговые функции / PositionsTotal
  • www.mql5.com
Торговые функции / PositionsTotal - Документация по MQL5
 
BaTTLeBLooM:

запарился... не могу заставить его работать...

открывает сделки в тестере пока не закончится депо...

можно конечно обойти этот момент...

но в новом советнике... обязательно нужно проверять наличие открытой позиции...

проверка OrdersTotal()==0 ничего не дает... сделки открываются вновь и вновь 

Я например использую такой вариант чтобы узнать открыта позиция по symbol

bool ActivePos(string symbol)
{
   PositionSelect(symbol);
   if(PositionGetDouble(POSITION_VOLUME)>0) return(true);
   return(false);
}

 В одно-валютном эксперте можно по-проще: используя if(PositionsTotal()>0) ...

 
gpwr:

Я например использую такой вариант чтобы узнать открыта позиция по symbol

вот так лучше вроде будет

//+----------------------------------------------------------------------------+
//|  есть ли открытая позиция ?                                                |
//|  Параметры:                                                                |
//|    sy - наименование инструмента                                           |
//|    op - операция                   (-1 - любая позиция)                    |
//|    mn - MagicNumber                (-1 - любой магик)                      |
//+----------------------------------------------------------------------------+
bool WhetherIsPosition(string sy="", ENUM_POSITION_TYPE op=-1, int mn=-1) {
      bool rez=false;         // результат запроса 
    
      if(PositionSelect(sy,100)==true)  // есть открытая позиция
         {
          if(PositionGetInteger(POSITION_TYPE) == op || op== -1) // проверка типа
             {
              if (PositionGetInteger(POSITION_MAGIC) == mn || mn==-1)  rez=true; // проверка магика
              else rez=false;
             }
         } 
  return(rez);
}    

 

 

Параметр sy зря в автозаполнение поставили - при нем результат будет заведомо отрицательный.

Вообще код лучше вот так переделать - быстрее работать будет:

//+----------------------------------------------------------------------------+
//|  есть ли открытая позиция ?                                                |
//|  Параметры:                                                                |
//|    sy - наименование инструмента                                           |
//|    op - операция                   (-1 - любая позиция)                    |
//|    mn - MagicNumber                (-1 - любой магик)                      |
//+----------------------------------------------------------------------------+
bool WhetherIsPosition(string sy, ENUM_POSITION_TYPE op=-1, int mn=-1) 
  {
   bool rez=false;         // результат запроса 
    
   if(PositionSelect(sy,100))                                  // есть открытая позиция
     {
      if(op== -1 || PositionGetInteger(POSITION_TYPE) == op)     // проверка типа
        {
         if(mn== -1 || PositionGetInteger(POSITION_MAGIC) == mn) // проверка магика
            rez=true; 
         }
     } 
 
   return(rez); 
  }


 
Renat:

Параметр sy зря в автозаполнение поставили - при нем результат будет заведомо отрицательный.

Вообще код лучше вот так переделать - быстрее работать будет:

По поводу быстрее, у меня однажды была ситуации. Попробую её описать.

Это торговый блок.

         Lots=0.1;
         if(WhetherIsPosition(sy,POSITION_TYPE_BUY,Magic)) Lots*=2;
         if(!WhetherIsPosition(sy,POSITION_TYPE_SELL,Magic))
           {
            OpenPosition(sy,ORDER_TYPE_SELL,Lots,sl,tp,Magic);
           }

 т.е. если есть открытая позиция бай, я удваиваю лот и переворачиваюсь в селл (для бай логика наоборот). если есть уже открытая позиция то я ничего не делаю. По идее в рынке должна быть позиция только 0.1 лота. 

но однажды у меня появился лот 0.2 (просто висел на демо счете советник, не в тестере). я долго анализировал и пришол к выводу, что сервер принял команду, но её еще не успел выполнить польностью, как пришол новый тик, и раз открытых позиций нет пошла команда открыть  позицию,  и эти приказы выполнились последовательно.

на чемпионате это дисквалификация 

поэтому я решил сделать задержку, но до сих  пор все равно не уверен, что исключил эту ситуацию

 if(PositionSelect(sy,100)==true)  // есть открытая позиция
З.Ы. спасибо за замечания и  правку кода
 
Prival:

поэтому я решил сделать задержку, но до сих  пор все равно не уверен, что исключил эту ситуацию

Вы неправильно поняли таймаут в параметре функции PositionSelect. Там не задержка, а именно таймаут ожидания разблокировки/обновления торговой базы.

Лучше всего после совершения сделки явным образом сохранять время последней операции и следующие N секунд ничего не предпринимать.

Документация по MQL5: Торговые функции / PositionSelect
Документация по MQL5: Торговые функции / PositionSelect
  • www.mql5.com
Торговые функции / PositionSelect - Документация по MQL5
 
Renat:

Вы неправильно поняли таймаут в параметре функции PositionSelect. Там не задержка, а именно таймаут ожидания разблокировки/обновления торговой базы.

Лучше всего после совершения сделки явным образом сохранять время последней операции и следующие N секунд ничего не предпринимать.

очень непонятно тогда справка написана, прочитав её, считал, что я задерживаю все опрерации на 100 милисекунд, т.е. жду это время и пытаюсь выбрать позицию, не появилась позиция в течении этого времени, значит её нет.

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

Какие будут рекомендации по величине N  (N секунд ничего не предпринимать) ?

 

 
Prival:

Какие будут рекомендации по величине N  (N секунд ничего не предпринимать) ?

В "Руководстве пользователя " клиентским терминалом написано про трэйлинг-стоп:

  • По одной позиции Трейлинг Стоп не может срабатывать чаще, чем один раз в 10 секунд.
Думаю, и по другим торговым операциям должна быть аналогичная задержка ?
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Типы торговых операций
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Типы торговых операций
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Типы торговых операций - Документация по MQL5
 
Prival:

очень непонятно тогда справка написана, прочитав её, считал, что я задерживаю все опрерации на 100 милисекунд, т.е. жду это время и пытаюсь выбрать позицию, не появилась позиция в течении этого времени, значит её нет.

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

Какие будут рекомендации по величине N  (N секунд ничего не предпринимать) ?

Думаю что это можно отследить через OnTrade().

Четыре её вызова соответствуют

выставлению ордера,

обработке ордера(проверке на правильность),

изменению позиции(совершение сделки),

появлению информации о сделке в истории.

Хотя чесно говоря я сам пока на практике её работу не проверил,

может быть тогда когда я занимался этим вопросом были активные перестройки в этой сфере,

но убедиться что всё работает как в описании я не смог.

Опятьже для меня остался непонятным момент что произойдёт если выставленны одновременно несколько ордеров,

как будет это отрабатываться в OnTrade()?