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

 

Не совсем по теме, но решил все же здесь написать.


В Журналах терминала работает поиск строки терминала по ее первым буквам, просто набирая (рагистрозависимо) их на клавиатуре.

В Журналах это не так удобно, как в Обзоре рынка и Навигаторе (постоянно использую во вкладке Избранное, чтобы найти нужный EX5).

 

Небольшое интересное наблюдение о ENUM_TIMEFRAMES:

// fast calculation
string TimeframeToString(ENUM_TIMEFRAMES tf)
  {
   static const string ids[] = {
    "PERIOD_M", "PERIOD_H", "PERIOD_W", "PERIOD_MN"};
   return ids[tf / 16384] + IntegerToString(tf % 16384);
  }

void OnStart()
  {
   Print( TimeframeToString(PERIOD_M1 ) );
   Print( TimeframeToString(PERIOD_M2 ) );
   Print( TimeframeToString(PERIOD_M3 ) );
   Print( TimeframeToString(PERIOD_M4 ) );
   Print( TimeframeToString(PERIOD_M5 ) );
   Print( TimeframeToString(PERIOD_M6 ) );
   Print( TimeframeToString(PERIOD_M10) );
   Print( TimeframeToString(PERIOD_M12) );
   Print( TimeframeToString(PERIOD_M15) );
   Print( TimeframeToString(PERIOD_M20) );
   Print( TimeframeToString(PERIOD_M30) );
   Print( TimeframeToString(PERIOD_H1 ) );
   Print( TimeframeToString(PERIOD_H2 ) );
   Print( TimeframeToString(PERIOD_H3 ) );
   Print( TimeframeToString(PERIOD_H4 ) );
   Print( TimeframeToString(PERIOD_H6 ) );
   Print( TimeframeToString(PERIOD_H8 ) );
   Print( TimeframeToString(PERIOD_H12) );
   Print( TimeframeToString(PERIOD_D1 ) );
   Print( TimeframeToString(PERIOD_W1 ) );
   Print( TimeframeToString(PERIOD_MN1) );
 }
 
amrali #:

Небольшое интересное наблюдение о ENUM_TIMEFRAMES:

return ids[tf >> 14] + IntegerToString(tf & 0x3FFF);
 
fxsaber #:
Компилятор оптимизирует div, modulo to shift, AND, если мы приведем к (uint)tf. Первая версия читабельна. Проверьте ее в Compiler Explorer.
 

Поскольку ветка часто затрагивает способы ускорения кода, то публикую здесь ссылку на универсальный механизм, позволяющий избавиться от дорогого OrdersTotal-цикла.

Имеется стороннее подтверждение увеличение производительности на советнике с большим количеством открытых позиций/ордеров (мартин/гридер).

Данный незамысловатый механизм позволяет писать самые производительные ТС подобного типа.

 
fxsaber #:

Имеется стороннее подтверждение увеличение производительности на советнике с большим количеством открытых позиций/ордеров (мартин/гридер).

Данный незамысловатый механизм позволяет писать самые производительные ТС подобного типа.

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

Библиотеки: Virtual

fxsaber, 2025.03.05 09:22

Как следствие, для ускорения в MT5-Тестере в реальном окружении мартинов/гридеров требуется использовать OnTrade-функцию.

Никогда не использовал эту функцию в Тестере.

Есть еще примеры ускорения работы советника в MT5-Тестере с ипользованием OnTrade?

 

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

template <typename T>
bool IsSign() { return((T)(-1) < 0); }

void OnStart()
{
  Print(IsSign<datetime>()); // true
}

Это удобно.

Учебник по MQL5: Общеупотребительные функции / Преобразование данных встроенных типов / Дата и время
Учебник по MQL5: Общеупотребительные функции / Преобразование данных встроенных типов / Дата и время
  • www.mql5.com
Значения типа datetime , предназначенные для хранения даты и/или времени , как правило, подвергаются нескольким видам конвертации: в строки и...
 
fxsaber #:

datetime-type является signtype- он корректно работает с отрицательными значениями.

Это удобно.

Да, вы можете присваивать отрицательные значения datetime. В других языках программирования это обозначает даты до 1.1.1970, но в MQL отрицательное значение datetime - это INVALID.

Print(datetime(-1));

 
amrali #:
Да, вы можете присваивать отрицательные значения datetime. В других языках программирования это обозначает даты до 1.1.1970, но в MQL отрицательное значение datetime является INVALID.

Print(datetime(-1));

См. этот пост: https://www.mql5.com/en/forum/479009#comment_55521044
 
amrali #:
Да, вы можете присваивать отрицательные значения datetime. В других языках программирования это обозначает даты до 1.1.1970, но в MQL отрицательное значение datetime - это INVALID.

Так это просто результат TimeToString и TimeToStruct. Хорошо, что datetime являет signed long-числом, что позволяет представлять время намного ДО рождения Вселенной.

Мне нужны были полноценные арифметические операции с datetime и операторы сравнения. Поэтому пришлось проверять signed/unsigned.