Momentum Reversal Combo Strategy

Author: ChaoZhang, Date: 2024-01-12 12:22:47



This strategy combines the 123 Reversal strategy and the CMO moving average strategy to generate combined trading signals. The 123 Reversal strategy generates trading signals by forming new highs or lows from the closing prices over two consecutive days combined with judgments on market momentum from the Stochastic Oscillator. The CMO moving average strategy utilizes the CMO indicator to determine price momentum and generate trading signals. The combination of signals from both strategies can form more reliable combo signals.

Strategy Logic

The 123 Reversal strategy generates trading signals based on the following logic:

  1. When the closing price rises for two consecutive days and the 9-day Stochastic Oscillator is below 50, go long.

  2. When the closing price falls for two consecutive days and the 9-day Stochastic Oscillator is above 50, go short.

By judging whether prices have formed new highs or lows in the short term combined with the Stochastic Oscillator’s indication on momentum, trading signals are generated.

The CMO moving average strategy generates trading signals based on the following logic:

  1. Calculate the CMO values over 5, 10 and 20 days.

  2. Take the average.

  3. When the average CMO goes above 70, go long.

  4. When the average CMO falls below -70, go short.

By conducting ensemble operations over CMO values of different timeframes, the strategy determines the direction of price momentum and generates trading signals.

The combo strategy performs an AND operation over the signals of the two strategies, meaning that actual trading signals are only triggered when both strategies give buy or sell signals simultaneously.


The advantages of this strategy include:

  1. Combined signals are more reliable with fewer false signals.

  2. The 123 Reversal strategy captures trends after short-term corrections.

  3. The CMO moving average strategy judges momentum over larger timeframes.

  4. Can adapt to different market environments.

Risk Analysis

The risks of this strategy include:

  1. The 123 Reversal strategy relies heavily on price patterns and may fail occasionally.

  2. The CMO indicator is sensitive to market fluctuations, which may generate wrong signals.

  3. The combo strategy’s signals can be too conservative, missing trading opportunities.

  4. Proper parameter tuning is needed to adapt to different cycles and market environments.

The counter measures are:

  1. Optimize the pattern recognition rules of the reversal strategy.

  2. Add other auxiliary indicators into the CMO moving average strategy.

  3. Evaluate recent performance dynamically and adjust parameters accordingly.

Optimization Directions

This strategy can be improved from the following aspects:

  1. Use machine learning algorithms to automatically optimize the combo weights.

  2. Add adaptive tuning modules to dynamically optimize parameters.

  3. Add stop loss modules to effectively control risks.

  4. Evaluate the robustness of the strategy and improve pattern recognition algorithms.

  5. Incorporate industry selection, fundamentals and other factors.


This strategy forms an effective combo trading system from two highly complementary strategies - the 123 Reversal and the CMO moving average. With proper risk control, it can generate stable alpha returns. As the algorithms and models continue to be upgraded, the profitability and stability of this strategy is expected to be further improved.

start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 3h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]

//  Copyright by HPotter v1.0 19/09/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 average of three different length CMO's. This indicator 
//    was developed by Tushar Chande. A scientist, an inventor, and a respected 
//    trading system developer, Mr. Chande developed the CMO to capture what he 
//    calls "pure momentum". For more definitive information on the CMO and other 
//    indicators we recommend the book The New Technical Trader by Tushar Chande 
//    and Stanley Kroll.
//    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.
// - 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))) 

CMOav(Length1,Length2,Length3, TopBand, LowBand) =>
    pos = 0
    xMom = close - close[1]
    xMomabs = abs(close - close[1])
    nSum1 = sum(xMom, Length1)
    nSumAbs1 = sum(xMomabs, Length1)
    nSum2 = sum(xMom, Length2)
    nSumAbs2 = sum(xMomabs, Length2)
    nSum3 = sum(xMom, Length3)
    nSumAbs3 = sum(xMomabs, Length3)
    nRes = 100 * (nSum1 / nSumAbs1 + nSum2 / nSumAbs2 + nSum3 / nSumAbs3 ) / 3
    pos := iff(nRes > TopBand, 1,
    	     iff(nRes < LowBand, -1, nz(pos[1], 0))) 

strategy(title="Combo Backtest 123 Reversal & CMOav", shorttitle="Combo", overlay = true)
Length = input(14, minval=1)
KSmoothing = input(1, minval=1)
DLength = input(3, minval=1)
Level = input(50, minval=1)
Length1 = input(5, minval=1)
Length2 = input(10, minval=1)
Length3 = input(20, minval=1)
TopBand = input(70, minval=1)
LowBand = input(-70, maxval=-1)
reverse = input(false, title="Trade reverse")
posReversal123 = Reversal123(Length, KSmoothing, DLength, Level)
posCMOav = CMOav(Length1,Length2,Length3, TopBand, LowBand)
pos = iff(posReversal123 == 1 and posCMOav == 1 , 1,
	   iff(posReversal123 == -1 and posCMOav == -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) 
barcolor(possig == -1 ? #b50404: possig == 1 ? #079605 : #0536b3 )