Скрытый смысл таймфреймов в MQL5

 

Вкратце поискал похожую тему, не нашел
Понадобилось вычислить множитель при переходе от одного ТФ к другому. Распечатал значения, еще раз удивился, под какой травой задавались эти константы? Или, может быть, я своим слабым умишком не догоняю скрытый смысл? А он есть?

void OnStart()
{
    Print(PERIOD_CURRENT,"  ",PERIOD_M1,"  ",PERIOD_M2,"  ",PERIOD_M3,"  ",PERIOD_M4,"  ",PERIOD_M5,"  ",PERIOD_M6,"  ",PERIOD_M10,"  ",PERIOD_M12,"  ",PERIOD_M15,"  ",PERIOD_M20,"  ",PERIOD_M30,
        IntegerToString(PERIOD_H1),"  ",IntegerToString(PERIOD_H2),"  ",PERIOD_H3,"  ",PERIOD_H4,"  ",PERIOD_H6,"  ",PERIOD_H8,"  ",PERIOD_H12,"  ",PERIOD_D1,"  ",PERIOD_W1,"  ",PERIOD_MN1);
}  

2017.02.26 23:45:48.984 EnumTF (EURUSD,M15) 0  1  2  3  4  5  6  10  12  15  20  3016385  16386  16387  16388  16390  16392  16396  16408  32769  49153

Надо писать длинный case с реальными значениями в минутах... 

 
Alexey Volchanskiy:

Вкратце поискал похожую тему, не нашел
Понадобилось вычислить множитель при переходе от одного ТФ к другому. Распечатал значения, еще раз удивился, под какой травой задавались эти константы? Или, может быть, я своим слабым умишком не догоняю скрытый смысл? А он есть?

void OnStart()
{
    Print(PERIOD_CURRENT,"  ",PERIOD_M1,"  ",PERIOD_M2,"  ",PERIOD_M3,"  ",PERIOD_M4,"  ",PERIOD_M5,"  ",PERIOD_M6,"  ",PERIOD_M10,"  ",PERIOD_M12,"  ",PERIOD_M15,"  ",PERIOD_M20,"  ",PERIOD_M30,
        IntegerToString(PERIOD_H1),"  ",IntegerToString(PERIOD_H2),"  ",PERIOD_H3,"  ",PERIOD_H4,"  ",PERIOD_H6,"  ",PERIOD_H8,"  ",PERIOD_H12,"  ",PERIOD_D1,"  ",PERIOD_W1,"  ",PERIOD_MN1);
}  

2017.02.26 23:45:48.984 EnumTF (EURUSD,M15) 0  1  2  3  4  5  6  10  12  15  20  3016385  16386  16387  16388  16390  16392  16396  16408  32769  49153

Надо писать длинный case с реальными значениями в минутах... 

Кстати, в MQL4 тот же скрипт выдает другие значения, опять, в чем смысл??? 

2017.02.26 23:33:13.330 EnumTF EURUSD.e,M15: 0  1  2  3  4  5  6  10  12  15  20  3060  120  180  240  360  480  720  1440  10080  43200

 
Alexey Volchanskiy:

Вкратце поискал похожую тему, не нашел
Понадобилось вычислить множитель при переходе от одного ТФ к другому. Распечатал значения, еще раз удивился, под какой травой задавались эти константы? Или, может быть, я своим слабым умишком не догоняю скрытый смысл? А он есть?

void OnStart()
{
    Print(PERIOD_CURRENT,"  ",PERIOD_M1,"  ",PERIOD_M2,"  ",PERIOD_M3,"  ",PERIOD_M4,"  ",PERIOD_M5,"  ",PERIOD_M6,"  ",PERIOD_M10,"  ",PERIOD_M12,"  ",PERIOD_M15,"  ",PERIOD_M20,"  ",PERIOD_M30,
        IntegerToString(PERIOD_H1),"  ",IntegerToString(PERIOD_H2),"  ",PERIOD_H3,"  ",PERIOD_H4,"  ",PERIOD_H6,"  ",PERIOD_H8,"  ",PERIOD_H12,"  ",PERIOD_D1,"  ",PERIOD_W1,"  ",PERIOD_MN1);
}  

2017.02.26 23:45:48.984 EnumTF (EURUSD,M15) 0  1  2  3  4  5  6  10  12  15  20  3016385  16386  16387  16388  16390  16392  16396  16408  32769  49153

Надо писать длинный case с реальными значениями в минутах... 

Очевидно же, что для H1...D1 считается как 0x4000 + количество часов. Неделя и месяц - нужно смотреть...
 
Serhii Shevchuk:
Очевидно же, что для H1...D1 считается как 0x4000 + количество часов. Неделя и месяц - нужно смотреть...
Недели: 0x8000 + кол-во недель.

Месяцы: 0xC000 + кол-во месяцев.

Итого, вместо длинного case можно обойтись четырьмя if-ами.
 

Serhii Shevchuk: 

Очевидно же, что для H1...D1 считается как 0x4000 + количество часов. Неделя и месяц - нужно смотреть...

Во первых, вы неправильно посчитали

1. PERIOD_H1 == 16386; // 0x4000 + 2 == 16384 + 2

2. Между PERIOD_H3 и PERIOD_H4 разрыв 2

ну и так далее, например  почему-то равен PERIOD_M30 == 3016385  


Очевидным было бы оставить значения в минутах, а на прибавлять непонятную зашифровку без каких-либо четких правил

 
Alexey Volchanskiy:

Во первых, вы неправильно посчитали

1. PERIOD_H1 == 16386; // 0x4000 + 2 == 16384 + 2

2. Между PERIOD_H3 и PERIOD_H4 разрыв 2

ну и так далее, например  почему-то равен PERIOD_M30 == 3016385  


Очевидным было бы оставить значения в минутах, а на прибавлять непонятную зашифровку без каких-либо четких правил

PERIOD_M30 = 30, PERIOD_H1 = 16385

Внимательнее, пожалуйста. И тогда всё становится на свои места. Ни разрывов, ни загадок.
 

можно использовать

PeriodSeconds()/60;


 

 
Это сделано для внутренней оптимизации.
 
Taras Slobodyanik:

можно использовать

PeriodSeconds()/60;


 Спасибо, что напомнили, а то уже сгоряча case собрался писать ))

 
Taras Slobodyanik:

можно использовать

PeriodSeconds()/60;


 

Да, но это медленно работает. Для сравнения набросал небольшой скрипт:

#property script_show_inputs

input long              InpCycles=1000000000;

ENUM_TIMEFRAMES TF_list[32]={
PERIOD_MN1, PERIOD_W1,  PERIOD_D1,  PERIOD_H12,
PERIOD_H8,  PERIOD_H6,  PERIOD_H4,  PERIOD_H3,  
PERIOD_H2,  PERIOD_H1,  PERIOD_M30, PERIOD_M20,
PERIOD_M15, PERIOD_M12, PERIOD_M10, PERIOD_M6,  
PERIOD_M5,  PERIOD_M4,  PERIOD_M3,  PERIOD_M2,  
PERIOD_M1,  PERIOD_MN1, PERIOD_W1,  PERIOD_D1,
PERIOD_M5,  PERIOD_M4,  PERIOD_M3,  PERIOD_M2,
PERIOD_H2,  PERIOD_H1,  PERIOD_M30, PERIOD_M20
};

int PeriodMinutes(ENUM_TIMEFRAMES tf)
{
      uint t = uint(tf);
      uint f = 0xc000&t;
      uint min = 0x00FF&t;
      if(f==0x4000) min*= 60;
      else if(f==0x8000) min*= 10080;
      else if(f==0xc000)  min*= 43200;
      return(int(min));  
}

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   ulong tmp = 0;
   //
   uint idx = 0;
   ulong t0 = GetMicrosecondCount();
   for(long i=0;i<InpCycles;i++)
      tmp+= PeriodMinutes(TF_list[0x1f&(idx++)]);  
   ulong t1 = GetMicrosecondCount();
   Print("1) tmp = ",tmp,"... dT = ",t1-t0);
//---
   tmp = 0;
   idx = 0;
   t0 = GetMicrosecondCount();
   for(long i=0;i<InpCycles;i++)
      tmp+= PeriodSeconds(TF_list[0x1f&(idx++)])/60;
   t1 = GetMicrosecondCount();
   Print("2) tmp = ",tmp,"... dT = ",t1-t0);
//---
  }    
//+------------------------------------------------------------------+
Как видно, примерно вдвое медленнее, чем на if-ах:

 
Alexey Volchanskiy:

Кстати, в MQL4 тот же скрипт выдает другие значения, опять, в чем смысл??? 

2017.02.26 23:33:13.330 EnumTF EURUSD.e,M15: 0  1  2  3  4  5  6  10  12  15  20 3060  30 60  120  180  240  360  480  720  1440  10080  43200

В МТ4 как раз всё логично - напрямую количество минут в периоде всегда выдаёт, по крайней мере, для стандартных периодов. У вас там, кстати, кое-где пробелы  потеряны в скрипте.