你好,丹尼尔、
我在使用多色指标时遇到了一些问题,我很喜欢您的文章,您可能知道解决方法。
我想创建一个不使用 #property 选项就能设置所有指标属性的函数,例如 #property indicator_color1 clrCrimson,clrWhite,clrLime
我在下面的测试程序中发现,如果包含#property indicator_color1 clrCrimson,clrWhite,clrLime 选项,程序就能正常运行,而如果将其注释掉,程序就不能正常运行。在这种情况下,程序似乎只绘制了部分数据点,好像使用了 "更高的 "时间框架,或者跳过了几个数据点。 我怀疑在指定多种颜色时,属性颜色指令设置了更多我没有识别的属性。
第二个问题是,我显然不了解使用多色曲线图的细节和要求。 我搜索了文档,但没有找到任何概述如何使用多色指标 的文章。 虽然第一个曲线图可以正确改变颜色,但第二个曲线图(绘制低点)并没有根据我的函数调用改变颜色。我使用 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 的程序很有意思,他定义了两个图,但只使用了一个颜色索引缓冲区。
感谢您的帮助
新文章 一张图表上多个指标(第 04 部分):晋升为一款智能交易系统已发布:
在我之前的文章里,我已经解释了如何创建拥有多个子窗口的指标,在使用自定义指标时如此这般会变得很有趣。 这次,我们将看到如何为智能交易系统添加多个窗口。
当我决定运用 OOP(面向对象编程)创建一些新东西时(我这么做是因为我已经知道运用这种方式有很大的优势,包括安全性和继承性)。 还有多态性,我们将在稍后创建交叉订单系统时用到它。 在这种特殊情况下,我们将用到 OOP 的一项优势 — 继承。 C_TemplateChart 已经是一个功能齐全的类。 看到这一点,您就不想再为所有内容重新编程,或冒着风险往类中添加代码,因为这会阻碍该类在其它地方使用。 解决方案是运用继承,它允许添加新代码或函数,而不必改变原始代码。
运用继承有很多优势,包括以下几点:已经测试过的代码仍然保留测试过的状态;复杂度会随着代码量的增长而增加;只有新功能真正需要测试;只是继承不会改变原类,故可提供稳定性。 换言之,事情会以最小的代价得以改善,但却会带来最大的安全性。 为了理解这一点,我们来看下面的示意图。
作者:Daniel Jose