0bps

Strategy vault / Trend following

5 Day EMA Based Trend Following Strategy Optimization Model

This strategy is a trend-following trading system based on the 5-day Exponential Moving Average (EMA), which analyzes the relationship between price and EMA to capture market trends. The strategy incorporates dynamic…

Author
ChaoZhang
Complexity
Intermediate · 92 lines
Parameters
0
Backtest bar
30m · intraday
Tested on
BTC/USDT · futures

IMG

Overview

This strategy is a trend-following trading system based on the 5-day Exponential Moving Average (EMA), which analyzes the relationship between price and EMA to capture market trends. The strategy incorporates dynamic adjustment of stop-loss and profit targets, uses percentage-based position management, and considers transaction costs, making it highly practical and flexible.

Strategy Principle

The core logic is based on the interaction between price and 5-day EMA to determine entry points. Specifically, a long signal is generated when the previous period's high is below the EMA and the current period shows a breakthrough. The strategy also includes an optional additional condition requiring the closing price to be higher than the previous period to increase signal reliability. For risk control, the strategy offers two types of stop-loss methods: dynamic stop-loss based on previous lows and fixed-point stop-loss. Profit targets are dynamically set based on the risk-reward ratio to ensure trading profit potential.

Strategy Advantages

  1. Strong trend capture capability: Effectively captures trend initiation phases through the combination of EMA and price action.
  2. Comprehensive risk control: Provides flexible stop-loss options, including both fixed-point and dynamic stop-loss methods.
  3. Reasonable profit targets: Sets profit objectives based on risk-reward ratio, ensuring sufficient profit potential for each trade.
  4. Thorough consideration of transaction costs: Incorporates trading cost calculations, better reflecting real trading conditions.
  5. Flexible parameters: Key parameters such as stop-loss distance and risk-reward ratio can be adjusted according to different market conditions.

Strategy Risks

  1. False breakout risk: May generate false breakout signals in choppy markets, leading to stop-loss exits.
  2. Slippage impact: Actual execution prices may significantly deviate from signal prices in volatile markets.
  3. EMA lag: As a moving average indicator, EMA has inherent lag, potentially causing delayed entries.
  4. Money management risk: Fixed percentage position sizing may lead to excessive drawdowns during consecutive losses.

Strategy Optimization Directions

  1. Multi-timeframe confirmation: Add longer-period trend confirmation, such as incorporating 20-day EMA as a trend direction filter.
  2. Volatility adaptation: Introduce ATR indicator to dynamically adjust stop-loss and profit targets for better adaptation to different market volatility environments.
  3. Position optimization: Dynamically adjust position sizes based on market volatility and signal strength to improve capital efficiency.
  4. Time filtering: Add time-based filters to avoid trading during highly volatile market opening and closing periods.
  5. Market environment recognition: Implement market condition identification mechanisms to use different parameter settings in different market states.

Summary

This is a well-designed trend-following strategy with clear logic, effectively capturing market trends through the combination of EMA indicator and price action. The strategy has comprehensive mechanisms for risk control and profit management while offering multiple optimization directions, demonstrating strong practical value and room for improvement. Future enhancements can focus on adding multi-timeframe analysis and adjusting stop-loss mechanisms to further improve strategy stability and profitability.

Source Pine Script

/*backtest
start: 2024-12-29 00:00:00
end: 2025-01-05 00:00:00
period: 30m
basePeriod: 30m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Demo GPT - PowerOfStocks 5EMA", overlay=true)

// Inputs
enableSL = input.bool(false, title="Enable Extra SL")
usl = input.int(defval=5, title="SL Distance in Points", minval=1, maxval=100)
riskRewardRatio = input.int(defval=3, title="Risk to Reward Ratio", minval=3, maxval=25)
showSell = input.bool(true, title="Show Sell Signals")
showBuy = input.bool(true, title="Show Buy Signals")
buySellExtraCond = input.bool(false, title="Buy/Sell with Extra Condition")
startDate = input(timestamp("2018-01-01 00:00"), title="Start Date")
endDate = input(timestamp("2069-12-31 23:59"), title="End Date")

// EMA Calculation
ema5 = ta.ema(close, 5)

// Plot EMA
plot(ema5, "EMA 5", color=color.new(#882626, 0), linewidth=2)

// Variables for Buy
var bool longTriggered = na
var float longStopLoss = na
var float longTarget = na

// Variables for Sell (used for signal visualization but no actual short trades)
var bool shortTriggered = na
var float shortStopLoss = na
var float shortTarget = na

// Long Entry Logic
if true
    if (showBuy)
        longCondition = high[1] < ema5[1] and high[1] < high and (not buySellExtraCond or close > close[1])
        if (longCondition and not longTriggered)
            entryPrice = high[1]
            stopLoss = enableSL ? low[1] - usl * syminfo.mintick : low[1]
            target = enableSL ? entryPrice + (entryPrice - stopLoss) * riskRewardRatio : high[1] + (high[1] - low[1]) * riskRewardRatio

            // Execute Buy Order
            strategy.entry("Buy", strategy.long, stop=entryPrice)

            longTriggered := true
            longStopLoss := stopLoss
            longTarget := target

            label.new(bar_index, entryPrice, text="Buy@ " + str.tostring(entryPrice), style=label.style_label_up, color=color.green, textcolor=color.white)

// Short Signal Logic (Visual Only)
if (true)
    if (showSell)
        shortCondition = low[1] > ema5[1] and low[1] > low and (not buySellExtraCond or close < close[1])
        if (shortCondition and not shortTriggered)
            entryPrice = low[1]
            stopLoss = enableSL ? high[1] + usl * syminfo.mintick : high[1]
            target = enableSL ? entryPrice - (stopLoss - entryPrice) * riskRewardRatio : low[1] - (high[1] - low[1]) * riskRewardRatio

            // Visual Signals Only
            label.new(bar_index, entryPrice, text="Sell@ " + str.tostring(entryPrice), style=label.style_label_down, color=color.red, textcolor=color.white)

            shortTriggered := true
            shortStopLoss := stopLoss
            shortTarget := target

// Exit Logic for Buy
if longTriggered
    // Stop-loss Hit
    if low <= longStopLoss
        strategy.close("Buy", comment="SL Hit")
        longTriggered := false

    // Target Hit
    if high >= longTarget
        strategy.close("Buy", comment="Target Hit")
        longTriggered := false

// Exit Logic for Short (Signals Only)
if shortTriggered
    // Stop-loss Hit
    if high >= shortStopLoss
        shortTriggered := false
    // Target Hit
    if low <= shortTarget
        shortTriggered := false

Published by ChaoZhang on the FMZ strategy square · last modified 2025-01-06. Collected in the Quant Trading Vault. Unvalidated research: re-test with your own data and costs before trusting it.

Build this with AgenKit

A spec is not a trading system. Paste this into your coding agent and AgenKit runs a specialist team — architecture, test-first build, risk gates, review — with paper trading on by default.

in Claude Code, Cursor, Codex & 4 more
/agenkit build a production-grade trading bot with a backtest engine, risk controls and paper trading by default from strategies/5-Day-EMA-Based-Trend-Following-Strategy-Optimization-Model.md
  1. npx agenkit install engineering-kit in your project
  2. Paste the command into your agent and approve each phase
  3. Get tests, backtest, risk controls and a paper-trading switch

Understand it first

Before you run this, read the lesson behind the idea and how to backtest it honestly. Specs like this one are the survivors of an unknown number of trials; deflate their results accordingly.

Related specs

esc

Try , , or .

↑↓ move↵ open