文章 "开发多模块智能交易系统"

 

新文章 开发多模块智能交易系统已发布:

MQL 编程语言允许实现交易策略的模块化开发概念。 本文展示由单独编译的文件开发多模块组合的智能交易系统示例。

作者:Sergey Pavlov

 
辅助(外部)模块是一个指标",这是一篇多么不寻常的论文啊!作者是否测试过这种设计的性能,尤其是资源消耗情况?
 

交易系统的多模态性主要由过程的性质决定(对于金融市场来说,价格变动是一个非稳态过程)。

要模拟这样一个复杂的过程(因为EA 的开发 始终是一个过程建模),单靠一种甚至是非常复杂的输入算法是不可能实现的。为了在精确度上更接近过程,我们需要一套算法(模块),每个模块都是一个独立的模型。

 
Aleksandr Masterskikh:

交易系统的多模态性主要由过程的性质决定(对于金融市场而言,价格变动是一个非稳态过程)。

而对这样一个复杂的过程进行建模(因为EA 的开发 始终是一个过程建模),仅靠单一的、甚至是非常复杂的输入算法是不可能实现的。要想在精度上更接近过程,我们需要一套算法(模块),其中每个模块都是一个独立的模型。

是的,是的,我想大多数人都采用这种方法--他们通过函数和类来实现它们,在极端情况下,他们只是从另一个文件中插入一段代码。我只是想知道,与上述方法相比,在指标中进行数据处理有什么优势。

[删除]  
为了模块化而模块化?
把 trall 和 lossless 放在两个不同的独立模块中?真的吗?
作者可能从未参与过优化工作,尤其是在 Mt4 中。
大多数作者都使用这种方法写作,最简单的函数都放在一个独立的模块中,每个 tick 被调用几十次。
这种解决方案会将优化时间从几十倍增加到几千倍。
 
Aleksey Vyazmikin:
辅助(外部)模块是一个指示器",这是一篇多么不同寻常的论文啊!作者还测试了这种设计的性能,尤其是资源消耗情况?

这篇文章是在我遇到一个指标的性能问题后诞生的。它消耗了资源和测试时间。因为它是用来生成交易信号的,所以我做了一个外部模块(信号指标)来代替它,它不绘制任何东西。结果,带有外部模块的智能交易系统 "飞 "了起来,尽管所有的计算仍然是完整的。

我同意您的观点,任何技术都有其开销。在这里,您需要做出妥协,选择更重要的东西。有时,隐藏算法比性能更重要。虽然模块化编程会降低性能,但这并不重要。在图中,我将所有外部模块 "挂 "在一张图上:


然后,我检查了 "智能交易系统 "本身的负载:在无外部模块和有外部模块的运行模式下。结果令人满意:


然后,我在策略测试器中 运行了它。

无外部模块

2018.03.26 06:32:23.684 Core 1  EURUSD,M1: 2378530 ticks, 24349 bars generated. Environment synchronized in 0:00:00.140. Test passed in 0:00:07.769 (including ticks preprocessing 0:00:00.171).


有外部模块

2018.03.26 06:33:49.859 Core 1  EURUSD,M1: 2378530 ticks, 24349 bars generated. Environment synchronized in 0:00:00.047. Test passed in 0:00:06.349.

如您所见,使用外部模块后,测试结束得更快。

这篇文章的目的是展示如何在其他人的代码中使用算法隐藏自己的算法。

 
Nikolay Khrushchev:
为了模块化而模块化? ,在 2 个不同的独立模块中取出 trall 和 no-loss?真的吗? ...

这篇文章展示了模块化编程技术:任何必要的函数或函数组都可以隐藏在外部模块中。

 
Sergey Pavlov:

这篇文章诞生于我遇到一个指标性能问题之后。它占用了资源和测试时间。因为它是用来生成交易信号的,所以我做了一个外部模块(信号指标)来代替它,它不绘制任何东西。结果,带有外部模块的 "智能交易系统""飞 "了起来,尽管所有计算仍然是满的。

我同意您的观点,任何技术都有其开销。在这里,您需要做出妥协,选择更重要的东西。有时,隐藏算法比性能更重要。虽然模块化编程会降低性能,但这并不重要。在图中,我把所有外部模块都 "挂 "在一张图上:


然后,我检查了 "智能交易系统 "本身的负载:在无外部模块和有外部模块的运行模式下。结果令人满意:


然后,我在策略测试器中 运行了它。

无外部模块:


有外部模块

如您所见,使用外部模块后,测试结束得更快。

这篇文章的目的是展示如何在其他人的代码中使用这些算法来隐藏自己的算法。

感谢您的详细回答。作为隐藏部分代码的一种可能性,也许这是一种选择。但是,谁会需要这样的模块呢?也就是说,你不能在市场上出售它,在自由职业者中,人们会要求你提供源代码,那么就只剩下一个选择了--在互联网上公开使用,而这里是禁止发布编译文件的。

使用指标加快计算速度--这是个耳熟能详的话题,有时真的很方便,可以让您摆脱智能交易系统中的循环。我现在刚刚开始研究这样一个指标。

 
Aleksey Vyazmikin:

是的,是的,我想大多数人都采用这种方法--他们通过函数和类来实现,在极端情况下,他们只是从另一个文件中插入一段代码。我只是想知道,与上述方法相比,在指标中处理数据有什么优势。

重要的是要区分

- 程序的模块化(当一个简单的模型被划分为多个模块时)

- 复杂模型的模块化(每个模块都是一个独立的模型)。


任何传统的指标都是一个简单的模型,需要一个复杂的模型、

因为简单模型不足以充分准确地反映过程。

因为简单的模型不足以充分准确地反映过程。

 
Aleksandr Masterskikh:

区分这两者很重要:

- 计划的模块性(当一个简单的模型被分解成多个模块时)

- 复杂模型的模块化(每个模块都是一个独立的模型)。


任何传统指标都是一个简单模型,但我们需要的是一个复杂模型、

因为简单模型不足以获得足够的准确性

的准确性。

比方说,我不知道什么是复杂模型的模块化,那么从你的评论中,我的知识并没有增加。

请举例说明嵌入指标的复杂模型。

 

作为一个非专业人员,我觉得这篇文章信息量很大,很适合初学者阅读。

但关于模块化,我认为示例并不完整。在我看来,如果在同一个例子中,主模块的每个功能都写在一个单独的文件中,然后在条件编译和嵌套的帮助下合并成一个文件--那么这就是模块化编写。在这种情况下,每个单独的部分都可以在不影响主代码的情况下重写。

举例来说,将代码

 if(on_lot)
     { // 如果有附加模块
      double buffer_m1[];
      ArraySetAsSeries(buffer_m1,true);
      if(CopyBuffer(handle_m1,0,0,1,buffer_m1)<0) return;
      lot=buffer_m1[0];
     }

代码:

 if(on_lot)
     { 
        LotCulcFuntion(lot);// 此函数在另一个文件中实现。
     }

附注:主文件中的模块指标名称与文件名称不一致。在主模块中需要添加"_ind",例如应为ind" 而不是" Module_training_module_Filter_ind"。 而不是 " Module_training_module_Filter"。