English Русский Español Deutsch 日本語 Português
以 Doji(十字星)为例阐述改进的烛条形态识别

以 Doji(十字星)为例阐述改进的烛条形态识别

MetaTrader 5指标 | 24 二月 2022, 08:18
2 283 0
ds2
ds2

概述

烛条形态的优点之一是其简单性:它们的描述只包含几个短语,而分析时只需处理几根柱线,甚至一根,因此即使是初学者也可以掌握。

另一个优点是无需关于终端和硬件的具体要求,因为分析过程并未构建任何资源密集型指标。 这一事实在几十年前尤为重要,因为当时的计算机还没有今天那么先进。 许多烛条形态都是在那个年代引入的。

然而,简单的烛条形态背后,还有一个严重的瑕疵,可经由现代自动交易化工具所提供的强大能力来抵消。 这一瑕疵粗略地与市场状况的柱线限制有关,当然这就会影响交易效率。


传统烛条的缺点及可能的解决方案

图表上的柱线形态是离散的、已预定义开始和结束时间。 与之对比,市场上的事件不断发生。 一些重要的价格波动可以从某根柱线开始,持续多根才结束。 在这种情况下,与发生在整段柱线内相比,事件看起来在图表上完全不同。 这意味着相同的走势可以在图表上有不同的方式反映。

我们以 Doji(十字星)烛条的例子来验证这个猜想。 最有趣的 Doji 类型之一是墓碑(或蜻蜓,倒置时)。 它有一个极易识别的形状,被认为是趋势结束和潜在的逆转信号。 这根烛条的开盘价和收盘价大致相等,上面的阴影非常高,而下面的阴影几乎没有:

图例 1. 完美的 Doji 墓碑


在下面的示例中,图表没有这样的烛条:

图例 2. 常规 H4 时间帧柱线


真的是这样吗? 我们看看若切换到一个较低的时间帧时,在这些柱线内发生了什么变化:


图例 3. 常规 H1 时间帧柱线


在上图中,一些烛条的收盘价与其它柱线的开盘价大致相等。 如果我们把所有的柱线从 1 到 5 组合起来,我们就会得到一个 Doji 形态。 同样这也适用于 6 至 9,以及 7 至 9 的柱线。 我们把这样的柱线群称为 “metabars(元柱线)”:

图例 4. 在 H1 时间帧上的元柱线


这不是魔术或骗术。 这些是真正的 Doji 烛条,它基于实际价格走势,即等于 H1 时间帧的 5、4 和 3 柱线。 我们无法在标准 H4 时间帧内看到这些 Doji,因为时间帧的硬编码持续时间为 4 小时,而柱线的开始时间也是硬编码。 时间长度只相差一个小时,或者柱线边界偏移一个小时,结果就会截然不同。

我们错过了多少个 Doji 形态? 经证明,错过形态会导致错失交易信号。

但是,我们无法手动分析图表,以便发现这样的元柱线,因为这很耗费时间和精力。 一个完美的选项是提供一个可以自动进行此类分析的指标。


开发改进的 Doji 指标

首先,我们需要判定指标应该具有的输入参数。

我们来详细看看 Doji 形态都由哪些部分组成。

图例 5. 形态结构

Height 是烛条的总高度。

Body 是烛条主体的高度。

Shadow 是烛条较短影线的高度。 正常柱线有两条影线:上影线和下影线。 在 Doji 的例子中,我们对较短的影线感兴趣,因为根据 Doji 的说明,它应该几乎不存在,但是它没有提到相对的影线。

Doji 形态与其它柱线和烛条的不同之处在于其各部件的特殊比例。 其形态应该几乎没有主体,也几乎没有较短的影线。 然而,“几乎没有”是一个相当模糊的概念。 假设每位交易者都自行决定这根柱线是否与 Doji 形态足够相似。 当运用软件指标来处理时,我们需要明晰、正式的准则。 这就意味着我们应该能够在指标输入参数中指定所有这些比例。

input double  Candle_BodyPowerMax      = 0.2;    // Maximum body height relative to the candlestick height

这是,Candle_BodyPowerMax = Body / Height (参见上图)。 更准确地说,这是最大比率,超过这个比率,形态就不能被归类为 Doji。 比率等于或小于该值(小于等于零)的所有柱线将被视为 Doji。

这同样适用于影线:

input double  Candle_ShadowPowerMax    = 0.2;    // Maximum shadow height relative to the candlestick height

Candle_ShadowPowerMax = Shadow / Height (see the figure above). 更准确地说,这是最大比率,超过这个比率,形态就不能被归类为 Doji。 比率等于或小于该值(小于等于零)的所有柱线将被视为 Doji。

这组参数对于基于单根柱线绘制 Doji 的指标来说已经足够了。 但在我们的例子中,该指标将配合元柱线(MetaBar)一起运行。 因此,我们还需要一个输入项来指定元柱线的数量。 这是元柱线宽度。


图例 6. 基于元柱线的形态的特殊参数


宽度不一定是固定的(这是元柱线相对于常规时间帧的优势),但可以指定为一个范围:

input int     Candle_WidthMin          = 1;      // Minimum candlestick width in bars
input int     Candle_WidthMax          = 2;      // Maximum candlestick width in bars

如果用户设置 Candle_WidthMin = 1 和 Candle_WidthMax = 1,那么所有的元柱线都与常规柱线相等,因此这将是一种经典的 Doji 构造方法。 否则,指标将遍历指定宽度范围内的所有柱线序列,并检查它们能否一起构成一个 Doji 形态。

在每根柱线上,终端操作不仅将依据柱线本身,而是需要更久远的若干根柱线。 我们需要在 OnInit(指标初始化)中通知该指标,从而在图表上绘制时,在历史数据开始处留出一个小的缩进:

SkipBars = Candle_WidthMax;
PlotIndexSetInteger(0, PLOT_DRAW_BEGIN, SkipBars);

SkipBars 变量必须声明为全局变量(时间为整数值)。 它还应用于指标计算(在 OnCalculate 中),来避免指标基于历史最久远的柱线绘制和计算(这将导致元柱线在历史范围之外形成,进而导致错误)。

下面,我将概括地描述指标主要部分的算法。

主指标在 OnCalculate() 里以循环形式组织:循环遍历所有未计算的柱线。 这是计算所有指标值所必需的。
在这个通用循环中,存在另一个循环来构建所有可能的元柱线,从当前柱线开始,延展到过去。 这是一个从 1 到最大宽度(指示器输入)的循环。也就是说,元柱线最初等于一根价格柱线。 在每次迭代中,价格历史记录中的另一跟柱线被叠加到元柱线当中,以此类推。

通过比较价格柱线和元柱线的 OHLC,可以实现向元柱线叠加价格柱线。 该操作的结果是,元柱线累积极值,并逐步计算其增长的大小。

对于每根元柱线,指标会计算烛条相应的参数(实体高度、影线高度和宽度)。 它还检查这些值是否与输入参数中指定的阈值相符。

如果一根烛条被证明是理想的 Doji 形态,则会发生以下情况:

指标沿形态的方向(向上或向下)绘制一条垂直线。 线段的高度等于形态的宽度。

元柱线的延展循环中断。

完整的指标代码附在文后。

我们来查看指标在终端中的操作。

在此,指标发现了一根单柱线 Doji 形态:

图例 7. 指标通知一根单柱线 Doji 形态


由于指标只分析已完成收盘的柱线,因此图表中的 Doji 形态比指标信号晚一根柱线。 该指标的目的不是显示形态,而是生成实时信号,通知 Doji 形态已完成(并且将保持不变)。 这个形态可由多根柱线组成。 指标将发现的形态宽度显示为其线段高度值。 在此情况下,向上方的形态为 “1”,向下方的形态为 “-1”。

现在,我们来看一个由五根柱线组成的 Doji 形态。 通常,指标的主要目的是搜索此类复合形态:

图例 8. 指标通知 Doji 形态由五根柱线组成


我们看到 Doji 搜索算法工作正常。 在上图中,我高亮显示了找到的元柱线的大小、及其 OHLC 价位。

然而,为了有效地实际应用这个指标,我们还需要考虑一个方面。 形态的大小可以不同:有些较大,有些则较小。 其中一些可能非常小,比相邻的柱线还要小得多,以至于可以把它们视为噪音,因此很难把它们作为重大走势变化的信号。 这种小型 Doji 形态的实际应用作用为零。 它们不能作为趋势开始或结束的迹象,也不能代表任何其它迹象。

因此,我们需要改进指标,令其仅显示较大的 Doji 形态。 问题的解决方案似乎很简单:我们可以往指标里添加以下输入参数:

input double  Candle_HeightMin          = 0.01;   // Minimum candlestick height (in absolute prices)

然后,OnCalculate 会依据这条准则过滤所有找到的烛台。

如果形态是基于普通单根柱线构造的,这个解决方案将非常有效。 由于使用了元柱线,我们遇到了一个不明显的问题,这降低了该解决方案的效率。 一根普通的柱线有一些统计上的平均高度。 我们称之为 h 值。 如果我们需要找到较大的 Doji 形态,我们可以在指标设置中将形态高度最小值设置为 2*h。 但是,如果我们需要找到基于元柱线的大型 Doji 形态,比如宽度为 1 到 4 根柱线,该怎么办? 然后,由 4 个中等高度的柱线组成的元柱线的总高度为 2*h(如果前两根柱线依次上升,而后两根柱线下降)。

指标会把这样的元柱线显示 Doji,因为它符合中等高度条件。 但这是正确的吗? 事实上,这个形态是由普通的柱线组成,很难被认可是一个较强的价格走势的迹象。

在此情况下,将 Candle_HeightMin 设置为 4*h 也是错误的,因为我们的元柱线宽度可以为 1 根柱线,而这也许是一个太强的阈值。 在此情况下,指标会舍弃 2*h 和 3*h 的较好形态。

故此,我们需要创建一个元柱线高度过滤器,来描述价格变动的强度,该过滤器对任何元柱线(包括由一根柱线和四根柱线组成的元柱线)都同样强大、且可实现。

这个问题的解决办法很简单。 Candle_HeightMin 应指定为相对值,而非绝对值。 也就是说,它不是元柱线的绝对高度,而是每个单位时间的高度。 Candlestick Height/Width

甚至,我们可以用价格点数来表示这个参数。 在这种情况下,指标设置将不依赖所选的货币对。 所有其它设置,如 Doji 实体和影线大小,也与绝对价格无关。

因此,我们将用以下参数代替 Candle_HeightMin 输入参数:

input double  Candle_HeightPowerMin          = 0.5;   // Candlestick power = Height/Width, points per minute

指标代码中按此准则筛选的过滤器如下所示:

if ((CandleHeight/CandleWidth/_Point) < (Candle_HeightPowerMin*PeriodSeconds()/60)) DojiExists = false;

现在,该指标已准备就绪,可供实际使用。 完整的指标代码附在文后。

指标测试

是时候验证一下我们开发的东西了。 在测试过程中,我们将测量基于元柱线的指标在查找 Doji 形态时的效率。 我们将验证,与按每根柱线一个形态的经典版本相比,它的效率是其多少倍。

在 EURUSD H4 图表上,采用以下设置运行指标:

Candle_WidthMin  
1
Candle_WidthMax    1

因此,该指标设置只搜索一根柱线的 Doji 形态。

设置阈值,Doji 形态实体和影线的总尺寸小于形态高度的一半:

Candle_BodyPowerMax      
0.2
Candle_ShadowPowerMax   
0.2

关于形态实体部位的尺寸,这些设置相当自由。 在实际交易中,您可能想将其设置为 0.1 或接近于零,以便 Doji 形态几乎完美。 当前测试的主要目的是比较两种不同方法(单根和元柱线)识别的形态数量。 样本应足够大,从而减少统计误差。

出于同样的原因,我们不会对形态的高度设定太高的要求。 目前,该过滤器将为零,以便观察所有 Doji 形态,包括强弱:

Candle_HeightPowerMin   
0

所以,所有参数都设置好了。 这是终端中的指标图表:


图例 9. 在普通(单)H4 柱线上构造 Doji 形态的指标


如果您滚动图表,则会看到,例如,两个月内只有 9 个这样的 Doji 形态。 这是传统的形态建造方法,采用单根柱线。

为了评估元柱线的优势,现在我们来把图表时间帧更改为 H1,并修改指标输入参数:

Candle_WidthMin  
4
Candle_WidthMax   
4

现在,指标将寻找由四根 H1 柱线宽度组成的形态。 该元柱线与上一示例中的传统 H4 柱线一样宽。 唯一的区别是经典柱线有严格的开始时间:0:00、4:00、8:00、等等。 元柱线的开始时间将增加四倍:0:00、1:00、2:00、3:00、4:00、等等。 宽度虽然是一样的,但随着时间的推移,灵活性要大得多。 我们来看看结果:


图例 10. 依据元柱线构建 Doji 形态的指标,每个元柱线由四根 H1 柱线组成


图例 10 显示了与图例 9 相同的价区格段。 这次有很多额外的 Doji 形态。 在两个月的时间里,元柱线指标总共识别出 54 个 Doji 形态。

这是经典方法的 6 倍! 新方法的优点是显而易见的。

接下来,我们采用更灵活的开始时间和基于 H1 的元柱线宽度来验证变体 — 相对于传统的 H4 柱线宽度将略有波动:

Candle_WidthMin  
3
Candle_WidthMax   
5


图例 11. 基于元柱线构建 Doji 形态的指标,每个元柱线由 2-5 根 H1 柱线组成


Doji 形态的数量增加得更多。 请注意,终端中不存在 H5 时间帧,因此此类 Doji 形态无法使用经典方法来实现。

通过覆盖所有可能的非标准时间帧,与经典方法相比,我们可以最大限度地提升检测到的 Doji 形态。 为此目的,我们在含有以下设置的最小可用 M1 时间帧上运行指标:

Candle_WidthMin  
180
Candle_WidthMax   
300

这似乎与上面的 3-5 H1 范围相同。 唯一的区别是,我们有一个更灵活的柱线开始时间:以分钟替代了小时。 然而,真正的区别要深刻得多:我们将获得宽度非常灵活的元柱线,不仅是小时的整数值 H1(3, 4, 5),而且是实数值,例如 199 M1,即 3.32 H1 或 6.63 M30;39.8 M5 等。 就传统交易而言,这些都是非常非标准时间帧。 交易者从不在这样的时间帧内构造任何形态。 在这里,数百个这样的时间帧组合在一个指标中,出现在一张图表上:


图例 12. 基于元柱线构建 Doji 形态,每个元柱线由 180-300 M1 柱线组成


现在我们得到数千个指标信号。 在这种模式下,Doji 形态几乎随处可见。 由于本例中的元柱线非常宽(比一根柱线高两个数量级 (!)),它们相互重叠。 由于指标报告所有找到的 Doji 形态宽度,我们可以在价格表上找到它们的边界。 我已经用彩色矩形标记了其中的一些元柱线。

在上图中真正引人注目的是,同一个长序列的价格既可以是向上 Doji 形态的一部分,也可以是向下形态的一部分! 这看起来似乎很疯狂和混乱,与任何交易都不相容。 但事实上,这里没有错误或问题。 我们没有针对已识别出的形态使用高度过滤器,因此许多形态都很短 — 处于价格波动噪音的水平,这就是为什么它们很容易通过小的时间偏移、或形态宽度的微小变化来改变方向。 我们尝试通过在指标设置中设置过滤器来克服这种噪音:

Candle_HeightPowerMin   
2

现在情况完全不同了:图表只显示了很强的形态,检测到的形态序列现在具有相同的方向:


图例 13. 基于元柱线构建 Doji 形态指标,每个元柱线由 180-300 M1 柱线组成,带有高度过滤器


M1 时间帧和宽泛的元柱线,令我们能够研究一个以前无法访问的新维度。 在这样一个指标上显示的每一个密集的形态序列实际上描述了一个随时间变化的形态。 针对它的动态分析可能会让人们得出额外的结论,而传统方法无法提供这种结论;在传统方法中,形态被视作绑定在一根柱线上的静态实体。 对于静态形态,如果时间参数稍微改变,形态就不会提供什么信息了。 可以针对这个新领域进行研究了。


结束语

在本文中,实验令人信服地表明,采用元柱线可以对形态进行更详细的分析:

  • 相比经典方法能发现更多的形态

  • 在额外的烛台上发现它们,这于传统的方法基本上是不可用的

  • 具有更大的灵活性和便利性(即便用的是单一图表),可以针对特定的交易者任务进行定制

  • 准确跟踪形态形成的开始和结束,监控形态在其整个生存期内的变化动态

本文中讲述的技术不仅适用于 Doji,还可以扩展解释所有其它经典形态的可能性。

然而,文章并未考虑所有细微差别。 该指标也尚未用于交易。 元柱线指标的实际效果可能因交易策略而异。 Doji 形态不是交易信号,所以您不应该期望元柱线的交易数量会随着指示信号的增加而增加。 Doji 形态交易需要对额外的市场条件进行额外的分析和验证。 是否可以将元柱线与其它类型的分析(基于常规柱线)结合起来? 它将如何影响交易数量? 我们在 M1 时间帧上看到了大量连续的指示信号,它们基本上是一个形态。 毫无疑问,由于这种形态的波动性和延展性,它可以适应其生存期内出现的各种市场情况。 这提高了产生有用信号(开仓或平仓交易)的机会,而传统的形态不会显示任何信号。

关于交易数量的可靠统计数据只能从更深入的实验中获得。 这是一个相当大的独立研究主题。 如果交易者觉得这样一篇讲述一个指标的文章很有趣,我可以在接下来的文章中继续实验,来检查交易策略中的行为。

本文由MetaQuotes Ltd译自俄文
原文地址: https://www.mql5.com/ru/articles/9801

附加的文件 |
MetaDoji.mq5 (10.49 KB)
DoEasy 函数库中的图形(第九十部分):标准图形对象事件。 基本功能 DoEasy 函数库中的图形(第九十部分):标准图形对象事件。 基本功能
在本文中,我将实现跟踪标准图形对象事件的基本功能。 我将从图形对象上的双击事件开始。
在 MQL5 中使用 AutoIt 在 MQL5 中使用 AutoIt
简述。 在本文中,我们将探索采用 MetraTrader 5 终端里以集成的 MQL5 编写 AutoIt 脚本。 在其中,我们将覆盖如何操纵终端的用户界面来自动完成各种任务,并介绍一个采用 AutoItX 库的类。
MQL5 中的矩阵和向量 MQL5 中的矩阵和向量
运用特殊的数据类型“矩阵”和“向量”,可以创建非常贴合数学符号本意的代码。 运用这些方法,您可以避免创建嵌套循环,或在计算中分心记忆正确的数组索引。 因此,矩阵和向量方法的运用能为开发复杂程序提高可靠性和速度。
DoEasy 函数库中的图形(第八十九部分):标准图形对象编程。 基本功能 DoEasy 函数库中的图形(第八十九部分):标准图形对象编程。 基本功能
目前,该函数库能够跟踪客户端终端图表上的标准图形对象,包括删除和修改其某些参数。 在当下,它还缺乏从自定义程序创建标准图形对象的能力。