下面的示例指标会在 EMA 穿过 SMA 或低于 SMA 时生成警报。不过,移动平均线的一个常见问题是,它们会在短时间内反复交叉,从而产生振荡鞭打(Pring,2002 年)。在下面的示例指标中,我们通过等待一个额外的柱状图来解决这个问题,然后查看移动平均线交叉是否仍然有效。虽然这确实会带来一些滞后,但(希望)也能为我们提供更多高质量的信号。
警报和指标的示例如下。讨论完代码后,我们将仔细研究脚本的行为。
Inputs:
Price_Data(Close),
Period_QuickMA(12),
Period_SlowMA(36);
Variables:
quickMA(0),
slowMA(0),
crossover(false),
crossunder(false);
// Calculate the moving averages
quickMA = XAverage(Price_Data, Period_QuickMA);
slowMA = AverageFC(Price_Data, Period_SlowMA);
// Plot the MAs
Plot1(quickMA, "Fast MA", red);
Plot2(slowMA, "Slow MA", blue);
// Monitor for a cross over or under
crossover = quickMA crosses over slowMA;
crossunder = quickMA crosses under slowMA;
// Generate the alerts for the MA crosses
if (crossover[1] and (quickMA > slowMA)) then begin
Alert("The " + NumToStr(Period_QuickMA, 0) +
"-bar MA crossed above the " +
NumToStr(Period_SlowMA, 0) +
" period average.");
end
else if (crossunder[1] and (quickMA < slowMA)) then begin
我们以类似的方式更新交叉下穿变量,只不过现在使用的是交叉下穿关键字组合。当当前条形图的左值小于右值时,返回 true,而之前的左值大于或等于右值(PowerLanguage 关键字参考,2016 年)。当这种交叉下行没有发生时,交叉下行返回 false。在我们的案例中,quickMA 变量位于交叉下穿的左侧,而 slowMA 位于右侧,当 12 条 EMA 穿过当前条形图上的 36 条 SMA 下方时,交叉下穿返回 true。如果没有发生下穿,则返回假值。无论返回哪个值,我们都会将其存储到 crossunder 变量中,以供以后使用。
我们用 if/else 语句结束指标代码。if/else 语句的第一部分是 if 关键字,代码如下:
if (crossover[1] and (quickMA > slowMA)) then begin
Alert("The " + NumToStr(Period_QuickMA, 0) +
"-bar MA crossed above the " +
NumToStr(Period_SlowMA, 0) +
" period average.");
end
复制代码
该 if 语句的条件使用了两个表达式,以检查在快速移动平均线当前仍高于慢速移动平均线的情况下,前一个条形图是否发生了交叉。我们将这些表达式与和逻辑关键字相结合。当关键字左边的值和右边的值都为真时,关键字返回 true。如果其中一个值或两个值都为假,那么与 and 结合的结果也是假的(PowerLanguage 关键字参考,2016 年)。
要检查前一个条形图是否存在交叉,我们使用交叉变量,在该变量后面的方括号([和 ])之间的值为 1。另一方面,crossover[3] 会返回变量在 3 个交易日前的值。由于交叉已经是一个真/假变量,所以当 12 条 EMA 在上一交易日交叉于 36 条 SMA 时,crossover[1] 返回值为真。如果没有移动平均线交叉,crossover[1] 返回 false。