1

这主要是一个理论问题(但总是欢迎示例代码)。

真正的问题是:如何正确编写 EA 的“框架”来测试来自多个自定义指标的多个场景?

我(忙)构建 EA 的方式不是非常专注于一种策略,而是会尝试“测试”多种策略并“挑选”最合适的一种。

所以我创建了一些自定义指标,它们都返回一个“状态数据”数组。

例如我有以下指标:

  • 交叉移动平均线指标,当平均线被交叉时给出一个信号,以及当前位置从 MA 移动的百分比。
  • 布林带指标,返回波段之间的“空间”,并在波段开始“挤压”时发出信号。
  • 多时间框架“方向/趋势”指标(是向上或向下移动的某个时间框架)。如果时间框架方向发生变化,它将返回当前方向并发出信号。
  • ADX 指标,用于检查“小规模”运动和选择最佳买入/卖出点。

我可以写一个巨大的场景,但我认为它可以做得更好。因为如果,假设所有时间框架都在下降(下降趋势),你可以有一个特殊的场景来处理大量的下降运动。但是,如果没有当前的趋势,那么不同的情景将最适合。

所以,我觉得最好制作多个场景(仍然在 1 个 EA 中)。首先收集所有自定义指标数据,然后每个场景使用该数据来计算其内容。然后它会返回一个“分数”并挑选出最好的分数。

但是我怎样才能以最好的“概述”方式布局代码呢?

我应该为每个场景创建一个类并给他们一个带有数据的手动“打勾”吗?只是将它们分成多个文件和#include它们?

或者也许是事件驱动的?创建的类只是继续运行、计算和设置某些指标事件的侦听器并以自己的方式进行(那太棒了)

任何想法都非常受欢迎!


更新2016-01-11,12:00

我现在没有时间创建 UML .. 但我现在执行以下操作 ->

  • OrderOrder是单例,只是执行订单请求)
  • Indicator(每个指标扩展的基类)
  • Strategy(每个策略扩展的基类)

  • IndicatorFetcher(保存所有指标,在每个刻度上运行)

  • StrategyRunner(保存所有策略,在每个刻度上运行,之后IndicatorFetcher

每个Strategy实例都可以访问IndicatorFetcher(持有包含所有指标数据的概览,并使用Order单例执行交易)。

4

3 回答 3

1

对于复杂的场景,将每个场景分成类将很有用。类分为相互交互的任务和数据。一个指标可以包装在一个数据类中,该类被馈送到一个监视器任务中。可以创建一个大的 Action-task-class 来响应多个监视器类。

于 2015-12-21T02:02:54.140 回答
1

. . . 关于爬行主题的评论

StackOverflow 鼓励用户发布与MCVE相关的问题,因为社区有动力提供与MCVE相关的答案。

algorithmic-tradingquantitative-finance特别是关于问题领域的窄带专业化和最终以利润为导向的动机MQL4的领域非常非常具体。话虽如此,StackOverflow 似乎并不是讨论交易策略开发工作的高级架构和开发策略的最佳场所,而且有时可能面临来自一些自成一体的强硬派政策执行者的强烈负面反馈



尽管上面提到了所有内容,但该问题的最后更新使该主题与上述理论推广的 StackOverflow 理想相距甚远。(...已经被警告)



特设最后更新:
关于类继承和单例+其他模式架构


您可能会重新考虑一些事实,它们不是软件工程传播理论或面向最佳实践的,但对于量化建模非常重要,交易领域就是这样。

- OOD/OOP理想可能并且将会受到MQL4语言限制的可扩展性(到目前为止C++

- 设计模式,在其他领域中很常见,不需要在MQL4事件触发的受限代码执行设施下工作(你无法控制mainloop()- 具有自定义添加的类似结构事件侦听器,如果尝试设计一个“可行的”类似 MVC 的框架,则确实MQL4存在很多问题OnTick()

strategy破坏了定量建模和优化服务的整个StrategyTester框架。如果确实对量化建模投资组合聚合策略感兴趣,还有其他工具可以做到这一点,但绝对不是MQL4自下而上的编码。

- 在同一流程下组合许多策略实际上是零收益,而未执行的风险 -XTO操作既超出您的控制范围,而且呈指数级增长,这正是良好的设计实践努力避免和主要防止的。


初始说明:架构是你的敌人(不是代码的“布局” MQL4

正如您在之前的问题中所讨论的,正确理解MetaTrader Terminal 4代码执行生态系统是否是您的最佳路线图。


MT4 的流程管理限制

这是任何大型项目的核心 alpha 和 omega。

在具有 GUI-Finite-State-Automaton 层的 MT4 事件方案之上完成 GPU / GPU-grid / 混合双事件控制器,将其实际状态输入分布式后端处理以实现真正快速的 MQL4-EA,由于适当注意共享资源使用稳定性(避免竞争条件)和主要非阻塞设计(避免冲突作为首选的并发方面),所有这些宏伟的项目都是可行的并且工作正常。

有关 MT4 的流程管理限制的介绍,请查看此帖子


#include与否#include(这是个问题……)

无需询问丹麦王子哈姆雷特,该#include指令已经为您的代码库做好了准备,但它并不能单独有效地处理您的所有压力。

基于为代码库提供开发和维护跨越数百人*年的经验,这#include不是万事通。

一个经过深思熟虑的选择...... IDE 加上一些自制的词法分析器和语法验证器......是关键,因为这是您的团队真正的生产力工具(或性能制动,如果选择不好)。

不要犹豫,在这篇文章中阅读一些关于此的注释


最后的评论:

虽然最初的帖子
的动机是
“如何在其中编写一些巨大的东西MQL4
[请原谅我故意过度简化以有更强烈的对比和关注优点的名义]

恕我直言

交易有完全不同的目标 - 这是一门营利性学科, 通常设计任何代码之前使用量化方法,
反之亦然意味着量化建模的交易策略并且由于本文范围之外的原因我宁愿声明它是一个TruStrategy,一个 5 维的策略字段应该在任何代码实现开始之前 提供先验意义 [The Profit-generation Performance]这意味着,任何设计者只能提出一个可行的方法临时的,而不是先验的






{ S, D, A, A, T }





- 最终导致巨大的遗留代码、智能(er)-OOD 代码或微小且足够的代码。在所有 5 维中

没有已知的 TruStrategy 行为
(不仅仅是事件的频率、信号检测的复杂性、对 alpha、beta 和黑天鹅因素的敏感性,有多少交易要在运行中并行管理
)从字面上看
,无论是在紧密的实时事件流控制循环中
寻找纳秒级
[如果位于频谱的 HFT 端附近]
,还是
努力减少维护非进化模型所花费的时间/天数
[如果 PB 的静态数据首先为自适应 AI/ML 模型进行处理,其中非凸GridSearchcross-validation minimiser 是为机器联盟选择最合适的成员,它可以每周可靠地预测一组 1 或 2 个成功交易机会]

信不信由你,生成的代码不同——很多。 ..

于 2015-12-18T13:38:52.340 回答
0

我一开始就在 OnTick 中收集我的所有数据。然后我知道我拥有的所有数据。与数据收集并行的是打印语句,因此我可以在专家选项卡中看到它们。可以使用其他几种方式来查看数据。在这个带有所有打印语句的函数中,如果您在编写和调试代码时需要在代码中查找一些变量,您可以去复制、粘贴到您正在工作的区域。

我使用 xmind.net 免费版来做代码流程。这有助于在问题更容易修复时识别问题。找出你的伪代码,然后在它准备好时填写它。一些 Xmind 可能最终会出现在注释中。

我发现对于我的文档,尽可能在代码中进行。其他方式使文档不同步并成为挑战。

使用 GitHub 或类似工具来存储您的更改。拍摄所有代码的完整快照,包括文件文件夹中的任何内容等等。我宁愿保存东西而不需要它,也不愿需要它而不拥有它。

在您的发布版本中,在前面加上日期:JosephsProject.mq5 // 发布版本 - 被认为是功能性的 20201215_JosephsProject.mq5(以及可执行文件)以及它现在是如何工作的。并且您可以在创建“发布版本”时在不挖掘所有包含文件和快照的情况下进行测试。

多台或大型显示器可提高生产力。我使用 50 英寸 4K 高清电视。我在最高像素设置下使用它,它让我有更多的空间来编码,并且我的所有工具都可以布局而不是像扑克牌那样堆叠。

将开发分解为小任务。您可能希望使用 KanbanFlow.com 来保持您的 ToDo 列表井井有条。您还可以看到有助于激励的 DONE 项目。如果您有多个人参与该项目,这也很有用。

随时保持代码清洁。可以测试并弄得一团糟,但是一旦确定了理想的代码,您就可以去清理所有杂乱和未使用的变量。

使用格式化行来分解逻辑块。

我对代码的排列方式很挑剔。这可能只是我的一些强迫症。

我喜欢留下很多笔记,即使只是我编码。当我必须回到这部分代码时,我想知道什么?

最后使用任何可以帮助并跳过其他的。你将是做这件事的人,所以选择最好的,如果需要的话,可以选择。

最好的祝愿。

于 2021-12-16T07:05:02.160 回答