
您应当知道的 MQL5 向导技术(第 50 部分):动量振荡器
概述
动量振荡器是由传奇投资者比尔·威廉姆斯(Bill Williams)除我们在上一篇指标形态文章中研究的短吻鳄之外,开发的另一款指标。原则上,它旨在衡量市场动能,并有助于查明占优趋势的潜在变化。动量振荡器(AO) 基于 34-周期简单移动平均线(SMA),与 5-周期 SMA 之间的差值,其中两者都应用中位价。中位价由下式给出:
(最高价 + 最低价)/ 2
AO 显示为振荡直方图,位于零轴上方和下方,零轴作为无动量记号,上方或下方的交叉建言潜在的趋势偏转。直方图上的绿色柱条表示看涨势头较前一根价格柱条有所增加,而红色柱条标记看跌势头也较前一根柱条增加。还有,作为一般概览规则,当直方图柱条位于零轴上方时,往往建言看涨趋势占优,而如果相同的直方图柱条镜像(同样是无论本身颜色如何)在零轴的另一侧,则意味着看跌势头占优。
为什么取名 “Awesome(英文原义:惊叹)”?好吧,没有一个简洁的答案,也没有权威的来源直指问题;然而,有论调 AO 将复杂的动量计算简化为一个简单的可视指标。通过双重专注快节奏和“长期” SMA,它可助力交易者了解短期和长期的相对市场动态。它高度综合,在趋势跟踪和逆转策略中运作优良。它的实际应用主要是帮助交易能与当前市场势头保持一致。它能提供潜在的入场和离场点,正如我们在下面涵盖的各种信号形态一样,它对于背离分析也很实用,于其中我们利用了以下研究的信号形态。
尽管它有许多信号形态和潜在用途,但它也有一些固有的局限性。就像许多振荡指标,AO 可能会在区间波动、或震荡的行情中产生假信号,不幸的是,这一特征意味着它与其它指标结合使用时或许效果最好,以此制定更广泛、更全面的策略。
通过这个快速介绍,维持我们的传统,我们现在研究 AO 的一些形态。至于本文,我们将研究 9 种不同形态,索引从 0 到 8。如常,我们将单独考察和测试每种形态,然后以多形态测试结束,我曾言反对在真实账户环境中推出,直至交易者基于他自己的使用经验,十分确定形态的相对权重。为了一次测试一种形态,我们需要将输入参数 m_inputs 或 “Patterns Used Bitmap” 赋值特定索引。如果我们只想测试形态-0,则该索引为 2 的 0 次方。如果是形态-4 索引是 2 的 4 次方;依此类推。
附带的代码旨在由 MQL5 向导汇编,如此它的格式令该汇编变得直截了当。这里和这里都是关于指导新读者如何行事。这些系列是关于开发/利用 MQL5 向导提供的优势,其中最主要的是快速测试、及原型新思路。需要从头开始编写所有东西是一个明显的益处,但在测试多种思路时,可能被忽视的是它提供的标准测试平台,这对于了解自己应对市场的策略和方式中哪些真正重要是个关键。我们来跃入其中。
零轴交叉
在索引 0 处我们的第一个形态可能是该指标最常见的,即零轴交叉。根据定义,AO 中的零轴代表中性动量状态,意即直方图在该线上方或下方交叉预示动量的偏转。这很直截了当,当 AO 从零轴下方穿过零轴上方时,会标记一个看涨交叉,从而提供买入机会;而看跌交叉是指 AO 从上方穿过这条零轴并低于它。我们的 MQL5 实现如下:
//+------------------------------------------------------------------+ //| Check for Pattern 0. | //+------------------------------------------------------------------+ bool CSignalAwesome::IsPattern_0(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && AO(X() + 1) < 0.0 && AO(X()) > 0.0) { return(true); } else if(T == POSITION_TYPE_SELL && AO(X() + 1) > 0.0 && AO(X()) < 0.0) { return(true); } return(false); }
这种形态于此值得强调的关键点是,零轴的交叉代表动量从看跌到看涨的偏转,反之亦然,具体取决于交叉的方向。对于交易者其有作为趋势变化早期指标的潜能。最后一点也导致需要替代指标,诸如趋势线等,确认该线的交叉。该振荡器的直方图柱条围绕零轴的高度和陡度,也能作为动量强度的指标,较高的柱条表示较强的动量,这意味着渐进的交叉(或较短尺寸柱条的交叉)比之与较高柱条交叉,通常表明信号较弱。
如常,承上启下很重要,因此,看涨环境中的渐进交叉或许不一定是弱信号,就像在波动的市场中拥有大尺寸直方图的交叉本身或许并不表明强信号一样。该振荡器可作为入场信号的指南,这是我们在本文中的主要应用,尽管我们在开仓和平仓时都采用多头和空头条件阈值,因此向导汇编的智能系统的固有信号类也利用了所有应用/选择信号的离场潜能。
形态-0 的基本优点是易于解释、可扩展,因为该振荡器可附加在从日内到长期的多时间帧图表,且它可作为趋势逆转的潜在早期预警。它的缺点是滞后性,因为它基于移动均线,信号在快速移动的行情中或许会滞后。此外,在盘整行情或在占优趋势中出现小幅调整时,假信号可能很寻常。最后,正如已规避的那样,确认其信号是一种良好的举措,这内在意味着它不是一个非常强的信号,至少孤立而言是这样。下面展示了输入设置为 GBPJPY 据 2022 年 H4 时间帧的短期优化测试结果:
双峰信号
我们的第二种形态-1,是双峰信号,虽然这在手工交易时相对容易解释,但实现自动交易、或在自定义信号中实现这个有点复杂。故此,对于定义,当零轴的同一侧形成两个峰值时,就会出现双峰,若第二个峰值更接近零轴,则在上方表示看跌,在下方表示看涨。形态-1 的一个关键规则是,两个峰值之间的零轴不应被突破。
我们的看涨信号、或看涨双峰是指两个峰值都低于零轴,最近的峰值更接近零线,相较之,看跌峰值是指两个峰值都高于零轴,最近的峰值更接近零轴界线。这样,如所述形态,峰值之间的直方图高度需要减小,以便反映先前趋势(趋势即将翻转)中动量的丧失。零轴还当作边界,若交叉先于形成双峰,则信号失效,而峰值太近也会令信号失效。我们的实现不检查后者,读者可自行独立实现这一点,不过我们的源代码如下所示:
//+------------------------------------------------------------------+ //| Check for Pattern 1. | //+------------------------------------------------------------------+ bool CSignalAwesome::IsPattern_1(ENUM_POSITION_TYPE T) { bool _1 = false; int _i = X(); if(T == POSITION_TYPE_BUY && AO(_i) < 0.0 && LowerColor(_i) == clrGreen && LowerColor(_i + 1) == clrRed) { while(AO(_i) < 0.0) { _i++; if(LowerColor(_i) == clrGreen && LowerColor(_i + 1) == clrRed) { if(fabs(AO(_i)) < fabs(AO(X()))) { _1 = true; } break; } if(AO(_i) >= 0.0) { break; } } } else if(T == POSITION_TYPE_SELL && AO(_i) > 0.0 && UpperColor(_i) == clrRed && UpperColor(_i + 1) == clrGreen) { while(AO(_i) > 0.0) { _i++; if(UpperColor(_i) == clrRed && UpperColor(_i + 1) == clrGreen) { if(fabs(AO(_i)) < fabs(AO(X()))) { _1 = true; } break; } if(AO(_i) <= 0.0) { break; } } } return(_1); }
形态-1 很重大,因为它往往指明价格动作占优动量的背离,其能作为逆转的早期预警。捕捉逆转的能力可能是形态-1 的强项。这些双峰形态的确切入场点能恰好在更接近零轴的第二个峰值形成之后,这就是我们在上面的源代码中实现的;然而,另一种“更安全”的替代方式可能是振荡器在形成两个峰值之后穿越零界。
形态-1 在止损设置中也极具灵活,并非传统上当该形态形成后就为持仓设置止损位,而是当振荡器检测到持仓再次接近双峰中的较高值(即第一个峰值)时,将其平仓。我们并未实现这一点,但这些内容读者可自行探索。此外,可以扩展这种形态来建立止盈目标,当振荡器穿过零轴时,在第二个较小峰值处开立的持仓如果获利,则会被平仓。最后一种方式理想情况下在较大时间帧内工作最佳,因为在较小的时间帧内,若价格仍在价格差价内,可能会穿过零轴。
尽管比之形态-0,该形态更罕见,因此有论调称更确定,但它仍可与趋势线搭配;如果交易量数据可用,则分析交易量,其中第二个较小峰上的交易量较高,则可作为信号的清晰确认;并且,配合 MACD、或 RSI 形式的背离工具,其中背离能为所指示信号提供额外的信认。相比 SMA 交叉、或形态-0,它的优点包括非滞后性、指向精确度,因为它不仅可以精准定位下一个趋势,而且通过凸显当前趋势中占优动量的疲软来支持这一点,当然还有它在不同时间帧、及行情的可扩展性。据优化设置 GBPJPY 的 2022 的 H4 时间帧进行的测试,为我们提供了以下结果:
形态-1 的局限性源于其复杂性,尤其在代码中实现这一点时就会遇到。如前论调,这是从价格图表中推断出的相对简单的形态,但智能系统如何解释来自缓冲区的价格则是另一回事。此外,在波动或不确定的市场环境中,该形态必然会出现大量假信号。配合已提到的工具,甚至烛条形态进行确认,可有助于缓解这种情况。
碟状设置
碟状形态,我们的形态-2,是另一种 AO 信号形态,它通过读取振荡器直方图柱条的颜色来帮助识别潜在的逆转。看涨碟状设置表明市场动量可能向上逆转,标志为两根连续的红色直方图柱条,其中第二个直方图柱条的幅度小于前一根柱条,而这两根柱条之后的第三根柱条是绿色的,高于第二根短红色柱条。这些柱条都需要处于零轴上方,入场信号往往位于绿色柱条的收盘处。
看跌碟状设置正如人们所期望的那样,是看涨的翻折,我们有 2 根连续的绿色柱条,第二根更靠近零轴(或更短),第三根柱条是红色的,高于第二根较短的绿色柱条。所有这些柱条都是看涨碟状的翻折,并且位于零轴下方,正如我们在看涨柱条中所见,入场信号将出现在红色柱线的收盘处。这种形态的关键在于它取决于动量变化,而非原始价格动作,这往往令其能有效地识别短期趋势逆转、或重续更强的趋势。我们的 MQL5 实现如下:
//+------------------------------------------------------------------+ //| Check for Pattern 2. | //+------------------------------------------------------------------+ bool CSignalAwesome::IsPattern_2(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && UpperColor(X() + 2) == clrRed && UpperColor(X() + 1) == clrRed && UpperColor(X()) == clrGreen) { return(true); } else if(T == POSITION_TYPE_SELL && LowerColor(X() + 2) == clrGreen && LowerColor(X() + 1) == clrGreen && LowerColor(X()) == clrRed) { return(true); } return(false); }
该形态的主要优点是它易于识别和解释,可与其它常见指标搭配使用,从而提高信号准确性,且它偏于相对较好地处理波动的市场,其中动量变化很平常。限制包括,在低波动性、非趋势设置中准确性降低,故最好将其与附加的指标配对。优化输设置据 GBPJPY 在 2022 年 H4 进行测试,为我们提供了以下结果:
价格和 AO 之间的背离
我们的形态-3 是基于背离。什么是背离?简单说它是指标读数和价格动作之间的偏差,这通常预示着占优趋势的潜在逆转或疲软。尽管,在这种形态中,我们倾向于专注价格的高点/低点、与 AO 振荡器峰值/低谷之间的背离。不过,在本文中,我们正在探索一种更简单的背离形式,即高点/低点价格走势、与 AO 直方图值的趋势。
当价格形成更低的低点,但 AO 振荡器正在形成更高的高点时,就会发生看涨背离。这种形态背后的论调是,看跌势头正在减弱,因此趋势可能会逆转上行。一种可能,当 AO 低于零轴、并等待它穿过零轴时会检测到这种形态,检测到这个清晰的入场信号,既可入场开立多头持仓。
相较之,当价格形成更高的高点,但 AO 振荡器却得到更低的低点时,就会发生看跌背离,表明尽管价格波动,但看涨势头正在减弱。这意味着趋势将逆转下行,开立空头持仓的合适入场点可能是当 AO 跌破零轴、或次要指标看跌形态确认之时。我们的 MQL5 实现如下:
//+------------------------------------------------------------------+ //| Check for Pattern 3. | //+------------------------------------------------------------------+ bool CSignalAwesome::IsPattern_3(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && Low(X() + 3) > Low(X()) && AO(X() + 3) < AO(X())) { return(true); } else if(T == POSITION_TYPE_SELL && High(X() + 3) < High(X()) && AO(X() + 3) > AO(X())) { return(true); } return(false); }
这种形态的主要特征是它引发价格逆转前常发生的动量变化的关注,尤其是在超买或超卖价位上。因此,它的构建更多地是为了辨别潜在的逆转,而非价格延续。理想优化设置采用我们一直所用的相同品种和形态,测试运行为我们给出以下报告:
它的优势与曾研究过的形态没有太大区别,即它有助于在趋势变化发生之前早期预测,在各种行情和时间帧内具有多功能性,并且可与其它指标配合,以便确认突破信号。类似地,它的缺点也没有太大区别,即它在横盘行情中往往不可靠,往往需要配合另一个指标来确认,而且它本身滞后。
假突破过滤
我们的形态-4 是关于假突破的,而假突破是指价格出现突破主要支撑/阻力位,但随后逆转方向,按理说是因为它未能维持最初突破障碍的势头。因此,如果我们假设动量是维持突破的关键指标,那么过滤这些虚假的突破信息,至少可在纸面上提高交易准确性。
如概述中所述,AO 在应用中位价时比较短线 SMA(5-周期)、和长线 SMA(34-周期)来衡量动量。因此,分析突破发生时的 AO 值,交易者可判定它是否受到动量的充分支持,或 5-周期与 34-周期价格动作之间的差距是否足够。我们利用 MQL5 实现的形态-2 如下:
//+------------------------------------------------------------------+ //| Check for Pattern 4. | //+------------------------------------------------------------------+ bool CSignalAwesome::IsPattern_4(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && Close(X() + 1) < MA(X() + 1) && Close(X()) > MA(X()) && UpperColor(X() + 1) == clrGreen && UpperColor(X()) == clrGreen && AO(X() + 1) > 0.0) { return(true); } else if(T == POSITION_TYPE_SELL && Close(X() + 1) > MA(X() + 1) && Close(X()) < MA(X()) && LowerColor(X() + 1) == clrRed && LowerColor(X()) == clrRed && AO(X() + 1) < 0.0) { return(true); } return(false); }
从我们的源码,我们按 8-周期移动平均线的交叉判定为突破。这个移动平均线周期可能应该更长,大概是 34?为了令支撑/阻力障碍更加重要,但这个较短的周期足以满足我们的测试目的。识别突破的替代方式包括趋势线、或如三角形、或矩形图表形态。任何超出这些指标定义级别的价格触发都是清晰的突破标记。
进一步分析突破点处的 AO,能够为突破是否可持续提供一些洞察。如果直方图大小(振荡器柱条的图形大小)在突破时很明显,那么它是可信的,但太短、或不温不火的直方图则往往需要进一步确认才能当作信号。确认措施包括,若 AO 最终穿越零轴,或者若直方图表明动量已处于占优/信号趋势的一半,那么在开仓之前需要看到更长或类似颜色的 AO 直方图柱条。
对于信号定义,看涨突破是指当 AO 高于零轴、且最后两根柱条为绿色时,价格从移动平均线下方穿过移动平均线,并收于移动平均线上方。另一折面,看跌突破是指当 AO 低于零轴,并且最后 2 根柱条为红色时,价格从移动平均线上方穿过移动平均线,并收于移动平均线下方。与上述其它形态类似的品种和设置,向我们呈现的测试结果报告:
趋势延续确认
形态-5,充当检查,确保任何给定趋势(无论是上行趋势、亦或下行趋势)都可持续存在;降低在逆转前开仓风险。AO 能经由动量分析有效地确认趋势延续。看涨趋势延续是指 AO 直方图在零受上方保持绿色,且收盘价继续走高。另一折面,当 AO 低于零轴、价格呈下降趋势。且 AO 直方图为红色时,看跌趋势延续。我们的 MQL5 实现如下:
//+------------------------------------------------------------------+ //| Check for Pattern 5. | //+------------------------------------------------------------------+ bool CSignalAwesome::IsPattern_5(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && Close(X() + 1) < Close(X()) && UpperColor(X() + 1) == clrGreen && UpperColor(X()) == clrGreen && AO(X() + 1) > 0.0) { return(true); } else if(T == POSITION_TYPE_SELL && Close(X() + 1) > Close(X()) && LowerColor(X() + 1) == clrRed && LowerColor(X()) == clrRed && AO(X() + 1) < 0.0) { return(true); } return(false); }
优化设置 GBPJPY 在 2022 年 H4 时间帧内,测试运行为我们提供了以下报告:
可支持趋势延续,并可编码以便补充上述内容的额外形态是零轴交叉(形态-0),或回调信号,其中动量短暂减弱(例如较小的柱条),随后 AO 直方图柱条重新走强,表明占优的价格趋势完好无损,或为我们已在上面研究的形态-1 的双峰信号。汇编的智能系统能做到组合多种形态进行交易,我们会在每个自定义指标信号的文章末尾加以研究。
不过,为了仅用形态-5 进行交易,我们将位图的输入参数赋值 32,如果我们在策略测试器中按与上述类似的优化设置,我们会获得以下报告。鉴于本质上受到动量的影响,它的优点和局限性与我们上面讲述的其它形态没有太大区别。
零轴反弹
从零轴、或靠近零轴处反弹是我们的形态-6,当 AO 接近零轴,但未能穿越时,这种形态背后隐喻是恢复其之前的趋势。因此,交易策略是,如果 AO 从零轴上方降至零轴,然后在没有交叉的情况下又从零轴撤回,则意味着看涨反弹。看跌反弹则是当 AO 低于零轴,朝向零轴倾倒,且在回撤之前没有交叉。我们在自定义信号类里如下编码:
//+------------------------------------------------------------------+ //| Check for Pattern 6. | //+------------------------------------------------------------------+ bool CSignalAwesome::IsPattern_6(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && AO(X() + 2) > AO(X() + 1) && AO(X() + 1) >= 0.0 && AO(X() + 1) < AO(X())) { return(true); } else if(T == POSITION_TYPE_SELL && AO(X() + 2) < AO(X() + 1) && AO(X() + 1) <= 0.0 && AO(X() + 1) > AO(X())) { return(true); } return(false); }
按有利的优化设置运行测试,就像我们对上述其它形态所做的那样,会为我们给出以下结果:
早期逆转预警
我们的形态-7,实则第 8 个,其标记是颜色突然从绿色变为红色,反之亦然。我们实现 AO 颜色读数如下:
// color UpperColor(int ind) { // return(AO(ind) >= AO(ind + 1) && AO(ind + 1) > 0.0 ? clrGreen : clrRed); } color LowerColor(int ind) { // return(AO(ind) <= AO(ind + 1) && AO(ind + 1) < 0.0 ? clrRed : clrGreen); }
这些函数位于自定义信号类的类接口中,并贯穿整个类所用,不仅仅只是该形态。形态-7 的交易策略是,看跌到看涨的过渡是当 AO 直方图颜色从红色变为绿色时,无论 AO 相对于零轴的位置如何。类似地,看涨到看跌的转变以直方图颜色再次从绿色突然变为红色为标志,无论 AO 相对于零轴的位置如何。我们的 MQL5 实现如下:
//+------------------------------------------------------------------+ //| Check for Pattern 7. | //+------------------------------------------------------------------+ bool CSignalAwesome::IsPattern_7(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && ((UpperColor(X() + 1) == clrRed && UpperColor(X()) == clrGreen) || (LowerColor(X() + 1) == clrRed && LowerColor(X()) == clrGreen))) { return(true); } else if(T == POSITION_TYPE_SELL && ((UpperColor(X() + 1) == clrGreen && UpperColor(X()) == clrRed) || (LowerColor(X() + 1) == clrGreen && LowerColor(X()) == clrRed))) { return(true); } return(false); }
仅按上面其它形态类似的条件,采用相应的优化设置测试该形态,但形态输入参数赋值 128,为我们给出以下报告:
通过直方图的趋势强度
我们的最终形态,直方图大小,索引为 8,它向 AO 直方图大小加入一个量值,是上面简单形态-7 的更进一步。从我们上面的颜色代码实现中可见,AO 的颜色编码是由直方图大小的变化驱动的。故此,当 AO 高于零轴时提升直方图,或在 AO 低于零时递减直方图,会导致绿色 AO 柱条。这在很多方面是形态-7 的前提。然而,对于形态-8,看涨动量增加由随后的绿色柱条(这意味着增加/或相关减少)、与最近的 AO 直方图柱超过证券价差的 8 倍来标记。取 8 倍弥散是任意选择的。典型情况下,该阈值应该是多少能经优化该输入参数得以更好地磨练,或者也可用当前波动率的一小部分。看跌势头的增加是这种情况的翻折。我们的 MQL 实现如下所示:
//+------------------------------------------------------------------+ //| Check for Pattern 8. | //+------------------------------------------------------------------+ bool CSignalAwesome::IsPattern_8(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && AO(X() + 2) > 0.0 && fabs(AO(X() + 2)) >= 8.0 * m_symbol.Spread()*m_symbol.Point() && UpperColor(X() + 2) == clrGreen && UpperColor(X() + 1) == clrGreen && UpperColor(X()) == clrGreen) { return(true); } else if(T == POSITION_TYPE_SELL && AO(X() + 2) < 0.0 && fabs(AO(X() + 2)) >= 8.0 * m_symbol.Spread()*m_symbol.Point() && LowerColor(X() + 2) == clrRed && LowerColor(X() + 1) == clrRed && LowerColor(X()) == clrRed) { return(true); } return(false); }
此处的主要论调是,较小的直方图(无论是绿色还是红色)表明趋势减弱,因此是盘整期,而更长、更突出的直方图表明势头强劲,并占优趋势尚有一定的持久力。仅对该形态运行测试,会为我给出供以下报告:
我们的自定义信号类还可交织多个形态进行交易,如果我们据 GBJPY,按单形态相同的年份和时间帧运行权重优化,我们会得到以下结果:
结束语
我们研究了另一个比尔·威廉姆斯指标,即动量震荡指标,逐个形态测试,就像我们之前所做的那样。尚有许多形态,我们并未研究和实现编码,例如添加更多输入参数,以便更好地管理每个形态的阈值,当然在实盘运用前,任何输入参数都要正确交叉验证。如常,这留给读者,因为完整的源代码我们已附在文章底部。
文件名 | 描述 |
---|---|
SignalWZ_50.mqh | 自定义信号类文件,基于 Awesom 振荡器 |
wz_50.mq5 | 向导汇编的智能系统示例,显示包含/所用的文件 |
本文由MetaQuotes Ltd译自英文
原文地址: https://www.mql5.com/en/articles/16502
注意: MetaQuotes Ltd.将保留所有关于这些材料的权利。全部或部分复制或者转载这些材料将被禁止。
本文由网站的一位用户撰写,反映了他们的个人观点。MetaQuotes Ltd 不对所提供信息的准确性负责,也不对因使用所述解决方案、策略或建议而产生的任何后果负责。



