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

 
klycko #:
как это сделать?
int IndexMaxProfit = GetMaxProfitPos(Cache); // https://www.mql5.com/ru/forum/318998/page2#comment_13846951
ЗЫ Sort-методы прописаны.
 
Большое спасибо! Проблема решилась.
 
fxsaber #:
Библиотека изменена под новый opt-формат (515).


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

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

Добрый день!

Очень полезная команда: 

Cache.SaveSet(Pos); // Создали set-файл самого прибыльного прохода.

Не могли бы вы подсказать, как автоматически этот set-файл сразу же записать оптимизируемому советнику в Setting?

У меня идет цикл оптимизаций, и запись в файл требуется только по его окончанию.

С уважением, Александр

 
klycko #:

как автоматически этот set-файл сразу же записать оптимизируемому советнику в Setting?

string Settings = Cache.TesterString(Pos);
 
Большое спасибо!
 

Здравствуйте!

Может быть подскажите, есть ли в файле оптимизации дата компиляции одного из кастомных индикаторов? Прогнал много миллионов тестов, осталось процентов 15, и с дуру перекомпилировал один из индикаторов, и теперь точно заново начнёт. Пытаюсь разобраться, можно ли просто дату файла индикатора поменять и на какую именно?

 
AntonKondratiev #:

есть ли в файле оптимизации дата компиляции одного из кастомных индикаторов?

Хранится хэш советника.
//+------------------------------------------------------------------+
//| заголовок кеша                                                   |
//+------------------------------------------------------------------+
struct TestCacheHeader
{
  UINT              version;                // версия кеша
  // ..........
  //---
  char              hash_ex5[16];           // контрольная сумма скомпилированного эксперта

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

Можете проверить эту гипотезу на другом советнике, либо же сохранить копию расчетов (соответствующий opt-файл) и продолжить оптимизацию.


ЗЫ Оптимизация продолжится только в случае полного перебора. При ГА будет запущена полноценная оптимизация с нуля, с сохранением результатов предыдущих расчетов (немного быстрее, чем с нуля).

 
Мат. режим.
#include <fxsaber\TesterCache\TesterCache.mqh> // https://www.mql5.com/ru/code/26223

void OnStart()
{
  const string Name = "EAToMath_Example.31.92B57559DD70539BE80A58E3472DB3B2.opt";
  const TESTERCACHE<MATHEMATICS> Cache(Name);
  
  int Pos[];
 
  if (Cache.SortByStat(STAT_CUSTOM_ONTESTER, Pos) && ArrayReverse(Pos)) // Сортировки по критерию
  {    
    Print(Cache[Pos[0]].ToString());   // Результат лучшего прохода.
    Print(Cache.TesterString(Pos[0])); // Данные для получения этого одиночного прохода.
  }
}


Результат.

Pass = 1687
custom_fitness = 49470.0

[Tester]
Expert=EAToMath_Example.ex5
Symbol=
Period=CURRENT
Optimization=2
Model=3
FromDate=1970.01.01
ToDate=1970.01.01
ForwardMode=0
Deposit=0
Currency=
ProfitInPips=0
Leverage=0
ExecutionMode=0
OptimizationCriterion=6
Visual=0
[TesterInputs]
;
inSaveTicks=0
inDataTotal=0
inTechData0=AAAAAEZJTFRFUjBfRVVSU0dEAAAAAAAADgAAAAAAAAA8r8uA1QEAAA4AAAAAAAA
inTechData1=AUvh2VPd/AAB8X8mA1QEAAE7cCs7xaOOItfjkPgUAAAD//////2n4QPFo44i1+O
inTechData2=Q+AAAAAACIw0CArSpcAAAAAICFdGcAAAAA
;
inFileNameHistory=EAToMath.mqh\Custom\FILTER0_EURSGD\Ticks_0.tsh
InFileMap=0||0||1||1||N
inBlockSize=256
inBlocks=1
;
inReport=0||0||1||1||N
inVirtual=0||0||1||1||N
inCloseAllByEnd=1||0||1||1||N
...
 

Улучшение.

Вместо того, чтобы задавать тип оптимизации вручную

//   TESTERCACHE<MATHEMATICS> Cache;             // Оптимизация в мат. режиме
//   TESTERCACHE<TestCacheSymbolRecord> Cache;   // Оптимизация по символам
   TESTERCACHE<ExpTradeSummary> Cache;         // Стандартная оптимизация

и перекомпилировать скрипт, можно его считать из файла такой функцией:

  int GetType( void ) const
  {
    return( (this.Header.symbol[] == "" ? 3 :// math        && (this.Header.ticks_mode = 3) ??
            (this.Header.opt_mode == 2 ? 2 : // all Symbols
            ((this.Header.symbol[] != "") && (this.Header.opt_mode < 2) ? 1 : // TradeSummary
            1 ))));//TradeSummary as default
  }

и затем выбрать автоматически тип:

void OnStart(){
   Print("start");   
   TESTERCACHE<MATHEMATICS> Cache0;           // Оптимизация в мат. режиме
   uchar Bytes[];
   const int handle = ::FileOpen(inFileName, FILE_READ | FILE_BIN);
   if (handle == INVALID_HANDLE){Print("Wrong file or file not found:",inFileName,"   Return!");return; }
   uint len= FileReadArray(handle,Bytes);
   ::FileClose(handle);
   
   Cache0.Load(Bytes);

   if(Cache0.GetType()==1){
      TESTERCACHE<ExpTradeSummary> Cache;         // Стандартная оптимизация
      Cache.Load(Bytes); ::ArrayFree(Bytes);
      OptReports(Cache);
   }
   else if(Cache0.GetType()==2){
      TESTERCACHE<TestCacheSymbolRecord> Cache;   // Оптимизация по символам
      Cache.Load(Bytes); ::ArrayFree(Bytes);
      OptReports(Cache);
   }else{
      ::ArrayFree(Bytes);
      OptReports(Cache0);// Оптимизация в мат. режиме
   }
}

template <typename T>
bool OptReports(TESTERCACHE<T> &Cache){
//   TESTERCACHE<MATHEMATICS> Cache;             // Оптимизация в мат. режиме
//   TESTERCACHE<TestCacheSymbolRecord> Cache;   // Оптимизация по символам
//   TESTERCACHE<ExpTradeSummary> Cache;         // Стандартная оптимизация
...
}
И проверять тип Res = this.IsCorrectType() в Load() уже не обязательно.
 

Возможно бывают большие файлы оптимизации и весь его читать в массив может быть накладно для ОЗУ.
Можно только заголовок считать и определить тип. А потом уже читать из файла а не массива, как в примере выше.

ПС. Посмотрел у себя - очень больших не увидел. Наверное не стоит такую опцию делать.