Check Market Time function

 

Привет!

Есть функция, которая проверяет торговое время для операций с ордерами.

bool CheckMarketTime()
{
  MqlDateTime sv_time;
  sv_time.year = 0;
  TimeCurrent(sv_time); //Возвращает последнее известное время сервера
  if(sv_time.year > 0)
  {
    MqlDateTime cur_time;
    cur_time.year = 0;
    TimeTradeServer(cur_time); //Возвращает расчетное текущее время торгового сервера.
    if(cur_time.year > 0)
    {
      if((cur_time.day_of_week == int(FirstDay)) ||
         (cur_time.day_of_week == int(SecondDay))) return(false); //Проверка на выходные
      if(cur_time.day_of_week == sv_time.day_of_week)
      {
        ulong tr_time = sv_time.hour * 3600 + sv_time.min * 60 + sv_time.sec;
        if(((tr_time >= time_st_mon) && (tr_time < 50370)) ||  //10:00:01 - 13:59:30
           ((tr_time >= time_st_day) && (tr_time < 67470)) ||  //14:05:01 - 19:44:30 
           ((tr_time >= time_st_evn) && (tr_time < 85770)))    //19:05:01 - 23:49:30
        {
          return(true);
        }  
      }   
    }   
  }
  return(false);
} 

Где в коде ошибка?

А ошибка есть, потому что иногда, происходит действие с ордерами вне пределов заданного времени.

 

А почему не

ulong tr_time = cur_time.hour * 3600 + cur_time.min * 60 + cur_time.sec;
?
 
Комбинатор:

А почему не

?

Потому что нужно брать время КОТИРОВКИ (TimeCurrent(sv_time); //Возвращает последнее известное время сервера) Т.Е самой котировки

Какой смысл проверять расчётное время?

Расчётное время (cur_time) берётся лишь только для того, чтобы проверить не вчерашняя ли котировка с нормальным временем

и для определения не выходные ли.

 
prostotrader:
очень странная логика, ну да дело ваше
 
Комбинатор:
очень странная логика, ну да дело ваше

Почему странная?

Из справки:

TimeTradeServer

Возвращает расчетное текущее время торгового сервера. В отличие от функции TimeCurrent(),
расчет значения времени производится в клиентском терминале и зависит от настроек времени на компьютере пользователя.

Так какой смысл проверять локальное время компа, когда нам нужно время котировки?

Добавлено

TimeCurrent

Возвращает последнее известное время сервера, время прихода последней котировки по одному из выбранных в "Обзоре рынка" символов.
В обработчике OnTick() данная функция вернет время пришедшего обрабатываемого тика.
В других случаях (например, вызов в обработчиках OnInit(), OnDeinit(), OnTimer() и так далее) это – время прихода последней котировки по любому символу,
доступного в окне "Обзор рынка", то самое время, которое показано в заголовке этого окна.
Значение времени формируется на торговом сервере и не зависит от настроек времени на компьютере пользователя.

В функции OnBookEvent() делаем:

void OnBookEvent (const string& symbol);
{
  if(symbol == Symbol())
  {
    if(CheckTradingTime())
    {
      //Дальнейщая работа
    }   
  }
}

Если в OnBookEvent() проверка символа валидна, то пришла новая котировка по этому символу (или изменился стакан, кто-то убрал свой отложенный ордер,

а остальные ордера могли быть выставлены неделю назад), а далее должно быть понятно... 

Дабавлено

А ешё есть премаркет, - это когда совершаются сделки вне биржевой сессии.