ATR Trend Breakout Strategy

Author: ChaoZhang, Date: 2024-03-22 14:48:37



This is a quantitative trading strategy that captures trend breakouts using the ATR indicator and closing prices. The strategy dynamically calculates upper and lower trend lines to determine the trend direction and generates trading signals when the closing price breaks through the trend lines. The strategy also sets stop-loss and target price levels and allows for trailing stops based on volatility.

Strategy Principles

  1. Calculate ATR signal: atr_signal = atr(atr_period)
  2. Calculate upper and lower trend lines:
    • Lower trend line: lower_trend = low - atr_mult*atr_signal
    • Upper trend line: upper_trend = high + atr_mult*atr_signal
  3. Dynamically adjust trend lines, keeping them unchanged if they are broken, otherwise updating to the latest values
  4. Color-code the trend lines based on the relative position of the closing price to identify trend direction
  5. Generate trading signals:
    • Long signal: No current position and closing price breaks above the upper trend line
    • Short signal: No current position and closing price breaks below the lower trend line
  6. Set stop-loss and target prices:
    • Stop-loss: Latest entry price ± ATR range * factor at the time of breakout
    • Target price: Latest entry price ± stop-loss range * reward/risk ratio (rr)
  7. Trailing stop:
    • Long stop: Highest upper trend line
    • Short stop: Lowest lower trend line

Advantages Analysis

  1. Dynamically adjusts trend lines based on volatility to adapt to different market conditions
  2. Color-coded trend lines with directionality for easy trend identification
  3. Uses ATR as a volatility measure to set reasonable stop-loss and target prices
  4. Trailing stop functionality to lock in profits while minimizing drawdowns
  5. Highly parameterized to suit different instruments and timeframes

Risk Analysis

  1. Trend breakout strategies can generate excessive signals leading to losses in choppy markets
  2. Improper selection of ATR parameters may result in overly sensitive or sluggish trend lines, affecting signal quality
  3. Fixed reward/risk ratio may not adapt well to different market characteristics
  4. Trailing stops may cut losses and miss out on trend moves


  1. Introduce trend filters or oscillator indicators to avoid losses in ranging markets
  2. Optimize ATR parameters separately based on instrument and timeframe characteristics
  3. Optimize reward/risk ratio and trailing stop logic to improve strategy risk-adjusted returns
  4. Combine with trend recognition methods to improve trailing stops and capture more trend profits

Optimization Directions

  1. Combine multiple timeframes, using higher timeframes to identify trends and lower timeframes to trigger signals
  2. Add volume and price indicators for validation before trend line breakouts to improve signal validity
  3. Optimize position sizing and incorporate swing trading
  4. Perform parameter optimization for stop-loss and reward/risk ratio
  5. Improve trailing stop logic to reduce premature stops during trend moves

Multi-timeframe analysis helps filter out noise for more stable trend identification. Volume and price confirmation before breakouts can eliminate false signals. Position sizing optimization improves capital efficiency. Optimizing stop-loss and reward/risk parameters can enhance risk-adjusted returns. Refining trailing stop logic allows capturing more trend profits while controlling drawdowns.


This strategy uses ATR as a volatility gauge to dynamically adjust trend line positions and capture trend breakouts. It sets reasonable stop-losses and profit targets, employing trailing stops to lock in gains. The parameters are adjustable for strong adaptability. However, trend breakout strategies are susceptible to whipsaw losses in choppy conditions and require further optimization and refinement. Combining multiple timeframes, filtering signals, optimizing position sizing, parameter optimization, and other techniques can improve the strategy’s performance and robustness. Quantitative strategies demand continuous testing and optimization based on a solid understanding of the underlying principles in order to provide aspiring traders with more ideas and guidance.

start: 2023-03-16 00:00:00
end: 2024-03-21 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]

strategy(title = "Claw-Pattern", overlay=true, calc_on_every_tick=true, default_qty_type= strategy.percent_of_equity,default_qty_value=10, currency="USD")
//Developer: Trading Strategy Guides
//Creator: Trading Strategy Guides
//Date: 3/18/2024
//Description: A trend trading system strategy 

atr_period = input(title="ATR Period", defval=120, type=input.integer)
atr_mult = input(title="ATR Multiplier", defval=2, type=input.integer)
dir = input(title="Direction (Long=1, Short=-1, Both = 0)", defval=1, type=input.integer)
factor = input(title="Stop Level Deviation (% Chan.)", defval=0.75, type=input.float)
rr = input(title="Reward to Risk Multiplier", defval=2, type=input.integer)
trail_bar_start = input(title="Trail Stop Bar Start", defval=20, type=input.integer)
col_candles = input(title="Enable Colored Candles", defval=false, type=input.bool)

atr_signal = atr(atr_period)

lower_trend = low - atr_mult*atr_signal
upper_trend = high + atr_mult*atr_signal

upper_trend := upper_trend > upper_trend[1] and close < upper_trend[1] ? upper_trend[1] : upper_trend
lower_trend := lower_trend < lower_trend[1] and close > lower_trend[1] ? lower_trend[1] : lower_trend

upper_color = barssince(cross(close, upper_trend[1])) > barssince(cross(close, lower_trend[1])) ? : na
lower_color = barssince(cross(close, upper_trend[1])) > barssince(cross(close, lower_trend[1])) ? na :

trend_line = lower_trend

plot(lower_trend, color=lower_color, title="Lower Trend Color")
plot(upper_trend, color=upper_color, title="Upper Trend Color")

is_buy = strategy.position_size == 0 and crossover(close, upper_trend[1]) and upper_color[1] and (dir == 1 or dir == 0)
is_sell = strategy.position_size == 0 and crossover(close, lower_trend[1]) and lower_color[1] and (dir == -1 or dir == 0)

if is_buy
    strategy.entry("Enter Long", strategy.long)
else if is_sell
    strategy.entry("Enter Short", strategy.short)