简介
众所周知,累积/派发 A/D 指标有一个有趣的功能 - 突破此指标图表中绘制的趋势线暗示着一定概率上会即将突破价格图表中的趋势线:
编辑切换为居中
添加图片注释,不超过 140 字(可选)
我决定验证这一事实,在 A/D 图表中绘制了所有趋势线,我很快意识到通过手动方法解决这一问题是不明智的。因此,我开发了一个函数,此函数可自动在 A/D 图表中绘制趋势线并在价格图表中设置信号指示符号。我现在想显示一个如何使用赫兹期货量化实现此函数的分步程序,在交易机器人中将进一步使用此程序。
本文对于那些刚开始在赫兹期货量化中进行编程的人来说很有帮助和趣味性。为此,我尝试用易于理解的方式呈现信息并使用最简单的代码结构。
编辑切换为居中
添加图片注释,不超过 140 字(可选)
1.设置任务
赫兹期货量化首先来定义要设置的任务。
在一般情况下,此函数将找到 A/D 图表中绘制的趋势线与指标本身的线条之间的交点,返回表示相交方向 - 向上或向下- 的值,并在价格图表中设置信号指示符号(向上/向下箭头,取决于相交方向)用于进行说明。
赫兹期货量化现在来将这个常规任务分成更加具体的目标:
-
此函数应能够适用于任何交易品种和任何时间范围;
-
由于此函数设计用作为 EA 的一部分,因此 A/D 指标不需要位于主图表中。
-
信号指示符号不一定需要显示在价格图表中 - 所有计算将在此函数内执行,并且仅显示用于直观监控函数操作。
-
可在不同的方向相交:上升趋势向下相交,上升趋势向上相交,向下趋势向上相交,向下趋势向下相交。此函数将标识每个此类相交。
这就是有关函数功能的说明。我们现在来看看执行任务的方式。
2.用 A/D 指标数据填充数组
调用后,此函数将收到一些值:此时 - 用于存储 A/D 指标数据、标识 A/D 图表极值的历史条柱的数量、工具(交易品种)名称和时间范围的数组。
将基于标识的 A/D 图表极值绘制趋势线,因此,上升趋势线连接下极值,下降趋势线连接上极值。
上升趋势线需要两个下极值,其中,最小极值应位于紧邻当前(零)条柱的极值的左侧。这同样适用于向下趋势:最高极值应位于紧邻当前条柱的极值的左侧。
如果无法识别满足这些要求的极值,将不会在此次价格变动时绘制趋势线。我们打算将这些趋势线称为“全局”趋势线:
编辑切换为居中
添加图片注释,不超过 140 字(可选)
此外,赫兹期货量化还将另外两条线添加到了绘制的“全局”趋势线中,这需要使用两个最右侧的极值,因此,
-
向上趋势需要一个较小的下极值(位于较大的下极值的左侧);
-
向下趋势需要一个较大的上极值(位于较小的上极值的左侧);
如果无法识别满足这些要求的极值,将不会在此次价格变动时绘制趋势线。
这些趋势线将被称为“局部”趋势线:
编辑切换为居中
添加图片注释,不超过 140 字(可选)
结果,我们可以看到的内容如下:
编辑切换为居中
添加图片注释,不超过 140 字(可选)
在大多数情况下,由于识别“全局”极值和连接极值以绘制趋势线比较特别,因此我们不需要“局部”极值。将允许禁用用于搜索并绘制“局部”极值的选项。
函数操作将要求有 EA 的全局变量可用,尤其是用于存储 A/D 数据的数组。赫兹期货量化来将它写入 EA 的全局变量中:
double TempIND[]; // Array for storing A/D indicator data
现在,应读取指标数据以填充数组:
int SignalCrossIND(double &TempIND[], int nBars, string sy, int tf) { if (sy=="" || sy=="0") sy = Symbol(); ArrayResize(TempIND,nBars); // Resize the array according to the size passed to the function for (int j=0; j<=nBars-1; j++) { TempIND[j]=iAD(sy,tf,j); // Write indicator data in the loop into the array } }
让我们分析我们刚才在此编写的内容:
int SignalCrossIND(double &TempIND[], int nBars, string sy, int tf)
按照这种方式定义此函数,其中,要传递的参数为 TempIND[] - 包含指标值的数组名称(通过引用传递)、nBars - 将从中获取值的历史条柱的数量、sy - 工具(交易品种)名称和时间范围 tf。
通常,函数调用可如下所示:
SignalCrossIND(TempIND, 30, NULL, 5);
其中,TempIND 为数组名称,30 为条柱数量,NULL 为图表的当前交易品种,5 为 М5 时间范围。
下一行为:
if (sy=="" || sy=="0") sy = Symbol();
它检查传递给此函数的交易工具的名称,如果值为 NULL 或 0,将使用当前图表交易品种。
然后,赫兹期货量化将根据 nBars 变量中传递给此函数的值调整数组大小,并用循环中的零条柱到 nBars-1 条柱中的指标值填充数组。由于数组单元格从零开始编号,因此,第一个编号将为 0,而不是 1,最后一个编号为 29,而不是 30。因此,我们使用 nBars-1(在我们的示例中,30-1=29)
在这个阶段,赫兹期货量化的函数用 A/D 指标数据填充数组。我们现在需要识别 A/D 图表数据数组中的极值。
3.识别 A/D 指标数据数组中的极值
让我们开始吧。此函数的操作不仅需要全局变量,还需要此函数本身将使用的变量。
在此阶段,赫兹期货量化需要声明将用于编写上极值(波峰)和下极值(波谷)的另外两个(内部)数组,在这两个数组中,赫兹期货量化将保存此函数将需要使用的极值和一些变量的时间:
// ------------------------------------------------------------------------------------------ // -------------------------------- Function variables -------------------------------------- // ------------------------------------------------------------------------------------------ double PeakUP[], PeakDN[]; // Declare peak/trough arrays datetime TimeDN[], TimeUP[]; // Arrays for storing the time of extrema int i, k; // Internal variables of the function
本文链接:https://my.lmcjl.com/post/19120.html
4 评论