程序库: 多功能测试仪 - 页 40

 
klycko 优化结果 输出到 Excel 表格和优化缓存文件中?
请参见读取选项文件
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) 之后;
下面几行试图从缓存中读取运行过程中发现的最佳参数。
然后打印这些参数并停止脚本。

下面是这段代码

inNum=0;

Run(Contr); // 对所选参数值进行优化运行

prWrite = MTTESTER::SetSettings2(Sohran); // 将保存的设置还原到机器人中
prRead = MTTESTER::GetSettings(Contr); // 读取机器人设置,对其进行控制
Print("prWriteSettings = ",prWrite," prReadSettings = ",prRead);
Print("SettingEnd Odinar ",Kol," PoseY = ",PoseY," Iteration ",IterNumber,"\n",Contr);

if(prRead && TypPar == 0) // 为双参数读取优化缓存

{// 读取相应的优化输入参数


int GLOC = MTTESTER::GetLastOptCache(Bytess);

Print("GLOC = ",GLOC);


const int Size = Cache.GetInputs(inNum,Paramas);
Print(Cache[inNum].ToString()); // 打印请求记录的统计数据
Print(Cache.Header.ToString()); // 打印优化缓存的主要数据
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," Iteration ",IterNumber);
返回;



然而,找到并打印出来的参数对应的是以前的某个 opt 文件,而不是运行 Run !!!! 时获得的参数!
也许我访问 Cache.GetInputs(inNum,Paramas) 的方式不正确?

运行过程本身运行正常,这与日志中之前的打印结果一致。

为什么还是无法从缓存中获取新数据?

感谢您的建议。

亚历山大
Библиотеки: TesterCache - Что такое 0xCACA?
Библиотеки: TesterCache - Что такое 0xCACA?
  • 2019.08.31
  • Good Beer
  • www.mql5.com
Да и дальше взаимодействия с Оптимизатором нет никакого. в кеше Оптимизатора по каждому проходу хранятся все стат. Бонусом идет возможность запуска любого прохода из обновленной таблицы стандартными средствами в два щелчка
 
klycko #:
int GLOC = MTTESTER::GetLastOptCache(Bytess);
您已将 opt 文件接收到字节数组中。接下来,您需要将其输入缓存。

交易、自动交易系统和交易策略测试论坛。

库:TesterCache

fxsaber, 2019.11.11 04:45 pm.

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

  if (Cache.Load(Bytes)) // 读取优化缓存。
  {
 
fxsaber #:
您已收到一个字节数组中的 opt 文件。接下来,您需要将其输入缓存。

我按照你说的进行了更正:


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," Iteration ",IterNumber,"\n",Contr);


Run(Contr[0]); // 对选定的 Y 参数值进行优化

int GLOC = MTTESTER::GetLastOptCache(Bytess); // 将选项文件存入 Bytess 字节数组中

TESTERCACHE<ExpTradeSummary> Cache;

bool CL = Cache.Load(Bytess); // 将 Bytess 字节数组导入 Cache

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," GLOC," ProfitNow =",ProfitNow," ParamMax=",ParamMax," Odinar ",Kol," PoseY = ",PoseY," PosEq = ",PosEq," TypPar = ",TypPar," Iteration ",IterNumber);

返回;



结果仍然是错误的。

由于某些原因,从缓存中读取了之前运行的 ProfitNow 和 ParamMax 数据。

亚历山大

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

由于某些原因,从缓存中读取了以前运行的 ProfitNow 和 ParamMax 数据。

该脚本 在优化后是否显示正确值?

如果是,那么问题很可能是优化后的选项文件还没有准备好。您可以尝试将 "睡眠 "放在 "运行 "之后。或者运行不正常。

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

该脚本 在优化后是否显示了正确的数值?

如果是,问题很可能是优化后 opt 文件没有立即就绪。您可以尝试将 "睡眠 "放在 "运行 "之后。或者运行不正常。

谢谢!我明天再检查。

但现在我发现,如果用新参数设置优化,一切都能正常工作。

所以在我看来,问题的关键在于,如果重新设置之前已经起作用的优化,测试仪实际上并没有重新处理,而只是从内存中检索之前的结果。

难道就不能发明一种东西,事先破坏测试仪的这段记忆吗?

 
klycko #:

因此,在我看来,问题的关键在于,如果重新设置先前运行的优化,测试仪实际上不会再次处理,而只是从内存中检索过去的结果。

你的假设是错误的。问题出在你编写的代码中。

 
fxsaber #:

你的假设是错误的。问题出在你编写的代码上。

下午好!


我同意你说的 "问题出在我写的代码上"。错误就在代码中,我还不知道如何解决。

不过,我在实验中发现,如果在运行 Run.

C:\Users\ASUSAppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075\Tester\cache" 文件夹中的所有 opt 文件、

那么我的代码就能正常工作,并对所选参数进行优化。

如果不清理这个文件夹,测试器就不会重复执行优化(使用相同的不变数据),而是从这个文件夹中读出

已存在的选项文件。在手动重复运行相同优化时,可以清楚地看到这一点。

可以看出,实际优化只在第一次执行,然后才从文件夹中读取 opt 文件。

这种重复读取似乎不会更新缓存的内容,这就是导致我的代码出错的原因。


清除上述文件夹可能有助于解决该错误。当然,这是一个糟糕的解决方案,如果能在缓存中恢复正确的数据会更完美。

但我不知道该怎么做。目前,上一次真正优化的数据还挂在缓存中(与从文件夹中重新读取的数据不匹配)。


不幸的是,无法使用 FolderClean 从脚本中清理该文件夹,因为 MQL5 禁止这样做。

它不在 "沙箱 "中,只能由策略测试器填充。


也许您应该通过 C++ 创建一些外部插件,然后从脚本中运行它。


亚历山大

 
运行程序工作正常。它写入 "设置 "并按下 "开始 "按钮。一切正常。