The resource loading... loading...

Dual Chain Hybrid Momentum EMA Tracking Trading System

Author: ChaoZhang, Date: 2024-11-29 17:04:57
Tags: EMAMA

img

Overview

This strategy is an innovative trading system based on Exponential Moving Averages (EMA), capturing market opportunities through two independent trading chains set across different timeframes. The strategy integrates the advantages of long-term trend following and short-term momentum trading, generating trading signals through EMA crossovers across weekly, daily, 12-hour, and 9-hour timeframes for multi-dimensional market analysis.

Strategy Principles

The strategy employs a dual-chain design, with each chain having its unique entry and exit logic:

Chain 1 (Long-term Trend) uses weekly and daily timeframes:

  • Entry signal: Generated when closing price crosses above EMA on weekly timeframe
  • Exit signal: Generated when closing price crosses below EMA on daily timeframe
  • Default EMA period is 10, adjustable as needed

Chain 2 (Short-term Momentum) uses 12-hour and 9-hour timeframes:

  • Entry signal: Generated when closing price crosses above EMA on 12-hour timeframe
  • Exit signal: Generated when closing price crosses below EMA on 9-hour timeframe
  • Default EMA period is 9, adjustable as needed

Strategy Advantages

  1. Multi-dimensional market analysis: Comprehensive market trend capture through timeframe combination
  2. High flexibility: Two chains can be enabled or disabled independently
  3. Robust risk control: Multiple timeframe confirmation reduces false signals
  4. Strong parameter adaptability: EMA periods and timeframes are adjustable
  5. Complete backtesting functionality: Built-in testing period settings for strategy verification

Strategy Risks

  1. Trend reversal risk: May show lag in volatile markets
  2. Timeframe configuration risk: Different markets may require different timeframe combinations
  3. Parameter optimization risk: Over-optimization may lead to overfitting
  4. Signal overlap risk: Simultaneous triggers from both chains may increase position risk

Risk control suggestions:

  • Set reasonable stop-loss levels
  • Adjust parameters based on market characteristics
  • Conduct thorough backtesting before live trading
  • Control position sizing per trade

Strategy Optimization Directions

  1. Signal Filtering Optimization:
  • Add volume confirmation mechanism
  • Incorporate volatility indicators
  • Include trend strength confirmation
  1. Risk Control Optimization:
  • Develop dynamic stop-loss mechanism
  • Design position management system
  • Add drawdown control functionality
  1. Timeframe Optimization:
  • Research optimal timeframe combinations
  • Develop adaptive timeframe mechanisms
  • Add market state recognition functionality

Summary

The Dual Chain Hybrid Momentum EMA Tracking Trading System achieves multi-dimensional market analysis through innovative combination of long and short-term moving average strategies. The system design is flexible and can be adjusted according to different market conditions and trader styles, showing strong practicality. Through proper risk control and continuous optimization, this strategy has the potential to achieve stable returns in actual trading. Traders are advised to conduct thorough backtesting and parameter optimization before live implementation to achieve optimal trading results.


/*backtest
start: 2019-12-23 08:00:00
end: 2024-11-28 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title='Dual Chain Strategy', shorttitle='DualChain', overlay=true)

// User inputs for enabling/disabling chains
enableChain1 = input.bool(true, title='Enable Chain 1')
enableChain2 = input.bool(true, title='Enable Chain 2')

// User inputs for the first chain
len1 = input.int(10, minval=1, title='Length Chain 1 EMA', group="Chain 1")
src1 = input(close, title='Source Chain 1', group="Chain 1")
tf1_entry = input.timeframe("W", title='Chain 1 Entry Timeframe', group="Chain 1")
tf1_exit = input.timeframe("D", title='Chain 1 Exit Timeframe', group="Chain 1")

// Weekly timeframe EMA for Chain 1
entryEMA1 = request.security(syminfo.tickerid, tf1_entry, ta.ema(src1, len1))

// Daily timeframe EMA for Chain 1
exitEMA1 = request.security(syminfo.tickerid, tf1_exit, ta.ema(src1, len1))

// User inputs for the second chain
len2 = input.int(9, minval=1, title='Length Chain 2 EMA', group="Chain 2")
src2 = input(close, title='Source Chain 2', group="Chain 2")
tf2_entry = input.timeframe("720", title='Chain 2 Entry Timeframe (12H)', group="Chain 2")  // 12 hours
tf2_exit = input.timeframe("540", title='Chain 2 Exit Timeframe (9H)', group="Chain 2")    // 9 hours

// Entry timeframe EMA for Chain 2
entryEMA2 = request.security(syminfo.tickerid, tf2_entry, ta.ema(src2, len2))

// Exit timeframe EMA for Chain 2
exitEMA2 = request.security(syminfo.tickerid, tf2_exit, ta.ema(src2, len2))

// Plotting Chain 1 EMAs
plot(enableChain1 ? entryEMA1 : na, title='Chain 1 Entry EMA', color=color.new(color.blue, 0))
plot(enableChain1 ? exitEMA1 : na, title='Chain 1 Exit EMA', color=color.new(color.yellow, 0))

// Plotting Chain 2 EMAs
plot(enableChain2 ? entryEMA2 : na, title='Chain 2 Entry EMA', color=color.new(color.green, 0))
plot(enableChain2 ? exitEMA2 : na, title='Chain 2 Exit EMA', color=color.new(color.red, 0))

// Backtesting period
startDate = input(timestamp('2015-07-27'), title="StartDate")
finishDate = input(timestamp('2026-01-01'), title="FinishDate")
time_cond = true

// Entry Condition (Chain 1)
bullishChain1 = enableChain1 and ta.crossover(src1, entryEMA1)
bearishChain1 = enableChain1 and ta.crossunder(src1, entryEMA1)

// Exit Condition (Chain 1)
exitLongChain1 = enableChain1 and ta.crossunder(src1, exitEMA1)
exitShortChain1 = enableChain1 and ta.crossover(src1, exitEMA1)

// Entry Condition (Chain 2)
bullishChain2 = enableChain2 and ta.crossover(src2, entryEMA2)
bearishChain2 = enableChain2 and ta.crossunder(src2, entryEMA2)

// Exit Condition (Chain 2)
exitLongChain2 = enableChain2 and ta.crossunder(src2, exitEMA2)
exitShortChain2 = enableChain2 and ta.crossover(src2, exitEMA2)

// Debugging: Plot entry signals for Chain 1
plotshape(bullishChain1, color=color.new(color.green, 0), style=shape.labelup, text='BUY C1', location=location.belowbar)
plotshape(bearishChain1, color=color.new(color.red, 0), style=shape.labeldown, text='SELL C1', location=location.abovebar)

// Debugging: Plot entry signals for Chain 2
plotshape(bullishChain2, color=color.new(color.green, 0), style=shape.labelup, text='BUY C2', location=location.belowbar)
plotshape(bearishChain2, color=color.new(color.red, 0), style=shape.labeldown, text='SELL C2', location=location.abovebar)

// Trade Execution for Chain 1
if bullishChain1 and time_cond
    strategy.entry('BUY_Chain_1', strategy.long)

if bearishChain1 and time_cond
    strategy.entry('SELL_Chain_1', strategy.short)

// Exit trades based on daily conditions for Chain 1
if exitLongChain1 and strategy.opentrades > 0
    strategy.close(id='BUY_Chain_1', when=exitLongChain1)

if exitShortChain1 and strategy.opentrades > 0
    strategy.close(id='SELL_Chain_1', when=exitShortChain1)

// Trade Execution for Chain 2
if bullishChain2 and time_cond
    strategy.entry('BUY_Chain_2', strategy.long)

if bearishChain2 and time_cond
    strategy.entry('SELL_Chain_2', strategy.short)

// Exit trades based on daily conditions for Chain 2
if exitLongChain2 and strategy.opentrades > 0
    strategy.close(id='BUY_Chain_2', when=exitLongChain2)

if exitShortChain2 and strategy.opentrades > 0
    strategy.close(id='SELL_Chain_2', when=exitShortChain2)

// Close all positions outside the backtesting period
if not time_cond
    strategy.close_all()


Related

More