Как правильно выяснить, что рынок закрыт? (mql4) - страница 3

 

А какая практическая необходимость во всех этих проверках?

Зачем проверять, например, разрешено ли эксперту торговать? На кого расчёт? На пользователя-дауна? Флаг разрешения торговли ставится в терминале один раз и всё. Зачем это на каждом тике проверять? Или же проверять каждые n-секунд? Советнику больше делать нечего?

Зачем проверять, открыт ли рынок? Рынок открывается когда хочет? Или какой-то инструмент сегодня торгуется с 16-ти часов, а завтра с 14-ти и такой бардак творится постоянно? Зачем при известном и никогда не меняющемся расписании торгов каждый тик или каждые n-секунд проверять открыт ли рынок?

А этот забавный совет с отправкой торгового запроса чтобы понять открыт ли рынок? Для любителей посмеяться? Или для довольного пользователя?

Нет тика -- нет торговли.

 
abolk:

А какая практическая необходимость во всех этих проверках?

Зачем проверять, например, разрешено ли эксперту торговать? На кого расчёт? На пользователя-дауна? Флаг разрешения торговли ставится в терминале один раз и всё. Зачем это на каждом тике проверять? Или же проверять каждые n-секунд? Советнику больше делать нечего?

Зачем проверять, открыт ли рынок? Рынок открывается когда хочет? Или какой-то инструмент сегодня торгуется с 16-ти часов, а завтра с 14-ти и такой бардак творится постоянно? Зачем при известном и никогда не меняющемся расписании торгов каждый тик или каждые n-секунд проверять открыт ли рынок?

А этот прикол с отправкой торгового запроса чтобы понять открыт ли рынок?

Нет тика -- нет торговли.

Задачи разные бывают. За всех не скажу, но у меня стояла задача из одного советника открывать ордера по разным инструментам, и у некоторых были разные торговые сессии (речь идёт о возможности работы с любым набором инструментов, доступных для счёта).

Поэтому все проверки делались не в OnTick, а в OnTimer. Свой вариант описал на предыдущей странице. Хотя в принципе он является своего рода проверкой "нет тика -- нет торговли".

 
abolk:

... Рынок открывается когда хочет? Или какой-то инструмент сегодня торгуется с 16-ти часов, а завтра с 14-ти и такой бардак творится постоянно?

...

Случается... Праздники там разные... В разных странах.    Вот недавнее "день амер президента", например.  Форекс работал, но золото и серебро - нет.

А если, кроме форекса, есть возможность пользовать ещё и фьючерсы, то здесь случается и раннее закрытие сессий, и отключения на случай превышения лимита, и прочие подвохи.

 
papaklass:

Вот еще вариант для четверки:

bool flag;
//-----------------------------------------------------------------------------+

bool RealSymbol(string str)
{
   return(MarketInfo(str, MODE_BID) != 0);
}//----------------------------------------------------------------------------+
 
void init()
{
   flag = RealSymbol(Symbol());
         
   return;  
}//----------------------------------------------------------------------------+
 
void deinit()
{
   return;
}//----------------------------------------------------------------------------+
 
void start()
{
   if (!flag)
   {
      return;
   }
   
   //дальше Ваш рабочий код
     
   return;  
}//----------------------------------------------------------------------------+

 

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

p.s. забавная ветка на советы

p.s.2. Особенно странно когда утверждают, что на закрытом рынке

MarketInfo(Symbol(), MODE_BID)

 даёт НОЛЬ.

 

Проверка задержки между тиками, и на основании этого делать вывод о закрытии торгов -- плохое решение.

 
avtomat:

Проверка задержки между тиками, и на основании этого делать вывод о закрытии торгов -- плохое решение.

Однако:
1) если отвечать не на вопрос "закрыты ли торги", а на вопрос "возможно ли открыть сделку по данной цене" (в текущих условиях);
2) заранее знать, что если котировка старше xx минут, то сервер на попытку открытия ордера гарантированно вернёт off quotes;
тогда вполне сносно. ИМХО, конечно.
 

Тут велось обсуждение данного вопроса для MT5.

Правильным вариантом для себя считаю использование функции SymbolInfoSessionTrade() для определения доступности торгов.


//+------------------------------------------------------------------+
//|Открыта ли торговая сессия                                        |
//|                                                 Copyright,Sergeev|
//|                           https://login.mql5.com/ru/users/sergeev|                 
//+------------------------------------------------------------------+
bool IsTradeSessionOpen()
  {
   MqlDateTime _DateTime;
   datetime _TimeCurrent=TimeTradeServer(_DateTime);

// проверяем время торгов по инструменту
   datetime _TradeEnd=(datetime)SymbolInfoInteger(_Symbol,SYMBOL_EXPIRATION_TIME);
   if(_TimeCurrent>_TradeEnd && _TradeEnd>0) return(false);

   datetime _TradeStart=(datetime)SymbolInfoInteger(_Symbol,SYMBOL_START_TIME);
   if(_TimeCurrent<_TradeStart && _TradeStart>0) return(false);

// проверяем сессии инструмента
   datetime _DayStart=_TimeCurrent/(60*60*24); _DayStart*=(60*60*24); // начало текущего дня
   datetime _sec=_TimeCurrent-_DayStart; // число секунд от начала дня

   for(int i=0; i<10; i++) // подразумеваем, что админ сделал не более 10 сессий в сутки
     {
      datetime _from,_to;
      if(!SymbolInfoSessionTrade(_Symbol,(ENUM_DAY_OF_WEEK)_DateTime.day_of_week,i,_from,_to)) break; // данные сессии
      if(_sec>=_from && _sec<=_to) return(true);
     }
   return(false);
  }
Как узнать, что по выходным нет торговли?
Как узнать, что по выходным нет торговли?
  • www.mql5.com
Пытаюсь дать понять советнику, что по выходным дням торговать не нужно :). - - Категория: общее обсуждение
 
Kino:

Перевел советника в режим работы OnTimer() теперь когда рынок закрыт он этого не понимает и пытается торговать, в общем обращается к серверу и естественно получает ошибки и забивает логи журнала. GetLastError() = Рынок закрыт. Какие ещё условия проверки на выходной день или закрытый рынок можно придумать ?

Duration = (задайте значение сами в миллисекундах. например, 6 часов = 1000*60*60*6)

if(GetLastError()==132(рынок закрыт) ) Sleep (Duration);

 

Когда то делал эксперименты с SymbolInfoSessionTrade() и Quote, и оказалось что данные из этих функций лишь приблизительно соответствуют действительности, а в некоторых случаях не соответствуют. 

 Возможно, комбинация нескольких проверок даст однозначный ответ на вопрос закончилась ли торговля?

SymbolInfoSessionTrade - Документация на MQL4
  • docs.mql4.com
SymbolInfoSessionTrade - Документация на MQL4
 

Ого сколько тектса.

MarketInfo(Symbol(),MODE_TRADEALLOWED) 

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