0bps

Strategy vault / Machine learning

EMA Strategy with ATR Stop Loss

This strategy uses the EMA golden cross to generate trading signals, that is, a buy signal is generated when the fast EMA line crosses above the slow EMA line, and a sell signal is generated when the fast EMA line…

Author
ChaoZhang
Complexity
Starter · 62 lines
Parameters
2
Backtest bar
1d · swing
Tested on
BTC/USDT · futures

IMG

Overview

This strategy uses the EMA golden cross to generate trading signals, that is, a buy signal is generated when the fast EMA line crosses above the slow EMA line, and a sell signal is generated when the fast EMA line crosses below the slow EMA line. It belongs to a typical trend following strategy. At the same time, the strategy uses the ATR indicator to set a dynamic stop loss to control risks while ensuring profits.

Strategy Principle

  1. Define the fast EMA period as 13 and the slow EMA period as 48.
  2. When the fast EMA line crosses above the slow EMA line, a buy signal is generated; when the fast EMA line crosses below the slow EMA line, a sell signal is generated.
  3. Use the ta.crossover and ta.crossunder functions to determine golden cross and death cross of moving averages.
  4. Use the ATR indicator to calculate the dynamic stop loss, which is 1.5 times the ATR away from the close.
  5. Intuitively display trading signals and stop loss levels through color changes, buy/sell marks and stop loss lines.

Advantage Analysis

  1. Signals are generated based on EMA golden cross and death cross, which avoids missing major market trends and returns are considerable.
  2. ATR trailing stop loss ensures adequate trend-following profits while controlling drawdowns, achieving a balanced risk-reward ratio.
  3. Intuitive signal display and stop loss display, easy to operate, suitable for most people.
  4. Few adjustable parameters, easy to grasp and optimize.

Risk Analysis

  1. Flash crashes may trigger the stop loss.
  2. Frequent invalid signals may occur in ranging markets.
  3. Improper parameter settings may result in overly aggressive entry or loose stop loss.
  4. EMA parameters and ATR parameters need proper optimization.

Solutions:

  1. Appropriately loosen the ATR multiplier to leave some buffer from recent highs.
  2. Consider confirmation mechanisms after signal occurs, such as price breaking previous high etc.
  3. Parameter optimization should take into account various market conditions.

Optimization Directions

  1. Test different parameter combinations to find optimum parameters.
  2. Consider adding other indicators for signal filtering, such as volume, volatility indicators etc to improve signal quality.
  3. Adjust EMA parameters according to major trends to better capture main trends.
  4. Consider dynamically adjusting ATR stop loss multiplier to expand stop range during trending markets.
  5. Incorporate machine learning algorithms for adaptive parameter optimization.

Conclusion

The strategy is relatively simple and easy to use. It generates signals based on EMA crossovers, follows the trend, and uses ATR trailing stop loss to effectively control risks. Although there may be some false signals, it has strong capabilities in capturing main trends and returns are relatively stable. It is suitable as a basic quantitative trading strategy. There is also great potential for improvements through parameter optimization and function extensions.

Parameters

NameDefaultWhat it controls
v_input_113EMA Length 1
v_input_248EMA Length 2

Source Pine Script

/*backtest
start: 2022-12-04 00:00:00
end: 2023-12-10 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © byee322

/// This strategy uses the EMA to generate buy and sell signals with a 1.5x ATR stop loss
//@version=5
strategy("EMA Strategy with ATR Stop Loss", overlay=true)

// Define the EMA lengths as input parameters
emaLength1 = input(13, "EMA Length 1")
emaLength2 = input(48, "EMA Length 2")

// Define the moving averages
ema1 = ta.ema(close, emaLength1)
ema2 = ta.ema(close, emaLength2)

// Buy signal: EMA 1 crosses above EMA 2
buy = ta.crossover(ema1, ema2)

// Sell signal: EMA 1 crosses below EMA 2
sell = ta.crossunder(ema1, ema2)

// Define the state variable
state = 0
state := buy ? 1 : sell ? -1 : nz(state[1])

// Change the color of the candles
color = state == 1 ? color.green : state == -1 ? color.red : na

// Plot the colored candles
plotcandle(open, high, low, close, color=color)

// Plot the signals on the chart with text labels
plotshape(buy, style=shape.triangleup, color=color.new(color.green, 50), location=location.belowbar, text="Buy")
plotshape(sell, style=shape.triangledown, color=color.new(color.red, 50), location=location.abovebar, text="Sell")

// Calculate the ATR
atrVal = ta.atr(14)

// Calculate the stop loss level for buy
stopLossBuy = buy ? close[1] - 1.5 * atrVal : na

// Calculate the stop loss level for sell
stopLossSell = sell ? close[1] + 1.5 * atrVal : na

// Plot the stop loss level for buy
plot(stopLossBuy,  color=color.new(color.green, 50), linewidth=3)

// Plot the stop loss level for sell
plot(stopLossSell, color=color.new(color.red, 50), linewidth=3)

if buy
    strategy.entry("Enter Long", strategy.long)
else if sell
    strategy.entry("Enter Short", strategy.short)

Published by ChaoZhang on the FMZ strategy square · last modified 2023-12-11. 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/EMA-Strategy-with-ATR-Stop-Loss.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