This strategy is a dual moving average trading strategy based on the price momentum indicator Chandre Momentum Oscillator (CMO) and its Weighted Moving Average (WMA). It attempts to identify trend reversals and continuation using CMO crossover its WMA.
The strategy first calculates CMO, which measures the net change in price momentum. Positive values indicate upside momentum while negative values indicate downside momentum. It then calculates the WMA of CMO. When CMO crosses above its WMA, a long position is taken; when CMO crosses below its WMA, a short position is taken. The strategy attempts to capture turning points in the trend using CMO and WMA crossovers.
The key steps in calculating CMO are:
The advantage of this strategy is capturing medium-term trend reversals in price. The absolute magnitude of CMO reflects the strength of the price run, while the WMA helps filter out false breakouts.
The biggest advantage of this strategy is using the absolute value of CMO to gauge market crowd sentiment and using the WMA filter to identify turning points in the medium-term trend. Compared to single moving average strategies, it is better able to capture medium-term trends with higher elasticity.
CMO standardizes price changes and maps them into a -100 to 100 range for easier judgment of market crowd sentiment; absolute magnitude represents strength of current trend. The WMA provides additional filtering on CMO to avoid excessive false signals.
The main risks that may exist in this strategy are:
Corresponding optimization methods:
The main optimization directions for this strategy are around parameter tuning, signal filtering and stop losses:
Overall this strategy uses CMO to judge trend strength and turning points, combined with the WMA filter to generate trading signals, a typical dual moving average system. Compared to single MA strategies, it has a stronger advantage in capturing elastic medium-term trends. But there is still room for optimization around parameters, filtering and stop losses. Controlling trade frequency and incorporating dynamic stops can further improve system stability.
/*backtest start: 2023-12-25 00:00:00 end: 2024-01-24 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 //////////////////////////////////////////////////////////// // Copyright by HPotter v1.0 18/10/2018 // 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. //////////////////////////////////////////////////////////// strategy(title="CMO & WMA Backtest ver 2.0", shorttitle="CMO & WMA") Length = input(9, minval=1) LengthWMA = input(9, minval=1) BuyZone = input(60, step = 0.01) SellZone = input(-60, step = 0.01) reverse = input(false, title="Trade reverse") hline(BuyZone, color=green, linestyle=line) hline(SellZone, color=red, linestyle=line) hline(0, color=gray, linestyle=line) 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 = 0.0 pos := iff(xWMACMO > BuyZone, 1, iff(xWMACMO < SellZone, -1, nz(pos[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) barcolor(possig == -1 ? red: possig == 1 ? green : blue ) plot(nRes, color=blue, title="CMO") plot(xWMACMO, color=red, title="WMA")