龙听期货论坛's Archiver

龙听 发表于 2024-4-8 15:48

如何在移动平均线交叉时生成 MultiCharts 警报?

虽然 MultiCharts 可以根据 PowerLanguage 中可访问的任何内容触发警报,但一种常见的方法是在较快的移动平均线上越或下越过较慢的移动平均线时生成警报。让我们看看如何在 MultiCharts 中做到这一点。

使用移动平均线触发 MultiCharts 警报

我们使用 Alert() 关键字以编程方式生成 MultiCharts 警报(PowerLanguage 关键字参考,2016 年)。这需要我们启用脚本的警报设置。然后,当指标或信号脚本执行 Alert() 时,警报会以通知窗口、音频警报和/或电子邮件警报的形式出现(MultiCharts Wiki,2013 年),具体取决于我们如何配置警报设置。

我们可以根据价格、指标值甚至数据源最后更新的时间等任何因素生成警报。另一种方法是在两条移动平均线交叉时生成 MultiCharts 警报。要了解如何使用两条移动平均线(MA)来发出可能的趋势变化信号,让我们来看看简单移动平均线和指数移动平均线的组合。

要在 MultiCharts 中计算简单移动平均线 (SMA),我们需要使用 AverageFC() 函数。该函数需要两个参数:一系列要计算的值,以及移动平均线的长度(以条为单位)。例如,AverageFC(Close, 10) 会根据脚本计算工具的收盘价计算 10 条均线。同样,我们使用 XAverage() 函数计算指数移动平均线(EMA)。该函数也有两个参数:计算值和移动平均线的长度。因此,通过 XAverage(Close,25),我们可以得到收盘价的 25 条 EMA。

让我们看看如何使用这两个函数,根据均线穿越 EMA 生成警报。

示例:根据移动平均线生成 MultiCharts 警报

下面的示例指标会在 EMA 穿过 SMA 或低于 SMA 时生成警报。不过,移动平均线的一个常见问题是,它们会在短时间内反复交叉,从而产生振荡鞭打(Pring,2002 年)。在下面的示例指标中,我们通过等待一个额外的柱状图来解决这个问题,然后查看移动平均线交叉是否仍然有效。虽然这确实会带来一些滞后,但(希望)也能为我们提供更多高质量的信号。

警报和指标的示例如下。讨论完代码后,我们将仔细研究脚本的行为。

[img]http://p.algo2.net/2024/0408/0fa37a258bc66.png[/img][code]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

        Alert("The " + NumToStr(Period_QuickMA, 0) +
                " period EMA fell below the " +
                NumToStr(Period_SlowMA, 0) +
                "-bar SMA.");

end;[/code]我们首先创建几个输入选项和变量:[code]Inputs:
        Price_Data(Close),
        Period_QuickMA(12),
        Period_SlowMA(36);

Variables:
        quickMA(0),
        slowMA(0),
        crossover(false),
        crossunder(false);[/code]通过价格数据(Price_Data)输入选项,我们可以指定移动平均线计算所依据的价格数据类型;默认值为 "平仓"(Close),移动平均线开始计算时依据的是工具的收盘价。另外两个输入选项,即默认值为 12 的 Period_QuickMA 和起始值为 36 的 Period_SlowMA,将设置移动平均线的长度。通过为这些设置创建输入选项,我们可以轻松地手动配置指标,而无需编辑和重新编译脚本代码。

我们首先创建的两个变量是 quickMA 和 slowMA 数值。这两个变量稍后将保留移动平均线的计算值。最后两个变量,crossover 和 crossunder,是真/假变量,用于保存是否发生了交叉或下穿。

接下来我们计算并绘制移动平均线:[code]// 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);[/code]我们使用 XAverage() 计算指数移动平均线 (EMA)。该函数需要两个参数:要处理的一系列数值和要计算的条数。在这里,我们将它们设置为 Price_Data 输入选项(默认情况下保存的是条形图的收盘价)和 Period_QuickMA,输入的默认值为 12。我们将收盘价的 12 条 EMA 储存在 quickMA 变量中,以便以后使用。

简单移动平均线 (SMA) 是通过 AverageFC() 函数计算的,该函数也需要两个参数:要计算的数据序列和平均线的长度(条数)。在这里,我们将这两个参数设置为 Price_Data 和 Period_SlowMA,并将收盘价的 36 条 EMA 值存储在 slowMA 变量中。

我们使用 Plot1() 和 Plot2() 在图表上显示移动平均线。这两个关键字都接受一系列参数来配置图表。这里我们设置了三个参数:绘图值、名称和颜色(PowerLanguage 关键字参考,2016 年)。为了绘制 EMA 图,我们设置 Plot1() 来显示 quickMA 变量的值,将该图命名为 "Fast MA",并使用红色标准 MultiCharts 颜色。通过 Plot2(),我们用蓝色绘制 slowMA 变量,并将其命名为 "Slow MA"。

然后,我们计算移动平均线交叉是否发生:[code]crossover  = quickMA crosses over slowMA;
crossunder = quickMA crosses under slowMA;[/code]我们在此设置交叉和下交叉变量。通过使用这些真/假变量来存储当前柱状图上是否出现了交叉,我们以后就可以很容易地检查前一柱状图上是否出现了移动平均线交叉。

要查看 12 条 EMA(快速移动平均线)是否交叉于 36 条 SMA(慢速移动平均线),我们使用交叉。如果在当前条形图中,左边的值大于右边的值,而在之前的条形图中,左边的值小于或等于右边的值(PowerLanguage 关键字参考,2016 年),则该关键字组合返回 true。这意味着,当当前条形图上的 12 条 EMA 跨过 36 条 EMA 时,quickMA 跨过 slowMA 返回 true,而当这种跨过没有发生时,返回 false。我们将真/假结果存储在交叉变量中,供以后使用。

我们以类似的方式更新交叉下穿变量,只不过现在使用的是交叉下穿关键字组合。当当前条形图的左值小于右值时,返回 true,而之前的左值大于或等于右值(PowerLanguage 关键字参考,2016 年)。当这种交叉下行没有发生时,交叉下行返回 false。在我们的案例中,quickMA 变量位于交叉下穿的左侧,而 slowMA 位于右侧,当 12 条 EMA 穿过当前条形图上的 36 条 SMA 下方时,交叉下穿返回 true。如果没有发生下穿,则返回假值。无论返回哪个值,我们都会将其存储到 crossunder 变量中,以供以后使用。

我们用 if/else 语句结束指标代码。if/else 语句的第一部分是 if 关键字,代码如下:[code]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[/code]该 if 语句的条件使用了两个表达式,以检查在快速移动平均线当前仍高于慢速移动平均线的情况下,前一个条形图是否发生了交叉。我们将这些表达式与和逻辑关键字相结合。当关键字左边的值和右边的值都为真时,关键字返回 true。如果其中一个值或两个值都为假,那么与 and 结合的结果也是假的(PowerLanguage 关键字参考,2016 年)。

要检查前一个条形图是否存在交叉,我们使用交叉变量,在该变量后面的方括号([和 ])之间的值为 1。另一方面,crossover[3] 会返回变量在 3 个交易日前的值。由于交叉已经是一个真/假变量,所以当 12 条 EMA 在上一交易日交叉于 36 条 SMA 时,crossover[1] 返回值为真。如果没有移动平均线交叉,crossover[1] 返回 false。

要查看较快的移动平均线是否仍高于较慢的移动平均线,我们要检查 quickMA 变量的值是否大于 (>) slowMA 变量。当值为 true 时,我们就知道 12 条 EMA 目前高于 36 期 SMA。

现在,当这两个真/假表达式都为真时,if 语句的条件也为真(由于使用了和逻辑关键字)。然后运行 if 语句中的代码,并通过 Alert() 程序生成警报(《PowerLanguage 关键字参考》,2016 年)。

在 Alert() 关键字的括号内,我们指定了一条包含文字(如 "The")和动态数值的警报信息。我们使用 + 运算符组合这些不同的文本字符串。为了使警报信息更有意义,我们通过使用 Period_QuickMA 和 Period_SlowMA 输入来包含移动平均线的长度。

我们使用 NumToStr() 关键字将这些数值转换为文本。该关键字使用两个参数。第一个参数是一个要转换为文本的数字,另一个参数是一个数值,用于设置转换后的数字小数位数(PowerLanguage 关键字参考,2016 年)。在本例中,我们使用 Period_QuickMA 和 Period_SlowMA 输入作为第一个参数,0 作为第二个参数。这样就可以将这些数字输入选项转换为 0-十进制字符串。

我们以 if/else 语句的第二部分结束编程示例。当快速移动平均线低于慢速移动平均线时,if 部分会生成警报:[code]else if (crossunder[1] and (quickMA < slowMA)) then begin

        Alert("The " + NumToStr(Period_QuickMA, 0) +
                " period EMA fell below the " +
                NumToStr(Period_SlowMA, 0) +
                "-bar SMA.");

end;[/code]这部分与之前的内容基本相同。同样,if 语句的条件包含两个表达式。第一个表达式检查前一个条形图是否出现了交叉下穿现象(在这种情况下,crossunder[1] 返回 true)。第二个表达式使用 quickMA < slowMA 来评估 12 条 EMA 的当前值是否小于(<)36 条 SMA。

当两个表达式的结果都为真时,与 and 结合的结果也为真,if 语句内的代码就会执行。该代码使用 Alert() 关键字生成警报。我们使用该关键字指定的警报信息包含静态文本和动态值。与之前一样,动态值是快速移动平均线(Period_QuickMA)和慢速移动平均线(Period_SlowMA)的长度。因此,警报信息会显示较快的移动平均线跌破了较快的移动平均线,并告诉我们这些移动平均线的当前设置。

根据移动平均线交叉触发 MultiCharts 警报

让我们看看我们的指标在图表上的表现以及它所生成的警报。不过,在生成这些警报之前,我们需要像这样启用脚本的警报设置:

[img]http://p.algo2.net/2024/0408/d8b66c908844d.png[/img]

通过 "启用警报 "复选框启用指标警报。通过 "每条一次 "单选按钮,我们可以指定每个价格条最多发出一次警报。这样可以防止指标在每一价格条上产生多个警报。

当上一柱出现移动平均线交叉,而当前柱在多次价格更新中,较快的移动平均线仍高于(或低于)较慢的移动平均线时,就会出现多次警报。(其他防止多个警报迅速接踵而至的方法包括限制每个条形图的警报数量,以及在警报之间保持一定的秒数)。

添加到图表中时,指标本身看起来是这样的:

[img]http://p.algo2.net/2024/0408/df4e49b6fe4a1.png[/img]

现在,当移动平均线在前一个条形图上相互交叉,然后像这样在当前条形图上确认信号:

[img]http://p.algo2.net/2024/0408/c0254705d7695.png[/img]

然后,该指标会生成以下警报:

[img]http://p.algo2.net/2024/0408/983c9ea4540ae.png[/img]

同样,当速度较快的移动平均线跌破速度较慢的移动平均线,并在随后的条形图中确认该信号时,也是如此:

[img]http://p.algo2.net/2024/0408/2abe4e6db8369.png[/img]

然后,该指标就会发出如下警报:

[img]http://p.algo2.net/2024/0408/e3ce1a797a5ca.png[/img]

在本文中,我们使用绘制的移动平均线触发警报,但我们也可以根据趋势线触发警报。我们将在根据趋势线触发警报和生成半自动 MultiCharts 警报中讨论这一点。

总结

只要脚本的 "启用警报 "复选框打开,Alert() 关键字就能以编程方式生成警报。触发警报的一种方法是使用移动平均线。我们使用 AverageFC() 函数计算简单移动平均线 (SMA),而 XAverage() 函数则计算指数移动平均线 (EMA) 的值。这两个函数都需要两个参数:一系列要处理的值(如工具收盘价的收盘价)和要计算的条数。要查看一条移动平均线是否与另一条移动平均线交叉,我们可以使用 crosses over 和 crosses under 关键字组合。在当前条形图中,如果左边的值大于右边的值,而之前左边的值小于右边的值,则 crosses over 返回 true。同样,如果在当前条形图中,该关键字组合的左侧值小于右侧值,而之前左侧值大于右侧值,则下穿返回 true。每当发生这种交叉或交叉下穿时,我们就可以用 Alert() 生成警报。我们可以通过加入数值使这些警报更有用。为此,我们需要使用 NumToStr() 将这些数字转换为文本,这个关键字需要两个参数:要转换为字符串的数字和转换后数字的小数位数。

页: [1]