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

 
Stanislav Korotky:

Я принимал фреймы в OnTesterPass. Прилагаю минимальный работающий тест (без файлов).

Этот тоже не работает. Я добавил только forw_id для наклядности.

test

Одни нули.  А что такое 0xCACA?

 
Good Beer:

Этот тоже не работает. Я добавил только forw_id для наклядности.


Одни нули.  А что такое 0xCACA?

У меня все работает, и мой пример, и ваш (отправил в соседней ветке). 0.0 - проход оптимизации, 1.0 - форвард.

2019.09.01 16:34:26.746 fwdfrm (GBPUSD,H1)      OnTesterPass
2019.09.01 16:34:26.749 fwdfrm (GBPUSD,H1)      2 0.0
2019.09.01 16:34:26.749 fwdfrm (GBPUSD,H1)      "dummy=3"
2019.09.01 16:34:26.749 fwdfrm (GBPUSD,H1)      0 0.0
2019.09.01 16:34:26.749 fwdfrm (GBPUSD,H1)      "dummy=1"
2019.09.01 16:34:26.749 fwdfrm (GBPUSD,H1)      1 0.0
2019.09.01 16:34:26.749 fwdfrm (GBPUSD,H1)      "dummy=2"
2019.09.01 16:34:26.749 fwdfrm (GBPUSD,H1)      3 0.0
2019.09.01 16:34:26.749 fwdfrm (GBPUSD,H1)      "dummy=4"
2019.09.01 16:34:26.749 fwdfrm (GBPUSD,H1)      4 0.0
2019.09.01 16:34:26.749 fwdfrm (GBPUSD,H1)      "dummy=5"
2019.09.01 16:34:26.749 fwdfrm (GBPUSD,H1)      OnTesterPass
2019.09.01 16:34:27.583 fwdfrm (GBPUSD,H1)      OnTesterPass
2019.09.01 16:34:27.583 fwdfrm (GBPUSD,H1)      0 1.0
2019.09.01 16:34:27.583 fwdfrm (GBPUSD,H1)      "dummy=1"
2019.09.01 16:34:27.583 fwdfrm (GBPUSD,H1)      OnTesterPass
2019.09.01 16:34:27.583 fwdfrm (GBPUSD,H1)      4 1.0
2019.09.01 16:34:27.583 fwdfrm (GBPUSD,H1)      "dummy=5"
2019.09.01 16:34:27.584 fwdfrm (GBPUSD,H1)      OnTesterPass
2019.09.01 16:34:27.584 fwdfrm (GBPUSD,H1)      1 1.0
2019.09.01 16:34:27.584 fwdfrm (GBPUSD,H1)      "dummy=2"
2019.09.01 16:34:27.602 fwdfrm (GBPUSD,H1)      OnTesterPass
2019.09.01 16:34:27.602 fwdfrm (GBPUSD,H1)      3 1.0
2019.09.01 16:34:27.602 fwdfrm (GBPUSD,H1)      "dummy=4"
2019.09.01 16:34:27.602 fwdfrm (GBPUSD,H1)      OnTesterPass
2019.09.01 16:34:27.602 fwdfrm (GBPUSD,H1)      2 1.0
2019.09.01 16:34:27.602 fwdfrm (GBPUSD,H1)      "dummy=3"

0xCACA - просто число (идентификатор), на функционал не влияет.

 

Не работает на последнем бета-билде на текущий момент :( .

Версия кэша 515.

 

Hi Fxsaber, I find this code extremely usefull. Thank you.

However, it does not work with the new update. Are you planning to update the code at some point?


Fulvio

 
Fulvio Monaco:

Are you planning to update the code at some point?

Планирую. По срокам не могу сказать. Очень много более важного не сделано.

 
Библиотека изменена под новый opt-формат (515).
// Сохраняем set-файл самого прибыльного прохода последней оптимизации.

#include <fxsaber\MultiTester\MTTester.mqh>    // https://www.mql5.com/ru/code/26132
#include <fxsaber\TesterCache\TesterCache.mqh> // https://www.mql5.com/ru/code/26223

// Возвращает номер записи с максимальной прибылью.
template <typename T>
int GetMaxProfitPos( const TESTERCACHE<T> &Cache )
{
  int Pos = 0;
  double MaxProfit = -DBL_MAX;

  for (int i = Cache.GetAmount() - 1; i >= 0; i--)
    if (Cache[i].TesterStatistics(STAT_PROFIT) > MaxProfit)
    {
      MaxProfit = Cache[i].TesterStatistics(STAT_PROFIT);

      Pos = i;
    }

  return(Pos);
}

void OnStart()
{
  uchar Bytes[];
  
  MTTESTER::GetLastOptCache(Bytes);
  
//  TESTERCACHE<TestCacheSymbolRecord> Cache;   // Оптимизация по символам
  TESTERCACHE<ExpTradeSummary> Cache;         // Стандартная оптимизация

  if (Cache.Load(Bytes)) // Прочитали оптимизационный кеш.
  {
    Print(Cache.Header.ToString()); // Вывели основные данные оптимизационного кеша.    
    
    const int Pos = GetMaxProfitPos(Cache);
    Print(Cache[Pos].ToString()); // Вывели стат. данные записи с максимальной прибылью.
    
    Cache.SaveSet(Pos); // Создали set-файл самого прибыльного прохода.
  }
}


В результате запуска появится такой set-файл.

; saved on 2019.11.13 19:40:01
; Experts\Examples\MACD\MACD Sample LImitTP.ex5
; EURUSD
; 2019.09.01 - 2019.11.13
; 479, 10, Max, 47.92, -253.60
;
InpLots=0.1
InpTakeProfit=200||10||5||500||Y
InpTrailingStop=290||30||10||300||Y
InpMACDOpenLevel=5||5||5||200||Y
InpMACDCloseLevel=180||5||5||200||Y
InpMATrendPeriod=8||1||1||200||Y
;
; Pass = 1838
; initial_deposit = 10000.0
; withdrawal = 0.0
; profit = 479.15
; grossprofit = 479.15
; grossloss = 0.0
; maxprofit = 99.8
; minprofit = 0.0
; conprofitmax = 479.15
; maxconprofit = 479.15
; conlossmax = 0.0
; maxconloss = 0.0
; balance_min = 10000.0
; maxdrawdown = 0.0
; drawdownpercent = 0.0
; reldrawdown = 0.0
; reldrawdownpercent = 0.0
; equity_min = 9997.700000000001
; maxdrawdown_e = 253.6000000000004
; drawdownpercent_e = 2.457388152985982
; reldrawdown_e = 253.6000000000004
; reldrawdownpercnt_e = 2.457388152985982
; expected_payoff = 47.91500000000001
; profit_factor = 1.797693134862316e+308
; recovery_factor = 1.889392744479493
; sharpe_ratio = 1.069726339729858
; margin_level = 1.797693134862316e+308
; custom_fitness = 0.0
; deals = 15
; trades = 10
; profittrades = 10
; losstrades = 0
; shorttrades = 6
; longtrades = 4
; winshorttrades = 6
; winlongtrades = 4
; conprofitmax_trades = 10
; maxconprofit_trades = 10
; conlossmax_trades = 0
; maxconloss_trades = 0
; avgconwinners = 10
; avgconloosers = 0
; 
; version = 515
; copyright = Copyright 2000-2019, MetaQuotes Software Corp.
; name = TesterOptCache
; header_size = 2526
; record_size = 328
; expert_name = MACD Sample LImitTP
; expert_path = Experts\Examples\MACD\MACD Sample LImitTP.ex5
; server = MetaQuotes-Beta
; symbol = EURUSD
; (ENUM_TIMEFRAMES)period = PERIOD_M1
; date_from = 2019.09.01 00:00:00
; date_to = 2019.11.13 00:00:00
; date_forward = 1970.01.01 00:00:00
; opt_mode = 1
; ticks_mode = 4
; last_criterion = 0
; msc_min = 501
; msc_max = 2342
; msc_avg = 801
; group = demo (netting)
; trade_currency = USD
; trade_deposit = 10000
; trade_condition = 0
; trade_leverage = 100
; trade_hedging = 1
; trade_currency_digits = 2
; trade_pips = 0
; parameters_size = 28
; parameters_total = 6
; opt_params_size = 40
; opt_params_total = 5
; dwords_cnt = 0
; snapshot_size = 0
; passes_total = 0
; passes_passed = 2510

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

 

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

Вариант с экспортом в XML (и далее Excel) совсем не полноценный, т.к. туда попадает малое количество стат. данных. Да и дальше взаимодействия с Оптимизатором нет никакого.


Однако, в кеше Оптимизатора по каждому проходу хранятся все стат. данные (не меньше, чем в отчете одиночного прогона). Поэтому задача решается легко - создание измененного opt-файла и его импортирование.


Вот пример, где нужно было из прибыли в пипсах вычесть комиссию.

#property script_show_inputs

input string inFileName = "Task.mqh\\MACD\\2019.01.02-2019.11.19\\EURUSD\\Base.opt"; // Путь к файлу кеша
input double inCommission = -5; // Какую комиссию сделать

#include <fxsaber\TesterCache\TesterCache.mqh> // https://www.mql5.com/ru/code/26223

void OnStart()
{
  uchar Bytes[];
  
  TESTERCACHE<ExpTradeSummary> Cache;         // Стандартная оптимизация

  if (Cache.Load(inFileName)) // Прочитали оптимизационный кеш.
  {
    for (int i = Cache.GetAmount() - 1; i >= 0; i--)
    {
      ExpTradeSummary Result = Cache[i];
      
      if (Result.TesterStatistics(STAT_CUSTOM_ONTESTER))
      {
        Result.custom_fitness = Result.TesterStatistics(STAT_PROFIT) + inCommission * Result.TesterStatistics(STAT_TRADES);
        
        Cache.Record[i] = Result;
      }
    }
    
    Cache.Save(StringSubstr(inFileName, 0, StringLen(inFileName) - 4) + "_change.opt");
  }
}


Результат


Бонусом идет возможность запуска любого прохода из обновленной таблицы стандартными средствами в два щелчка.

 
Насколько я понимаю, похожий формат одиночных проходов .tst не парсится? Если разгребу его и напишу аналогичный код парсинга, будет интересно или не нужен?
 
traveller00:
Насколько я понимаю, похожий формат одиночных проходов .tst не парсится? Если разгребу его и напишу аналогичный код парсинга, будет интересно или не нужен?

Будет очень интересно. Все же надеюсь, что разработчики поделятся этим форматом позже.

 

Способ быстрого импорта кеша из песочницы.

  1. Выбрали во вкладке Оптимизация меню импортировать.
  2. В диалоге выбора файла сделать CTRL+V это строки  ..\..\MQL5\Files\*.opt и нажать Enter.
Возможно, разработчики сделают drag&drop-механизм, тогда будет гораздо проще и удобнее.