1. Introduction

In the early 1980s, Richard Dennis and William Eckhardt conducted one of the most famous experiments in trading history. They recruited a group of novices – dubbed the “Turtles” – and taught them a fully mechanical trend-following system. Over the following years, the Turtles collectively generated hundreds of millions of dollars in profits, demonstrating that a rules-based approach could succeed even in the hands of traders with no prior market experience.

The Turtle system is often oversimplified as “buy 20-day highs, sell 20-day lows.” In reality, it comprises four interlocking components:

  1. Entry: Donchian Channel breakout.
  2. Position sizing: Volatility-adjusted unit size based on Average True Range (ATR).
  3. Pyramiding: Systematic addition to winning positions.
  4. Exit and stop-loss: 2-ATR stop from the last entry, with a shorter-channel breakout exit as backup.

This article provides a rigorous treatment of each component, with formal mathematical definitions and an analysis of the risk-control principles that make the system robust.

2. The Donchian Channel

2.1 Definition

The Donchian Channel of window nn at time tt is defined by an upper bound and a lower bound:

DC+(t;n)=maxi{0,1,,n1}Hti \text{DC}^+(t; n) = \max_{i \in \{0, 1, \ldots, n-1\}} H_{t-i} DC(t;n)=mini{0,1,,n1}Lti \text{DC}^-(t; n) = \min_{i \in \{0, 1, \ldots, n-1\}} L_{t-i}

where HtiH_{t-i} and LtiL_{t-i} are the highest and lowest prices of bar tit-i. The channel width at time tt is:

W(t;n)=DC+(t;n)DC(t;n) W(t; n) = \text{DC}^+(t; n) - \text{DC}^-(t; n)

The Turtle system uses two channels:

  • Entry channel: ne=20n_e = 20 – a breakout above DC+(t;20)\text{DC}^+(t; 20) triggers a long entry; a breakout below DC(t;20)\text{DC}^-(t; 20) triggers a short entry.
  • Exit channel: nx=10n_x = 10 – a breakout below DC(t;10)\text{DC}^-(t; 10) triggers a long exit; a breakout above DC+(t;10)\text{DC}^+(t; 10) triggers a short exit.

2.2 Why Different Entry and Exit Windows?

The asymmetry (ne>nxn_e > n_x) is deliberate. A longer entry window reduces false breakouts at the cost of later entry. A shorter exit window enables faster position liquidation when the trend reverses, protecting profits. The combination captures a larger fraction of each trend move than a symmetric channel would.

2.3 Breakout Signal

Formally, a long entry signal fires at bar tt when:

Ht>DC+(t1;ne) H_t > \text{DC}^+(t-1; n_e)

That is, the current bar’s high exceeds the previous bar’s nen_e-period channel high. The strict inequality ensures the breakout is new. A short entry signal fires analogously when Lt<DC(t1;ne)L_t < \text{DC}^-(t-1; n_e).

3. Average True Range and Volatility-Adjusted Sizing

3.1 True Range

The True Range (TR) at bar tt is:

TRt=max(HtLt,  HtCt1,  LtCt1) \text{TR}_t = \max\bigl(H_t - L_t,\; |H_t - C_{t-1}|,\; |L_t - C_{t-1}|\bigr)

where Ct1C_{t-1} is the previous bar’s close. TR captures the full range of price movement, including gaps.

3.2 Average True Range (ATR)

The ATR with window nan_a is the exponential moving average of TR:

ATRt=EMA(TR,na)t=αTRt+(1α)ATRt1 \text{ATR}_t = \text{EMA}(\text{TR}, n_a)_t = \alpha \cdot \text{TR}_t + (1 - \alpha) \cdot \text{ATR}_{t-1}

where α=2/(na+1)\alpha = 2 / (n_a + 1). The Turtle system uses na=20n_a = 20. ATR is often denoted NN in the Turtle literature.

3.3 Position Unit Size

The Turtle system defines a unit of position size as the quantity that represents a fixed dollar risk per ATR. Given an account equity EE, a risk fraction ρ\rho (typically 1%), and the current ATR:

Unit=ρEATRtpoint_value \text{Unit} = \frac{\rho \cdot E}{\text{ATR}_t \cdot \text{point\_value}}

where point_value is the monetary value of one price unit (e.g., the multiplier for futures contracts). The intent is that one unit of position should expose the account to approximately ρE\rho \cdot E of risk per ATR move. This normalizes volatility across instruments: a volatile contract gets fewer units; a quiet contract gets more.

In simplified form (setting point_value = 1), the unit size is:

Unit=ρEATRt \text{Unit} = \frac{\rho \cdot E}{\text{ATR}_t}

4. Pyramiding: Adding to Winners

4.1 The Rationale

Most trading systems open a position and hold it until exit. The Turtle system differs: it adds to winning positions in increments. This is called pyramiding. The logic is that a confirmed trend is likely to continue (the “momentum” or “trend persistence” hypothesis), and increasing exposure in the direction of the trend amplifies returns when the trend runs far.

4.2 The Pyramiding Rule

After the initial entry at the channel breakout, the system adds one unit each time price advances by 0.5ATR0.5 \cdot \text{ATR} in the direction of the trade. The maximum position is capped at 4 units.

For a long position entered at price P0P_0:

Entry1=P0(initial, 1 unit)Entry2=P0+0.5ATR(add 1 unit)Entry3=P0+1.0ATR(add 1 unit)Entry4=P0+1.5ATR(add 1 unit) \begin{aligned} \text{Entry}_1 &= P_0 & \text{(initial, 1 unit)} \\ \text{Entry}_2 &= P_0 + 0.5 \cdot \text{ATR} & \text{(add 1 unit)} \\ \text{Entry}_3 &= P_0 + 1.0 \cdot \text{ATR} & \text{(add 1 unit)} \\ \text{Entry}_4 &= P_0 + 1.5 \cdot \text{ATR} & \text{(add 1 unit)} \end{aligned}

The average entry price for a fully pyramided 4-unit position is:

Pˉ=14i=14Entryi=P0+0.75ATR \bar{P} = \frac{1}{4}\sum_{i=1}^{4} \text{Entry}_i = P_0 + 0.75 \cdot \text{ATR}
1
2
3
4
5
6
7
8
9
# Pseudocode: pyramiding logic (long side)
function compute_pyramid_orders(current_position, entry_price, atr):
    max_units = 4
    unit_size = compute_unit_size()  # volatility-adjusted
    current_units = current_position / unit_size

    for i from ceil(current_units + 1) to max_units:
        next_entry_price = entry_price + (i - 1) * 0.5 * atr
        submit_stop_buy_order(price=next_entry_price, quantity=unit_size)

4.3 The Cost of Pyramiding

Pyramiding is not free. The average entry price is worse (higher for longs, lower for shorts) than the initial breakout price. For the 4-unit long, the average entry is 0.75ATR0.75 \cdot \text{ATR} above P0P_0. This means the trend must advance at least 0.75ATR0.75 \cdot \text{ATR} beyond P0P_0 just to break even on the aggregate position. The payoff, however, is that a trend that runs kk ATRs from P0P_0 yields:

Profit=i=14(exit priceEntryi)unit_size \text{Profit} = \sum_{i=1}^{4} (\text{exit price} - \text{Entry}_i) \cdot \text{unit\_size}

which scales linearly with the number of pyramided units. The convexity of the payoff is the reward for the worse average price.

5. Stop-Loss: The 2-ATR Rule

5.1 Definition

The Turtle stop-loss is anchored to the most recent entry price. For a long position last entered at price PlastP_{\text{last}}:

Stoplong=Plast2ATR \text{Stop}_{\text{long}} = P_{\text{last}} - 2 \cdot \text{ATR}

For a short position:

Stopshort=Plast+2ATR \text{Stop}_{\text{short}} = P_{\text{last}} + 2 \cdot \text{ATR}

The stop is updated every time a new pyramid unit is added, since PlastP_{\text{last}} changes. This means the stop ratchets up (for longs) as the trade moves in favor, locking in progressively more profit.

5.2 Risk per Unit

Each unit risks 2ATR2 \cdot \text{ATR} from its entry price. With the unit-size formula from Section 3.3, the dollar risk per unit is:

Risk per unit=2ATRUnit=2ATRρEATR=2ρE \text{Risk per unit} = 2 \cdot \text{ATR} \cdot \text{Unit} = 2 \cdot \text{ATR} \cdot \frac{\rho \cdot E}{\text{ATR}} = 2\rho E

With ρ=1%\rho = 1\%, each unit risks 2%2\% of account equity. A fully pyramided 4-unit position risks up to 4×2%=8%4 \times 2\% = 8\% of equity if all stops are hit simultaneously. In practice, the stops are staggered (earlier units have tighter effective stops due to ratcheting), so the worst-case loss is somewhat less.

5.3 Why 2 ATR?

The choice of 2 ATR as the stop distance is not arbitrary. Consider the distribution of price changes over a holding period. If returns are approximately normal with standard deviation σ\sigma, then one ATR is roughly σ\sigma (up to a constant factor depending on the EMA window). A 2-ATR stop corresponds to a 2-sigma event, which has an approximate probability of P(Z>2)4.6%P(|Z| > 2) \approx 4.6\% under normality. This means the stop is unlikely to be triggered by routine noise but will reliably trigger on a genuine adverse move.

More importantly, the 2-ATR stop is adaptive: it widens in volatile markets (when ATR is large) and tightens in quiet markets (when ATR is small). This is far superior to a fixed-percentage stop, which can be too tight in volatile regimes (causing premature exits) or too loose in calm regimes (allowing excessive drawdown).

5.4 The Worst-Case Scenario

Consider a fully pyramided long position with entries at P0P_0, P0+0.5NP_0 + 0.5N, P0+NP_0 + N, P0+1.5NP_0 + 1.5N (where N=ATRN = \text{ATR}). The stop for the last unit is at P0+1.5N2N=P00.5NP_0 + 1.5N - 2N = P_0 - 0.5N. If the stop is hit:

Loss1=(P00.5N)P0=0.5NLoss2=(P00.5N)(P0+0.5N)=1.0NLoss3=(P00.5N)(P0+1.0N)=1.5NLoss4=(P00.5N)(P0+1.5N)=2.0N \begin{aligned} \text{Loss}_1 &= (P_0 - 0.5N) - P_0 = -0.5N \\ \text{Loss}_2 &= (P_0 - 0.5N) - (P_0 + 0.5N) = -1.0N \\ \text{Loss}_3 &= (P_0 - 0.5N) - (P_0 + 1.0N) = -1.5N \\ \text{Loss}_4 &= (P_0 - 0.5N) - (P_0 + 1.5N) = -2.0N \end{aligned} Total loss=5.0Nunit_size \text{Total loss} = -5.0N \cdot \text{unit\_size}

Expressed in terms of the unit risk (2Nunit_size=2ρE2N \cdot \text{unit\_size} = 2\rho E), this is 2.52.5 times the per-unit risk. In dollar terms, with ρ=1%\rho = 1\%:

Total loss=5.0ρE=5.0% of equity \text{Total loss} = 5.0 \cdot \rho \cdot E = 5.0\% \text{ of equity}

This is the worst case from a fully pyramided position, assuming all four units are stopped out simultaneously at the same price. In practice, earlier units may be stopped out before later units are even filled, reducing the maximum drawdown.

6. Exit: The Shorter Channel

In addition to the 2-ATR stop, the Turtle system exits when price breaks the 10-day channel in the opposite direction:

  • Long exit: price breaks below DC(t;10)\text{DC}^-(t; 10)
  • Short exit: price breaks above DC+(t;10)\text{DC}^+(t; 10)

The effective exit price is the more conservative of the two:

Exit price (long)=max(Stoplong,  DC(t;10)) \text{Exit price (long)} = \max\bigl(\text{Stop}_{\text{long}},\; \text{DC}^-(t; 10)\bigr)

This max operation ensures that if the ATR stop is tighter than the 10-day low (e.g., because volatility has contracted after entry), the tighter stop prevails. Conversely, if the 10-day low is higher (the trend has been so strong that the trailing channel has risen above the ATR stop), the channel exit triggers first.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# Pseudocode: combined exit logic (long side)
function check_exit(position, long_stop, exit_channel_low):
    if position > 0:
        exit_price = max(long_stop, exit_channel_low)
        submit_sell_order(price=exit_price, quantity=abs(position))

function on_new_entry(trade):
    if trade.direction == LONG:
        long_entry_price = trade.price
        long_stop = long_entry_price - 2 * atr

7. The Complete System in Pseudocode

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# Pseudocode: complete Turtle Trading system

# Parameters
entry_window = 20
exit_window = 10
atr_window = 20
max_units = 4
add_interval = 0.5  # ATR multiplier for adding
stop_distance = 2.0 # ATR multiplier for stop

state:
    position = 0
    long_entry_price = 0
    long_stop = 0
    short_entry_price = 0
    short_stop = 0

on_bar(bar):
    # Compute indicators
    entry_high = max(highs over entry_window bars)
    entry_low  = min(lows  over entry_window bars)
    exit_high  = max(highs over exit_window bars)
    exit_low   = min(lows  over exit_window bars)
    atr = compute_atr(atr_window)

    # Entry: no position -> place breakout orders
    if position == 0:
        submit_stop_buy(price=entry_high, quantity=unit_size)
        submit_stop_sell(price=entry_low, quantity=unit_size)

    # Exit: check stop and channel
    if position > 0:
        exit_price = max(long_stop, exit_low)
        if bar.low <= exit_price:
            close_long(price=exit_price, quantity=position)
    elif position < 0:
        exit_price = min(short_stop, exit_high)
        if bar.high >= exit_price:
            close_short(price=exit_price, quantity=abs(position))

    # Pyramiding: add units if price advances
    if position > 0:
        units_held = position / unit_size
        for i from ceil(units_held + 1) to max_units:
            add_price = long_entry_price + (i - 1) * add_interval * atr
            submit_stop_buy(price=add_price, quantity=unit_size)

on_fill(trade):
    if trade.direction == LONG:
        long_entry_price = trade.price
        long_stop = long_entry_price - stop_distance * atr
    elif trade.direction == SHORT:
        short_entry_price = trade.price
        short_stop = short_entry_price + stop_distance * atr

8. Robustness Analysis

8.1 Why the System Works

The Turtle system embodies three principles of robust trend-following:

  1. Cut losses short: The 2-ATR stop ensures that no single trade (or pyramid sequence) can inflict catastrophic damage. The maximum loss is bounded by design.

  2. Let profits run: The exit is triggered only by a confirmed reversal (10-day channel breakout), not by a fixed profit target. This allows the strategy to capture the full extent of trends, including the rare but extremely profitable “fat tail” moves that account for the bulk of long-term returns.

  3. Volatility-adaptive sizing: By scaling position size inversely with ATR, the system maintains roughly constant risk per trade across instruments and regimes. This prevents overexposure to volatile markets and underexposure to quiet ones.

8.2 Known Weaknesses

  • Whipsaw in ranges: Like all trend-following systems, the Turtle performs poorly in sideways markets. The 20-day breakout will fire repeatedly, and each false breakout incurs a stop-loss hit. The expected loss per whipsaw cycle is approximately 2ATRunit_size2 \cdot \text{ATR} \cdot \text{unit\_size}.
  • Correlation risk: The Turtles traded a basket of instruments. When multiple instruments trend simultaneously, the aggregate position can far exceed the per-instrument risk budget. Correlation spikes (e.g., during market crashes) can cause outsized losses.
  • Slippage: The system relies on stop orders, which are filled at market when triggered. In fast markets, slippage can exceed the assumed stop distance, particularly for illiquid instruments.

8.3 Parameter Sensitivity

The system has only three core parameters: ne=20n_e = 20, nx=10n_x = 10, and na=20n_a = 20. These values were chosen by Dennis and Eckhardt through experimentation in the 1980s. Subsequent research has shown that the system is relatively insensitive to these parameters within a reasonable range (e.g., ne[15,30]n_e \in [15, 30], nx[7,15]n_x \in [7, 15]). The pyramiding and stop parameters (0.50.5 ATR add interval, 22 ATR stop) are similarly robust. This insensitivity is a feature, not a bug: a system that only works for one specific parameter set is almost certainly overfit.

9. Conclusion

The Turtle Trading system is a masterclass in systematic risk management. Each component – the Donchian Channel for objective breakout signals, ATR for volatility-normalized position sizing, pyramiding for convex payoffs, and the 2-ATR stop for bounded risk – serves a specific purpose, and the components fit together into a coherent whole. The system does not predict market direction; it responds to market movement with disciplined rules that limit losses in adverse conditions and maximize gains in favorable ones.

The enduring relevance of the Turtle rules lies not in their specific parameters but in the principles they encode: volatility-adjusted risk, additive position building, and unconditional stop-loss discipline. These principles apply far beyond the original 1980s futures markets and remain foundational to modern trend-following and CTA strategies.


References

  1. Faith, C. (2007). Way of the Turtle: The Secret Methods that Turned Ordinary People into Legendary Traders. McGraw-Hill. – First-hand account by a Turtle trader, covering the complete rules and their rationale.

  2. Dennis, R., & Eckhardt, W. (1983). “The Turtle Traders.” Various interviews and accounts. – Original source material on the experiment.

  3. Donchian, R. D. (1960). “High Finance in Copper.” Financial Analysts Journal, 16(6), 133–142. – The origin of the Donchian Channel concept.

  4. Wilder, J. W. (1978). New Concepts in Technical Trading Systems. Trend Research. – Original definition of ATR and the concept of volatility-adjusted position sizing.

  5. Schwartz, E. (2010). “Trend Following: How to Make a Fortune in Bull and Bear Markets.” In Managed Futures: An Investor’s Guide, ed. H. Till and J. Eagleeye. – Analysis of trend-following returns and risk profiles.

  6. Hennessy, D. A. (2018). Trend Following with Managed Futures: The Search for Crisis Alpha. Wiley. – Modern academic treatment of trend-following, including the Turtle system.

  7. Fama, E. F., & Blume, M. E. (1966). “Filter Rules and Stock-Market Trading.” Journal of Business, 39(1), 226–241. – Early academic evidence on the profitability of breakout rules.