Советники: Validate - страница 10

 
Александр Кувакин #:

модифицировал ValidateTask.mqh чтобы при одиночном проходе смотреть кэш вместо isReady2. Добавил метод:

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

 
Спасибо за идеи!
 
При первом запуске Validate.ex5 отработал нормально. Почистил кеш. Скомпилировал исходник, изменений не вносил. После запуска Validate с теми же параметрами, стал выдавать ошибку. Validate (EURUSD,H1)    array out of range in 'TesterCache.mqh' (291,24). В чем может быть причина?
 
Radik Nurmukhametov #:
При первом запуске Validate.ex5 отработал нормально. Почистил кеш. Скомпилировал исходник, изменений не вносил. После запуска Validate с теми же параметрами, стал выдавать ошибку. Validate (EURUSD,H1)    array out of range in 'TesterCache.mqh' (291,24). В чем может быть причина?

Была похожая проблема, скорее всего тебе надо обновить файл https://www.mql5.com/ru/code/viewcode/26223/264471/testercache.mqh и перекомпилить, или попросить @fxsaber перекомпилить - вчера как раз он обновил TesterCache ,
там было условие в IsCorrectType:

(typename(T) == "TestCacheSymbolRecord")

а стало:

(typename(T) == "struct TestCacheSymbolRecord")

из-за него у меня была такая ошибка

 
изучал проблему с тем что не срабатывает IsReady2, через проверку файлов тоже не получилось сделать поскольку когда нет сделок он не создаёт файл - например когда out-of-sample небольшой или последняя итерация, 
в общем решил что без небольшой модификации исходного кода советника не обойтись, попробовал сделать через глобальные переменные - не получилось поскольку тестовые прогоны имеют изолированный слой переменных
нашёл либу 
https://www.mql5.com/ru/code/818 и сделал статический класс:
#include <fxsaber\MultiTester\MTTester.mqh> // https://www.mql5.com/ru/code/26132
#include <MemMapLib.mqh>

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class MyGlobals {
   static CMemMapFile hmem;
   static string     filePath;

public:

   // create in validate before operations
   static void       createMemMap() {
      while(!IsStopped()) {
         if(MyGlobals::hmem.Open(MyGlobals::filePath, 111, modeCreate) == 0) break;
         Sleep(250);
      }
   }

   // set global in tester
   static void        setTstGlobal() {
      if (!MQLInfoInteger(MQL_OPTIMIZATION) && MyGlobals::hmem.Open(MyGlobals::filePath, 111, modeCreate) == 0) {
        string toDate = MyGlobals::getTesterEndDate();
        uchar data[];
        StringToCharArray(toDate, data);
        MyGlobals::hmem.Write(data, ArraySize(data));
        MyGlobals::hmem.Close();
      }
   }

   // check in validate
   static bool       checkTstGlobal(string toDate) {
      uchar data[];
      StringToCharArray(toDate, data);
      int size = ArraySize(data); // непонятно как посчитать колличество байт у строки, сделал пока так
      ArrayInitialize(data,0);
      int res1 = MyGlobals::hmem.Seek(0,SEEK_SET);
      int res2 = MyGlobals::hmem.Read(data, size);
      string result = CharArrayToString(data);
      return result == toDate;
   }

   static void       close() {
      MyGlobals::hmem.Close();
   }

   static string     getTesterEndDate(void) {
      string Str;
      return (MTTESTER::GetSettings(Str) ? MTTESTER::GetValue(Str, "ToDate") : "");
   }
   
   static void deinit() {
    delete(&MyGlobals::hmem); // не знаю надо ли, не эксперт в C++
   }
};

CMemMapFile MyGlobals::hmem;
string MyGlobals::filePath = "Local\\MyGlobals.tst";
теперь надо советнику добавить одну строчку в OnTester():
MyGlobals::setTstGlobal();
ну и модифицировать Validate по аналогии, и всё заработало нормально - процессы просто перезаписывают и считывают область оперативной памяти - всё очень быстро работает
File Mapping без DLL
File Mapping без DLL
  • www.mql5.com
Класс MQL5, который работает напрямую с маппингом, без использования самописной DLL.
 
@fxsaber подскажи пожалуйста если в курсе, в функции MTTESTER::ClickStart есть строчка:
user32::SendMessageW(Handle, BM_CLICK, 0, 0);

при оптимизации она открывает два окна - сначала график с советником тестируемым зачем-то, и окно с самой оптимизацией, под конец оптимизации график с советником не закрывается и накапливается много лишних окон, может в курсе как это можно пофиксить?
У меня терминал для торговли на мосбирже - хотя вроде разницы не должно быть с форексом

 
Александр Кувакин #:

при оптимизации она открывает два окна - сначала график с советником тестируемым зачем-то, и окно с самой оптимизацией, под конец оптимизации график с советником не закрывается

OnTester*-функции в исходнике.

 
Александр Кувакин #:
теперь надо советнику добавить одну строчку в OnTester():
ну и модифицировать Validate по аналогии, и всё заработало нормально - процессы просто перезаписывают и считывают область оперативной памяти - всё очень быстро работает

В чем идея?

 
fxsaber #:

OnTester*-функции в исходнике.

спасибо, не заметил - странная фича терминала открывать график с советником при оптимизации)

 
fxsaber #:

В чем идея?

Пока что просто исправляю мелкие баги чтобы код изучить и юзабельность поднять, в идеале хочу автоматизировать чтобы ставить сразу много задач для Validate на ночь например, но незнаю будет ли это возможно если не очищать кэш например?
TesterPortfolio думаю выпилить и делать просто отчёт из tst файлов, поскольку для фондовой биржи TesterPortfolio не очень работает из-за графика торгов и аукционов открытия/закрытия, и я прогоны делаю по OHLC M1 - тоже не очень вписываются. Кажется если брать готовые tst и считать по ним статистику и рисовать график то будет проще.
Могу потом скинуть итоговое решение если интересно

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