大数跨境
0
0

经典策略范例:"逆转MACD(Reversing MACD)"交易系统

经典策略范例:"逆转MACD(Reversing MACD)"交易系统 我爱程序化
2025-09-10
2
导读:两个互补函数,用于计算:逆转 MACD由 Gerald Appel 创建的移动平均线收敛/发散 (MACD)

两个互补函数,用于计算:逆转 MACD

由 Gerald Appel 创建的移动平均线收敛/发散 (MACD) 可能是当今最流行的动量震荡指标之一。它使用两条不同长度的指数移动平均线 (EMA) 计算,是较短(快)周期 MACD 的值减去较长(慢)周期 EMA 的值。MACD 在移动平均线交叉的零值上下波动。

在 Giorgos Siligardos 的文章 “RSI 的逆向工程 ”中,他表明逆向工程相对强弱指数 (RSI) 可以利用震荡指标的值帮助确定下一时间段的收盘价。在 “RSI 波段 ”一文中,Francois Bertrand 演示了在价格图表上叠加 RSI 超买/超卖水平。

我将展示特定 MACD 水平的价格值计算方法,以及导致 MACD 改变方向的价格值计算方法。然后可以通过在价格图表上叠加这些值来显示它们与价格的关系。此处显示的价格图表和代码来自 AmiBroker 图表软件包。

反向 MACD 价格关系

让我们从 MACD 的定义开始:

MACDt = MACD(Pt, Xt, Yt) = EMA (Pt, Xt) - EMA (Pt, Yt)

其中

Pt 是输入序列,传统上是一系列收盘价 Xt 是快速周期,通常为 12

Yt 是慢周期,通常为 26

EMA(Pt, Xt) = αX * Pt + (1 - αX) * EMA(Pt-1, Xt-1)

EMA(Pt, Yt) = αy * Pt + (1 - αY) * EMA(Pt-1, Yt-1)

是周期值 X 的乘数权重
是周期值 Y 的乘数权重

除了绘制两条指数移动平均线之外,我们如何将一些 MACD 信息投射到价格图表上呢?一种方法是找到所需的价格 Pt,在该价格 Pt 上,MACDt 达到与前一栏 MACDt-1 值相同的值。如果实际值大于推导出的 Pt,则 MACD 值将大于 MACDt-1,如果小于,则 MACD 值将小于 MACDt-1。下面是一种计算方法。我们知道

MACD(Pt, Xt, Yt) = EMA(Pt, Xt) - EMA(Pt, Yt)

现在将计算结果代入 EMA(Pt, Xt) 和 EMA(Pt, Yt) 即可得出:

MACD(Pt, Xt, Yt) = (αX * Pt + (1 - αX) * EMA(Pt-1, Xt-1)) - (αY * Pt + (1 - αY) * EMA(Pt-1, Yt-1))

由此得出

MACD(Pt, Xt, Yt) = (αX - αY) * Pt + (1 - αX) * EMA(Pt-1, Xt-1) - (1 - αY) * EMA(Pt-1, Yt-1)

根据 MACD 的定义,MACDt-1 的前值为

MACD(Pt-1, Xt-1, Yt-1) = EMA(Pt-1, Xt-1) - EMA(Pt-1,Yt-1)

因此,对于价格 Pt 来说

MACD(Pt,Xt,Yt)= MACD(Pt-1,Xt-1,Yt-1)

那么

(αX - αY) * Pt + (1 - αX) * EMA(Pt-1, Xt-1) - (1 - αY) * EMA(Pt-1, Yt-1) = EMA(Pt-1, Xt-1) - EMA(Pt-1,Yt-1)

简化为

(αX - αY) * Pt - EMA(Pt-1, Xt-1) * αX + EMA(Pt-1, Yt-1) * αY = 0

因此,如果 MACDt = 0,Pt 将基本上代表 MACDt 为零的那条线。使用 AmiBroker,函数 PMACDlevel() 表示等式。

根据 PMACDlevel() 函数,还可以推导出 PMACDeq() 函数。它只是用 EMA(Pt-1,Xt-1)- EMA(Pt-1,Yt-1)代替 MACDt 的值,因为我们希望 MACDt 等于 MACDt-1 的值。

示例

AmiBroker 公式语言 (AFL) 中的代码在 Traders.com 用户专区的 “反转 MACD 的 AmiBroker 公式语言代码 ”条目中列出,分为两部分,一部分是价格图表的列表,另一部分是指标面板的列表。使用参数 “绘制图表 ”选择要在价格图表中叠加的内容,使用指标面板上的参数 “绘制指标 ”选择要显示的指标。

自然,您会想看看结果图表的样子,并将其与 MACD 本身进行比较。我将展示几张图表作为示例,展示 MACD 指标的不同绘制方式,并展示价格图表上绘制的反向映射的类似技术。在每个图表上,都会有由函数 PMACDeq() 生成的一条或多条线,以及由函数 PMACDzero() 生成的线,后者只是 PMACDlevel(),MACD 水平值为零。

请注意,当 MACD 值为正高位时,函数 PMACDzero() 得出的 MACD 为零所需的价格在数学上可能小于零。在代码中,PMACDzero() 和 PMACDeq() 只是叠加在价格图表上,并没有重新缩放纵轴。这可以通过手动调整 Y 轴或将 “绘图缩放 ”参数改为 “是 ”来改变。

Figure 1: S&P 500 with macd, Pmacdeq(), NiNe-Period ema ofF Pmacdeq() aNd Pmacdzero() of the cloSiNg Price.2010年12月至2011年2月期间,PMACDeq()线基本处于上升趋势,收盘价围绕其震荡。相应的 MACD 为正值,几乎以水平线上下波动,显示趋势可能为正。

图 1(“绘图 ”设置为 “PMACD”)的上面板显示的是标准普尔 500 指数的价格图表,下面板(“绘图指标 ”设置为 MACD)显示的是收盘价的标准 MACD(蓝色虚线及其红色信号线表示)。在价格图表上,蓝线是 PMACDeq(),红线是 PMACDeq() 的九周期 EMA,黑线是 PMACDzero()。

根据默认参数,所有三条线都是提前一格绘制的。请注意,绘制黑线时没有重新缩放图表。否则,它可能会偏离图表的垂直比例。从 2010 年 12 月到 2011 年 2 月第四周,PMACDzero() 黑线被剪切(PMACDzero() 值低于显示的黑线),而在 2011 年 6 月,PMACDzero() 值高于显示的黑线。

2010 年 12 月至 2011 年 2 月期间,PMACDeq() 线基本处于上升趋势,收盘价在其附近震荡。相应的 MACD 为正值,几乎以水平线上下波动,显示趋势可能为正。从右边第二个条形图(2011 年 7 月 1 日)开始,可以看到 MACD() 值为 0.25(刚刚越过零线),相应的白色蜡烛收盘价为 1339.67,高于 PMACDeq() 值 1289.47(这是两条指数移动平均线的交叉点)。

第二天(2011 年 7 月 5 日),市场收盘于 1337.88 点,MACD() 仍然上升至 3.25。蓝线显示第二天(7 月 6 日)(尚未发生)的情况是,即使市场下跌但收盘价高于 1308.96,MACD() 仍可能上升。黑线显示,市场可能从 1337.88 点下跌至 1268.28 点以上收盘,而 MACD() 仍可能高于零。请注意,最后一组信息已添加到下面板的 MACD 中,从而对其进行了补充。

我将展示特定 MACD 水平的价格值计算,以及导致 MACD 改变方向的价格值计算。

有些人可能更喜欢使用最高价或最低价而不是收盘价来绘制 MACD。在图 2 的底部子图(“绘图指标 ”设置为 MACD_HLC")上,有分别用绿色、蓝色和红色线条表示的最高价、收盘价和最低价的 MACD 线。在顶部(“绘图 ”设置为 PMACD_HLC),最高价、收盘价和最低价的 PMACDeq() 被绘制成一个带状。正如您所看到的,有几次最高点、最低点和收盘点的 MACD 线数值相近,而导数 PMACDeq() 线可能有很大差异,在价格图表上显示为带状可能很有用。

图 2:标准普尔 500 指数图表,包含最高价、最低价和收盘价的 Pmacdeq() 以及收盘价的 Pmacdzero()。底部面板显示最高价、最低价和收盘价的 MACD 指标。有几次,最高价、最低价和收盘价的 MACD 指标数值相近,而导数 PMACDeq() 线可能会有很大差异,在价格图表上显示为波段可能很有用。

布林线通常是应用于价格序列的波动带,但也可与商品通道指数 (CCI) 或 MACD 等许多标准指标配合使用。在图 3 中,MACD() 的布林线显示在底部面板上(参数 “绘图指标 ”设置为 PMACD_BB),PMACDeq() 的布林线叠加在价格图表上(参数 “绘图图表 ”设置为 PMACD_BB)。在 2010 年 12 月至 2011 年 2 月期间,注意价格图表线和布林带的变化,并与 MACD_BB 指标进行比较。

图 3:标准普尔 500 指数图表,其中有当前价格的 PMacdeq()、布林带和当前价格的 PMacdzero()。底部面板显示的是带有布林带的 MACD。在 2010 年 12 月至 2011 年 2 月期间,请注意价格图表线和布林线的变化,并将其与 MACD_BB 指标进行比较。

图 4(“绘制图表 ”参数设置为 PMACD_MTF,“绘制指标 ”参数设置为 MACD_MTF)显示了使用三个不同周期的指标示例。在指标面板上,您可以看到蓝色的标准 MACD 线、绿色的 5 倍标准周期 MACD 和红色的 21 倍标准周期 MACD。由于默认时间框架为日线,因此可以想象绿色和红色线分别与周线 MACD 和月线 MACD 的近似程度。

Figure 4: MultiPle tiMe FraMeS. 标准普尔 500 指数图表,有三个收盘价的 PMacdeq() 和收盘价的 PMacdzero()。在标准普尔 500 指数的图表中,您可以看到收盘价的三个 PMACDeq() 和收盘价的 PMACDzero()。底部面板显示三个 MACD 指标。

最后

我展示了两个补充 MACD 的函数。第一个函数 PMACDeq() 计算 MACD 值保持不变所需的下一栏价格。第二个函数 PMACDlevel() 计算 MACD 值为特定恒定值时所需的价格。当水平常数值为零时,函数 PMACDzero() 基本上就是 PMACDlevel() 函数。它计算 MACD 移动平均线交叉所需的价格。由于函数基于价格,因此可以应用其他技术指标,如移动平均线和布林线。


程式码:(仅适用于multicharts平台)
inputs:        MACDPrice( Close ), { price used for PMACDeq }        P_Fast( 12 ),        P_Slow( 26 ),        P_Signal( 9 ), { PMACDeq EMA Signal length }        p_bbperiod( 10 ), { BB average length }        p_bbwidth( 1 ) ; { BB # of standard deviation }variables:        MyMACD( 0 ),        UpperBand( 0 ),        LowerBand( 0 ) ;MyMACD = MACD( MACDPrice, P_Fast, P_Slow ) ;UpperBand = BollingerBand( MyMACD, p_bbperiod,p_bbwidth ) ;  LowerBand = BollingerBand( MyMACD, p_bbperiod,-p_bbwidth ) ;{ Entry }if MyMACD crosses above UpperBand then Buy ( "MACD BB LE" ) next bar market ;if MyMACD crosses below LowerBand then SellShort ( "MACD BB SE" ) next bar market ;{ Exits }if MyMACD crosses below UpperBand then Sell ( "MACD BB LX" ) next bar market ;if MyMACD crosses above LowerBand then BuyToCover ( "MACD BB SX" ) next bar market ;

简评:

结合了macd 与boll带两种指标效果还是挺不错的。

完整文章地址:http://www.qhlt.cn/thread-160838-1-1.html
关注我们微信及群,第一时间获取最新策略解析及程式码

关注微信:

加入群:每天接收新策略新思路

关注公众号:每天经典策略不错过!

通过下面方式支持我们:

1、关注管理员微信、我们公众号及入群。

2、想用multicharts平台做程序化可以联系我们购买它们年度会员或绑定实盘进行程序化,我们有最具性价比的手续费政策和年度会员购买优惠折扣政策。

3、使用我们自研平台“鼎元C++全自动化”平台进行期货量化交易,执行期货公司特惠佣金费率,享受免平台费服务,【执行无平台费,不加手续费政策】,众多策略模板范例可供参考、优化与升级。我们还提供更多的教程服务与视频培训,欢迎咨询。

4、通过我们开立证券股票账户,执行人性化佣金政策,欢迎咨询。

5、我们的工作与研究离不开大家的支持。感谢大家!

图片

【声明】内容源于网络
0
0
我爱程序化
期货程序化介绍、平台、策略及源码研究与编程。20年策略研究,15年实战经验。
内容 292
粉丝 0
我爱程序化 期货程序化介绍、平台、策略及源码研究与编程。20年策略研究,15年实战经验。
总阅读623
粉丝0
内容292