Проверка доступности рынка

 
Доброго времени суток!

Подскажите, как "грамотно" (не прибегая к костылям) проверить из эксперта, что торговля по заданному символу доступна в данный момент и сделать это "быстро" (не отсылая ордеров на сервер и прочее)?

Заранее спасибо.
 
717161:
Доброго времени суток!

Подскажите, как "грамотно" (не прибегая к костылям) проверить из эксперта, что торговля по заданному символу доступна в данный момент и сделать это "быстро" (не отсылая ордеров на сервер и прочее)?

Заранее спасибо.

Из справки mql4. 

IsTradeAllowed

Возвращает информацию о возможности торговли при помощи экспертов.

bool  IsTradeAllowed();

Вторая форма вызова возвращает информацию о возможности торговли для заданного символа в указанное время.

bool  IsTradeAllowed(
  const string symbol       // символ
  datetime     tested_time  // время
   );

Параметры

symbol

[in]  Символ.

tested_time

[in]  Время.

Возвращаемое значение

Возвращает true, если эксперту разрешено торговать и поток для выполнения торговых операций свободен, иначе возвращает false.

Для mql5.

 

TerminalInfoInteger

Возвращает значение соответствующего свойства окружения mql5-программы.

int  TerminalInfoInteger(
   int  property_id      // идентификатор свойства
   );

Параметры

property_id

[in]  Идентификатор свойства. Может быть одним из значений перечисленияENUM_TERMINAL_INFO_INTEGER.

Возвращаемое значение

Значение типа int.


 
Плюс ещё есть 
SymbolInfoInteger(Symbol(),SYMBOL_TRADE_MODE)
 
Vitalie Postolache:
Плюс ещё есть 
SymbolInfoInteger(Symbol(),SYMBOL_TRADE_MODE)
Спасибо, буду пробовать.
 
Vitalii Ananev:

Из справки mql4. 

IsTradeAllowed

Возвращает информацию о возможности торговли при помощи экспертов.

bool  IsTradeAllowed();

Вторая форма вызова возвращает информацию о возможности торговли для заданного символа в указанное время.

bool  IsTradeAllowed(
  const string symbol       // символ
  datetime     tested_time  // время
   );

Параметры

symbol

[in]  Символ.

tested_time

[in]  Время.

Возвращаемое значение

Возвращает true, если эксперту разрешено торговать и поток для выполнения торговых операций свободен, иначе возвращает false.

Для mql5.

 

TerminalInfoInteger

Возвращает значение соответствующего свойства окружения mql5-программы.

int  TerminalInfoInteger(
   int  property_id      // идентификатор свойства
   );

Параметры

property_id

[in]  Идентификатор свойства. Может быть одним из значений перечисленияENUM_TERMINAL_INFO_INTEGER.

Возвращаемое значение

Значение типа int.


То что Вы написали для mql5 - это не то что нужно. Для mql4 - все верно, но эксперт пишу для mql5.
Но все равно спасибо, что отозвались.
 
717161:
Доброго времени суток!

Подскажите, как "грамотно" (не прибегая к костылям) проверить из эксперта, что торговля по заданному символу доступна в данный момент и сделать это "быстро" (не отсылая ордеров на сервер и прочее)?

Заранее спасибо.
быстро и без запросов - это только если отслеживать поступающие события с рынка, то есть обрабатывать TradeEvent, BookEvent - если событий говорящих о том что рынок работает не поступает N-цать секунд то стоит наверное сделать запрос "жив ли рынок"
 
717161:
То что Вы написали для mql5 - это не то что нужно. Для mql4 - все верно, но эксперт пишу для mql5.
Но все равно спасибо, что отозвались.

Как это не то. Читайте справку по этой функции. TerminalInfoInteger(TERMINAL_TRADE_ALLOWED)

TERMINAL_TRADE_ALLOWED

Разрешение на торговлю

bool


 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Особенности языка mql5, тонкости и приёмы работы

fxsaber, 2017.02.25 16:39

ENUM_DAY_OF_WEEK GetDayOfWeek( const datetime time )
{
  MqlDateTime sTime = {0};

  ::TimeToStruct(time, sTime);

  return((ENUM_DAY_OF_WEEK)sTime.day_of_week);
}

// true - находимся в торговой сессии
bool SessionTrade( const string Symb )
{
  datetime TimeNow = ::TimeTradeServer();

  const ENUM_DAY_OF_WEEK DayOfWeek = GetDayOfWeek(TimeNow);

  TimeNow %= 24 * 60 * 60;

  bool Res = false;
  datetime From, To;

  for (int i = 0; (!Res) && ::SymbolInfoSessionTrade(Symb, DayOfWeek, i, From, To); i++)
    Res = ((From <= TimeNow) && (TimeNow < To));

  return(Res);
}

// Возвращает true, если символ торгуемый. Иначе - false.
bool SymbolTrade( const string Symb )
{
  MqlTick Tick;

  return(::SymbolInfoTick(Symb, Tick) ? ((Tick.bid != 0) && (Tick.ask != 0) && SessionTrade(Symb) /* &&
         ((ENUM_SYMBOL_TRADE_MODE)::SymbolInfoInteger(Symb, SYMBOL_TRADE_MODE) == SYMBOL_TRADE_MODE_FULL) */
) : false);
}

Применение

if (OrderCheck(Request, CheckResult) && SymbolTrade(Request.symbol))
  OrderSend(Request, Result);
Раскомментируйте часть кода, тогда OrderCheck можно будет не делать.
 

К сожалению, бывают моменты, когда перечисленные методы не исключают появления сообщения в терминале "...[Market closed]....". Тема неоднократно обжёвывалась на форуме, что-то вроди бы предпринималось...‌
Однако до сих пор приходится пользоваться костылями.
P.S. Если я ошибаюсь, не отследил, как проблему разрулили, ткните плиз носом "что, где когда".

 
Vladimir Suschenko:

P.S. Если я ошибаюсь, не отследил, как проблему разрулили, ткните плиз носом "что, где когда".

Выше код.
 
Я видел... Моя слова: "перечисленные методы" в том числе и к нему относятся.
Причина обращения: