Как определить время начала дня на FORTS ?

 

Подскажите, как вы определяете время начало дня FORTS в советниках ?

Сейчас определяю без учета праздников и переносов рабочих дней и т.п.  Ничего в голову не приходит кроме запроса истории баров... может быть есть варианты проще ?

 
pivomoe:

Подскажите, как вы определяете время начало дня FORTS в советниках ?

Сейчас определяю без учета праздников и переносов рабочих дней и т.п.  Ничего в голову не приходит кроме запроса истории баров... может быть есть варианты проще ?

Начало дня, на ФОРТС, всегда начинается в 19-00 или 19-05 (при экспирации) и делится на сессии

Вечерняя сессия: Начало 19-00 (19-05) конец 23-50

Утренняя сессия: Начало 10-00 конец 14-00

Дневная сессия:  Начало 14-05 конец 18-45  

input string          TimeStMon    = "10:00:00";               //Время начала утренней сессии
input string          TimeStDay    = "14:05:00";               //Время начала дневной сессии
input string          TimeStEvn    = "19:05:00";               //Время начала вечерней сессии

ulong         time_st_mon;
ulong         time_st_day;
ulong         time_st_evn;

time_st_mon = GetStringTime(TimeStMon);
time_st_day = GetStringTime(TimeStDay);
time_st_evn = GetStringTime(TimeStEvn);

//+------------------------------------------------------------------+
//| Expert Get string time function                                  |
//+------------------------------------------------------------------+
ulong GetStringTime(const string a_string)
{
  int str_size = StringLen(a_string);
  if(str_size == 8)
  {
    int k = StringFind(a_string, ":", 2);
    if(k == 2)
    {
      string s_hour = StringSubstr(a_string, 0, k);
      k = StringFind(a_string, ":", 5);
      if(k == 5)
      {
        string s_min = StringSubstr(a_string, 3, k-3);
        string s_sec = StringSubstr(a_string, 6, str_size - k - 1);
        ulong t_sec = ulong(StringToInteger(s_sec));
        ulong t_min = ulong(StringToInteger(s_min)) * 60;
        ulong t_hour = ulong(StringToInteger(s_hour)) * 3600;
        return(t_hour + t_min + t_sec);
      }
    }
  }
  return(0);
}
//+------------------------------------------------------------------+
//| Expert Check traiding time function                              |
//+------------------------------------------------------------------+
bool CheckTradingTime(MqlDateTime &t_time)
{
  t_time.year = 0;
  TimeTradeServer(t_time);
  if(t_time.year > 0)
  {
// 13 * 3600 + 59 * 60 + 30 = 50370 - 13:59:30
// 14 * 3600                = 50400 - 14:00:00
// 14 * 3600 + 30           = 50430 - 14:00:30
// 14 * 3600 + 60           = 50460 - 14:01:00

// 18 * 3600 + 44 * 60 + 30 = 67470 - 18:44:30
// 18 * 3600 + 45 * 60      = 67500 - 18:45:00
// 18 * 3600 + 45 * 60 + 30 = 67530 - 18:45:30
// 18 * 3600 + 46 * 60      = 67560 - 18:46:00

// 19 * 3600                = 68400 - 19:00:00
// 19 * 3600 + 60           = 68460 - 19:01:00   

// 23 * 3600 + 49 * 60 + 30 = 85770 - 23:49:30
// 23 * 3600 + 50 * 60      = 85800 - 23:50:00
// 23 * 3600 + 50 * 60 + 30 = 85830 - 23:50:30
// 23 * 3600 + 51 * 60      = 85860 - 23:51:00
//---
    ulong trade_time = t_time.hour * 3600 + t_time.min * 60 + t_time.sec;  
    if(((trade_time >= time_st_mon) && (trade_time < 50370)) ||
       ((trade_time >= time_st_day) && (trade_time < 67470)) ||
       ((trade_time >= time_st_evn) && (trade_time < 85770)))
    {
      return(true);
    }
  } else Print(__FUNCTION__, ": Ошибка! Не получено время торгового сервера!"); 
  return(false);
}  
 
https://www.mql5.com/ru/docs/marketinformation/symbolinfosessiontrade
https://www.mql5.com/ru/docs/marketinformation/symbolinfosessionquote
Документация по MQL5: Получение рыночной информации / SymbolInfoSessionTrade
Документация по MQL5: Получение рыночной информации / SymbolInfoSessionTrade
  • www.mql5.com
SymbolInfoSessionTrade - Получение рыночной информации - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Под временем начала дня я имею ввиду не просто 19 00. А время дня вместе с датой. Допустим сейчас 11 :00 вторник, как определить в какие именно 19 00 часов начался торговый день ? Это ведь не обязательно понедельник. Понедельник мог быть и выходным. Начало дня мне нужно для подсчета оставшихся не эффективных транзакций. 
 
pivomoe:
Под временем начала дня я имею ввиду не просто 19 00. А время дня вместе с датой. Допустим сейчас 11 :00 вторник, как определить в какие именно 19 00 часов начался торговый день ? Это ведь не обязательно понедельник. Понедельник мог быть и выходным. Начало дня мне нужно для подсчета оставшихся не эффективных транзакций. 

Вряд ли что-то проще истории баров получится придумать.

 
pivomoe:
Под временем начала дня я имею ввиду не просто 19 00. А время дня вместе с датой. Допустим сейчас 11 :00 вторник, как определить в какие именно 19 00 часов начался торговый день ? Это ведь не обязательно понедельник. Понедельник мог быть и выходным. Начало дня мне нужно для подсчета оставшихся не эффективных транзакций. 

Задача понятна.

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

//+------------------------------------------------------------------+
//| Expert Set transaction count function                            |
//+------------------------------------------------------------------+
void SetTransCount()
{
  double tr_count = 0;
  double ses_cnt = 0;
  uint i = 0;
  do
  {
    i++;
    if(GlobalVariableGet("ses_count", ses_cnt))
    {
      if(GlobalVariableSetOnCondition("ses_count", ses_cnt + 1, ses_cnt))
      {
        i = 100;
      }
    }
  }
  while(i < 100);
//---
  i = 0;  
  do
  {
    i++;
    if(GlobalVariableGet("trans_count", tr_count))
    {
      if(GlobalVariableSetOnCondition("trans_count", tr_count + 1, tr_count))
      {
        i = 100;
      }
    }
  }  
  while(i < 100);
}

В переменной 

"ses_count"

  Хранится счетчик транзакций за сессию (в клиринг обнуляется)

В переменной 

"trans_count"

хранится общий счетчик транзакций (обнуляется после 18-45)

это гораздо эффективнее истории баров

Соответственно функция проверки торгового времени принимает вид:

input ulong   OrdFistSes   = 600;                      //Ордеров за 1 сессию  
//+------------------------------------------------------------------+
//| Expert Check traiding time function                              |
//+------------------------------------------------------------------+
bool CheckTradingTime(MqlDateTime &t_time)
{
  t_time.year = 0;
  TimeTradeServer(t_time);
  if(t_time.year > 0)
  {
    datetime lk_time = TimeCurrent();
// 13 * 3600 + 59 * 60 + 30 = 50370 - 13:59:30
// 14 * 3600                = 50400 - 14:00:00
// 14 * 3600 + 30           = 50430 - 14:00:30
// 14 * 3600 + 60           = 50460 - 14:01:00

// 18 * 3600 + 44 * 60 + 30 = 67470 - 18:44:30
// 18 * 3600 + 45 * 60      = 67500 - 18:45:00
// 18 * 3600 + 45 * 60 + 30 = 67530 - 18:45:30
// 18 * 3600 + 46 * 60      = 67560 - 18:46:00

// 19 * 3600                = 68400 - 19:00:00
// 19 * 3600 + 60           = 68460 - 19:01:00   

// 23 * 3600 + 49 * 60 + 30 = 85770 - 23:49:30
// 23 * 3600 + 50 * 60      = 85800 - 23:50:00
// 23 * 3600 + 50 * 60 + 30 = 85830 - 23:50:30
// 23 * 3600 + 51 * 60      = 85860 - 23:51:00
//---
    ulong trade_time = t_time.hour * 3600 + t_time.min * 60 + t_time.sec;  
    if(((trade_time >= time_st_mon) && (trade_time < 50370)) ||
       ((trade_time >= time_st_day) && (trade_time < 67470)) ||
       ((trade_time >= time_st_evn) && (trade_time < 85770)))
    {
      return(true);
    }
    else
    {
//---
        if(GlobalVariableCheck("ses_count") == true)
        {
          double trc_value = GlobalVariableGet("ses_count");
          if((trade_time >= 50430) && (trade_time <= 50460)) //14:00:30 - 14:01:00
          {
            if(long(trc_value) != 0)
            {
              GlobalVariableSet("ses_count", 0);
              Print(__FUNCTION__, ": Сейчас ", TimeToString(lk_time), ", если есть необходимость, можно закрыть терминал.");
            }
            else
            {
              if(GlobalVariableCheck(Symbol()) == true) GlobalVariableDel(Symbol());
            }
          }
          else
          if((trade_time >= 67530) && (trade_time <= 67560)) //18:45:30 - 18:46:00 
          {
            if(long(trc_value) != 0)
            {    
              GlobalVariableSet("ses_count", 0);
              GlobalVariableSet("trans_count", 0);
              Print(__FUNCTION__, ": Сейчас ", TimeToString(lk_time), ", если есть необходимость, можно закрыть терминал.");
            }
            else
            {
              if(GlobalVariableCheck(Symbol()) == true) GlobalVariableDel(Symbol());
            }
          }
          else
          if((trade_time >= 85830) && (trade_time <= 85860)) //23:50:30 - 23:51:00 
          {
            if(long(trc_value) > 0)
            {
              if(trc_value < double(OrdFistSes))
              {
                GlobalVariableSet("ses_count", trc_value - double(OrdFistSes));
              }
              else
              {
                GlobalVariableSet("ses_count", 0);
              } 
              Print(__FUNCTION__, ": Сейчас ", TimeToString( lk_time ), ", если есть необходимость, можно закрыть терминал."); 
            }
            else
            {
              if(GlobalVariableCheck(Symbol()) == true) GlobalVariableDel(Symbol());
            }
          }
        }
        else Print(__FUNCTION__, ": Ошибка! Глобальная переменная терминала 'ses_count' не найдена!");
    } 
  } else Print(__FUNCTION__, ": Ошибка! Не получено время торгового сервера!"); 
  return(false);
} 
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Глобальные переменные создаются путем размещения их объявлений вне описания какой-либо функции. Глобальные переменные определяются на том же уровне, что и функции, т. е. не локальны ни в каком блоке. Область видимости глобальных переменных - вся программа, глобальные переменные доступны из всех функций, определенных в программе...
 
Roman:
https://www.mql5.com/ru/docs/marketinformation/symbolinfosessiontrade
https://www.mql5.com/ru/docs/marketinformation/symbolinfosessionquote

Сами-то проверяли, то что советуете?

 
prostotrader:

Сами-то проверяли, то что советуете?

))) Главное в документации прочесть.

 
prostotrader:


В переменной 

  Хранится счетчик транзакций за сессию (в клиринг обнуляется)

В переменной 

хранится общий счетчик транзакций (обнуляется после 18-45)

это гораздо эффективнее истории баров

Соответственно функция проверки торгового времени принимает вид:

  Спасибо за код.  Я правда не понял зачем вам количество транзакций за сессию ?

  Вы обнули счетчик транзакций в 19 00. Во время вечерней сессии намолотили много комиссии. С учетом комиссии у вас осталось 10 000 транзакций. Несколько торговых дней вы пропустили. Запускаете советник в 10 00 делаете до 19 00 все оставшиеся 10 000 транзакций и получаете штраф т.к те 10 000 транзакций относились не к тому торговому дню. 

 
Alexey Viktorov:

))) Главное в документации прочесть.

Время окончания сессии  в секундах от 00 часов 00 минут, в полученном значении дату следует игнорировать.
 
pivomoe:
Время окончания сессии  в секундах от 00 часов 00 минут, в полученном значении дату следует игнорировать.

Ну получите вот эти часы


и что будете с этим делать?¿? Как принимать решение торговать или наблюдать?

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