双重反转CMO量子策略


创建日期: 2024-01-04 14:35:23 最后修改: 2024-01-04 14:35:23
复制: 0 点击次数: 428
avatar of ChaoZhang ChaoZhang
1
关注
1301
关注者

双重反转CMO量子策略

概述

该策略是一种双重反转策略,结合了123反转指标和CMOWMA量子指标,实现价格反转信号的双重确认,具有红绿染色K线视觉效果。

策略原理

策略由两部分组成:

  1. 123反转指标

    • 使用收盘价与昨日收盘价的大小关系判断价格上涨或下跌
    • 利用Stochastic指标的快线和慢线交叉来确认反转信号
    • 当符合条件时产生做多或做空信号
  2. CMOWMA量子指标

    • 使用CMO指标测量价格动量
    • 对CMO指标进行WMA加权移动平均
    • CMO指标高于(低于)其WMA时看多(空)

两部分信号同向时进入仓位。

策略优势

  1. 双重确认机制,可过滤假断和减少无谓头寸
  2. 红绿K线染色,形成视觉效果,容易判断市场状况
  3. 利用反转和动量指标的组合,整体稳定性良好
  4. 简单参数设置,适合多种品种,容易实施

策略风险

  1. 反转后可能再反转,存在尾盘风险
  2. 仓位频繁切换,产生过多交易费用
  3. 参数设置不当可能造成信号过多或过少
  4. CMO参数需要根据品种特点调整

可以通过适当放宽反转条件、增加持仓时间、优化参数组合等方法降低风险。

策略优化

  1. 可以测试不同Stochastic参数对效果的影响
  2. 可以结合其他指标如MACD、KDJ等替代或添加确认
  3. 可以测试不同CMO和WMA长度参数的优化
  4. 可以尝试在特定级别添加止损止盈
  5. 可以设置过滤条件,控制开仓频率

总结

该策略整体稳健,参数简单,容易实施,同时结合价格反转和动量指标,形成有效的双重信号过滤机制,可以过滤假信号,且K线染色效果直观。通过参数优化和风险控制,可以进一步提升策略表现。

策略源码
/*backtest
start: 2023-12-04 00:00:00
end: 2024-01-03 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
////////////////////////////////////////////////////////////
//  Copyright by HPotter v1.0 19/08/2019
// This is combo strategies for get a cumulative signal. 
//
// First strategy
// This System was created from the Book "How I Tripled My Money In The 
// Futures Market" by Ulf Jensen, Page 183. This is reverse type of strategies.
// The strategy buys at market, if close price is higher than the previous close 
// during 2 days and the meaning of 9-days Stochastic Slow Oscillator is lower than 50. 
// The strategy sells at market, if close price is lower than the previous close price 
// during 2 days and the meaning of 9-days Stochastic Fast Oscillator is higher than 50.
//
// Second strategy
//    This indicator plots Chandre Momentum Oscillator and its WMA on the 
//    same chart. This indicator plots the absolute value of CMO.
//    The CMO is closely related to, yet unique from, other momentum oriented 
//    indicators such as Relative Strength Index, Stochastic, Rate-of-Change, 
//    etc. It is most closely related to Welles Wilder?s RSI, yet it differs 
//    in several ways:
//    - It uses data for both up days and down days in the numerator, thereby 
//        directly measuring momentum;
//    - The calculations are applied on unsmoothed data. Therefore, short-term 
//        extreme movements in price are not hidden. Once calculated, smoothing 
//        can be applied to the CMO, if desired;
//    - The scale is bounded between +100 and -100, thereby allowing you to clearly 
//        see changes in net momentum using the 0 level. The bounded scale also allows 
//        you to conveniently compare values across different securities.
//
// WARNING:
// - For purpose educate only
// - This script to change bars colors.
////////////////////////////////////////////////////////////
Reversal123(Length, KSmoothing, DLength, Level) =>
    vFast = sma(stoch(close, high, low, Length), KSmoothing) 
    vSlow = sma(vFast, DLength)
    pos = 0.0
    pos := iff(close[2] < close[1] and close > close[1] and vFast < vSlow and vFast > Level, 1,
	         iff(close[2] > close[1] and close < close[1] and vFast > vSlow and vFast < Level, -1, nz(pos[1], 0))) 
	pos

CMOWMA(Length, LengthWMA) =>
    pos = 0
    xMom = abs(close - close[1])
    xSMA_mom = sma(xMom, Length)
    xMomLength = close - close[Length]
    nRes = 100 * (xMomLength / (xSMA_mom * Length))
    xWMACMO = wma(nRes, LengthWMA)
    pos := iff(nRes > xWMACMO, 1,
    	   iff(nRes <= xWMACMO, -1, nz(pos[1], 0))) 
    pos

strategy(title="Combo Backtest 123 Reversal & CMO & WMA", shorttitle="Combo", overlay = true)
Length = input(14, minval=1)
KSmoothing = input(1, minval=1)
DLength = input(3, minval=1)
Level = input(50, minval=1)
//-------------------------
LengthCMO = input(14, minval=1)
LengthWMA = input(13, minval=1)
reverse = input(false, title="Trade reverse")
posReversal123 = Reversal123(Length, KSmoothing, DLength, Level)
posCMOWMA = CMOWMA(LengthCMO, LengthWMA)
pos = iff(posReversal123 == 1 and posCMOWMA == 1 , 1,
	   iff(posReversal123 == -1 and posCMOWMA == -1, -1, 0)) 
possig = iff(reverse and pos == 1, -1,
          iff(reverse and pos == -1 , 1, pos))	   
if (possig == 1) 
    strategy.entry("Long", strategy.long)
if (possig == -1)
    strategy.entry("Short", strategy.short)	 
if (possig == 0) 
    strategy.close_all()
barcolor(possig == -1 ? #b50404: possig == 1 ? #079605 : #0536b3 )