文章 "一张图表上多个指标(第 04 部分):晋升为一款智能交易系统"

 

新文章 一张图表上多个指标(第 04 部分):晋升为一款智能交易系统已发布:

在我之前的文章里,我已经解释了如何创建拥有多个子窗口的指标,在使用自定义指标时如此这般会变得很有趣。 这次,我们将看到如何为智能交易系统添加多个窗口。

当我决定运用 OOP(面向对象编程)创建一些新东西时(我这么做是因为我已经知道运用这种方式有很大的优势,包括安全性和继承性)。 还有多态性,我们将在稍后创建交叉订单系统时用到它。 在这种特殊情况下,我们将用到 OOP 的一项优势 — 继承。 C_TemplateChart 已经是一个功能齐全的类。 看到这一点,您就不想再为所有内容重新编程,或冒着风险往类中添加代码,因为这会阻碍该类在其它地方使用。 解决方案是运用继承,它允许添加新代码或函数,而不必改变原始代码。

运用继承有很多优势,包括以下几点:已经测试过的代码仍然保留测试过的状态;复杂度会随着代码量的增长而增加;只有新功能真正需要测试;只是继承不会改变原类,故可提供稳定性。 换言之,事情会以最小的代价得以改善,但却会带来最大的安全性。 为了理解这一点,我们来看下面的示意图。


作者:Daniel Jose

 
MetaQuotes:

新文章:一张图表上的多个指标(第 04 部分):从 EA 开始》已发布:

作者: Daniel Jose丹尼尔-何塞

你好,丹尼尔,我一直在关注你的文章,但第 03 部分呢?
 
Mateus Lopes #:
你好,丹尼尔,我一直在关注你的文章,但第 03 部分怎么样了?

在申请发布时出了点小问题,但我已经授权发布第 03 部分,很快也会发布,这个问题更多是由我已经发送的文章数量造成的......目前还有 15 篇文章需要他们分析,所有这些文章都与该 EA 的开发有关,而且每一篇文章的内容都会变得越来越复杂 ....,但还是要感谢您关注这个系列......期待从第 05 条开始的大量新内容,从那时起,它真的会变得很有价值,因为它将成为一件大事,前几条只是向您介绍即将发生的事情......😁👍

 

你好,丹尼尔、

我在使用多色指标时遇到了一些问题,我很喜欢您的文章,您可能知道解决方法。

我想创建一个不使用 #property 选项就能设置所有指标属性的函数,例如 #property indicator_color1 clrCrimson,clrWhite,clrLime

我在下面的测试程序中发现,如果包含#property indicator_color1 clrCrimson,clrWhite,clrLime 选项,程序就能正常运行,而如果将其注释掉,程序就不能正常运行。在这种情况下,程序似乎只绘制了部分数据点,好像使用了 "更高的 "时间框架,或者跳过了几个数据点。 我怀疑在指定多种颜色时,属性颜色指令设置了更多我没有识别的属性。

第二个问题是,我显然不了解使用多色曲线图的细节和要求。 我搜索了文档,但没有找到任何概述如何使用多色指标 的文章。 虽然第一个曲线图可以正确改变颜色,但第二个曲线图(绘制低点)并没有根据我的函数调用改变颜色。我使用 Mladen 的 Laguerre Adaptive Filter 指标确定,属性指标使用情节编号 2 而不是指标编号 3 才能正确显示。

如果能提供任何建议、参考资料或帮助,我将不胜感激。

卡普科达

附加的文件:
 
CapeCoddah 指示器 的文章。第一个图形的颜色变化是正确的,而第二个图形(追踪低点)并没有根据我的函数调用改变颜色。这个图形需要所有三个属性:type2、color2 和 width2 才能正常工作。我还感到困惑的是,为什么属性声明使用 2 而不是 3。我使用 Mladen 的 Laguerre Adaptive Filter 指标确定,属性指标使用图表编号 2 而不是指标编号 3 才能正确显示。

如果能提供任何建议、参考或帮助,将不胜感激。

真诚的,科达角

你有点困惑,我能理解......但所有的困惑都在于你没有真正关注代码中的细节。我先试着解释一下评论中的一些细节,然后再谈谈你的代码....。

第一点是,您甚至可以不使用#property indicator_colorN 而生成多色指标,但对用户甚至对您来说,这样更实用、更安全、更易于理解和修改代码,因为您只需进入属性修改其中的颜色即可,而对用户来说则更简单,因为他只需在 MT5 为指标创建的标准窗口中选择要修改的颜色并进行修改即可。当您使用PlotIndexSetInteger 命令生成颜色变化时,您已经在做正确的事情了,当我们不使用#property indicator_colorN 时就是这样,但当我们使用属性时,使用 PlotIndexSetInteger 命令设置其他颜色往往没有意义、这是因为维护起来会更复杂,用户也会更困惑,因为他可能并不真正理解颜色标准想要表达的意思,即使代码是你的,而且只有你一个人使用该指标,也没有太大意义,除非在极少数情况下,你创建了一个动态颜色模式。

现在谈谈第二点:在这种情况下,问题在于你将指标绘制的数量(2 条线为 2 个)与对象属性(本例中为线)混淆了,要绘制线,实际上至少需要声明 3 条信息,即TypeN、ColorN、WidthN,其中N 表示对象的编号。不要放弃......继续学习,很快你就会明白的😁👍

现在让我们看看你的代码...我不会告诉你具体的修复方法(如果我这样做就不好玩了...... .... 😁👍✌ ),我希望你注意以下事实,这很重要:

      Buf=Set_IndexBuffer5(Buf, dataHi, INDICATOR_DATA , DRAW_COLOR_LINE , 4 ,
"High" , clrYellow , clrWhite , clrDodgerBlue );
      Buf=Set_IndexBuffer5(Buf, dataHic, INDICATOR_COLOR_INDEX );
      Buf=Set_IndexBuffer5(Buf, dataLo, INDICATOR_DATA , DRAW_COLOR_LINE , 4 ,
"Low" , clrYellow , clrWhite , clrDodgerBlue );
      Buf=Set_IndexBuffer5(Buf, dataLoc, INDICATOR_COLOR_INDEX );

请注意,我在您的代码中标注了两点......现在让我们看看在图 .... 上播放时发生了什么。


看到了吗,只有一个标签与您在代码中声明的一样,只有 HIGH .... 和 LOW?!!她在哪里?!!这是您应该纠正的第一点,因为没有显示 LOW 标签这一事实表明,正在使用的颜色模式是在#property indicator_color2 中声明的,也就是说,您在这一点上失败了,如果您尝试删除实际创建 LOW 线的指标 2 的属性,即使保留代码的其余部分,HIGH 线也会绘制,但 LOW 线不会。......为什么?!!!因为事实上,您并没有定义绘制 LOW 线 需的信息,这是通过使用PlotIndexSetInteger 调用动态定义的......这看起来很奇怪......但事实就是这样 ....。

当您解决了这个问题,如果您真的想使用 PlotIndexSetInteger 动态声明行对象的数据,您就可以从场景中移除#property indicator_color 编译命令,因为必要的数据将被动态设置,但如果您不想这样做,也没关系....。

现在,我想让您看一下上面的图片,并将其与您在 #property indicator_color 中使用的颜色进行比较......仔细观察这些颜色 ....,如果您这样做,您会发现一些奇怪的地方 .... 我不会再说不要失去乐趣,但请尝试使用不同的颜色,不要重复任何一种颜色......当您重复这些颜色时,就会更难理解错误出在哪里...😁👍

最后一个细节:你认为他只绘制了某些点,而跳过了其他点,可能有两个原因:颜色模式与图表背景不一致,请尝试使用与图表背景一致的颜色;第二种,但我不认为是实际情况,可能是 OnCalcule 事件失败,您返回了 -1 或 i 的值,正确的做法是返回 rates_total,因此请在代码中修改这一点,以避免期货问题...

 

你好,丹尼尔、

我很困惑,我以为绘图特性是通过 MQ4 等缓冲区规范定义的,而至少 DRAW_COLOR... 规范的绘图特性是通过顺序绘图标识符定义的。我尚未确定 DRAW_LINE 等是否也需要绘图规范。 此外,indicator_colorX 属性实际上有两个功能,首先是计算和设置颜色的数量,然后将每种指定的颜色设置到适当的数组位置。我在此附上两个文件,一个是 Color Test,它现在可以正常运行,不过还需要进一步完善;另一个是 MLADEN 的 MACD Original2_1,稍作修改。 Mladen 的程序很有意思,他定义了两个图,但只使用了一个颜色索引缓冲区。


感谢您的帮助

附加的文件: