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

 
休眠 10 秒钟也无济于事。只有清除该文件夹才能解决问题。
 
klycko 休眠 10 秒钟也无济于事。只有清除该文件夹才能解决问题。

发布优化MQL5\Experts\Examples\MACD\MACD Sample.mq5 的代码。然后你可以尝试重现它。现在几乎没有建设性的工作了。

 
fxsaber #:

上传优化MQL5\Experts\Examples\MACD\MACD Sample.mq5 的代码。然后你可以尝试重现它。现在几乎没有建设性的工作了。

谢谢!我会尽量准备好文件并发布出来。现在一切都还没有整理好。

 
fxsaber #:

上传优化MQL5\Experts\Examples\MACD\MACD Sample.mq5 的代码。然后你可以尝试重现它。现在几乎没有建设性的工作了。

下午好!

我已经准备好了文件并附在后面。

优化从 25.03 到 20.05.2024,时间框架 M1。

存款 17000。杠杆 40。复杂标准的最大值。


首先,我们需要清理 "C:\Users\ASUS\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075\Tester\cache "文件夹,以保证实验的纯净度。

为了优化 Nocturne 脚本,应该一次运行一个参数。

然后输出:

第一个参数:ProfitNow -1478 ParamMax 0.37(第一次)。

第二个参数: ProfitNow -379 ParamMax 30(第一次)。

第三个参数: ProfitNow -379 ParamMax 6(第一次)。


第三个参数:ProfitNow -379 ParamMax 6 重复使用。

对于第三个参数:ProfitNow -379 ParamMax 6 重复执行

第三个参数:ProfitNow -379 ParamMax 6 重复。


这表明第三个参数的数据缓存被挂起。


现在我们需要再次清除文件夹 "C:\Users\ASUS\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075\Tester\cache

然后又是重复


第一个参数:ProfitNow -1478 ParamMax 0.37 第一次。

第二个参数:ProfitNow -379 ParamMax 30(第一次)。

第三个参数: ProfitNow -379 ParamMax 6(第一次)。


对于第三个参数:ProfitNow -379 ParamMax 6 重复使用。

对于第三个参数:ProfitNow -379 ParamMax 6 重复执行

重复第三个参数:ProfitNow -379 ParamMax 6


Nocturne 脚本的第 151-154 行按照您的指示说明了一切:

运行(Odinar);

int GLOC = MTTESTER::GetLastOptCache(Bytes); // 将 opt 文件存入字节数组 Bytes

TESTERCACHE<ExpTradeSummary> Cache;

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


当然,错误就在我编写的代码中,但我还不知道如何修复它。

不过,我在实验中发现,如果在运行 Run 之前,手动删除 "C:\bytes "文件夹中的所有 opt 文件,就可以解决这个问题。

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

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


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

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

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

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


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

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

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

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


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


亚历山大

附加的文件:
 

文本中的错误:



下午好!

准备好文件并附上。

从 2024 年 5 月 25 日到 2024 年 5 月 20 日在时间框架 M1 上进行优化。

存款 17000。杠杆 40。复杂标准的最大值。


首先,我们需要清理 "C:\Users\ASUS\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075\Tester\cache "文件夹,以保证实验的纯净度。

为了优化 Nocturne 脚本,应该一次运行一个参数。

然后输出:

第一个参数:ProfitNow -1478 ParamMax 0.37(第一次)。

第二个参数: ProfitNow -379 ParamMax 30(第一次)。

第三个参数:ProfitNow -379 ParamMax 6(第一次)。


对于第一个 参数:ProfitNow -379 ParamMax 6 重复使用。

对于第二个 参数:ProfitNow -379 ParamMax 6 重复执行

第三个 参数:ProfitNow -379 ParamMax 6 重复。


这表明数据缓存挂起在第三个参数上。


现在我们需要再次清除文件夹 "C:\Users\ASUS\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075\Tester\cache"。

然后又是重复


第一个参数:ProfitNow -1478 ParamMax 0.37 第一次。

第二个参数:ProfitNow -379 ParamMax 30(第一次)。

第三个参数: ProfitNow -379 ParamMax 6,第一次。


对于 第一个 参数:ProfitNow -379 ParamMax 6 重复使用。

对于 第二个 参数:ProfitNow -379 ParamMax 6 重复执行

第三个参数:ProfitNow -379 ParamMax 6 重复。


Nocturne 脚本的第 151-154 行按照您的指示说明了一切:

运行(Odinar);

int GLOC = MTTESTER::GetLastOptCache(Bytes); // 将 opt 文件存入字节数组 Bytes

TESTERCACHE<ExpTradeSummary> Cache;

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


当然,错误就在我编写的代码中,但我还不知道如何修复它。

不过,我在实验中发现,如果在运行 Run 之前,手动删除 "C:\bytes "文件夹中的所有 opt 文件,就可以解决这个问题。

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

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


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

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

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

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


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

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

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

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


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


亚历山大

 

我已经发布了我的优化机器人,因为Nocturne是以它的参数列表为导向的。

但对于MQL5\Experts\Examples\MACD\MACD Sample.mq5 来说,它需要进行大量修改。


顺便问一下,为什么需要输入参数 int inNum = 0?

或者这只是一种习惯?

 
fxsaber #:

上传优化MQL5\Experts\Examples\MACD\MACD Sample.mq5 的代码。然后你可以尝试重现它。现在几乎没有建设性的工作了。

下午好!

在亚历山大-斯拉夫斯基(Alexander Slavsky)的帮助下,我成功地解决了所有问题:https://www.mql5.com/zh/users/s22aa。

他给我发了删除缓存内容的代码。

我无法直接清理缓存,因为它在沙盒之外。

也许有人会在运行运行程序之前使用它,这样过去的优化结果就不会干扰新的优化结果。

我附上了这个脚本。

你们的库和这个清理程序确保了我能够持续优化机器人。

非常感谢这些代码和你们的帮助。

亚历山大

Aleksandr Slavskii
Aleksandr Slavskii
  • 2024.05.27
  • www.mql5.com
Профиль трейдера
附加的文件:
 
klycko 重复 执行优化(使用相同的未更改数据),而是将其读出

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

你可以看到,真正的优化只在第一次进行,然后才从文件夹中读取 opt 文件。

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

sinput uint Range = 2;

void OnTesterInit( void )
{
  ::MathSrand((int)::TimeLocal());

  const int Start = ::MathRand();
  const int Step = ::MathRand();

  const uint TmpRange = (::Range < 2) ? 2 : ::Range;

  ::ParameterSetRange("Range", true, TmpRange, Start, Step, Start + (TmpRange - 1) * Step);
}
 
klycko #:

删除缓存内容的代码。

在 MTTester.mqh 中,当您进行大量单次运行时,就需要这样一个功能。

  static bool DeleteLastTST( void )
  {
    const string Path = ::TerminalInfoString(TERMINAL_DATA_PATH)+ "\\Tester\\cache\\";
    string FileNames[];

    const int Size = MTTESTER::GetFileNames(Path, "*.tst", FileNames);

    return(Size && kernel32::DeleteFileW(Path + FileNames[Size - 1]));
  }

如果将 tst 替换为 opt,就会删除最后一个 opt 文件。清理整个缓存文件夹似乎是多余的。

 
谢谢!