文章 "开发多币种 EA 交易(第 20 部分):整理自动项目优化阶段的输送机(一)"

 

新文章 开发多币种 EA 交易(第 20 部分):整理自动项目优化阶段的输送机(一)已发布:

我们已经创建了不少有助于安排自动优化的组件。在创建过程中,我们遵循了传统的循环结构:从创建最小的工作代码到重构和获得改进的代码。是时候开始清理我们的数据库了,这也是我们正在创建的系统中的一个关键组件。

在本系列文章中,我们尝试创建一个自动优化系统,该系统允许在没有人为干预的情况下找到一种交易策略的参数的良好组合。然后,这些组合将组合成一个最终的 EA。第 9 部分第 11 部分更详细地阐述了目标。这种搜索过程本身将由一个 EA(优化 EA)控制,在其操作过程中需要保存的所有数据都设置在主数据库中。

在数据库中,我们有表来存储有关几类对象的信息。有些类具有状态字段,可以从一组固定的值(“Queued”(排队)、“Process”(处理)、“Done”(完成))中获取值,但并非所有类都使用此字段。更准确地说,目前它仅用于优化任务(task)。我们的优化 EA 在任务表(task)中搜索排队任务以选择下一个要运行的任务。每个任务完成后,其在数据库中的状态将更改为“Done”。

让我们尝试不仅对任务,而且对所有其他类别的对象(作业、阶段、项目)实现状态自动更新,并安排所有必要阶段的自动执行,直到获得最终的 EA,该 EA 可以独立工作,而无需连接到数据库。

作者:Yuriy Bykov

 

尝试运行您的示例。

我设置了 groupId_ = 1。

但在初始化函数中没有创建专家。这就是问题所在:

int OnInit() {
// 在资本管理类中设置参数
   CMoney::DepoPart(expectedDrawdown_ / 10.0);
   CMoney::FixedBalance(fixedBalance_);

// 包含策略参数集的初始化字符串
   string strategiesParams = NULL;

// 如果从策略库中选择的策略组索引有效,则
   if(groupId_ >= 0 && groupId_ < ArraySize(CGroupsLibrary::s_params)) {
      // 从库中获取选定组的初始化字符串
      strategiesParams = CGroupsLibrary::s_params[groupId_];
   }

// 如果未指定库中的策略组,则中止操作
   if(strategiesParams == NULL) {
      return INIT_FAILED;
   }

// 为包含多个策略组的智能交易系统准备初始化字符串
   string expertParams = StringFormat(
                            "class CVirtualAdvisor(\n"
                            "    class CVirtualStrategyGroup(\n"
                            "       [\n"
                            "        %s\n"
                            "       ],%f\n"
                            "    ),\n"
                            "    class CVirtualRiskManager(\n"
                            "       %d,%.2f,%d,%.2f,%.2f,%d,%.2f,%.2f,%d,%.2f,%d,%.2f,%.2f"
                            "    )\n"
                            "    ,%d,%s,%d\n"
                            ")",
                            strategiesParams, scale_,
                            rmIsActive_, rmStartBaseBalance_,
                            rmCalcDailyLossLimit_, rmMaxDailyLossLimit_, rmCloseDailyPart_,
                            rmCalcOverallLossLimit_, rmMaxOverallLossLimit_, rmCloseOverallPart_,
                            rmCalcOverallProfitLimit_, rmMaxOverallProfitLimit_, rmMaxOverallProfitDate_,
                            rmMaxRestoreTime_, rmLastVirtualProfitFactor_,
                            magic_, "SimpleVolumes", useOnlyNewBars_
                         );

   PrintFormat(__FUNCTION__" | Expert Params:\n%s", expertParams);

// 创建使用虚拟仓位的智能交易系统
   expert = NEW(expertParams);

// 如果未创建智能顾问,则返回错误信息
   if(!expert) return INIT_FAILED;

...
}


如果我们深入研究,在 CVirtualFactory() 中并没有创建对象:

class CVirtualFactory {
public:
   // 根据初始化字符串创建对象
   static CFactorable* Create(string p_params) {
      // 读取对象类别名称
      string className = CFactorable::ReadClassName(p_params);
      
      // 指向要创建对象的指针
      CFactorable* object = NULL;

      // 根据类名,调用相应的构造函数
      if(className == "CVirtualAdvisor") {
         object = new CVirtualAdvisor(p_params);
...

您能告诉我问题出在哪里吗?

谢谢。

 

你好

您可能还没有完成在参数库中创建条目的工作,甚至还没有完成自动优化的所有其他必要步骤。例如,您可以在第 17 部分 阅读更多关于最后一步--填充参数库--的内容。

不过,问题的关键可能有所不同。理想情况下,运行最终的 EA 不需要数据库。我会检查代码并稍后回复。
 
我查看了这篇文章的代码。事实上,到目前为止,我们还没有到达自动化的最后阶段,即自动生成未与优化数据库链接的最终 EA。这将在今后的文章中完成。现在,为了获得结果,有必要初步执行管道的第一阶段。
 

你好,尤里

我用谷歌翻译找到了第 20 部分。 谷歌 "谷歌翻译",并将其放在浏览器的新标签页上。 它会在搜索栏最右侧放置一个图标。 加载母语页面,然后按图标选择文章语言和要翻译成的语言。 很快,我就找到了第 20 部分!它做得并不完美,但翻译 99% 是有用的。

我将您的 Archive Source 载入 Excel,并添加了几列进行排序,以安排内容。除了在 Excel 中排序外,电子表格 还可以直接导入 OutLook 数据库。


我在确定建立 SQL 数据库的起始文章时遇到了问题。 我试着运行 Simple Volume Stage 1,得到的结果是一条平线,这表明我可能需要回溯并创建另一个 SQL 数据库。 如果能有一个表,列出执行必要程序的顺序,对建立一个工作系统会非常有帮助。也许你可以把它添加到存档源表中。

另一个微小的要求是在包含文件规格时使用 <> 选项,而不是""。 我将您的系统分别保存在我的专家目录和包含目录中,#include <!!!!MultiCurrency/VirtualAdvisor.mqh>,因此这一更改将使添加子目录规范/变得更容易。

感谢您的意见

科达角

附加的文件:
 

您好。

关于项目、阶段、工程和任务信息的数据库初始填充,您可以参见第 13、18 和 19 部分。这不是主要话题,所以您需要的信息会在文章末尾的某个地方。例如,在第 18 部分:

Проверив, что в базу данных теперь корректно попадают результаты проходов, совершаемых с использованием форвард-периода, проведём более приближенный к реальным условиям тест работы автоматической оптимизации. Для этого в чистую базу данных добавим уже два этапа. На первом будет оптимизироваться одиночный экземпляр торговой стратегии, но только на одном символе и периоде (EURGBP H1) на промежутке 2018 - 2023 годов. Форвард-период на этом этапе использоваться не будет. На втором этапе будет оптимизироваться группа из хороших одиночных экземпляров, полученных на первом этапе. Теперь форвард период уже будет использоваться: под него отводится весь 2023 год.

或第 19 部分:

让我们在数据库中为项目创建四个阶段,分别命名为 "第一阶段"、"从第一阶段开始的聚类"、"第二阶段 "和 "带聚类的第二阶段"。在每个阶段,我们将为 H1 时间框架上的 EURGBP 和 GBPUSD 符号创建两个作品。对于第一阶段的工作,我们将创建三个具有不同标准(复杂、最大利润和自定义)的优化任务。对于其余工作,我们将各创建一个任务。我们将以 2018 年至 2023 年为优化区间。我们将为每项工作指定正确的输入参数值。

您也可以等待下一篇文章,其中将专门讨论借助辅助脚本对数据库进行初始填充的问题。

改用 include 文件夹存储文件 也在计划之中,但目前还未实现。

 
Yuriy Bykov 存储 库 的计划中,但到目前为止还没有实现。

非常感谢

 

你好,尤里、

您提交下一篇文章了吗?

 
你好,很可能在一个月左右。