Библиотеки: MathTicker - генератор тиков в математическом режиме - страница 8

 
Aleksei Kuznetsov #:

2) Откзался от считывания свопов из архива.

Склоняюсь в сторону хранения всех свойств символа в JSON-файле, который делает сам MT5.
 
Aleksei Kuznetsov #:

Нужно установить даты на которых надо тестировать и которые записаны в архиве:

У вас с 1970 по 1970

Вроде, уже почти стандарт, что если задан ноль - то вся история.
 
Aleksei Kuznetsov #:

сделал обновление.

Штатное обнуление.
      ArrayResize(this.Ticks,this.TicksPerBlock);
//      this.TicksFill0(this.Ticks,this.TicksPerBlock);//заполнить 0, чтобы не делать это на каждом тике
      ::ZeroMemory(this.Ticks);
 
#ifdef MathTicker_optimize
   input group "MathTicker Optimization best number of files and ticks"
   input int inRepeats=5;
   input int inTicksLen=30000;//optimize best number of ticks per read from file 
#else // #ifdef MathTicker_optimize
   int inTicksPerBlock=30000;//30000 2.04 10000 2.1 
#endif // #ifdef MathTicker_optimize 

Возможно, статический массив ускорит дело.

class MathTicker{
   int hs,hr,TicksPerBlock,_TickItems; int Task,ticks,nextSize,ticksTotal; string path;
public: //Compression_ = 0: no compression, 1: Forex/CFD, 2: Exchange
   double Point_,TickSize_,TickValue_,VolumeStep_,swapShort,swapLong; int Digits_,minFreezeLevel_,minStopLevel_, prev_year,Selected_year,swap3days; string Symbol_,Selected_Instrument; datetime Selected_Start_Date,Selected_End_Date; bool isMath; 
   TickCompressor TickCompr;
   MqlDateTime dateStruct;
   MqlTick Ticks[30000];
   uchar Archive[];
 
fxsaber #:
Штатное обнуление.
fxsaber #:

Возможно, статический массив ускорит дело.

Теоретически быстрее. Обновил.
Ускорение на уровне погрешности.

Старый
2026.02.11 11:35:51.742    pass 8 returned result 514165380.744476 in 0:00:07.788
2026.02.11 11:35:51.742    optimization finished, total passes 11
2026.02.11 11:35:51.752    optimization done in 0 minutes 24 seconds
2026.02.11 11:35:51.752    shortest pass 0:00:07.714, longest pass 0:00:08.174, average pass 0:00:07.930

Новый вариант

2026.02.11 11:39:50.482    pass 10 returned result 514165380.744476 in 0:00:07.749
2026.02.11 11:39:50.482    optimization finished, total passes 11
2026.02.11 11:39:50.492    optimization done in 0 minutes 24 seconds
2026.02.11 11:39:50.492    shortest pass 0:00:07.659, longest pass 0:00:08.392, average pass 0:00:08.033

 
Aleksei Kuznetsov #:

Ускорение на уровне погрешности.

Делается лишний шаг - заполнение массива и пробег по нему.

            tick=TickCompr.DeCompress(this.Archive,Ticks, this.nextSize, 0); //распаковать блок и перезаписать в Ticks
            this.nextSize =ns;
            //this.nextSize=FileReadInteger(this.hr);// считать длину блока в байтах - альтернатива чтению размера в массив +4. Вдвое больше обращений к диску из за 4 байт
            if(this.Task==0){
               for (j = 0; j < (uint)tick; j++){ Strategy(Ticks[j]); } //стратегия  

Архитектурно быстрее будет так.

int Pos = 0;

while (TickCompr.NextTick(this.Archive, Pos, Tick)) // bool TickCompressor::NextTick( const uchar &Archive[], int &Pos, MqlTick &Tick ); // Pos сдвигается внутри.
  Strategy(Tick);


ЗЫ Сам делаю именно так.

        for (uint j = 0; j < Size; j++)
          if (this.TicksShort.Decompress(Ticks[j], this.Tick))
          {
            VIRTUAL::NewTick_NoCheck(this.Tick);

            ::OnTickOriginal_EAToMath();
 
fxsaber #:

Делается лишний шаг - заполнение массива и пробег по нему.

Архитектурно быстрее будет так.


ЗЫ Сам делаю именно так.

Сам пользуюсь блоками сжатыми в ZIP. Их можно только целиком распаковать. Так же тики сжаты до разного числа байт. Можно конечно из тех функций делать вызовы Strategy(Tick);

Но на это надо потратить часы, чтобы понять что-куда, сделать и протестировать во всех режимах. Ради нескольких миллисекунд не готов на такие временные затраты. Мои тесты с МО 12 дней считаются - секунды не дадут ничего.
Инструмент работает - теперь его лучше не трогать.

 
Aleksei Kuznetsov #:

Сам пользуюсь блоками сжатыми в ZIP. Их можно только целиком распаковать.

Логичнее же их один раз ZIP-распаковать в OnTesterInit.
 

Обновил библиотеку. 

!!! Последняя версия файла библиотеки  MathTicker.mqh (44.7 KB) - в корневой папке. Но её нужно сохранить вместо \MQL5\Include\Forester\MathTicker.mqh (это старая версия, которую невозможно перезаписать из за бага сайта).


Теперь встраивание стало проще - нужно меньше кода. Библиотека теперь сама перехватывает вызовы OnTick() и OnTester() запускает нужные функции и затем вызывает OnTick() и OnTester() из эксперта.
Описание и примеры кода - изменены на новую версию.

Добавлено:

  1. Virtual machines count - количество виртуальных машин. Рекомендуется 1, так как от 2  и больше будут работать значительно медленнее, так как на каждом тике будут переключения между машинами для отправки им тика.
  2. ServerName - имя сервера. При сохранении тиков будет автоматически создана папка с именем сервера Common/Files/MathTicker_Archive/--CurrentServerName--/, так как на разных серверах тиковые данные отличаются. В папке MathTicker_Archive/ может быть несколько папок от разных серверов. 
    Перед запуском тестирования нужно вручную указать имя сервера для считывания тиков. Результаты тестов на разных серверах могут значительно отличаться, например из за проскальзываний.
  3. Open report (DLL required) - автоматически откроет в браузере отчет для основного тестера MQ и для всех виртуальных машин. Требуется разрешение dll. Код безопасный - он открытый, можете проверить самостоятельно - там просто открывается броузер с адресом веб-страницы с отчетом для каждой машины.
  4. В файлы с тиками сохраняются дополнительно параметры 
          MathTick.stepvol=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);
          MathTick.minvol=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
          MathTick.maxvol=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX);

    И добавлены функции MathTick.CalcMargin(ORDER_TYPE_BUY,_Symbol,1.0,price,margin) и MathTick.FreeMargin() - это аналоги OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,1.0,price,margin)  и  AccountInfoDouble(ACCOUNT_MARGIN_FREE)
    Всё это может пригодиться для расчета лота в % от свободной маржи.
 
Aleksei Kuznetsov #:

!!! Последняя версия файла библиотеки  MathTicker.mqh (44.7 KB) - в корневой папке.

Не получается скачать эту версию - старая берется.