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

 
amrali #:

Спасибо, это действительно быстро!

Функция является умным подмножеством алгоритма StructToTime в mql5, или mktime в C https://github.com/lattera/glibc/blob/master/time/mktime.c.

Отлично отформатировано:

//+------------------------------------------------------------------+
//| Get the datetime of the first day of the iMonth for the iYear.   |
//| GetMonthTime(2016, 5) => D'2016.05.01 00:00:00'                  |
//| https://www.mql5.com/en/forum/393227/page251#comment_53067868    |
//+------------------------------------------------------------------+
datetime GetMonthTime(const int iYear, const int iMonth)
  {
// MqlDateTime dt = {iYear, iMonth, 01}
// return StructToTime(dt);
   static const int dm[] = {0, 0, 31, 59, 90, 120, 151, 181, 212,243, 273, 304, 334};
   int leap_days = (iYear - 1968) / 4 - (iYear % 4 == 0 && iMonth < 3);
   return datetime((iYear - 1970) * 365 + leap_days + dm[iMonth]) * DAY;
  }
 
amrali #:

Функция является умным подмножеством алгоритма StructToTime в mql5

К сожалению, исходный код StructToTime не анализируется компилятором, а подключается в виде имфортируемой функции. Поэтому StructToTime при каждом вызове считает все поля структуры.

MQL5-компилятор умеет не считать неиспользуемые поля, но для этого нужно, чтобы анализировался исходный код.


MQ неоднократно говорили, что включат исходный код штатных функций при компиляции. К сожалению, со StructToTime этого не произошло.

 
amrali #:

mktime в C https://github.com/lattera/glibc/blob/master/time/mktime.c.

Отлично отформатировано:

Легкий для понимания исходник.

// https://github.com/NewYaroslav/xtime_cpp/blob/master/src/xtime.hpp
struct MqlDateTime 
  { 
   int year;           // uint32_t get_year(const timestamp_t timestamp = get_timestamp())
   int mon;            // uint32_t get_month(const timestamp_t timestamp = get_timestamp())
   int day;            // uint32_t get_day_month(const timestamp_t timestamp = get_timestamp())
   int hour;           // uint32_t get_hour_day(const timestamp_t timestamp = get_timestamp())
   int min;            // uint32_t get_minute_hour(const timestamp_t timestamp = get_timestamp())
   int sec;            // uint32_t get_second_minute(const timestamp_t timestamp = get_timestamp())
   int day_of_week;    // uint32_t get_weekday(const timestamp_t timestamp = get_timestamp())
   int day_of_year;    // uint32_t get_day_year(const timestamp_t timestamp = get_timestamp())
  };
GitHub - NewYaroslav/xtime_cpp: Простая C++ библиотека для работы с временем и датой
GitHub - NewYaroslav/xtime_cpp: Простая C++ библиотека для работы с временем и датой
  • NewYaroslav
  • github.com
boost::posix_time, std, boost ::chrono... надо учиться эффективно использовать чужие велосипеды, иначе легко завязнуть в своих... Зачем нужна эта библиотека? Данная библиотека поможет в случаях, когда есть необходимость часто использовать метку времени и искать данные, имеющие взаимосвязь с разными промежутками времени. Например, когда нужно...
 
fxsaber #:

Простой и понятный исходный код.

Хорошие коды, хотя и не самые быстрые.

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

Библиотеки: Местные часовые пояса и часы локальных сессий

amrali, 2024.04.16 18:40

Обновление 16 апреля 2024 года - версия 1.85

Заменен внутренний метод GetNthSunday на более оптимизированный методGetMonthTime .


 

Forum on trading, automated trading systems and testing trading strategies

Libraries: Local Timezones and Local Session Hours

amrali, 2024.04.17 00:27

Update 17 April 2024 - version 1.87

Replaced the TimeYear internal method with the more optimized GetYear method.


//+------------------------------------------------------------------+
//| Returns year as integer of the specified date.                   |
//| https://www.mql5.com/ru/forum/170952/page251#comment_53071746    |
//+------------------------------------------------------------------+
int CTimeZoneInfo::GetYear(const datetime time)
  {
   return((int)((time / DAY * 4 + 2) / 1461) + 1970);
  }
 
fxsaber #:

Начнем с года.

Или она же в целочисленном виде.

int GetYear3( const datetime time )
{
  return((int)((time / DAY * 4 + 2) / (365 * 4 + 1)) + 1970);
}

генеально! Круто получилось. Спасибо!

 
amrali #:

Хорошие коды, хотя и не самые быстрые.

Легко конвертируется на MQL. Например, нахождение года.

#define FIRST_YEAR_UNIX      1970       // Год начала UNIX времени
#define SECONDS_IN_4_YEAR    126230400  // Количество секунд за 4 года
#define SECONDS_IN_YEAR      31536000   // Количество секунд за год
#define SECONDS_IN_LEAP_YEAR 31622400   // Количество секунд за високосный год

// https://github.com/NewYaroslav/xtime_cpp/blob/master/src/xtime.hpp
int GetYear_XTime( const datetime timestamp )
{
  const int year = FIRST_YEAR_UNIX + 4 * (timestamp / SECONDS_IN_4_YEAR); 
  const datetime t = timestamp % SECONDS_IN_4_YEAR;
  if(t < SECONDS_IN_YEAR) return year;
  else if(t < (2*SECONDS_IN_YEAR)) return year + 1;
  else if(t < (2*SECONDS_IN_YEAR + SECONDS_IN_LEAP_YEAR)) return year + 2;
  return year + 3;  
}

Скорость не проверял.

 
fxsaber #:

Легко конвертируется в MQL. Например, поиск года.

Скорость работы не проверял.

быстрее, чем GetYear3(), но не слишком сильно 1,5x

 
fxsaber #:

Я как-то говорил, что хорошая идея год начинать с 1 марта, а не с 1 января. Тогда кривой февраль становится последним месяцем. 
Тогда можно будет применить для нахождения месяца следующую логику:

int m1 = days/30;
if (m1 == days/31) month = m1; // более 80% случаев
else {...} 

где days - количество дней с последнего 1 марта
сам бы сделал, да спать пора. 


 
amrali #:

быстрее, чем GetYear3(), но не слишком сильно 1,5x

Скорее всего, там все функции очень быстрые. Можно взять за основу для написания своей TimeToStruct_Custom. Тогда будет намного быстрее штатной функции.

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