0bps

Strategy vault / Trend following

Dual ATR Trailing Stop Strategy

The Dual ATR Trailing Stop strategy is a short-term trading strategy based on the Average True Range (ATR) indicator. The strategy sets two stop loss lines, fast ATR line and slow ATR line, at the same time, and…

Author
ChaoZhang
Complexity
Starter · 67 lines
Parameters
6
Backtest bar
1h · intraday
Tested on
BTC/USDT · futures

IMG

Overview

The Dual ATR Trailing Stop strategy is a short-term trading strategy based on the Average True Range (ATR) indicator. The strategy sets two stop loss lines, fast ATR line and slow ATR line, at the same time, and determines entry and exit based on the crossover of the two lines. The strategy is simple, responsive, and suitable for high volatility markets.

Strategy Principle

The core of this strategy is using two ATR stop loss lines. One is the fast ATR line with short period and small multiplier for fast reaction. The other is the slow ATR line with longer period and bigger multiplier for filtration. When fast ATR line crosses above slow ATR line, it generates buy signal. When fast ATR line crosses below slow ATR line, it generates sell signal. So the strategy uses the crossover of two ATR lines to determine entry and exit, which can effectively control the stop loss.

The specific logic is: calculate fast ATR line and slow ATR line. When price is above slow line, use fast line to trail stop loss. Otherwise, use slow line to trail stop loss. The color of Kline represents current stop loss line. Green and blue means using fast line. Red and yellow means using slow line. Exit when market price touches the stop loss lines.

Advantage Analysis

The advantages of this strategy are:

  1. Simple and clear logic, easy to understand and implement.
  2. Fast response to market change, suitable for high volatility market.
  3. Dual ATR stop loss controls risk effectively.
  4. ATR indicator is parametric for adjusting stop loss range.
  5. Visual Kline color indicates stop loss situation clearly.

Risk Analysis

There are also some risks:

  1. Prone to over-trading.
  2. ATR has poor curve fitting, may amplify losses.
  3. Cannot effectively filter sideways and trending markets.

We can reduce risks by optimizing ATR period, adjusting ATR multiplier, combining other indicators for filtration etc.

Optimization Direction

The optimization directions are:

  1. Optimize ATR parameters for better stop loss range.
  2. Add filter indicators to avoid invalid trades, like MA.
  3. Add open conditions to avoid mistrades. For example, add volume indicators.
  4. Add exits for holding period to avoid over-trading.

Conclusion

The Dual ATR Trailing Stop Strategy is easy to understand and implement, especially suitable for high volatility scenarios, and can effectively control risks. There is also large room for optimization. It is a recommended short-term strategy worth trying.

Parameters

NameDefaultWhat it controls
v_input_1_close0Source: close | high | low | open | hl2 | hlc3 | hlcc4 | ohlc4
v_input_25Fast ATR period
v_input_30.5Fast ATR multiplier
v_input_410Slow ATR perod
v_input_52Slow ATR multiplier
v_input_6truePaint color on chart

Source Pine Script

/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
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/
// © ceyhun

//@version=4
strategy("ATR Trailing Stop Strategy by ceyhun", overlay=true)

/////////notes////////////////////////////////////////
// This is based on the ATR trailing stop indicator //
// width addition of two levels of stops and        //
// different interpretation.                        //
// This is a fast-reacting system and is better     //
// suited for higher volatility markets             //
//////////////////////////////////////////////////////

SC = input(close, "Source", input.source)

// Fast Trail //
AP1 = input(5, "Fast ATR period", input.integer)  // ATR Period
AF1 = input(0.5, "Fast ATR multiplier", input.float)  // ATR Factor
SL1 = AF1 * atr(AP1)  // Stop Loss
Trail1 = 0.0
Trail1 := iff(SC > nz(Trail1[1], 0) and SC[1] > nz(Trail1[1], 0), max(nz(Trail1[1], 0), SC - SL1), iff(SC < nz(Trail1[1], 0) and SC[1] < nz(Trail1[1], 0), min(nz(Trail1[1], 0), SC + SL1), iff(SC > nz(Trail1[1], 0), SC - SL1, SC + SL1)))

// Slow Trail //
AP2 = input(10, "Slow ATR perod", input.integer)  // ATR Period
AF2 = input(2, "Slow ATR multiplier", input.float)  // ATR Factor
SL2 = AF2 * atr(AP2)  // Stop Loss
Trail2 = 0.0
Trail2 := iff(SC > nz(Trail2[1], 0) and SC[1] > nz(Trail2[1], 0), max(nz(Trail2[1], 0), SC - SL2), iff(SC < nz(Trail2[1], 0) and SC[1] < nz(Trail2[1], 0), min(nz(Trail2[1], 0), SC + SL2), iff(SC > nz(Trail2[1], 0), SC - SL2, SC + SL2)))

// Bar color for trade signal //
Green = Trail1 > Trail2 and close > Trail2 and low > Trail2
Blue = Trail1 > Trail2 and close > Trail2 and low < Trail2
Red = Trail2 > Trail1 and close < Trail2 and high < Trail2
Yellow = Trail2 > Trail1 and close < Trail2 and high > Trail2

// Signals //
Bull = barssince(Green) < barssince(Red)
Bear = barssince(Red) < barssince(Green)

Buy = crossover(Trail1, Trail2)
Sell = crossunder(Trail1, Trail2)

TS1 = plot(Trail1, "Fast Trail", style=plot.style_line,color=Trail1 > Trail2 ? color.blue : color.yellow, linewidth=2)
TS2 = plot(Trail2, "Slow Trail", style=plot.style_line,color=Trail1 > Trail2 ? color.green : color.red, linewidth=2)
fill(TS1, TS2, Bull ? color.green : color.red, transp=90)

plotcolor = input(true, "Paint color on chart", input.bool)

bcl = iff(plotcolor == 1, Blue ? color.blue : Green ? color.lime : Yellow ? color.yellow : Red ? color.red : color.white, na)
barcolor(bcl)

if Buy
    strategy.entry("Buy", strategy.long, comment="Buy")
    
if Sell
    strategy.entry("Sell", strategy.short, comment="Sell")

Published by ChaoZhang on the FMZ strategy square · last modified 2024-01-31. 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/Dual-ATR-Trailing-Stop-Strategy.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