Библиотеки: MultiTester - страница 40

 
klycko #:
В 107-ой строке желательно определить максимум прибыли и значение параметра, где достигнута максимальная прибыль.
Может кто-нибудь подсказать, как считать эти значения?
Как вывести результаты оптимизации в таблицу Excel и в кэш-файл оптимизации?а
Смотрите чтение opt-файлов.
How to open cache optimization file (.opt), MT5
How to open cache optimization file (.opt), MT5
  • 2020.07.30
  • DDamasceno
  • www.mql5.com
Hi, Is there a way to open Metatrader 5 optimization cache file (folder -> tester/cache/) with another software and export the data in...
 
klycko #:
Как вывести результаты оптимизации в таблицу Excel

Почитайте про работу с фреймами.

Документация по MQL5: Работа с результатами оптимизации
Документация по MQL5: Работа с результатами оптимизации
  • www.mql5.com
Функции для организации собственной обработки результатов оптимизации в тестере стратегий. Могут вызываться при оптимизации в агентах тестирования...
 
Добрый день!

С помощью библиотек TesterCache, MultiTester, TypeToBytes
разработал программу оптимизации, но есть в ней какая-то непреодолимая ошибка.

Я её локализовал:
После запуска процедуры Run(Contr);
В последующих строках делается попытка считать найденные при этом запуске Run наилучшие параметры из Cache.
А далее распечатываются эти параметры и скрипт останавливается.

Вот этот код:

inNum=0;

               Run(Contr);                                  // Прогон оптимизации по значениям выделенного параметра

               prWrite = MTTESTER::SetSettings2(Sohran);    // Восстановление сохранённых настроек в робота
               prRead = MTTESTER::GetSettings(Contr);       // Считываются для контроля настройки робота
               Print("prWriteSettings = ",prWrite," prReadSettings = ",prRead);
               Print("SettingEnd Odinar ",Kol," PoseY = ",PoseY," Итерация ",IterNumber,"\n",Contr);

               if(prRead && TypPar == 0)                    // Прочитали оптимизационный Cache для double-параметра

                 {                                          // Считали соответствующие оптимизируемые входные параметры


int GLOC = MTTESTER::GetLastOptCache(Bytess);

Print("GLOC = ",GLOC);                 


                   const int Size = Cache.GetInputs(inNum,Paramas); 
                   Print(Cache[inNum].ToString());                  // Вывели статистику запрошенной записи
                   Print(Cache.Header.ToString());                  // Вывели основные данные оптимизационного Cache
Print("Paramas\n");
                  ArrayPrint(Paramas);                              // Вывели её оптимизируемые входные параметры
                  Print(Cache[GetMaxProfitPos(Cache)].ToString());  // Вывели статистику записи с максимальной прибылью

                  ProfitNow = Cache[GetMaxProfitPos(Cache)].profit;              // Максимальная прибыль
                  int NomProchodaMaxProfit = Cache[GetMaxProfitPos(Cache)].Pass; // Номер прохода с максимальной прибылью
                  int IndexMaxProfit = GetMaxProfitPos(Cache);                   // Индекс массива со значением параметра  
                  Cache.GetInputs(IndexMaxProfit,Paramas);

                  ParamMax = Paramas[0,1].double_value;   // Значение параметра, при котором достигнута максимальная прибыль

Alert("ProfitNow =",ProfitNow," ParamMax=",ParamMax," Odinar ",Kol," PoseY = ",PoseY," PosEq = ",PosEq," TypPar = ",TypPar," Итерация ",IterNumber);
return;



Однако, найденные и распечатанные параметры соответствуют какому-то прежнему opt-файлу, а не тому, который был получен при запуске Run !!!
Может я неверно обращаюсь к Cache.GetInputs(inNum,Paramas)?

Сама процедура Run отработала нормально, это следует из предыдущих распечаток в log.

Почему же всё-таки не удаётся получить свежие данные из Cache?

Заранее благодарен за любой совет.

С уважением, Александр
Библиотеки: TesterCache - Что такое 0xCACA?
Библиотеки: TesterCache - Что такое 0xCACA?
  • 2019.08.31
  • Good Beer
  • www.mql5.com
Да и дальше взаимодействия с Оптимизатором нет никакого. в кеше Оптимизатора по каждому проходу хранятся все стат. Бонусом идет возможность запуска любого прохода из обновленной таблицы стандартными средствами в два щелчка
 
klycko #:
int GLOC = MTTESTER::GetLastOptCache(Bytess);
Вы получили opt-файл в байтовый массив. Дальше его надо подать в Cache.

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

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

fxsaber, 2019.11.11 04:45

void OnStart()
{
  uchar Bytes[];
  
  MTTESTER::GetLastOptCache(Bytes);
  
  TESTERCACHE<ExpTradeSummary> Cache;

  if (Cache.Load(Bytes)) // Прочитали оптимизационный кеш.
  {
 
fxsaber #:
Вы получили opt-файл в байтовый массив. Дальше его надо подать в Cache.

Поправил так, как Вы сказали:


string Sohran,Contr;

MTTESTER::GetSettings(Sohran);               // Считываются текущие исходные настройки робота для временного сохранения в Sohran

prWrite = MTTESTER::SetSettings2(Odinar);    // Установка Odinar в настройки робота

prRead = MTTESTER::GetSettings(Contr);       // Считываются только что установленные настройки робота

Print("prWriteSettings = ",prWrite," prReadSettings = ",prRead);

Print("SettingBeg OdinarContr ",Kol," PoseY = ",PoseY," Итерация ",IterNumber,"\n",Contr);


Run(Contr[0]);                 // Прогон оптимизации по значениям выделенного Y параметра

int GLOC = MTTESTER::GetLastOptCache(Bytess); // Получили opt-файл в байтовый массив Bytess

TESTERCACHE<ExpTradeSummary> Cache;

bool CL = Cache.Load(Bytess);                            // Подаём в Cache байтовый массив Bytess

ProfitNow = Cache[GetMaxProfitPos(Cache)].profit;                        // Максимальная прибыль

int NomProchodaMaxProfit = Cache[GetMaxProfitPos(Cache)].Pass; // Номер прохода с максимальной прибылью

int IndexMaxProfit = GetMaxProfitPos(Cache);                                // Индекс массива со значением параметра  https://www.mql5.com/ru/forum/318998/page2#comment_13846951

Cache.GetInputs(IndexMaxProfit,Paramas);

ParamMax = Paramas[0,1].double_value;                                       // Значение параметра, при котором достигнута максимальная прибыль


Alert("CL=",CL," GLOC = ",GLOC," ProfitNow =",ProfitNow," ParamMax=",ParamMax," Odinar ",Kol," PoseY = ",PoseY," PosEq = ",PosEq," TypPar = ",TypPar," Итерация ",IterNumber);

return;



Результат по-прежнему ошибочный.

Почему-то из кеша считываются данные по ProfitNow и ParamMax из какого-то бывшего ранее прогона.

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

Библиотеки: TesterCache - Что такое 0xCACA?
Библиотеки: TesterCache - Что такое 0xCACA?
  • 2019.08.31
  • Good Beer
  • www.mql5.com
Да и дальше взаимодействия с Оптимизатором нет никакого. в кеше Оптимизатора по каждому проходу хранятся все стат. Бонусом идет возможность запуска любого прохода из обновленной таблицы стандартными средствами в два щелчка
Файлы:
 
klycko #:

Почему-то из кеша считываются данные по ProfitNow и ParamMax из какого-то бывшего ранее прогона.

Показывает ли после Оптимизации правильные значения этот скрипт?

Если да, то проблема, скорее всего, в неготовности opt-файла сразу после Оптимизации. Можно попробовать поставить Sleep после Run. Ну либо Run работает неправильно.

Библиотеки: TesterCache - Что такое 0xCACA?
Библиотеки: TesterCache - Что такое 0xCACA?
  • 2019.08.31
  • Good Beer
  • www.mql5.com
Да и дальше взаимодействия с Оптимизатором нет никакого. в кеше Оптимизатора по каждому проходу хранятся все стат. Бонусом идет возможность запуска любого прохода из обновленной таблицы стандартными средствами в два щелчка
 
fxsaber #:

Показывает ли после Оптимизации правильные значения этот скрипт?

Если да, то проблема, скорее всего, в неготовности opt-файла сразу после Оптимизации. Можно попробовать поставить Sleep после Run. Ну либо Run работает неправильно.

Спасибо! Завтра все это проверю.

Но сейчас обнаружил, что если задать оптимизацию по новому параметру, то все работает правильно. 

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

Нельзя ли что-нибудь придумать, чтобы предварительно уничтожать эту память тестера? 

 
klycko #:

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

Ваши гипотезы ошибочны. Проблема в коде, что написали.

 
fxsaber #:

Ваши гипотезы ошибочны. Проблема в коде, что написали.

Добрый день!


Согласен с вами, что "Проблема в коде, который я написал". Ошибка в нём, и я пока не знаю, как ее исправить.

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

из папки "C:\Users\ASUS\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075\Tester\cache",

то мой код работает правильно и проводит оптимизацию по выбранному параметру.

Если же эту папку не чистить, то Тестер повторные оптимизации (с теми же самыми неизменными данными) не проводит, а считывает

уже имеющийся opt-файл из этой папки. Это хорошо видно при неоднократном запуске вручную одной и той же оптимизации. 

Видно, что реальная оптимизация производится только в первый раз, а потом - только считывание opt-файла из папки. 

При таком повторном считывании в кеше, по-видимому, не обновляется содержимое, и это-то и приводит к ошибке в моем коде.


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

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


К сожалению, из скрипта при помощи FolderClean нельзя очистить эту папку, потому что это запрещено в MQL5 - 

она вне "песочницы" и заполняется только Тестером стратегий.


Может следует создать средствами С++ какую-то внешнюю примочку и запускать ее из скрипта.


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

 
Процедура Run работает безукоризненно. Записывает Settings и нажимает кнопку Старт. Все нормально.