О кеше оптимизатора.

 
Тестер терминала MetaTrader 4 позволяет проводить оптимизацию советников для поиска наилучших параметров. Есть возможность использовать прямой перебор и генетичесике алгоритмы.
При этом, нужно заметить, что оптимизация методами ГА допускает многократный прогон советника с одними и теми же параметрами в течение одной операции оптимизации (от нажатия кнопки "Старт" до окончания оптимизации).
Такая повторяемость заложена изначально в генетический алгоритм оптимизации. Вполне естественно, что для ускорения процесса оптимизации, был применен механизм кеширования результатов бектеста.
Это означает, что каждый результат бектеста конкретного советника с конкретными входными параметрами запоминается в некой базе данных, и если тестер встречает при оптимизации те же самые данные, то новый расчет не производится, а подставляются готовые данные.

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

//+------------------------------------------------------------------+
//|                                               Check2Dsurface.mq4 |
//|                      Copyright © 2007, MetaQuotes Software Corp. |
//|                                        https://www.metaquotes.net/ |
//+------------------------------------------------------------------+
extern double x=0;
extern double start=0;
extern double end=0;
 
double initialBalance,Profit;
int FileHandle;
string FileName;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//---- 
   initialBalance=AccountBalance();
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
   {
   Profit=AccountBalance()-initialBalance;
   FileName=WindowExpertName()+".csv";
   FileHandle=FileOpen(FileName,FILE_WRITE|FILE_READ|FILE_CSV);
   if (FileHandle!=-1)
     {
      FileSeek(FileHandle, 0,SEEK_END);     
      FileWrite(FileHandle,"x=",x,"   start=",start,"   end=",end,"   Profit=",Profit);
      FileClose(FileHandle);
     }
   }
 
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
   {
    if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==false && Ask>=start && Ask<=end)
    {
        OrderSend(Symbol(),OP_BUY,1,Ask,0,0,Ask+250*Point,NULL,0,0,Blue);
    }
    
   }
//+------------------------------------------------------------------+

Данный советник после окончания бектеста производит запись в файл (с именем советника) внешних параметров бектеста.
В функции init() мы запоминаем начальный баланс, а в функции deinit() открываем файл и пишем значения X, start и end. Profit вычисляется как разница между балансом на конец тестирования и начальным балансом.
 
Компилируем советника, устанавливаем параметры, запускаем:





Все работает как и было задумано, файл создан




и в нем есть записи

 
Но. Если теперь это файл удалить (не важно почему) и запустить оптимизацию с теми же самыми настройками (тайм-фрейм, период тестирования, символ и так далее), то ... как ни странно, файл не появляется.
Можно предположить, что испортился терминал ... И тут мы вспоминаем про кеширование результатов бектеста! :)

Мы получили наглядное представление о том, что результаты хранятся в кеше. Независимо от типа оптимизации (я в примере использовал оптимизацию методом прямого перебора).
Как же можно сломать кеш (а точнее, как можно заставить оптимизатор запускать все же бек-тест [вызывать deinit()], а не подставлять готовые результаты)? Если подсунуть тестеру параметры, по которым он еще не проводил бектест. Например, я изменил для параметра end конечное значение:




И действительно , файл появился .



но с другим размером (29 килобайт против 115 килобайт первоначально. Но при этом тестер остался при своем мнении - он рассчитал только те значения, которых у него не было в кеше.
Это видно из содержимого файла

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

Если все же вам необходимо провести реальный полный расчет для всех значений параметров, то вы можете просто удалить закешированные результаты из папки estercaches




Деваться оптимизатору будет некуда и он сделает все расчеты заново.
 
Но самый простой способ почистить кеш - это отметить чек-бокс "Пересчитать" или перекомпилировать советника.
 

Все работает так, как Вы описали.... Но....

Я сталкнулся с такой ситуацией...

Процесс оптимизации занимает много времени... приходится прерывать на ночь... с тем чтобы запустить с утра...

оптимизируется только один параметр: счетчик количества подстановок параметров советника... Эти варианты берутся из файла...

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

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

происходит смещение... на последнем прогоне нулевых результатов не должно быть...

Позднее выложу картинки...

 
Rosh >>:
То есть, оптмизатор взял из кеша результаты по уже использованным параметрам, и сделал реальный прогон только для новых комбинаций параметров.

Если все же вам необходимо провести реальный полный расчет для всех значений параметров, то вы можете просто удалить закешированные результаты из папки estercaches




Деваться оптимизатору будет некуда и он сделает все расчеты заново.

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

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

 
Почему кеш оптимизатора обнуляется, если мы решили протестировать один из вариантов? Это так задумано?
Причина обращения: