Особенности языка mql5, тонкости и приёмы работы - страница 261

 
fxsaber #:
Для сравнения скоростей предложенных методов (штатный неинтересен) имеет смысл делать только такую контрольную сумму.
DayOfYear - не представляю, для чего нужно. Внутрисуточное время (и день недели) - элементарно всегда. А вот первые три слагаемые - основная сложность, поэтому их реализации и стоит сравнивать. Как и обратный функционал.

Тогда уж достаточно 

uint mm =dt.day;

все равно для расчета дня нужен месяц и год

2024.05.02 23:28:38.923 TestDate3 (EURUSD,M20)  1 - 22.48 ns, контрольная сумма = 1572958884  // TimeToStruct
2024.05.02 23:28:39.497 TestDate3 (EURUSD,M20)  2 - 5.75 ns, контрольная сумма = 1572958884  // amrali
2024.05.02 23:28:39.874 TestDate3 (EURUSD,M20)  3 - 3.76 ns, контрольная сумма = 1572958884  // TimeToStruct2100
2024.05.02 23:28:40.354 TestDate3 (EURUSD,M20)  4 - 4.81 ns, контрольная сумма = 1572958884  // TimeToStruct2100 fxsaber
2024.05.02 23:28:45.598 TestDate3 (EURUSD,M20)  1 - 22.50 ns, контрольная сумма = 1573013128  // TimeToStruct
2024.05.02 23:28:46.168 TestDate3 (EURUSD,M20)  2 - 5.70 ns, контрольная сумма = 1573013128  // amrali
2024.05.02 23:28:46.554 TestDate3 (EURUSD,M20)  3 - 3.86 ns, контрольная сумма = 1573013128  // TimeToStruct2100
2024.05.02 23:28:47.065 TestDate3 (EURUSD,M20)  4 - 5.11 ns, контрольная сумма = 1573013128  // TimeToStruct2100 fxsaber
 
fxsaber #:
Для сравнения скоростей предложенных методов (штатный неинтересен) имеет смысл делать только такую контрольную сумму. DayOfYear - не представляю, для чего нужно. Внутрисуточное время (и день недели) - элементарно всегда. А вот первые три слагаемые - основная сложность, поэтому их реализации и стоит сравнивать. Как и обратный функционал.

День программиста отмечать

 
Nikolai Semko #:

Тогда уж достаточно 

все равно для расчета дня нужен месяц и год

Занесите единицу в массив.

last_result_d   = last_result_yd-dm[last_result_m]+1 -((last_result_yd>59)?isleap:0);
 
fxsaber #:

Занесите единицу в массив.

Ах, ну да. Спасибо
 

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

Особенности языка mql5, тонкости и приёмы работы

fxsaber, 2024.04.16 12:46

День месяца.

Наконец, пробуем применить полученные результаты. Не забывая про високосные особенности.

#define DAY (24 * 3600)

// Работает до конца XXI-века.
int GetDayMonth2100( const datetime time )
{
  int time2 = (int)(time / DAY);
  const int Year = ((time2 << 2) + 2) / (365 * 4 + 1); // to 2100

  const bool Flag = ((Year & 3) == 2);
  time2 -= Year * 365 + ((Year + 2) >> 2);    
  
  const int Month = (time2 < 59) ? (time2 + Flag) / 31 + 1
                                 : ((time2 >= 90) ? (time2 * 500 + 1532 * 11) / (1532 * 10) : 3);
                                                  
  // Количество дней от начала года до начала месяца: январь - 0, февраль - 31, март - 59, ...
  static const int Months[] = {0, 0-1, 31-1, 59-1, 90-1, 120-1, 151-1, 181-1, 212-1 ,243-1, 273-1, 304-1, 334-1};
  
  return(time2 - Months[Month] + (Flag && (Month < 3)));
}

Похоже, это быстрее.

#define DAY (24 * 3600)

// Работает до конца XXI-века.
int GetDayMonth2100_2( const datetime time )
{
  int time2 = (int)(time / DAY);
  const int Year = ((time2 << 2) + 2) / (365 * 4 + 1); // to 2100

  const bool Flag = ((Year & 3) == 2);
  
  time2 -= Year * 365 + ((Year + 2) >> 2);    
//  time2 -= ((Year * 1461 + 1) >> 2) + Flag;    
  
  const int Month = (time2 + Flag) < 31 ? 1 : (time2 * 5 + 166) / 153;
                                                  
  // Количество дней от начала года до начала месяца: январь - 0, февраль - 31, март - 59, ...
  static const int Months[] = {0, 0-1, 31-1, 59-1, 90-1, 120-1, 151-1, 181-1, 212-1 ,243-1, 273-1, 304-1, 334-1};
  
  const int Res = time2 - Months[Month] + (Flag && (Month < 3));
  
  return(Res);
}
 
В копилку.
void TimeToStruct2100_fxsaber( const datetime dt, MqlDateTime &dt_struct )
{
  const uint time = (uint)dt;
  
  dt_struct.sec = (int)(time % 60);
  dt_struct.min = (int)(time / 60) % 60;
  dt_struct.hour = (int)(time / 3600) % 24;
  
  dt_struct.day_of_year = (int)(time / (24 * 3600));
  dt_struct.day_of_week = (dt_struct.day_of_year + THURSDAY) % 7;
  
  const int Year = ((dt_struct.day_of_year << 2) + 2) / (365 * 4 + 1); // to 2100
  const bool Flag = ((Year & 3) == 2);
  
  dt_struct.day_of_year -= Year * 365 + ((Year + 2) >> 2);
//  dt_struct.day_of_year -= ((Year * 1461 + 1) >> 2) + Flag;
  
  dt_struct.year = Year + 1970;
  
  dt_struct.mon = (dt_struct.day_of_year + Flag) < 31 ? 1 : (dt_struct.day_of_year * 5 + 166) / 153;
  
  static const int Months[] = {0, 0-1, 31-1, 59-1, 90-1, 120-1, 151-1, 181-1, 212-1,243-1, 273-1, 304-1, 334-1};
  
  dt_struct.day = dt_struct.day_of_year - Months[dt_struct.mon] + (Flag && (dt_struct.mon < 3));
  
  dt_struct.day_of_year += Flag;
  
  return;
}

Выделил изменение. На старом CPU быстрее.

 
fxsaber #:
В копилку.

Выделил изменение. На старом CPU быстрее.

+
Но сохранение дня через статику все же необходимо. В реальном( а не в рандомном, как в тесте) применении выигрыш производительности будет выше в разы.
 
Nikolai Semko #:
Но сохранение дня через статику все же необходимо. В реальном( а не в рандомном, как в тесте) применении выигрыш производительности будет выше в разы.

Кеширование к самому алгоритму не имеет отношения. В реальности TimeToStruct редко используется, т.к. практикуется NextTime-подход в советниках.

Обычно кешируют для интерактивных продуктов - определение данных времени под курсором мыши. Т.е. ниша не для штатного MQ-Тестера, а для GUI, где скорость TimeToStruct - дело двадцатое.

Библиотеки: Control_Trade_Sessions
Библиотеки: Control_Trade_Sessions
  • 2024.01.31
  • Automated-Trading
  • www.mql5.com
Статьи и техническая библиотека по автоматическому трейдингу: Библиотеки: Control_Trade_Sessions
 
fxsaber # :

Caching has nothing to do with the algorithm itself. In reality, TimeToStruct is rarely used, because The NextTime approach is practiced  in advisors.

Typically cached for interactive products - determining time data under the mouse cursor. Those. The niche is not for a regular MQ Tester, but for a GUI, where the speed of TimeToStruct is second nature.

Your Custom function is faster than TimeToStruct() 3-4x times, the usefulness is in extraction of separate calendar components (year, month, etc...)
 
Это также встречается в MT4, это зависит от конкретного сервера
Причина обращения: