Библиотеки: TesterCache - страница 8

 

Использую Вашу библиотеку в своём optimization helper. Эта либа и MultiTester вместе являются основой для него. К сожалению, вчера столкнулся с тем, что для кеша, созданного Gen 96bit она не работает.

cache[idx].ToString() выдаёт мусор.

2020.05.01 08:59:25.444 TesterCache_Example (EURUSD.m,M1)       version = 515
2020.05.01 08:59:25.444 TesterCache_Example (EURUSD.m,M1)       copyright = Copyright 2000-2020, MetaQuotes Software Corp.
2020.05.01 08:59:25.444 TesterCache_Example (EURUSD.m,M1)       name = TesterOptCache
2020.05.01 08:59:25.444 TesterCache_Example (EURUSD.m,M1)       header_size = 12975
2020.05.01 08:59:25.444 TesterCache_Example (EURUSD.m,M1)       record_size = 376
2020.05.01 08:59:25.444 TesterCache_Example (EURUSD.m,M1)       expert_name = RevertTest
2020.05.01 08:59:25.444 TesterCache_Example (EURUSD.m,M1)       expert_path = Experts\My\Revert\RevertTest.ex5
2020.05.01 08:59:25.444 TesterCache_Example (EURUSD.m,M1)       server = RoboForex-MetaTrader 5
2020.05.01 08:59:25.444 TesterCache_Example (EURUSD.m,M1)       symbol = EURUSD.m
2020.05.01 08:59:25.444 TesterCache_Example (EURUSD.m,M1)       (ENUM_TIMEFRAMES)period = PERIOD_M1
2020.05.01 08:59:25.444 TesterCache_Example (EURUSD.m,M1)       date_from = 2016.01.25 00:00:00
2020.05.01 08:59:25.444 TesterCache_Example (EURUSD.m,M1)       date_to = 2016.02.24 00:00:00
2020.05.01 08:59:25.444 TesterCache_Example (EURUSD.m,M1)       date_forward = 1970.01.01 00:00:00
2020.05.01 08:59:25.444 TesterCache_Example (EURUSD.m,M1)       opt_mode = 1
2020.05.01 08:59:25.444 TesterCache_Example (EURUSD.m,M1)       ticks_mode = 1
2020.05.01 08:59:25.444 TesterCache_Example (EURUSD.m,M1)       last_criterion = 6
2020.05.01 08:59:25.444 TesterCache_Example (EURUSD.m,M1)       msc_min = 50
2020.05.01 08:59:25.444 TesterCache_Example (EURUSD.m,M1)       msc_max = 1731
2020.05.01 08:59:25.444 TesterCache_Example (EURUSD.m,M1)       msc_avg = 134
2020.05.01 08:59:25.444 TesterCache_Example (EURUSD.m,M1)       group = real (hedging)
2020.05.01 08:59:25.444 TesterCache_Example (EURUSD.m,M1)       trade_currency = USD
2020.05.01 08:59:25.444 TesterCache_Example (EURUSD.m,M1)       trade_deposit = 300000
2020.05.01 08:59:25.444 TesterCache_Example (EURUSD.m,M1)       trade_condition = 0
2020.05.01 08:59:25.444 TesterCache_Example (EURUSD.m,M1)       trade_leverage = 1000
2020.05.01 08:59:25.444 TesterCache_Example (EURUSD.m,M1)       trade_hedging = 2
2020.05.01 08:59:25.444 TesterCache_Example (EURUSD.m,M1)       trade_currency_digits = 2
2020.05.01 08:59:25.444 TesterCache_Example (EURUSD.m,M1)       trade_pips = 0
2020.05.01 08:59:25.444 TesterCache_Example (EURUSD.m,M1)       parameters_size = 445
2020.05.01 08:59:25.444 TesterCache_Example (EURUSD.m,M1)       parameters_total = 63
2020.05.01 08:59:25.444 TesterCache_Example (EURUSD.m,M1)       opt_params_size = 88
2020.05.01 08:59:25.444 TesterCache_Example (EURUSD.m,M1)       opt_params_total = 11
2020.05.01 08:59:25.444 TesterCache_Example (EURUSD.m,M1)       dwords_cnt = 2
2020.05.01 08:59:25.444 TesterCache_Example (EURUSD.m,M1)       snapshot_size = 0
2020.05.01 08:59:25.444 TesterCache_Example (EURUSD.m,M1)       passes_total = 0
2020.05.01 08:59:25.444 TesterCache_Example (EURUSD.m,M1)       passes_passed = 10542
2020.05.01 08:59:25.444 TesterCache_Example (EURUSD.m,M1)       
2020.05.01 08:59:39.156 TesterCache_Example (EURUSD.m,M1)       Pass = -9026495928064020348
2020.05.01 08:59:39.156 TesterCache_Example (EURUSD.m,M1)       initial_deposit = 5.027117946434684e-320
2020.05.01 08:59:39.156 TesterCache_Example (EURUSD.m,M1)       withdrawal = 300000.0
2020.05.01 08:59:39.156 TesterCache_Example (EURUSD.m,M1)       profit = 0.0
2020.05.01 08:59:39.156 TesterCache_Example (EURUSD.m,M1)       grossprofit = 0.0
2020.05.01 08:59:39.156 TesterCache_Example (EURUSD.m,M1)       grossloss = 0.0
2020.05.01 08:59:39.156 TesterCache_Example (EURUSD.m,M1)       maxprofit = 0.0
2020.05.01 08:59:39.156 TesterCache_Example (EURUSD.m,M1)       minprofit = 0.0
2020.05.01 08:59:39.156 TesterCache_Example (EURUSD.m,M1)       conprofitmax = 0.0
2020.05.01 08:59:39.156 TesterCache_Example (EURUSD.m,M1)       maxconprofit = 0.0
2020.05.01 08:59:39.156 TesterCache_Example (EURUSD.m,M1)       conlossmax = 0.0
2020.05.01 08:59:39.156 TesterCache_Example (EURUSD.m,M1)       maxconloss = 0.0
2020.05.01 08:59:39.156 TesterCache_Example (EURUSD.m,M1)       balance_min = 0.0
2020.05.01 08:59:39.156 TesterCache_Example (EURUSD.m,M1)       maxdrawdown = 300000.0
2020.05.01 08:59:39.156 TesterCache_Example (EURUSD.m,M1)       drawdownpercent = 0.0
2020.05.01 08:59:39.156 TesterCache_Example (EURUSD.m,M1)       reldrawdown = 0.0
2020.05.01 08:59:39.156 TesterCache_Example (EURUSD.m,M1)       reldrawdownpercent = 0.0
2020.05.01 08:59:39.156 TesterCache_Example (EURUSD.m,M1)       equity_min = 0.0
2020.05.01 08:59:39.156 TesterCache_Example (EURUSD.m,M1)       maxdrawdown_e = 300000.0
2020.05.01 08:59:39.156 TesterCache_Example (EURUSD.m,M1)       drawdownpercent_e = 0.0
2020.05.01 08:59:39.156 TesterCache_Example (EURUSD.m,M1)       reldrawdown_e = 0.0
2020.05.01 08:59:39.156 TesterCache_Example (EURUSD.m,M1)       reldrawdownpercnt_e = 0.0
2020.05.01 08:59:39.156 TesterCache_Example (EURUSD.m,M1)       expected_payoff = 0.0
2020.05.01 08:59:39.156 TesterCache_Example (EURUSD.m,M1)       profit_factor = 0.0
2020.05.01 08:59:39.156 TesterCache_Example (EURUSD.m,M1)       recovery_factor = 1.797693134862316e+308
2020.05.01 08:59:39.156 TesterCache_Example (EURUSD.m,M1)       sharpe_ratio = 0.0
2020.05.01 08:59:39.156 TesterCache_Example (EURUSD.m,M1)       margin_level = 0.0
2020.05.01 08:59:39.156 TesterCache_Example (EURUSD.m,M1)       custom_fitness = 1.797693134862316e+308
2020.05.01 08:59:39.156 TesterCache_Example (EURUSD.m,M1)       deals = 0
2020.05.01 08:59:39.156 TesterCache_Example (EURUSD.m,M1)       trades = 0
2020.05.01 08:59:39.156 TesterCache_Example (EURUSD.m,M1)       profittrades = 0
2020.05.01 08:59:39.156 TesterCache_Example (EURUSD.m,M1)       losstrades = 0
2020.05.01 08:59:39.156 TesterCache_Example (EURUSD.m,M1)       shorttrades = 0
2020.05.01 08:59:39.156 TesterCache_Example (EURUSD.m,M1)       longtrades = 0
2020.05.01 08:59:39.156 TesterCache_Example (EURUSD.m,M1)       winshorttrades = 0
2020.05.01 08:59:39.156 TesterCache_Example (EURUSD.m,M1)       winlongtrades = 0
2020.05.01 08:59:39.156 TesterCache_Example (EURUSD.m,M1)       conprofitmax_trades = 0
2020.05.01 08:59:39.156 TesterCache_Example (EURUSD.m,M1)       maxconprofit_trades = 0
2020.05.01 08:59:39.156 TesterCache_Example (EURUSD.m,M1)       conlossmax_trades = 0
2020.05.01 08:59:39.156 TesterCache_Example (EURUSD.m,M1)       maxconloss_trades = 0
2020.05.01 08:59:39.156 TesterCache_Example (EURUSD.m,M1)       avgconwinners = 0
2020.05.01 08:59:39.156 TesterCache_Example (EURUSD.m,M1)       avgconloosers = 0

Для Gen 64bit:

2020.05.01 09:28:27.568 TesterCache_Example (EURUSD.m,M1)       version = 515
2020.05.01 09:28:27.570 TesterCache_Example (EURUSD.m,M1)       copyright = Copyright 2000-2020, MetaQuotes Software Corp.
2020.05.01 09:28:27.570 TesterCache_Example (EURUSD.m,M1)       name = TesterOptCache
2020.05.01 09:28:27.570 TesterCache_Example (EURUSD.m,M1)       header_size = 12975
2020.05.01 09:28:27.570 TesterCache_Example (EURUSD.m,M1)       record_size = 376
2020.05.01 09:28:27.570 TesterCache_Example (EURUSD.m,M1)       expert_name = RevertTest
2020.05.01 09:28:27.570 TesterCache_Example (EURUSD.m,M1)       expert_path = Experts\My\Revert\RevertTest.ex5
2020.05.01 09:28:27.570 TesterCache_Example (EURUSD.m,M1)       server = RoboForex-MetaTrader 5
2020.05.01 09:28:27.570 TesterCache_Example (EURUSD.m,M1)       symbol = EURUSD.m
2020.05.01 09:28:27.570 TesterCache_Example (EURUSD.m,M1)       (ENUM_TIMEFRAMES)period = PERIOD_M1
2020.05.01 09:28:27.570 TesterCache_Example (EURUSD.m,M1)       date_from = 2016.01.25 00:00:00
2020.05.01 09:28:27.570 TesterCache_Example (EURUSD.m,M1)       date_to = 2016.02.24 00:00:00
2020.05.01 09:28:27.570 TesterCache_Example (EURUSD.m,M1)       date_forward = 1970.01.01 00:00:00
2020.05.01 09:28:27.570 TesterCache_Example (EURUSD.m,M1)       opt_mode = 1
2020.05.01 09:28:27.570 TesterCache_Example (EURUSD.m,M1)       ticks_mode = 1
2020.05.01 09:28:27.570 TesterCache_Example (EURUSD.m,M1)       last_criterion = 6
2020.05.01 09:28:27.570 TesterCache_Example (EURUSD.m,M1)       msc_min = 47
2020.05.01 09:28:27.570 TesterCache_Example (EURUSD.m,M1)       msc_max = 1332
2020.05.01 09:28:27.570 TesterCache_Example (EURUSD.m,M1)       msc_avg = 148
2020.05.01 09:28:27.570 TesterCache_Example (EURUSD.m,M1)       group = real (hedging)
2020.05.01 09:28:27.570 TesterCache_Example (EURUSD.m,M1)       trade_currency = USD
2020.05.01 09:28:27.570 TesterCache_Example (EURUSD.m,M1)       trade_deposit = 300000
2020.05.01 09:28:27.570 TesterCache_Example (EURUSD.m,M1)       trade_condition = 0
2020.05.01 09:28:27.570 TesterCache_Example (EURUSD.m,M1)       trade_leverage = 1000
2020.05.01 09:28:27.570 TesterCache_Example (EURUSD.m,M1)       trade_hedging = 2
2020.05.01 09:28:27.570 TesterCache_Example (EURUSD.m,M1)       trade_currency_digits = 2
2020.05.01 09:28:27.570 TesterCache_Example (EURUSD.m,M1)       trade_pips = 0
2020.05.01 09:28:27.570 TesterCache_Example (EURUSD.m,M1)       parameters_size = 445
2020.05.01 09:28:27.570 TesterCache_Example (EURUSD.m,M1)       parameters_total = 63
2020.05.01 09:28:27.570 TesterCache_Example (EURUSD.m,M1)       opt_params_size = 88
2020.05.01 09:28:27.570 TesterCache_Example (EURUSD.m,M1)       opt_params_total = 11
2020.05.01 09:28:27.570 TesterCache_Example (EURUSD.m,M1)       dwords_cnt = 0
2020.05.01 09:28:27.570 TesterCache_Example (EURUSD.m,M1)       snapshot_size = 0
2020.05.01 09:28:27.570 TesterCache_Example (EURUSD.m,M1)       passes_total = 0
2020.05.01 09:28:27.570 TesterCache_Example (EURUSD.m,M1)       passes_passed = 33410
2020.05.01 09:28:27.570 TesterCache_Example (EURUSD.m,M1)       
2020.05.01 09:28:27.573 TesterCache_Example (EURUSD.m,M1)       Pass = 6654
2020.05.01 09:28:27.573 TesterCache_Example (EURUSD.m,M1)       initial_deposit = 300000.0
2020.05.01 09:28:27.573 TesterCache_Example (EURUSD.m,M1)       withdrawal = 0.0
2020.05.01 09:28:27.573 TesterCache_Example (EURUSD.m,M1)       profit = 1890.9
2020.05.01 09:28:27.573 TesterCache_Example (EURUSD.m,M1)       grossprofit = 2883.0
2020.05.01 09:28:27.573 TesterCache_Example (EURUSD.m,M1)       grossloss = 992.1
2020.05.01 09:28:27.573 TesterCache_Example (EURUSD.m,M1)       maxprofit = 2883.0
2020.05.01 09:28:27.573 TesterCache_Example (EURUSD.m,M1)       minprofit = 332.0
2020.05.01 09:28:27.573 TesterCache_Example (EURUSD.m,M1)       conprofitmax = 2883.0
2020.05.01 09:28:27.573 TesterCache_Example (EURUSD.m,M1)       maxconprofit = 2883.0
2020.05.01 09:28:27.573 TesterCache_Example (EURUSD.m,M1)       conlossmax = 663.0
2020.05.01 09:28:27.573 TesterCache_Example (EURUSD.m,M1)       maxconloss = 663.0
2020.05.01 09:28:27.573 TesterCache_Example (EURUSD.m,M1)       balance_min = 299337.0
2020.05.01 09:28:27.573 TesterCache_Example (EURUSD.m,M1)       maxdrawdown = 663.0
2020.05.01 09:28:27.573 TesterCache_Example (EURUSD.m,M1)       drawdownpercent = 0.221
2020.05.01 09:28:27.573 TesterCache_Example (EURUSD.m,M1)       reldrawdown = 663.0
2020.05.01 09:28:27.573 TesterCache_Example (EURUSD.m,M1)       reldrawdownpercent = 0.221
2020.05.01 09:28:27.573 TesterCache_Example (EURUSD.m,M1)       equity_min = 299270.0
2020.05.01 09:28:27.573 TesterCache_Example (EURUSD.m,M1)       maxdrawdown_e = 813.0
2020.05.01 09:28:27.573 TesterCache_Example (EURUSD.m,M1)       drawdownpercent_e = 0.2685795609963014
2020.05.01 09:28:27.573 TesterCache_Example (EURUSD.m,M1)       reldrawdown_e = 813.0
2020.05.01 09:28:27.573 TesterCache_Example (EURUSD.m,M1)       reldrawdownpercnt_e = 0.2685795609963014
2020.05.01 09:28:27.573 TesterCache_Example (EURUSD.m,M1)       expected_payoff = 472.725
2020.05.01 09:28:27.573 TesterCache_Example (EURUSD.m,M1)       profit_factor = 2.905957060780163
2020.05.01 09:28:27.573 TesterCache_Example (EURUSD.m,M1)       recovery_factor = 2.325830258302583
2020.05.01 09:28:27.573 TesterCache_Example (EURUSD.m,M1)       sharpe_ratio = 0.3406163891757934
2020.05.01 09:28:27.573 TesterCache_Example (EURUSD.m,M1)       margin_level = 271074.705935171
2020.05.01 09:28:27.573 TesterCache_Example (EURUSD.m,M1)       custom_fitness = 9.675071018666522
2020.05.01 09:28:27.573 TesterCache_Example (EURUSD.m,M1)       deals = 8
2020.05.01 09:28:27.573 TesterCache_Example (EURUSD.m,M1)       trades = 4
2020.05.01 09:28:27.573 TesterCache_Example (EURUSD.m,M1)       profittrades = 1
2020.05.01 09:28:27.573 TesterCache_Example (EURUSD.m,M1)       losstrades = 3
2020.05.01 09:28:27.573 TesterCache_Example (EURUSD.m,M1)       shorttrades = 2
2020.05.01 09:28:27.573 TesterCache_Example (EURUSD.m,M1)       longtrades = 2
2020.05.01 09:28:27.573 TesterCache_Example (EURUSD.m,M1)       winshorttrades = 0
2020.05.01 09:28:27.573 TesterCache_Example (EURUSD.m,M1)       winlongtrades = 1
2020.05.01 09:28:27.573 TesterCache_Example (EURUSD.m,M1)       conprofitmax_trades = 1
2020.05.01 09:28:27.573 TesterCache_Example (EURUSD.m,M1)       maxconprofit_trades = 1
2020.05.01 09:28:27.573 TesterCache_Example (EURUSD.m,M1)       conlossmax_trades = 2
2020.05.01 09:28:27.573 TesterCache_Example (EURUSD.m,M1)       maxconloss_trades = 2
2020.05.01 09:28:27.573 TesterCache_Example (EURUSD.m,M1)       avgconwinners = 1
2020.05.01 09:28:27.573 TesterCache_Example (EURUSD.m,M1)       avgconloosers = 2

Вероятно, Вам Gen 96bit не актуален. Не будете доводить?

 
Edgar Akhmadeev:

К сожалению, вчера столкнулся с тем, что для кеша, созданного Gen 96bit она не работает.

Что это такое? Вижу различие в dwords_cnt.

 
fxsaber:

Что это такое?

96бит генетика включается, когда количество переборов превышает 64битное число. При этом в тестере (внизу вкладки "Параметры") количество вариантов отображается в научной нотации.

 
У меня оптимизация многоступенчатая. Такое большое количество переборов - только для предварительной оценки диапазонов. Переменных много. А загрублять шаг не хочется - чтобы уместить в 64 бит генетику, некоторые шаги пришлось бы загрублять до 15 раз. На следующем этапе сужаю диапазоны, переменные разбиваю на группы и оптимизирую по-отдельности.
 
Edgar Akhmadeev:

96бит генетика включается, когда количество переборов превышает 64битное число. При этом в тестере (внизу вкладки "Параметры") количество вариантов отображается в научной нотации.

Пришлите оба opt-файла.


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

Выделил куски, которые выглядят, как бред.

  bool Load( const string FileName )
  {
    const int handle = ::FileOpen(FileName, FILE_READ | FILE_BIN);
    bool Res = (handle != INVALID_HANDLE);

    if (Res)
    {
      ::ArrayFree(this.Inputs);
      ::ArrayFree(this.ParametersBuffer);
      ::ArrayFree(this.Record);
      ::ArrayFree(this.UnknownNums);

      ::FileReadStruct(handle, this.Header);

      if (Res = this.IsCorrectType() && this.Header.passes_passed)
      {
        ::FileReadArray(handle, this.Inputs, 0, this.Header.parameters_total);

        ::FileReadArray(handle, this.ParametersBuffer, 0, this.Header.parameters_size);

        ::FileReadArray(handle, this.UnknownNums, 0, this.Header.snapshot_size);

        const int Size = ::ArrayResize(this.Record, this.Header.passes_passed);
        const bool Offset = (this.Header.record_size - this.Header.opt_params_size - sizeof(T) == sizeof(long));

        for (int i = 0; i < Size; i++)
        {
          ::FileReadStruct(handle, this.Record[i].Result);

          ::FileReadArray(handle, this.Record[i].OptBuffer, 0, this.Header.opt_params_size);

          if (Offset)
            ::FileReadArray(handle, this.Record[i].Genetic, 0, sizeof(long) + this.Header.dwords_cnt * sizeof(int));
          else
            ::FileReadArray(handle, this.Record[i].Genetic, 0, this.Header.dwords_cnt * sizeof(int));
        }
      }

      ::FileClose(handle);
    }

    return(Res);
  }
Если кто поможет разобраться, можно будет допилить библу до нормального состояния.
 
Ранее писал тут https://www.mql5.com/ru/forum/318998/page4#comment_14270407 Возможно, мой вариант сработает. У меня он пока всегда работал правильно.
Библиотеки: TesterCache
Библиотеки: TesterCache
  • 2019.12.17
  • www.mql5.com
Статьи и техническая библиотека по автоматическому трейдингу: Библиотеки: TesterCache
 
fxsaber:

Пришлите оба opt-файла.

Отослал в личку. Как освободился тестер, создал заново кеши. Разница между ними только в шаге одной переменной.

 
fxsaber:

Пришлите оба opt-файла.


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

Выделил куски, которые выглядят, как бред.

Если кто поможет разобраться, можно будет допилить библу до нормального состояния.
bool Load( const string FileName )
  {
    const int handle = ::FileOpen(FileName, FILE_READ | FILE_BIN);
    bool Res = (handle != INVALID_HANDLE);

    if (Res)
    {
      ::ArrayFree(this.Inputs);
      ::ArrayFree(this.ParametersBuffer);
      ::ArrayFree(this.Record);
      ::ArrayFree(this.UnknownNums);

      ::FileReadStruct(handle, this.Header);

      if (Res = this.IsCorrectType() && this.Header.passes_passed)
      {
        ::FileReadArray(handle, this.Inputs, 0, this.Header.parameters_total);

        ::FileReadArray(handle, this.ParametersBuffer, 0, this.Header.parameters_size);

        ::FileReadArray(handle, this.UnknownNums, 0, this.Header.snapshot_size);					// У меня snapshot_size==0, значит снимок отсутствует

        const int Size = ::ArrayResize(this.Record, this.Header.passes_passed);
        const bool Offset = (this.Header.record_size - this.Header.opt_params_size - sizeof(T) == sizeof(long));	// Не знаю, нужен ли. У меня в обоих случаях true

        for (int i = 0; i < Size; i++)
        {
          ::FileReadStruct(handle, this.Record[i].Result);

          ::FileReadArray(handle, this.Record[i].OptBuffer, 0, this.Header.opt_params_size);

          if (Offset)
            ::FileReadArray(handle, this.Record[i].Genetic, 0, sizeof(long) + this.Header.dwords_cnt * sizeof(int));	// Это работает у меня для Gen64, где dwords_cnt == 0

          else
            ::FileReadArray(handle, this.Record[i].Genetic, 0, this.Header.dwords_cnt * sizeof(int));			// Это работает у меня для Gen96, где dwords_cnt == 2
        }
      }

      ::FileClose(handle);
    }

    return(Res);
  }

UnknownNums переименовал бы в Snapshot.

Так заработало. Но надо последить за Offset (отлавливать false) и dwords_cnt (отлавливать не 0 и не 2).

UPD: пардон, поправил код. Т.е. у меня в обоих случаях Genetic имел длину 8 байт.
 

Столкнулся со случаем в Gen96, когда dwords_cnt == 3. Итого были случаи 0, 2, 3. Для всех них работает

            ::FileReadArray(handle, this.Record[i].Genetic, 0, MathMax(this.Header.dwords_cnt, 2) * sizeof(int));

Тестим дальше.

 

На последнем релизном билде 2650 парсить opt-файл полной (медленной, не генетической) оптимизации никто не пробовал? То ли я что сломал, то ли формат поменялся.

Может, дело в том, что сейчас version = 515, а 

PS. Формат может поменяться. Данный формат соответствует версии 514


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