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

 
Vitalii Ananev:

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

TERMINAL_TRADE_ALLOWED

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

bool


Виталий, функция 
TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) // позволяет программно проверить
разрешение на автоматическую торговлю в настройках терминала. Я спрашивал немного про
другое - Вы видели иногда что рынок бывает закрыт по некоторым символам -
нерабочее время, праздники.... да мало ли еще чего.
 
Vladimir Suschenko:
Я видел... Моя слова: "перечисленные методы" в том числе и к нему относятся.
Приведите пример, где не работает данный код.
 
Maxim Kuznetsov:
быстро и без запросов - это только если отслеживать поступающие события с рынка, то есть обрабатывать TradeEvent, BookEvent - если событий говорящих о том что рынок работает не поступает N-цать секунд то стоит наверное сделать запрос "жив ли рынок"
Каким Вы видите этот запрос?
 
fxsaber:
Ваш код очень элегантен, забираю его :)
Только вопрос - если на рынке будет праздник, он обработается этим кодом, или добавить проверку на некое разумно БОЛЬШОЕ  количество миллисекунд (например равное перерыву в торговой сессии) с последней котировки?
 
Vladimir Suschenko:

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

Можете тему показать где это максимально подробно пережевано?
 
fxsaber:
Приведите пример, где не работает данный код.

Как я сказал раньше, "...бывают моменты, когда перечисленные методы не исключают появления сообщения в терминале "...[Market closed]...." . К сожалению я не могу формализовать совокупность стечений обстоятельств и привести конкретный пример, но с высокой степенью вероятности смогу такой момент отследить. Если есть сомнение в том, что я говорю правду, можем провести небольшой эксперимент. Для его чистоты Вы напишите и прокомпилите и пришлёте мне небольшой советничек, задача которого всего лишь подтвердить (или не подтвердить) пригодность Вашего кода для предотвращения ошибок в торговле с появлением сообщения "[Market closed]". Пусть алгоритм работы советничка будет следующим: По приходу нового бара нужно открыть сделку в любом направлении. Если возникнет ошибка, пусть советничек отправит Вам об этом пуш уведомление (это будет гарантией, что я запустил именно его, а не свою подделку). Если мне удастся отловить сбойный момент, я Вам пришлю лог с ошибками.
Как Вам идея? Надеюсь, не очень обременителное предложение?
 
717161:
Можете тему показать где это максимально подробно пережевано?


https://www.mql5.com/ru/search#!keyword=Market%20closed&module=mql5_module_forum&page=1

‌‌Там не всё в тему, но развлечься есть чем

 
Vladimir Suschenko:

Как я сказал раньше, "...бывают моменты, когда перечисленные методы не исключают появления сообщения в терминале "...[Market closed]...." . К сожалению я не могу формализовать совокупность стечений обстоятельств и привести конкретный пример, но с высокой степенью вероятности смогу такой момент отследить. Если есть сомнение в том, что я говорю правду, можем провести небольшой эксперимент. Для его чистоты Вы напишите и прокомпилите и пришлёте мне небольшой советничек, задача которого всего лишь подтвердить (или не подтвердить) пригодность Вашего кода для предотвращения ошибок в торговле с появлением сообщения "[Market closed]". Пусть алгоритм работы советничка будет следующим: По приходу нового бара нужно открыть сделку в любом направлении. Если возникнет ошибка, пусть советничек отправит Вам об этом пуш уведомление (это будет гарантией, что я запустил именно его, а не свою подделку). Если мне удастся отловить сбойный момент, я Вам пришлю лог с ошибками.
Как Вам идея? Надеюсь, не очень обременителное предложение?
Один из наиболее сильных тестов (наглая реклама, конечно)

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

Библиотеки: MT4Orders

fxsaber, 2017.02.16 15:16

// Скрипт проверяет скоростные характеристики обработки основных типов торговых приказов MT5.

#define TOSTRING(A)  #A + " = " + (string)(A) + "\n"
#define TOSTRING2(A) #A + " = " + EnumToString(A) + " (" + (string)(A) + ")\n"

string ToString( const MqlTradeRequest &Request )
{
  return(TOSTRING2(Request.action) + TOSTRING(Request.magic) + TOSTRING(Request.order) +
         TOSTRING(Request.symbol) + TOSTRING(Request.volume) + TOSTRING(Request.price) +
         TOSTRING(Request.stoplimit) + TOSTRING(Request.sl) +  TOSTRING(Request.tp) +
         TOSTRING(Request.deviation) + TOSTRING2(Request.type) + TOSTRING2(Request.type_filling) +
         TOSTRING2(Request.type_time) + TOSTRING(Request.expiration) + TOSTRING(Request.comment) +
         TOSTRING(Request.position) + TOSTRING(Request.position_by));
}

string ToString( const MqlTradeResult &Result )
{
  return(TOSTRING(Result.retcode) + TOSTRING(Result.deal) + TOSTRING(Result.order) +
         TOSTRING(Result.volume) + TOSTRING(Result.price) + TOSTRING(Result.bid) +
         TOSTRING(Result.ask) + TOSTRING(Result.comment) + TOSTRING(Result.request_id) +
         TOSTRING(Result.retcode_external));
}

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

  ::TimeToStruct(time, sTime);

  return((ENUM_DAY_OF_WEEK)sTime.day_of_week);
}

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);
}

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);
}

#define MT4ORDERS_BENCHMARK Alert(MT4ORDERS::LastTradeRequest.symbol + " " +       \
                                  (string)MT4ORDERS::LastTradeResult.order + " " + \
                                  MT4ORDERS::LastTradeResult.comment);             \
                            Print(ToString(MT4ORDERS::LastTradeRequest) +          \
                                  ToString(MT4ORDERS::LastTradeResult));

#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006


#define Point (SymbolInfoDouble(Symb, SYMBOL_POINT))
#define Bid (SymbolInfoDouble(Symb, SYMBOL_BID))
#define Ask (SymbolInfoDouble(Symb, SYMBOL_ASK))

void Benchmark( string Symb = NULL, uint LimitOffset = 1000 )
{
  if (Symb == NULL)
    Symb = _Symbol;

  if (SymbolTrade(Symb))
  {
    const bool DemoAccount = ((ENUM_ACCOUNT_TRADE_MODE)AccountInfoInteger(ACCOUNT_TRADE_MODE) == ACCOUNT_TRADE_MODE_DEMO);
    const double MinLot = SymbolInfoDouble(Symb, SYMBOL_VOLUME_MIN);

    const uint StopLevel = (uint)SymbolInfoInteger(Symb, SYMBOL_TRADE_STOPS_LEVEL);

    if (StopLevel != 0)
      LimitOffset = StopLevel;

    if (DemoAccount && OrderSelect(OrderSend(Symb, OP_BUY, MinLot, Ask, 100, 0, 0, __FUNCTION__ + "_Position"), SELECT_BY_TICKET))
    {
      OrderModify(OrderTicket(), OrderOpenPrice(), 0, Bid + LimitOffset * Point, 0);
      OrderClose(OrderTicket(), OrderLots(), Bid, 100);
    }

    double PriceMin = SymbolInfoDouble(Symb, SYMBOL_SESSION_PRICE_LIMIT_MIN);

    if (PriceMin < Point)
      PriceMin = MathMax(Ask - LimitOffset * Point, Point);

    if ((PriceMin < Ask) &&
        OrderSelect(OrderSend(Symb, OP_BUYLIMIT, MinLot, PriceMin, 100, 0, 0, __FUNCTION__ + "_Order"), SELECT_BY_TICKET) &&
        (!OrderDelete(OrderTicket())) && (!DemoAccount))
    {
      Alert("OrderDelete ERROR, Check Now!");

      ExpertRemove();
    }
  }
}
void OnStart()
{
  if ((ENUM_ACCOUNT_TRADE_MODE)AccountInfoInteger(ACCOUNT_TRADE_MODE) == ACCOUNT_TRADE_MODE_DEMO) // Закомментировать, если хочется проверить реал
  {
    Alert(TOSTRING(AccountInfoString(ACCOUNT_SERVER)));
    Alert(TOSTRING(TerminalInfoInteger(TERMINAL_PING_LAST)));

    while (!IsStopped())
      for (int i = SymbolsTotal(true) - 1; (i >= 0) && (!IsStopped()); i--)
        Benchmark(SymbolName(i, true));
  }
}

С помощью этого скрипта удалось найти проблемы с исполнением в MT5. Рекомендую проверять свою связку Терминал+Торговый Сервер и, в случае проблем, сообщать в Сервисдеск.

 

Бежит по всем символам в Обзоре рынка и совершает торговые операции на тех, что проходят сабж. Можете выкинуть Order-функции и впихнуть свои в Benchmark-функцию.

З‌абиваете перед запуском Обзор рынка всякими дрянь-символами под завязку и запускаете скрипт. Словит Market Closed почти сразу, если проверочный код ошибочный.

 
717161:
Виталий, функция 
TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) // позволяет программно проверить
разрешение на автоматическую торговлю в настройках терминала. Я спрашивал немного про
другое - Вы видели иногда что рынок бывает закрыт по некоторым символам -
нерабочее время, праздники.... да мало ли еще чего.

Я думал, что это аналог функции из mql4 IsTradeAllowed, которая помимо проверки разрешения на торговлю экспертами проверяет возможна ли торговля вообще. По крайней мере в своих экспертах я использую эту функцию и еще не разу не заметил что бы эксперт пытался торговать в выходные. Вы у разработчиков не пробовали спрашивать об этом, может просто они не посчитали нужным полностью задокументировать возможности этой функции. Или проверить экспериментальным путем.
 
fxsaber:
Один из наиболее сильных тестов (наглая реклама, конечно)

Бежит по всем символам в Обзоре рынка и совершает торговые операции на тех, что проходят сабж. Можете выкинуть Order-функции и впихнуть свои в Benchmark-функцию.

З‌абиваете перед запуском Обзор рынка всякими дрянь-символами под завязку и запускаете скрипт. Словит Market Closed почти сразу, если проверочный код ошибочный.


Интересная идея, но не могу запустить и проверить. Можете сделать без MT4Orders.mqh ? не хочется ковыряться в дебрях MT4.
Причина обращения: