
您应当知道的 MQL5 向导技术(第 48 部分):比尔·威廉姆斯(Bill Williams)短吻鳄
概述
短吻鳄指标,由比尔·威廉姆斯(Bill Williams)开发,前提是行情倾向于在任何设定方向上只有大约 15-30% 的时间保持强劲趋势。它本质上是一种趋势跟踪工具,可助交易者辨别行情方向、及潜在的分形或转折点。它由一组三条平滑移动平均线(SMA)来达成这一点,这些平均线不仅设置了不同的均化周期,而且还以不同量级的前移。
这三条 SMA 通常被称为下颌、牙齿、和唇,参照短吻鳄的嘴。这 3 个平均缓冲区有助于交易者可视化行情的阶段,其中通常包括趋势阶段、盘整阶段、及过渡阶段。当 3 条均线处于窄幅内,这往往被称为短吻鳄打盹,其与比尔·威廉姆斯所估的大多数行情中占据 85 – 70% 时间的无方向阶段一致。另一部分(15 – 30%)以这三个缓冲区背离为标志,这种背离总是由看涨或看跌的特定方向示人。该阶段往往被打上短吻鳄觉醒的标签,料想它是大多数交易者应当寻求赚钱的时刻。
这些是 3 条 SMA 的公式。首先,我们得到下颌:
其中:
- SMA 13 (Close):13-周期收盘价的平滑移动均线。
- Shift:下颌线前移 8-周期,平滑趋势,并允许预测行情方向。
然后是牙齿:
其中:
- SMA 8 (Close):8-周期收盘价的平滑移动均线。
- Shift:牙齿线前移 5-周期。
最后,嘴唇:
其中:
- SMA 5 (Close):5-周期收盘价的平滑移动均线。
- Shift:唇线前移 3-周期。
短吻鳄所展现出的特征也能比作一个进食周期。如果我们从所有三个缓冲区混杂、或紧靠的部分开始,该阶段也称为睡眠阶段,行情被称为盘整或拉锯。威廉姆斯将其比作一只打盹的短吻鳄,正如概述中所暗示的那样,对于大多数证券来说,该阶段占主导地位,占据了大部分时间。那么,接下来就是“醒来”。
在周期的这个阶段,三条 SMA 开始发散、或分道扬镳,通常按指示性方向。这意味着当它们开始分开时,会开始按特定方向,不过它们的顺序,升序应当是唇-齿-颌,降序时逆反,或许还不一定遵守。醒来后,接着就是“进食”。
在周期的这个阶段,曲线开始更纯粹地发散,看涨趋势中的唇-齿-颌、或看跌暴跌中的颌-齿-唇(从顶部排序)开始站稳脚跟。交易者往往认为这是跟随趋势方向的好时机,因为这是大部分资金涌入的时候。这是周期的第 3 阶段,但它并非最后阶段,在于“满意”阶段紧随其后。
在这个最后阶段,其标记为“满意”阶段,三条 SMA 开始聚合。这种转换或许是趋势正在结束、或进入修正阶段的信号,因此无论哪种道路,对于一些交易者来说,当出现该阶段的信号时,获利了结可能是个好主意。短吻鳄指标的结构简单,令其成为一种相对直截了当的工具,只需研究平滑移动均线即可了解行情当前阶段、及潜在方向的变化。因此,在帮助交易者更好地安排入场和离场时,它会派上用场。
在此背景下,我们逐个形态深入研究该指标,就像本系列之前的轮换文章中的情况一样,我们一次处理一个特定的常见技术指标。我们在这篇文章中考察了 Ichimoku,对于新读者,我们当时回顾了 11 种形态,在本文中,我们列出了 8 种形态。审查指标的逐个形态有潜在揭示一些被交易者忽略,但值得加进他们武器库中的很常见指标的某些层面。
但也许更重要的是,它们将焦点放在给定指标必须提供的所有关键形态的相对权重和重要性上,以此磨练交易者关注或忽略什么的技能。我们倾向于通过优化每种形态的相对权重来完结这些文章,虽然可将该类结果带入实时部署环境,但我宁愿由交易者根据自己的经验为每种形态手工设置权重,即使他们的优化测试结果或许会被交叉验证。
所附代码旨在搭配 MQL5 向导一起来汇编智能系统,且此处和此处为新读者提供了有关如何完成该操作的指南。这个汇编的智能系统一次只能与一种形态搭配使用,正如前面关于这些指标的讲述文章中提过的。因为每个形态都从零到形态总数减去 1(在我们的例子中是 7)作为索引,所以我们可由标记为 m_patterns_usage 的输入参数来控制采用哪些形态,且它会从父类继承我们的自定义信号类。
为了仅用一种可选形态,该输入参数设置的索引,将是形态索引的 2 次方。故此,若要仅用形态-0,该输入将被赋值 2^0,即 1,而对于形态-5,该值是 2^5,即 32,依此类推。如上所述,相同的输入参数允许多选并使用形态,这就是我们在本文的最后一部分中解决的问题,因为即使对于数量较少的形态,也有许多可能的组合,如 8;在我们的例子中,读者能明白,当任何整数不在 2^0,2^1,...2^n 序列,且它小于 m_patterns_usage 输入参数的最大值限制,则该值意味着正在使用多形态。在我们的例子中,鉴于我们只用 8 个形态,m_patterns_usage 的限制是 255。我们进入形态。
短吻鳄觉醒(交叉信号)
这也许是短吻鳄指标的主要形态,正如人们所期望的那样,它应对短吻鳄周期中最有趣的阶段,即盛宴阶段的开始,此处称为觉醒。它的信号基于唇、齿及颌相互交叉时的信号,表明趋势或方向的潜在偏转。
看涨交叉是指绿色唇线与红色齿线、及蓝色颌线交叉;这往往是上升趋势开始的信号。相较之,看跌交叉是指绿色唇线下穿红色齿线、及蓝色颌线,示意下降趋势的开始。我们的 MQL5 实现如下:
//+------------------------------------------------------------------+ //| Check for Pattern 0. | //+------------------------------------------------------------------+ bool CSignalAlligator::IsPattern_0(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && Lips(X() + 1) < Jaws(X() + 1) && Lips(X()) > Jaws(X())) { return(true); } else if(T == POSITION_TYPE_SELL && Lips(X() + 1) > Jaws(X() + 1) && Lips(X()) < Jaws(X())) { return(true); } return(false); }
这标记了我们的形态-0,若要仅用该形态执行测试运行,我们的输入参数 m_patterns_usage 需要设置为 1。如果我们这样做,并尝试优化智能系统其它一些设置,以便展示该形态的交易潜力,我们会从一些有益结果中得到以下报告:
该测试设置是依据 USDCHF 的 2023 年 H1 时间帧。这些结果主要来自优化形态的阈值权重,以及开仓和平仓条件阈值。我们采用挂单进行交易,有止盈价位,但没有止损价位。这些当然不是理想的条件,但它们的目的是演形态-0 的实际效果。
短吻鳄进食(趋势跟踪)
我们的第二个形态,是形态-1,应对由唇和齿、及下颌线构成的短吻鳄信号在设定方向上的合拢和分开,示意特定趋势。这是短吻鳄周期的进食阶段,看涨进食的定义是当绿色唇线高于红色齿线,红色齿线高于蓝色颌线。这些线虽然都指向朝上,但不仅它们的平均周期不同,且偏移量也不同,故也会发散。当所有这些特征都被勾选时,将示意非常强劲的看涨趋势。
另一方面,看跌进食的定义是如果绿唇低于红色齿线,而红色齿线低于蓝色颌线,同样所有 3 条 SMA 都朝下发散(非平行)。与看涨一样,若观察到所有这些特征,将示意强烈的看跌信号。我们的 MQL5 实现如下:
//+------------------------------------------------------------------+ //| Check for Pattern 1. | //+------------------------------------------------------------------+ bool CSignalAlligator::IsPattern_1(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && Lips(X()) > Teeth(X()) && Teeth(X()) > Jaws(X())) { return(true); } else if(T == POSITION_TYPE_SELL && Lips(X()) < Teeth(X()) && Teeth(X()) < Jaws(X())) { return(true); } return(false); }
采用类似形态-0 的优化设置,依据 USDCHF 外汇对 2023 年,H1 时间帧,测试结果给出以下结果:
鳄鱼振荡器信号
除了短吻鳄指标外,比尔·威廉姆斯还负责鳄鱼振荡器,它是短吻鳄指标三个 SMA 缓冲区之间差值的直方图投影形式的振荡器。MQL5 内置的鳄鱼振荡器指标有点错误,因为鳄鱼振荡器本质上是非正统的。其输出是 4 个叠值、两个双精度值、和双色数值。由于这些背后的公式定义是众所周知的,因此我们在自定义信号类中执行自定义实现,如下所示:
// double Upper(int ind) { return(fabs(Jaws(ind) - Teeth(ind))); } color UpperColor(int ind) { return(Upper(ind) >= Upper(ind + 1) ? clrGreen : clrRed); } double Lower(int ind) { m_gator.Refresh(-1); return(-fabs(Teeth(ind) - Lips(ind))); } color LowerColor(int ind) { m_gator.Refresh(-1); return(fabs(Lower(ind)) >= fabs(Lower(ind + 1)) ? clrRed : clrGreen); } //
该形态,即形态-2,是我们的第 3 个形态,它结合了来自鳄鱼振荡器的信号,我们将从从短吻鳄指标衍生的自定义函数中读取这些信号。话虽如此,看涨鳄鱼扩张是指鳄鱼振荡器中的绿色柱线向上扩张,表明趋势走强。相较之,看跌鳄鱼扩张是指红色柱线向下扩张,表明看跌趋势正在加强。作为推论,红色和绿色混杂柱线通常标志着市场盘整、或趋势减弱。我们利用 MQL5 实现的形态-2 如下:
//+------------------------------------------------------------------+ //| Check for Pattern 2. | //+------------------------------------------------------------------+ bool CSignalAlligator::IsPattern_2(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && UpperColor(X()) == clrGreen && LowerColor(X()) != clrRed) { return(true); } else if(T == POSITION_TYPE_SELL && LowerColor(X()) == clrRed && UpperColor(X()) != clrGreen) { return(true); } return(false); }
优化运行的测试结果为我们提供了以下报告:
设置与上述品种 USD CHF 类似,H1 时帧,2023 年。这些结果未经交叉验证,仅展示形态-2 的交易潜力。我们仅用形态-2 测试了智能系统,方法是将 m_patterns_usage 输入参数赋值整数值 4,如上文所述。
颌-唇和齿-唇发散
该形态是我们的第四个形态,它是形态-3 的索引。它围绕颌-唇、或齿-唇之间的方向、或间隙的差值而演变。看涨背离是如果唇线(绿色)在一段时间的拉锯后,开始远离齿线(红色)、及颌线(蓝色)。这本质上是潜在看涨趋势的早期指标。相较之,如果唇线开始向下远离颌线和齿线,则为看跌背离,这往往是行情颓败的预兆。我们的 MQL5 实现如下:
//+------------------------------------------------------------------+ //| Check for Pattern 3. | //+------------------------------------------------------------------+ bool CSignalAlligator::IsPattern_3(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && Lips(X()) - fmax(Teeth(X()), Jaws(X())) > Lips(X() + 1) - fmax(Teeth(X() + 1), Jaws(X() + 1))) { return(true); } else if(T == POSITION_TYPE_SELL && fmin(Teeth(X()), Jaws(X())) - Lips(X()) > fmin(Teeth(X() + 1), Jaws(X() + 1)) - Lips(X() + 1)) { return(true); } return(false); }
采用与上述所有形态的相同设置进行测试,为我们提供了以下结果,这些设置来自从短暂优化阶段获得的一些有利设置:
短吻鳄从睡梦中醒来
形态-4,我们的第五种形态,意即在相当长的一段时间的盘整、或鳄鱼沉睡之后展开。其特征是唇线、齿线和颌线开始裂开。因此,对于交易策略来说,看涨信号是在短吻鳄沉睡了很长时间之后,如果唇线、齿线和颌线开始向上发散,这可能是看涨突破的迹象。另一方面,看跌信号是,如果相同的 3 条线在长时间收敛后开始向下发散,这可能表明看跌突破。我们的 MQL5 实现如下:
//+------------------------------------------------------------------+ //| Check for Pattern 4. | //+------------------------------------------------------------------+ bool CSignalAlligator::IsPattern_4(ENUM_POSITION_TYPE T) { if(Range(X() + 3) <= Spread(X() + 3) && Range(X() + 8) <= Spread(X() + 8)) { if(T == POSITION_TYPE_BUY && Lips(X()) > Lips(X() + 3) && Teeth(X()) > Teeth(X() + 3) && Jaws(X()) > Jaws(X() + 3)) { return(true); } else if(T == POSITION_TYPE_SELL && Lips(X()) < Lips(X() + 3) && Teeth(X()) < Teeth(X() + 3) && Jaws(X()) < Jaws(X() + 3)) { return(true); } } return(false); }
我们按上述形态相似品种设置、及相同时间帧,仅测试该形态,m_patterns_usage 参数赋值 16,我们得到以下结果:
突破确认
我们的形态-5 在拓展信号时,价格走势如短吻鳄线相同方向,一直延续且没有较强的回踩。对于该形态,如果价格高于短吻鳄线,且所有三条线都向上倾斜,则为看涨突破,表明多头建仓仍在继续。它并不是由价格重大变化作为标志。同样,看跌“突破”是指价格低于短吻鳄线,且所有三条线都向下倾斜,这是抛售继续的信号。我们的 MQL5 实现如下:
//+------------------------------------------------------------------+ //| Check for Pattern 5. | //+------------------------------------------------------------------+ bool CSignalAlligator::IsPattern_5(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && Close(X()) > Lips(X()) && Lips(X()) > Lips(X() + 3) && Teeth(X()) > Teeth(X() + 3) && Jaws(X()) > Jaws(X() + 3)) { return(true); } else if(T == POSITION_TYPE_SELL && Close(X()) < Lips(X()) && Lips(X()) < Lips(X() + 3) && Teeth(X()) < Teeth(X() + 3) && Jaws(X()) < Jaws(X() + 3)) { return(true); } return(false); }
若要仅用该形态的同时,采用向导汇编的智能系统进行交易,我们需要给 m_patterns_usage 输入参数赋值 32。从输入参数中,标签是 “Pattern's Used Bitmap”,由自定义信号类的父类继承。采用与上述形态类似的,来自快速优化的有利设置,运行测试为我们提供了以下报告:
波动率信号
这种红利形态虽然不像其它形态那样正式编码和测试,但如果将流行的价格动作趋势、与短吻鳄范围搭配,仍可实现。它背后的主要论点是整体短吻鳄范围,我们在以下函数中定义;
double Range(int ind) { return(fmax(fmax(Jaws(ind), Teeth(ind)), Lips(ind)) - fmin(fmin(Jaws(ind), Teeth(ind)), Lips(ind))); }
是波动性的代表。因此,当颌线、齿线和唇线相距较远时,高波动性表明当下主导趋势非常强烈且合理。检查当下主导价格趋势将有助于建立是否看涨信号(价格上涨)、或看跌信号(价格下跌)的推断。另一方面,低波动性不一定标志着任何信号;不过,它可用于判定何时平仓离场。尽管,当三个 SMA 缓冲区紧靠时,这往往是区间弹跳的信号,并且也通常当作等待入场的筹备。对于持仓,尽管这可能体现离场机会,若价格趋势完好无损,随着近期波动性的下降,可能暗示逆转开仓。为此,看涨价格趋势在减弱至低波动性时,可能预示着看跌信号,就像类似条件下的看跌价格趋势,可能表明看涨亮起绿灯一样。有论调说,该形态不如其它形态确定,因此希望编码和实现该形态的读者,也许应当与其它信号配对。
短吻鳄唇线回踩信号
形态-6 是我们的第七种形态,它涉及唇线向齿线、或颌线回踩,但并未完全交叉。据此,交易策略是,如果唇线向齿线和颌线移动,但随后反弹向上而不交叉,则看涨回踩表明看涨趋势可能持续。正如预期,如果唇线向齿线和颌线移动,反弹而不交叉,从而形成潜在的下降趋势,那么看跌回踩就是看跌回踩。我们的 MQL5 实现如下:
//+------------------------------------------------------------------+ //| Check for Pattern 6. | //+------------------------------------------------------------------+ bool CSignalAlligator::IsPattern_6(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && Lips(X()) > Lips(X()+1) && Lips(X()+1) < Lips(X()+2) && Lips(X()) > Teeth(X()) && Lips(X()+1) > Teeth(X()+1) && Teeth(X()) > Jaws(X())) { return(true); } else if(T == POSITION_TYPE_SELL && Lips(X()) < Lips(X()+1) && Lips(X()+1) > Lips(X()+2) && Lips(X()) < Teeth(X()) && Lips(X()+1) < Teeth(X()+1) && Teeth(X()) < Jaws(X())) { return(true); } return(false); }
若要智能系统仅与形态-6 一起使用,需将输入参数 “Patterns-Used-Bitmap” 赋值 2 的 6 次幂,即整数值 64,其为我们形态的索引。如果我们仅用该形态来优化我们的智能系统,按有利输入设置之一,会向我们提供以下报告:
如前所述,这并未经过交叉验证,而仅在此展示形态-6 的交易潜力、能力。
预防假冒
我们的最后一个形态-7,源于观察短吻鳄的颌线、齿线和唇线,看看它们是否在行情突破中保持齐头并进。此处的目标是预防假冒。因此,交易策略是,若发生看涨突破,但短吻鳄线并未明显发散,则记录为看涨假冒预防,因为行情或许会逆转,从而再次下跌。相较之,当短吻鳄线在下行的镜像价格突破中保持靠拢时,就被认为是看跌假冒预防,这通常意味着交易者需要避免入场做空。这些假冒在某种意义上暗示了相反的信号,为此,我们在 MQL5 中实现了这种形态,如下所示:
//+------------------------------------------------------------------+ //| Check for Pattern 7. | //+------------------------------------------------------------------+ bool CSignalAlligator::IsPattern_7(ENUM_POSITION_TYPE T) { if(Range(X()) <= Spread(X())) { if(T == POSITION_TYPE_BUY && Close(X()) < fmin(fmin(Jaws(X()), Teeth(X())), Lips(X())) && Close(X()+1) > fmin(fmin(Jaws(X()+1), Teeth(X()+1)), Lips(X()+1))) { return(true); } else if(T == POSITION_TYPE_SELL && Close(X()) > fmax(fmax(Jaws(X()), Teeth(X())), Lips(X())) && Close(X()+1) < fmax(fmax(Jaws(X()+1), Teeth(X()+1)), Lips(X()+1))) { return(true); } } return(false); }
我们的智能系统仅与该形态一起使用,需为所用形态输入赋值整数 128,一旦完成,我们采用上述其它模式类似的设置进行优化,品种 USDCHF、时间帧 H1、测试期 2023,当采用一些推荐的输入设置时,我们会得到以下报告:
组合所有形态
智能系统中把所有形态组合的潜力,引发了关于这是否合适、或交易者应当坚持单一形态的争论。我警告不要在真实账户里,采用各种形态的优化权重,因为我认为最好由交易者根据自己对相应指标的经验,将权重设置为常数。然而,在这次讨论中还有其它几点需要研究。
首先是境况意识与简单性的争论。如果该指标,短吻鳄,对您来说相对较新,那么可能提出这样的情况:跟踪多种形态允许更细致地了解与短吻鳄相关的整个行情周期;在这种情况下它们是:盘整、趋势开始、趋势延续、和趋势结束。这能提供过渡阶段细微变化的洞察,更不用说每个阶段可能的风险回报状况了。
在手工交易环境中观察和获取这些信息可能是理想的,而这不一定是我们考察本系列能得到的。不过,简单性的论点在于这样一个事实,即只关注一种形态,例如“进食”、或趋势阶段,有助于简化决策制定。当手工交易时,这可能是一个关键的论点,但由于我们打算运用智能系统,这不是一个大问题,特别是如果您认为其涉及的计算和内存资源甚小。
故此,总而言之,可以说多形态方式适合探索和学习,一旦交易者精通了怎样操作、如何、以及为什么有效,那专注于路径就适合。尽管有这些论点和警告,我们仍对各种形态进行了优化,以便发现当它们全部组合在一起时,哪种相对权重效果最佳。如此行事,由于我们希望用到多个形态,因此输入 “Pattern's Used Bitmap” 将在 0 到 255 的范围内进行优化。采用来自优化的一些有利输入参数,为我们提供了以下结果报告:
我们再次依据品种 USDCHF,采用 2023 年的 H1 时间帧,正如我们在上面的所有形态单独测试中那样。
结束语
我们试验了另一个指标,即比尔·威廉姆斯的短吻鳄,在自定义信号类别里逐个形态试验,目的是了解每种形态的相对重要性,以及组合所有形态是否比单独使用每种形态更有成效,这是针对 “总和大于部分” 的论调。虽然在这种情况下,我们的大量测试报告表明,鉴于我们组合所有形态后报告平淡无奇,“少即多”,但在得出明确结论之前,需要在我们的测试窗口(2023 年)之外进行更长时期的广泛测试。
本文由MetaQuotes Ltd译自英文
原文地址: https://www.mql5.com/en/articles/16329
注意: MetaQuotes Ltd.将保留所有关于这些材料的权利。全部或部分复制或者转载这些材料将被禁止。
This article was written by a user of the site and reflects their personal views. MetaQuotes Ltd is not responsible for the accuracy of the information presented, nor for any consequences resulting from the use of the solutions, strategies or recommendations described.




嗨,回溯测试 结果?
当我运行 EA 时,它不停地交易,每年交易 3943 次,似乎完全无视信号。
我对模式 2 特别感兴趣。很明显,它的位掩码是 4,但其他值呢?
当我运行 EA 时,它不停地交易,每年交易 3943 次,而且似乎完全无视信号。
我对模式 2 特别感兴趣。很明显,它的位掩码是 4,但其他值呢?
越来越多的人向我询问输入设置,但问题是我从不保留这些设置。我总是尝试在文章中分享交易对的名称、使用的时间框架和测试年份(我通常只测试一年)。
输入设置总是来自短期优化,没有经过交叉验证,因此严格来说不值得分享。
发布测试报告的目的只是为了证明信号的可交易性和使用性,仅此而已。寻找交叉验证设置的工作始终由读者自己完成。