Multi-Timeframe Trend Trading Strategy Based on MACD, ADX, and EMA200

Author: ChaoZhang, Date: 2024-03-22 10:50:35



This strategy is based on the MACD, ADX, and EMA200 indicators, aiming to capture trend trading opportunities across multiple timeframes by analyzing current market trends and momentum. The main idea behind the strategy is to use the MACD indicator to determine market trends, the ADX indicator to confirm trend strength, and the EMA200 as a trend filter. By employing multiple timeframes, the strategy seeks to obtain more trading opportunities and better risk-reward ratios.

Strategy Principles

  1. Calculate the 200-day Exponential Moving Average (EMA200) as a trend filter.
  2. Calculate the MACD indicator, including the MACD line, signal line, and histogram, to determine market trends.
  3. Calculate the Average True Range (ATR) and Average Directional Index (ADX) to confirm trend strength.
  4. Long entry condition: Close price above EMA200, MACD line above signal line and below 0, ADX greater than or equal to 25.
  5. Short entry condition: Close price below EMA200, MACD line below signal line and above 0, ADX greater than or equal to 25.
  6. Use ATR to calculate stop loss and take profit distances, with stop loss set at 1% and take profit set at 1.5%.
  7. When long conditions are met, enter long positions using stop and limit orders; when short conditions are met, enter short positions using stop and limit orders.
  8. Test the strategy across different timeframes, such as 15-minute, 30-minute, 1-hour, etc., to find the optimal trading timeframe.

Advantage Analysis

  1. Combining multiple indicators for trading decisions helps improve the reliability and stability of the strategy.
  2. Employing multiple timeframes allows the strategy to capture trends at different levels and obtain more trading opportunities.
  3. Using ATR to calculate stop loss and take profit distances enables dynamic position sizing and risk management.
  4. Reasonable stop loss and take profit settings help improve the strategy’s risk-reward ratio.
  5. The code structure is clear and easy to understand and optimize.

Risk Analysis

  1. The strategy relies on trending markets and may underperform in choppy markets.
  2. The parameter settings for multiple indicators may need to be optimized for different markets and assets; otherwise, the strategy may perform poorly.
  3. Fixed stop loss and take profit settings may not adapt to market changes, leading to increased losses or reduced profits.
  4. Trading across multiple timeframes may increase trading frequency and transaction costs.


  1. Introduce adaptive parameter optimization to automatically adjust indicator parameters based on market changes.
  2. Implement dynamic stop loss and take profit adjustments, such as trailing stops or variable take profits.
  3. Consider trading costs during backtesting and select the optimal timeframe and trading frequency.

Optimization Directions

  1. Incorporate other trend confirmation indicators, such as Bollinger Bands, moving average systems, etc., to improve the accuracy of trend identification.
  2. Optimize stop loss and take profit settings, such as using dynamic or volatility-based stop loss and take profit.
  3. Add more filtering conditions to trading signals, such as volume, market sentiment, etc., to improve signal quality.
  4. Perform parameter optimization for different markets and assets to find the optimal parameter combinations.
  5. Consider introducing machine learning algorithms to adapt to market changes and enhance the adaptability and stability of the strategy.

Through these optimizations, the strategy’s robustness and profitability can be improved, enabling it to better adapt to different market environments.


By combining the MACD, ADX, and EMA200 indicators, this strategy aims to capture trend trading opportunities across multiple timeframes, demonstrating certain advantages and feasibility. The key to the strategy lies in trend identification and trend strength confirmation, which can be achieved through the combined action of multiple indicators. The strategy also employs fixed stop loss and take profit levels to help control risk. However, the strategy has some limitations, such as potential underperformance in choppy markets and the inability of fixed stop loss and take profit levels to adapt to market changes.

Future improvements can include introducing more trend confirmation indicators, optimizing stop loss and take profit methods, adding filtering conditions, performing parameter optimization, and introducing machine learning algorithms to continuously enhance the strategy’s performance. Overall, the strategy has a clear logic and simple implementation, making it a suitable foundation for further optimization and improvement. It offers valuable insights for practical applications in real-world trading.

start: 2024-02-01 00:00:00
end: 2024-02-29 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at
// © colemanrumsey

strategy("15-Minute Trend Trading Strategy", overlay=true)

// Exponential Moving Average (EMA)
ema200 = ta.ema(close, 200)

// MACD Indicator
[macdLine, signalLine, _] = ta.macd(close, 12, 26, 9)
macdHistogram = macdLine - signalLine

// Calculate True Range (TR)
tr =

// Calculate +DI and -DI
plusDM = high - high[1]
minusDM = low[1] - low

atr14 = ta.atr(14)
plusDI = ta.wma(100 * ta.sma(plusDM, 14) / atr14, 14)
minusDI = ta.wma(100 * ta.sma(minusDM, 14) / atr14, 14)

// Calculate Directional Movement Index (DX)
dx = ta.wma(100 * math.abs(plusDI - minusDI) / (plusDI + minusDI), 14)

// Calculate ADX
adxValue = ta.wma(dx, 14)

// Long Entry Condition
longCondition = close > ema200 and (macdLine > signalLine) and (macdLine < 0) and (adxValue >= 25)

// Short Entry Condition
shortCondition = close < ema200 and (macdLine < signalLine) and (macdLine > 0) and (adxValue >= 25)

// Calculate ATR for Stop Loss
atrValue = ta.atr(14)

// Initialize Take Profit and Stop Loss
var float takeProfit = na
var float stopLoss = na

// Calculate Risk (Stop Loss Distance)
risk = close - low[1]  // Using the previous candle's low as stop loss reference

// Strategy Orders
if longCondition
    stopLoss := close * 0.99  // Set Stop Loss 1% below the entry price
    takeProfit := close * 1.015 // Set Take Profit 1.5% above the entry price
    strategy.entry("Buy", strategy.long, stop=stopLoss, limit=takeProfit)

if shortCondition
    stopLoss := close * 1.01 // Set Stop Loss 1% above the entry price
    takeProfit := close * 0.985 // Set Take Profit 1.5% below the entry price
    strategy.entry("Sell", strategy.short, stop=stopLoss, limit=takeProfit)

// Plot EMA
// plot(ema200,, linewidth=1, title="200 EMA")

// Plot MACD Histogram
// plot(macdHistogram, color=macdHistogram > 0 ? :, style=plot.style_columns, title="MACD Histogram")

// Display ADX Value
// plot(adxValue, color=color.purple, title="ADX Value")