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

 
Edgar:

如果你指的是如何查看优化结果,我指的是从缓存中以编程方式读取结果。

我不是这个意思。但缓存读取是可能的。你只需编写程序即可。

[删除]  

很酷的东西

把 Cycles 也拧上了,这正是我所缺少的 )))))

#include <fxsaber\MultiTester\MultiTester.mqh> // 在测试器中进行多次运行/优化。

enum CyclNum
{
   n01   = 1,     // 1
   n02,           // 2
   n03,           // 3
   n04,           // 4
   n05,           // 5
   n06,           // 6
   n07,           // 7
   n08,           // 8
   n09,           // 9
   n10,           // 0
};
sinput bool Period_M1 = false;         // 打开 M1
sinput bool Period_M5 = false;         // 打开 M5
sinput bool Period_M15 = false;        // 打开 M15
sinput bool OnlyCustomSymbols = false; // 仅限自定义字符
sinput CyclNum number_cycles  = n06;   // 周期数

// 该函数负责生成任务列表。
void SetTesterSettings()
{
   for(int n = 0; n < number_cycles; n++)
   {
      // 从市场观察中搜索所有符号。
      for (int i = SymbolsTotal(true) - 1; i >= 0; i--)
      {

谢谢!

 
Сергей Таболин:

我在其中添加了 Cycles,这正是我所需要的 ))))

我需要测试仪中的按键功能。这样自动化程度就会不同。

 

我为我需要的控件添加了一些函数(存款、货币、杠杆、OptimisationType、BarsType、标准)。但我还没有进行测试。之后我可以发布它。

我想实现代理管理。例如,您可以点击代理列表,按 HOME 键,然后用 VK_DOWN 选择每个代理。但我不知道如何调用选定行的上下文菜单。按 "d"/"e "键可以禁用/启用。

谁能给我一点提示?

启用/禁用云(在打钩或交叉优化前禁用)就更难了。即使进入右键菜单,也无法明确启用/禁用,只能翻转。你无法通过编程找出当前状态。你可以从终端日志 "2019.07.31 19:27:35.664 Tester Cloud servers using switch off "中读取。似乎也无法通过编程读取日志,必须查看日志文件。

仍有可能出现未注明的 WinAPI 命令。也许有些 C++ 程序员知道如何找到它们?

[删除]  

面临停电问题。现在我不知道做了多少优化 ((((

如果我有时间,我会尝试添加一个总优化百分比和工作字符的检查。希望作者不要介意。)))或者他想自己做?

 
Сергей Таболин:

面临停电问题。现在我不知道做了多少优化 ((()

MultiTester 会在日志中反映其步骤。如果终端保存了日志,就能看到所有内容。

此外,优化缓存是 100% 保存的。所以你可以看到执行了什么。

 
Edgar:

我为我需要的控件添加了一些函数(存款、货币、杠杆、OptimisationType、BarsType、标准)。但我还没有进行测试。之后我可以发布它。

在解决私人问题之前,最好先描述一下使用 其解决方案的场景。

 
fxsaber:

在解决私人问题之前,最好先预设使用其解决方案的情景。

我在上一页描述了我的方案。

Clicker 并不能替代一切,它只是自动优化所需的几种工具之一。它可以让你在一个终端上完成所有操作,而无需启动其他终端。我还想添加 用于分析结果的框架(您用于读取优化缓存的新库也可用于相同目的)、用于管理输入变量的函数、用于存储状态和统计数据的 SQLITE。您还可以编写智能优化脚本。无法实现通用性,每个智能交易系统都有自己的脚本。您必须手动创建脚本,然后才能重复应用。

已经添加了框架。我有使用 SQLITE 的经验。

我只是根据自己的需要扩展了您的库。我相信您自己也在计划中,但我没有等待。这是上述技术中我唯一没有现成解决方案的技术。顺便说一下,我检查了我的附加组件,它们都能正常工作。代理管理问题仍然存在。对于有经验的系统工程师来说,Spy++ 可以帮助捕捉信息,但对我来说帮助不大,我需要知道该过滤什么。我希望大家能提起来。这个话题从 2008 年就开始出现了。

 
Edgar:

以下是我想改进的方法。我的典型优化方案:

运行 N 次 OHLC 遗传运行。根据自定义的标准,从每个运行中提取最佳结果。

对每组参数(每组有 2-3 个相互依赖的参数)进行缓慢优化。

对每组参数重复迭代慢速优化,直到达到最优(参数停止浮动)。

切换到实际刻度,执行相同的慢速优化。

切换到另一个符号,重复所有操作。

我面前没有这样的任务。当然,如果能实现自动化就更好了。

我自己正在努力通过自动优化 指标来制定 TS 的稳健性标准。这对提高研究的客观性非常不利。

自动优化器的方案是经过深思熟虑的,实施起来没有任何技术障碍。

Bibla 肯定需要功能上的补充。因此,请提出您的建议。

 
enum eOptType   { eOptOff, eOptSlow, eOptGen, eOptAllSym };
enum eBars      { eBarsEvery, eBarsReal, eBarsOHLC, eBarsOpen, eBarsMath };
enum eCriteria  { eCritBal, eCritPF, eCritEPO, eCritDD, eCritRF, eCritSR, eCritCust };



class MTTESTER {
public:

        static bool 
        SetOptType(eOptType opt) {
                const bool rc = MTTESTER::IsReady();
                if (rc) {
                        static const int ControlID[] = { 0xE81E, 0x804E, 0x28EC, 0x28FB };
                        GET_HANDLE
                        user32::SendMessageW(Handle, WM_KEYDOWN, VK_HOME, 0);
                        for (int i = 0; i < opt; i++)
                                user32::SendMessageW(Handle, WM_KEYDOWN, VK_DOWN, 0);
                }
                return rc;
        }



        static bool 
        SetBars(eBars type) {
                const bool rc = MTTESTER::IsReady();
                if (rc) {
                        static const int ControlID[] = { 0xE81E, 0x804E, 0x28EC, 0x2913 };
                        GET_HANDLE
                        user32::SendMessageW(Handle, WM_KEYDOWN, VK_HOME, 0);
                        for (int i = 0; i < type; i++)
                                user32::SendMessageW(Handle, WM_KEYDOWN, VK_DOWN, 0);
                }
                return rc;
        }



        static bool 
        SetCriteria(eCriteria type) {
                const bool Res = MTTESTER::IsReady();
                if (Res) {
                        static const int ControlID[] = { 0xE81E, 0x804E, 0x28EC, 0x290B };
                        GET_HANDLE
                        user32::SendMessageW(Handle, WM_KEYDOWN, VK_HOME, 0);
                        for (int i = 0; i < type; i++)
                                user32::SendMessageW(Handle, WM_KEYDOWN, VK_DOWN, 0);
                }
                return Res;
        }



        static bool 
        SetCurrency(const string name) {
                const bool Res = MTTESTER::IsReady();
                if (Res) {
                        static const int ControlID[] = { 0xE81E, 0x804E, 0x28EC, 0x293F, 0x03E9 };
                        GET_HANDLE
                        user32::SendMessageW(Handle, WM_LBUTTONDOWN, 0, 0);
                        user32::SendMessageW(Handle, WM_KEYDOWN, VK_DELETE, 0);
                        char Chars[];
                        const int Size = ::StringToCharArray(name, Chars);
                        for (int i = 0; i < Size; i++)
                                user32::SendMessageW(Handle, WM_CHAR, Chars[i], 0);
                }
                return Res;
        }



        static bool 
        SetDepo(const long depo) {
                const bool Res = MTTESTER::IsReady();
                if (Res) {
                        static const int ControlID[] = { 0xE81E, 0x804E, 0x28EC, 0x28F9, 0x03E9 };
                        GET_HANDLE
                        user32::SendMessageW(Handle, WM_LBUTTONDOWN, 0, 0);
                        user32::SendMessageW(Handle, WM_KEYDOWN, VK_DELETE, 0);
                        string s = IntegerToString(depo);
                        char Chars[];
                        const int Size = ::StringToCharArray(s, Chars);
                        for (int i = 0; i < Size; i++)
                                user32::SendMessageW(Handle, WM_CHAR, Chars[i], 0);
                }
                return Res;
        }



        static bool 
        SetLeverage(const long leverage) {
                const bool Res = MTTESTER::IsReady();
                if (Res) {
                        static const int ControlID[] = { 0xE81E, 0x804E, 0x28EC, 0x28E9, 0x03E9 };
                        GET_HANDLE
                        user32::SendMessageW(Handle, WM_LBUTTONDOWN, 0, 0);
                        user32::SendMessageW(Handle, WM_KEYDOWN, VK_DELETE, 0);
                        string s = "1:" + IntegerToString(leverage);
                        char Chars[];
                        const int Size = ::StringToCharArray(s, Chars);
                        for (int i = 0; i < Size; i++)
                                user32::SendMessageW(Handle, WM_CHAR, Chars[i], 0);
                }
                return Res;
        }