【问题标题】:MQL4, Code layout for big EAMQL4,大型 EA 的代码布局
【发布时间】:2015-12-18 12:38:24
【问题描述】:

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

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

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

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

例如我有以下指标:

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

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

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

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

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

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

欢迎提出任何想法!


更新2016-01-11,12:00

我现在没有时间创建 UML.. 但我现在做以下 ->

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

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

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

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

【问题讨论】:

    标签: low-latency algorithmic-trading quantitative-finance mql4 metatrader4


    【解决方案1】:

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

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

    algorithmic-tradingquantitative-finance 尤其是 MQL4 域在窄带专业化和最终利润导向的动机方面非常具体

    也就是说,StackOverflow 似乎不是讨论交易策略开发工作的高级架构和开发策略的最佳场所,而且可能偶尔面临来自一些自命不凡的强硬派政策执行者的强烈的负面反馈

    虽然上面提到了所有内容,但问题的最后更新使主题又向前迈进了一步离所说的理论上提升了 StackOverflow 的理想更远了。 ( ... '已经被警告过)



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


    您可能会重新考虑一些事实,它们不是软件工程传播理论或面向最佳实践的,但对于量化建模非常重要,交易领域就是这样。
    - OOD/OOP Ideals 可能也将受到 MQL4 语言有限可扩展性的影响(到目前为止 !C++

    - 设计模式,常见于其他域,不需要在 MQL4 事件触发的受限代码执行设施下工作(您无法控制 mainloop()-alike 具有自定义添加事件侦听器的构造,并且如果尝试设计“MQL4”确实有很多问题-viable” 类似 MVC 的框架,只是“挂在”OnTick() 外部事件注入器。

    - “multi”-strategy操作模式的想法摧毁了整个 StrategyTester 量化建模和优化服务框架。如果确实对量化建模组合感兴趣io-aggregated 策略,还有其他工具可以做到这一点,但绝对不是 MQL4-coding 自下而上。

    - 在同一流程下组装许多策略实际上是零收益,而风险未执行 XTO-操作都不受您的控制并且呈指数增长,这正是良好的设计实践力求避免和主要是防止。

    初始说明:架构是你的敌人(不是“布局”-of-MQL4-code)

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


    MT4 的流程管理限制

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

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

    MT4流程管理限制介绍,check this post


    #include 还是 #include(这是个问题……)

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

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

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

    不要犹豫read a few notes on this in this post


    最后的话:

    虽然最初的帖子
    的动机是
    “如何在MQL4 中编写巨大的程序”
    [请原谅我故意过度简化以具有更鲜明的对比和专注于优点的名义]

    恕我直言

    交易的目标完全不同 - 这是一门营利学科,
    定量方法
    通常在设计任何代码之前使用,
    反之亦然

    这意味着
    量化建模交易策略
    (由于本文范围之外的原因
    我宁愿将其声明为 TruStrategy , 一个 5 维的策略字段 { S, D, A, A, T } )

    应提供先验意义 [利润生成性能]
    在任何代码实施开始之前

    这意味着,
    任何设计者都可以提出一种仅临时的可行方法,不是先验 - 最终导致巨大的遗留代码、智能(er)-OOD 代码或微小且足够的代码。

    没有已知所有 5 维的 TruStrategy 行为
    (不仅仅是事件的频率、信号检测的复杂性、对 alpha、beta 和黑天鹅因素的敏感性,要并行管理多少笔交易) the-fly )
    一个人实际上一无所知
    是否
    在紧密的实时事件流控制循环中寻找纳秒
    [如果定位在 HFT 频谱末端附近]

    努力减少用于维护非进化模型的时间/天数
    [如果首先要为自适应 AI/ML 模型处理 PB 的静态数据vex GridSearch cross-validation minimiser 是为机器联盟挑选最合适的成员,可以稳健地预测一组每周 1 或 2 个成功交易机会]

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

    【讨论】:

    • 你今天帮了大忙@user366197 :) 不知道你也可以使用另一个IDE..这确实节省了很多痛苦。我发现 MQL 的“环境”比最初想象的要大。认为没有其他方法,然后在必要时继续构建和重构,因为在互联网上几乎没有任何指导方针可以找到更大的 EA。谢谢
    • 有人可以分解SDAAT{ S, D, A, A, T }吗?谷歌搜索没有找到任何有用的东西。
    【解决方案2】:

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

    【讨论】:

    • 虽然 New-MQL4.56789-classes + 方法可能看起来很有吸引力,但它们不会帮助您自己设计 co -例程或其他并发代码操作,大型项目进入。在MQL4 中,仍然顺序的代码不是一种前进的方式(无论是以命令式还是面向对象的方式编程,它仍然保持顺序执行 QED 的串行幼稚
    【解决方案3】:

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

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

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

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

    在您的发布版本中,在前面加上日期,如下所示: JosephsProject.mq5 // 发布版本 - 相信是功能性的 20201215_JosephsProject.mq5(以及可执行文件) 现在,您可以拥有此代码,您可以在其中比较是否需要它的工作方式以及现在的工作方式。并且您可以在不挖掘“发布版本”创建时的所有包含文件和快照的情况下进行测试。

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

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

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

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

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

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

    最后使用其中的任何一个来帮助并跳过其他的。您将是这样做的人,因此请选择最好的,如果需要,请选择。

    最好的祝愿。

    【讨论】:

      猜你喜欢
      • 2020-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-13
      • 1970-01-01
      • 2010-09-23
      • 2012-08-30
      • 1970-01-01
      相关资源
      最近更新 更多