Multiple Timeframe EMA Trend Following Trading Strategy

Author: ChaoZhang, Date: 2024-02-26 16:55:48



This strategy is a trend following and breakout trading strategy based on multiple timeframe exponential moving averages (EMA). It combines 5 EMAs with different periods and has strong capabilities in trend identification to catch medium-to-long term price movements along the trend.

Strategy Logic

  1. Calculate 5 EMAs with periods of 12, 15, 18, 21 and 24 respectively.

  2. EMA ranking rule: EMA12 > EMA15 > EMA18 > EMA21 > EMA24 as buy signal; EMA12 < EMA15 < EMA18 < EMA21 < EMA24 as sell signal.

  3. Trigger trading signals only after the user-defined start date.

  4. Long entry when buy signal triggered; short entry when sell signal triggered.

The strategy forms a trend channel using multiple EMAs to determine the trend direction based on the relationship between the channel bands. The EMA periods are set close to be more sensitive to breakout signals, while also avoiding being misled by short-term market noise. Also, allowing users to customize the start date provides more flexibility.

Advantage Analysis

  1. Strong capabilities in trend identification using multiple EMAs as the trend channel.

  2. Close EMA period setting makes it sensitive to trend breakout signals and able to catch mid-to-long term trends timely.

  3. Customizable start date provides flexibility in use.

  4. Customizable capital management to control per order size.

  5. Clear and simple trading rules, suitable for trend following.

Risk Analysis

  1. EMAs inherently have lagging effect, may miss short-term sharp price swings.

  2. Breakout trading is prone to being trapped, requiring reasonable stop loss.

  3. Potential huge loss when trend reverses.

  4. Need to choose suitable products, not applicable to extremely volatile stocks.

Corresponding risk management and optimizations:

  1. Fine tune EMA parameters, optimize period combination.

  2. Add other indicators for trend direction validation.

  3. Set proper stop loss to control per order loss.

Optimization Directions

  1. Add other indicators like MACD, KDJ to improve strategy performance.

  2. Add trading volume condition to avoid false breakout.

  3. Optimize EMA periods to find the best combination.

  4. Stop trading at specific time range to avoid market turbulence periods.

  5. Use machine learning methods to dynamically optimize EMA periods and parameters.


In general, this is a typical trend following strategy. It capitalizes on the advantages of EMAs by forming a trading channel using multiple EMAs and generating trading signals when price breaks out of the channel. The pros are simple and clear trading rules which make it easy to follow mid-to-long term trends. The cons are sensitivity to short-term market noise and inherent lagging effect. Proper parameter tuning and optimizations like adding other assisting tools can improve the stability and performance. It suits investors with some trading experience.

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

strategy(title="Scalping Strategy - EMA",
         shorttitle="EMA Scalp",

// User input for start date
startDateInput = input(title="Start Date", defval=timestamp("2024-02-01"))

// Calculate EMAs
ema_12 = ta.ema(close, 12)
ema_15 = ta.ema(close, 15)
ema_18 = ta.ema(close, 18)
ema_21 = ta.ema(close, 21)
ema_24 = ta.ema(close, 24)

// Plot EMAs
plot(ema_12,, title="EMA 12")
plot(ema_15,, title="EMA 15")
plot(ema_18, color=color.yellow, title="EMA 18")
plot(ema_21,, title="EMA 21")
plot(ema_24,, title="EMA 24")

// Define a start date for the strategy based on user input
isAfterStartDate = true

// Visualize the isAfterStartDate condition
bgcolor(isAfterStartDate ?, 90) : na, title="After Start Date")

// Entry conditions
buy_condition = (ema_12 > ema_15) and (ema_15 > ema_18) and (ema_18 > ema_21) and (ema_21 > ema_24) and isAfterStartDate
sell_condition = (ema_12 < ema_15) and (ema_15 < ema_18) and (ema_18 < ema_21) and (ema_21 < ema_24) and isAfterStartDate

// Execute trades using conditional blocks
if (buy_condition)
    strategy.entry("Buy", strategy.long)
if (sell_condition)
    strategy.entry("Sell", strategy.short)