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

 
Andrei Iakovlev #:

Для полноты GetWeekOfYear никто не хочет добавить?

Зачем?
Нет такой необходимости. Тем более как считать, если 1 января это среда или воскресенье. Если просто по количеству дней, то просто поделите дни в году на 7
 
amrali #:

Более быстрая функция TimeToStruct() для декодирования переменных времени суток, чтобы получить все компоненты даты и времени.

Странный код. Вы сравнивали производительность с этим решением?

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

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

fxsaber, 2024.04.16 14:08

Написал кастомный TimeToSruct, по скорости не превосходит оригинал.
void TimeToStruct2100( 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.year = Year + 1970;
  dt_struct.mon = (dt_struct.day_of_year < 59) ? (dt_struct.day_of_year + Flag) / 31 + 1
                                               : ((dt_struct.day_of_year >= 90) ? (dt_struct.day_of_year * 500 + 1532 * 11) /
                                                                                  (1532 * 10)
                                                                                : 3);

  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;  
}
Перемудрил где-то.
 

Как производить вычисления в #define, чтобы этот #define потом использовать в качестве константы?

char A = 10, m = 0;

#define С(void) {int B = A - 1; \
for(;;B--){ \
if(B == 4){B++; break;} if(++m == 5) break;} return B;}

int D = 20 - C();

куча ошибок

 
fxsaber #:

Это странный код. Вы сравнивали производительность с этим решением?

 
amrali #:
1 - 40.36 ns, контрольная сумма = 22407500695  // TimeToStruct
2 - 20.07 ns, контрольная сумма = 22407500695  // amrali
3 - 10.73 ns, контрольная сумма = 22407500695  // fxsaber
1 - 41.04 ns, контрольная сумма = 22407076366  // TimeToStruct
2 - 21.42 ns, контрольная сумма = 22407076366  // amrali
3 - 11.25 ns, контрольная сумма = 22407076366  // fxsaber
1 - 40.07 ns, контрольная сумма = 22407602371  // TimeToStruct
2 - 19.98 ns, контрольная сумма = 22407602371  // amrali
3 - 10.59 ns, контрольная сумма = 22407602371  // fxsaber
 
fxsaber #:
2024.04.21 19:37:17.237 benchmark_TimeToStruct2100 (EURUSD,H1)  Randomized benchmark:
2024.04.21 19:37:17.326 benchmark_TimeToStruct2100 (EURUSD,H1)  TimeToStruct() -> 84519 usec
2024.04.21 19:37:17.367 benchmark_TimeToStruct2100 (EURUSD,H1)  TimeToStructFast() -> 125200 usec
2024.04.21 19:37:17.393 benchmark_TimeToStruct2100 (EURUSD,H1)  TimeToStruct2100() -> 151022 usec
2024.04.21 19:37:17.393 benchmark_TimeToStruct2100 (EURUSD,H1)  sum1: 10540181026
2024.04.21 19:37:17.393 benchmark_TimeToStruct2100 (EURUSD,H1)  sum2: 10540181026
2024.04.21 19:37:17.393 benchmark_TimeToStruct2100 (EURUSD,H1)  sum3: 10540181026

TimeToStruct() действительно хороша, как я уже говорил.

Основной целью было исследовать новые идеи (без использования таблиц поиска) для декодирования временных меток.

Файлы:
 
fxsaber #:
2024.04.21 19:46:42.686 benchmark_TimeToStruct2100 (EURUSD,H1)  Randomized benchmark:
2024.04.21 19:46:42.776 benchmark_TimeToStruct2100 (EURUSD,H1)  TimeToStruct() -> 84531 usec
2024.04.21 19:46:42.817 benchmark_TimeToStruct2100 (EURUSD,H1)  TimeToStructFast() -> 41000 usec
2024.04.21 19:46:42.843 benchmark_TimeToStruct2100 (EURUSD,H1)  TimeToStruct2100() -> 25932 usec
2024.04.21 19:46:42.843 benchmark_TimeToStruct2100 (EURUSD,H1)  sum1: 10540393813
2024.04.21 19:46:42.843 benchmark_TimeToStruct2100 (EURUSD,H1)  sum2: 10540393813
2024.04.21 19:46:42.843 benchmark_TimeToStruct2100 (EURUSD,H1)  sum3: 10540393813

Хорошо, что у нас есть несколько вариантов декодирования временных меток.

Файлы:
 
Andrei Iakovlev #:

Как производить вычисления в #define, чтобы этот #define потом использовать в качестве константы?

куча ошибок

Задача состоит в том, чтобы сначала произвести вычисления (которые сейчас находятся внутри #define), и только после вычислений записать константе значение через #define. Это возможно осуществить?

 
amrali #:

Хорошо, что у нас есть несколько вариантов декодирования временных меток.

Где мы можем найти <mql5_lib\base.mqh>?
 
Alain Verleyen #:
Где мы можем найти <mql5_lib\base.mqh>?
Используйте библиотеку xoroshiro в кодовой базе, это моя личная библиотека.
Причина обращения: