Как проверить, открыт ли рынок для торговли? - страница 2

 
SanAlex:

 иногда надо читать почту 

Ну мы же тут про автоматическую торговлю. Я могу вообще в отпуск уехать, а роботы будут колбасить. Комп на UPS'е полчаса-час продержится, а дольше редко отключают, два провайдера с одновременной работой и автопереключением.

 
JRandomTrader:

Могли не снять, а поставить. И тоже без сделки.

Да и тик получать не обязательно, если получаешь стакан.

И основная задача - не "узнать, что рынок закрыт", а "как можно быстрее узнать, что рынок открылся", без долбёжки ордерами.

Тестовая - это не прогон на истории, а имитация торговли в реальном времени, на реальном графике и стакане. И тут, для точности тестирования, надо учитывать периоды закрытой торговли.

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

Да без разницы! Вы сами определитесь(в худшую для себя сторону, или хотя бы в какую-то сторону), что для Вас условие(я) - рынок открылся! без долбежки ордерами.

И проверяйте/правьте условия в реале, рассуждать около рынка можно до бесконечности)

Для тестовой та же ситуация, пишите код, собирайте данные в лог.

 
JRandomTrader:

Ну мы же тут про автоматическую торговлю. Я могу вообще в отпуск уехать, а роботы будут колбасить. Комп на UPS'е полчаса-час продержится, а дольше редко отключают, два провайдера с одновременной работой и автопереключением.

Зачем же так рисковать ? В Отпуск же можно взять, ноутбук. 

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

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

sinput group "----------------- Start Stop ---------------------------"
sinput datetime           HoursFrom                  = D'1970.01.02';    // 1 Время: старт
sinput datetime           HoursTo                    = D'1970.01.01';    // Время: стоп
sinput datetime           HoursFrom2                 = D'1970.01.01';    // 2 Время: старт
sinput group "----------------- Time:Start Stop ----------------------"
sinput int                HoursFrom1                 = 0;                // Время: старт
sinput int                HoursTo1                   = 24;               // Время: стоп
 
SanAlex:

Зачем же так рисковать ? В Отпуск же можно взять, ноутбук. 

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

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

А сегодня разве 1970 год?

И если взять с собой в отпуск ноут, то можно и в ручную поторговать. Да и из отпуска не возвращаться.
 
jaffer wilson:

У меня проблема с пониманием того, открыт рынок или закрыт.

Я видел и другие темы, где говорят, что можно проверить дни недели.

А как насчет других праздников?

В последнее время рынок не открывался в пятницу из-за Страстной пятницы. Подобные вещи случаются и в другие дни недели. Это время, когда рынок закрыт. Я вижу это на вкладке «Журнал» МТ5, но не знаю, как отловить это в проблеме.

Пожалуйста, дайте мне знать, что я могу сделать?

До отправки ордера на сервер никак не узнаете.
Сейчас только свою проверку делать нужно.

Если это биржевая торговля, то там ещё веселее.
В котировочную сессию, я могу ставить и снимать стоп-ордера, но не могу отправлять лимитные м рыночные ордера.
При этом OrderCheck() сообщит что всё ОК.

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

 
Alexey Viktorov:

А сегодня разве 1970 год?

И если взять с собой в отпуск ноут, то можно и в ручную поторговать. Да и из отпуска не возвращаться.

в коде может не указываться год, только время, например в коде Василия Соколова

 
Fast235:

в коде может не указываться год, только время, например в коде Василия Соколова

В этом год день - обязательно нужно указать. - а 1970 - это скорее всего по умолчанию от этой функции. 

\\\\\\\\\\\\\\\\\\\\\\\\\\\\

ещё что то - "до" был придел, кажись до 2030

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

как я узнал почему 2030 - эту функцию лет 10 назад нашёл из программки по написанию кодов.

надо было просто день прибавить  D'1970.01.02' и все стартует - а я не сообразил, и что то в том коде верх тормашками задавал дату.

больше 2030 не работало - 

input datetime HoursFrom            = D'1970.01.01';  // Время старта Эксперта
input datetime HoursTo              = D'2030.12.31';  // Время закрытия всех позиций

 

   if((HoursFrom<HoursTo && TimeLocal()>=HoursFrom && TimeLocal()<HoursTo) || 
      (HoursFrom>HoursTo && (TimeLocal()<HoursTo || TimeLocal()>=HoursFrom)))
     {
      OnTickOnTick();
     }
 

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

( автор кода - блистательный @fxsaber )

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

1970.01.01 - это "нулевая" дата в UNIX, от неё считаются секунды.

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

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

 

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

//+------------------------------------------------------------------+
//|                                                        State.mqh |
//|                          Copyright 2005-2021, Vladimir Mikhailov |
//|                                                mikh.vl@gmail.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2005-2021, Vladimir Mikhailov"
#property link      "mikh.vl@gmail.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//|  CState                                                          |
//+------------------------------------------------------------------+
class CState
{
   enum ENUM_STATE
   {
      STATE_TRADE = 0,
      STATE_CLOSE = 1
   };

   struct SState
   {
      ENUM_STATE          state;
      int                 start_hour;
      int                 start_min;
      int                 start_sec;
      int                 end_hour;
      int                 end_min;
      int                 end_sec;
   };

private:
   MqlDateTime             m_current_stime;
   datetime                m_current_time;
   datetime                m_start_time;
   datetime                m_end_time;
   int                     m_size;
   SState                  m_state[];

public:
   bool                    is_trade;
//---
   datetime                State(void);
   void                    CState(void);
   void                    ~CState(void);
} state;
//+------------------------------------------------------------------+
//|  Init                                                            |
//+------------------------------------------------------------------+
void CState::CState(void)
{
   m_size = ArrayResize(m_state, 3);
//--- Trade
   m_state[0].state = STATE_TRADE;
   m_state[0].start_hour = 7;
   m_state[0].start_min = 0;
   m_state[0].start_sec = 0;
   m_state[0].end_hour = 14;
   m_state[0].end_min = 0;
   m_state[0].end_sec = 0;
//---
   m_state[1].state = STATE_TRADE;
   m_state[1].start_hour = 14;
   m_state[1].start_min = 5;
   m_state[1].start_sec = 0;
   m_state[1].end_hour = 18;
   m_state[1].end_min = 45;
   m_state[1].end_sec = 0;
//---
   m_state[2].state = STATE_TRADE;
   m_state[2].start_hour = 19;
   m_state[2].start_min = 0;
   m_state[2].start_sec = 0;
   m_state[2].end_hour = 23;
   m_state[2].end_min = 50;
   m_state[2].end_sec = 0;
}
//+------------------------------------------------------------------+
//|  DeInit                                                          |
//+------------------------------------------------------------------+
void CState::~CState(void)
{
   ArrayFree(m_state);
}
//+------------------------------------------------------------------+
//|  Action                                                          |
//+------------------------------------------------------------------+
datetime CState::State(void)
{
   is_trade = false;
//---
   m_current_time = TimeTradeServer(m_current_stime);

//--- get state
   for(int i = 0; i < m_size; i++)
   {
      m_current_stime.hour = m_state[i].start_hour;
      m_current_stime.min = m_state[i].start_min;
      m_current_stime.sec = m_state[i].start_sec;
      m_start_time = StructToTime(m_current_stime);

      m_current_stime.hour = m_state[i].end_hour;
      m_current_stime.min = m_state[i].end_min;
      m_current_stime.sec = m_state[i].end_sec;
      m_end_time = StructToTime(m_current_stime);

      if(m_current_time >= m_start_time && m_current_time < m_end_time)
      {
         if(m_state[i].state == STATE_TRADE)
         {
            is_trade = true;
            break;
         }
      }
   }
//---
   return(m_current_time);
}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//|                                             TestSessionState.mq5 |
//|                               Copyright 2021, Vladimir Mikhailov |
//|                                                mikh.vl@gmail.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, Vladimir Mikhailov"
#property link      "mikh.vl@gmail.com"
#property version   "1.00"
#include "State.mqh"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
//---

//---
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---

}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
//---
   state.CState();

   if(state.is_trade)
   {
//--- trade time
   }
}
//+------------------------------------------------------------------+
Файлы:
Причина обращения: