手把手的教你实现MACD的变色与背离

发布于: 雪球转发:0回复:0喜欢:1

作为最经典最实用的技术指标,MACD被称为“指标之王”,几乎所有的交易软件中都自带了这个指标。

但这些自带的MACD指标一般都有两个问题。首先是不能有效识别趋势,只能通过柱线的高低来判断;其次是不能有效识别背离,只能手动划线后再对比MACD与收盘价趋势是否一致来判断。

因此,针对这两个问题,这篇文章将会手把手的带你对交易软件自带的MACD指标进行改造。

变色

先来看一下系统自带的MACD指标是如何实现的。

富途PC版上点击“指标管理”,找到MACD,查看其源码。可以看到,系统自带的MACD是通过COLORSTICK实现的。

然后查看函数定义可以发现,其只是实现了最基本的按零轴上下画不同颜色柱状线的功能。

那么,为了让MACD的走势更加明显,我们可以仿照TradingView的实现方式,在零轴上下时,根据其涨跌情况设置不同的颜色。

实现思路

要想实现根据涨跌情况来变色,显然,首先要获取到上一个周期的数据,以便于同当前周期的数据进行比较。其次,要有一个可以自定义画柱状图的函数,以便于在指定条件下,画指定长度、宽度、颜色的柱状图。

所需函数

显然,我们可以通过 REF 函数获取上一个周期的数据。

可以通过 STICKLINE 来设置自定义的柱状图。

具体步骤

基础数据

首先要通过EMA获取MACD指标中的三个数据项。

DIF: EMA(C, 12) - EMA(C, 26), COLORE51883;

DEA: EMA(DIF, 9), COLOR7F9A00;

MACD: (DIF - DEA) * 2, COLORSTICK;

逻辑判断

然后通过判断MACD在零轴上下以及与上一周期的数据比较涨跌来绘制不同的颜色。

STICKLINE(MACD > 0 AND MACD >= REF(MACD, 1), 0, MACD, 0.8, 0), COLORFF5252;

STICKLINE(MACD > 0 AND MACD < REF(MACD, 1), 0, MACD, 0.8, 0), COLORFFCDD2;

STICKLINE(MACD < 0 AND MACD >= REF(MACD, 1), MACD, 0, 0.8, 0), COLORB2DFDB;

STICKLINE(MACD < 0 AND MACD < REF(MACD, 1), MACD, 0, 0.8, 0), COLOR26A69A;

效果展示

在“指标管理”中新建一个指标,“缩写”和“全名”都要填写,“对象”选择“副图”,敲入上面的代码。

特斯拉上与系统自带MACD指标的对比。

背离

背离是指技术指标的方向与价格的方向相反。

股价创新高而指标却未创新高则为顶背离,表示多头的趋势强度减弱,市场可能发生顶部反转;

股价创新低而指标却未创新低则为底背离,表示空头的趋势强度减弱,市场可能发生底部反转。

当然,在强劲的趋势中,有可能会发生“顶中有顶,底中有底,背离之后再背离”的情况,具体还是要结合实际的场景区别对待。

实现思路

一般在识别背离时,需要首先连接股价的两个高点(低点),再连接相同时间范围对应的MACD,看其涨跌是否一致。

因此,如果想要实现对背离的自动识别,就需要做到三件事。

首先是触发机制,即在什么时候触发是否背离的判断;

其次是时间范围,即对多长时间范围的数据进行比较;

最后是判断方法,即触发后比较哪两组数据的涨跌情况。

股价是肯定要进行比较的,关键是另外一组数据的选择。

MACD指标由三部分组成,分别是:DIF(差离值)、DEA(差离值平均数)和 MACD(柱状线)。因此这个“另外一组数据”就有了三种选择。为了简便起见,这里以 DIF 为例进行演示。

触发机制

显然,可以使用快慢线的金叉、死叉来作为触发机制。这里可以直接通过 CROSS 函数实现。

{是否金叉: DIF上穿DEA}

COND_GC := CROSS(DIF, DEA);

时间范围

当发生金叉(死叉)时,MACD从零轴下方(上方)回到了上方(下方),因此,可以比较当前金叉(死叉)与上一次金叉(死叉)时两组数据的变化情况。

对于“上一次”可以使用BARSLAST函数来实现。

BARS_GC := BARSLAST(REF(COND_GC, 1)) + 1;

判断方法

当前发生金叉,且当前股价与上一次金叉时的股价相比,当前DIF与上一次金叉时的DIF相比,股价在降低而DIF在上升则发生底背离。

BD := COND_GC AND DIF > REF(DIF, BARS_GC) AND C < REF(C, BARS_GC);

锦上添花

识别出背离后,可以通过绘图函数进行标识。

标识文字

{标识: 满足底背离时在 DIF 的 1.6 倍处(避免遮挡)显示文字标识}

DRAWTEXT(BD, DIF * 1.6, '底背离'), COLORFF5252;

标识线段

{画线: 以上一次金叉(LGC)的 DEA 为起点,以当前金叉的 DIF 为终点}

DRAWLINE(COND_GC AND BARS_GC > 0 AND NOT(BD), DEA, BD, DEA, 0), COLORFF5252, LINETHICK3;

效果展示

在上一步的基础上再添加上背离部分的代码即可。

然后原来已经具有变色功能的MACD现在又多了对底背离、顶背离的自动识别。