The rules at a glance
- Market: any major pair, gold or index on the daily chart; the example uses GBPUSD
- Day one: the price makes a new 20-day low, the old 20-day low was made at least 3 days earlier, and the day closes at or below the old low
- Day two: a buy stop just above the old low (plus 5% of an ATR), good for that day only
- Stop loss: a tenth of an ATR below day one's low
- Target: twice the risk (2R)
- Shorts: the mirror image: a new 20-day high that closes above the old one, then a sell stop just below the old high
Where the name comes from
The Turtles were a group of traders taught a breakout system in the 1980s; one of its rules bought a new 20-day high (the gold breakout strategy uses the same channel). Many breakouts fail, though, and the traders who bought them get stopped out as the price falls back. Laurence Connors and Linda Raschke described a way to trade that failure in their 1995 book Street Smarts and called it Turtle Soup.
It's the same idea that smart money traders now call a liquidity sweep: stops sitting just beyond an obvious level get taken out, and the price snaps back.
Turtle Soup and Turtle Soup Plus One
| Turtle Soup | Turtle Soup Plus One | |
|---|---|---|
| Day one | A new 20-day low below an old low made at least 4 days earlier | The same, but the old low only needs to be 3 days old, and the day closes at or below it |
| Entry | The same day, if the price climbs back above the old low | The next day, with a buy stop at the old low |
| Stop | Below the new low | Below the lower of day one's and day two's lows |
| Needs | Watching the market during the day | Only the daily close |
The original version enters on the same day the low is made, which needs intraday watching and can't be tested properly on daily candles. The Plus One version uses the next day, so it works with end-of-day orders and backtests cleanly. That's the one in the script, with one simplification: the stop goes under day one's low, so the lot size is known before day two opens.
The rules, step by step
1. Find day one
On a daily chart, day one makes a new 20-day low. The old 20-day low it breaks must be at least three days old, so a fresh low that was just made doesn't count. Day one has to close at or below that old low: the breakdown looks real.
2. Place the day two buy stop
For the next day only, place a buy stop just above the old low, plus 5% of the ATR. If the price climbs back above the old low, the breakdown has failed and you're in. If not, cancel the order.
3. Stop below the new low, target 2R
The stop goes a tenth of an ATR below day one's low. The target is twice the risk. The book's own exits were more flexible than a fixed target; a fixed 2R makes the rules easy to test.
Shorts work the same way upside down: a new 20-day high that closes above the old one, then a sell stop just below the old high the next day.
Worked example: GBPUSD, daily chart
GBPUSD made a 20-day low at 1.3301 and bounced. 15 days later it breaks that low, trading down to 1.3281, and closes at 1.3297, below the old low. That's day one. The next day a buy stop sits just above the old low, at 1.33041. The day's rally fills it, and the stop goes a tenth of the 62-pip daily ATR below day one's low, at 1.32748.
| GBPUSD long | |
|---|---|
| Entry (buy stop above the old low) | 1.33041 |
| Stop loss | 1.32748, 29.3 pips away |
| Target (2R) | 1.33627, 58.6 pips away |
| Lot size at 1% of $10,000 | $100 ÷ (29.3 pips × $10) = 0.341, rounded down to 0.34 lots |
| Loss if the stop is hit | $99.62 |
| Profit at the target | $199.24 |
GBPUSD keeps climbing and reaches the target 4 days after the entry. The stop is small compared with the daily ATR because it sits just under day one's low, close to the entry. That's the appeal of the setup, and the risk too: a second push lower takes it out quickly.
Risk management
- Size from the stop. Daily Turtle Soup stops are often 20 to 60 pips on the major pairs.
- Weekend gaps. A daily trade often stays open over a weekend. A gap can jump the stop.
- Swaps. Holding for days costs or earns an overnight swap.
- Strong trends. In a powerful downtrend, new lows tend to stick and a buy back above the old low often fails. Test whether the setup does better after a sideways spell.
Common mistakes
- Buying the new low itself. The setup needs the price to climb back above the old low.
- Using a fresh low. The old low must be at least three days old; a low made yesterday hasn't attracted many stops yet.
- Leaving the order for days. In the Plus One version, the buy stop is good for one day only.
Backtest it yourself on TradingView
This page doesn't quote a win rate or a profit figure, and you should be wary of anyone who does without showing the test. Results change with the market, the dates, the data feed and the costs you put in. The honest way is to run the test yourself, and the free script below does the work in a couple of minutes.
- Open the chart. On TradingView, open GBPUSD on the daily chart.
- Add the script. Open the Pine Editor from the Pine icon in the panel on the right of the chart (older layouts have it as a tab under the chart), delete the code that's already there, paste this strategy's code and click "Add to chart".
- Put in your costs. Open the strategy's settings and go to Properties. Enter your broker's commission and a little slippage. A test without costs flatters every strategy, and short-term ones most of all.
- Read the Strategy Tester. The panel under the chart shows the net profit, the maximum drawdown, the profit factor, the number of trades and a list of every trade. Click a few trades and check on the chart that each one follows the rules. Trade sizes are shown in units rather than lots: 100,000 units is one lot of a forex pair, and 100 ounces is one lot of gold.
- Change one setting at a time. Compare the look-back (10, 20 and 55 days), the minimum age of the old low (3 against 4 days, and more), the 2R target against 1.5R and 3R, and longs against shorts. On the daily chart the free plan's 5,000 candles cover many years. Then try EURUSD, USDJPY and XAUUSD.
As a rough guide, don't trust a result with fewer than 100 trades, a profit factor under 1 once costs are in, or a drawdown you couldn't sit through with real money. Settings tuned to look good on one stretch of history often fail on the next, so check the same settings on dates you didn't tune them on, then demo trade the strategy for a few weeks. How much history you can test depends on your TradingView plan: the free plan loads 5,000 candles, which is a few months of 15-minute candles but years of daily ones.
The script sizes each trade from the stop loss and your risk percentage, starts with $10,000 and assumes 1:100 leverage (a 1% margin setting), so the tester doesn't flag margin calls on normal forex trade sizes. Change these under Properties to match your account. By default TradingView fills orders at the open of the candle after the signal, so the fill can differ a little from the signal candle's close.
Download the free Pine Script and PDF
The script is written in Pine Script version 6 for this guide and follows the rules above. It can't read the economic calendar, so skipping news days is up to you. It's free to use, change and share. The PDF is a one-page cheat sheet with the Turtle Soup and Plus One rules, a worked example and a checklist, to keep next to your chart.
Show the code (Pine Script v6, 67 lines)
//@version=6
// Turtle Soup Plus One strategy by PipLedger (https://pipledgerfx.com/turtle-soup-strategy)
// Based on the Turtle Soup Plus One setup described by Laurence Connors and Linda Raschke in Street Smarts (1995): a new 20-day low that closes at or below the old one, then a buy stop back at the old low the next day. Shorts are the mirror image.
// The book puts the stop under the lower of day one's and day two's lows; this script uses day one's low, so the trade size is known before day two opens.
// Free to use and change. For education and backtesting only; not financial advice.
strategy("PipLedger: Turtle Soup Plus One", shorttitle="Turtle Soup", overlay=true, initial_capital=10000, pyramiding=0, default_qty_type=strategy.fixed, default_qty_value=1, margin_long=1, margin_short=1, currency=currency.USD)
// ---------- Inputs
lookback = input.int(20, "Look-back for the old low (high)", minval=5)
minAge = input.int(3, "The old low must be at least this many candles old", minval=1)
bufAtr = input.float(0.05, "Entry buffer above the old low (x ATR 14)", minval=0.0, step=0.01)
stopBuf = input.float(0.1, "Stop buffer below the new low (x ATR)", minval=0.0, step=0.05)
rr = input.float(2.0, "Target (R multiple)", minval=0.5, step=0.25)
riskPct = input.float(1.0, "Risk per trade (% of equity)", minval=0.1, maxval=5.0, step=0.1)
// ---------- Helpers
fx = strategy.convert_to_account(1.0) // one unit of the chart's quote currency in account currency (1 on USD-quoted charts)
calcQty(float entry, float stop) =>
float dist = math.abs(entry - stop)
dist > 0 and not na(fx) ? strategy.equity * riskPct / 100 / (dist * syminfo.pointvalue * fx) : 0.0
atr = ta.atr(14)
// the old 20-candle low and high, from the candles before this one, and how many candles ago each was made
oldLo = ta.lowest(low, lookback)[1]
oldHi = ta.highest(high, lookback)[1]
oldLoAge = 1 - ta.lowestbars(low, lookback)[1]
oldHiAge = 1 - ta.highestbars(high, lookback)[1]
// day one: a new low below an old low that's at least minAge candles old, and a close at or below the old low
dayOneLong = low < oldLo and oldLoAge >= minAge and close <= oldLo
dayOneShort = high > oldHi and oldHiAge >= minAge and close >= oldHi
var int pend = 0
flat = strategy.position_size == 0
// the stop order is good for one candle only (day two)
if pend != 0 and not dayOneLong and not dayOneShort
strategy.cancel("Long")
strategy.cancel("Short")
pend := 0
// ---------- Orders: day two's buy stop back at the old low
if flat and dayOneLong
strategy.cancel("Short")
float entry = oldLo + bufAtr * atr
float sl = low - stopBuf * atr
float q = calcQty(entry, sl)
pend := 0
if q > 0
strategy.entry("Long", strategy.long, qty=q, stop=entry)
strategy.exit("Long exit", "Long", stop=sl, limit=entry + (entry - sl) * rr)
pend := 1
else if flat and dayOneShort
strategy.cancel("Long")
float entry = oldHi - bufAtr * atr
float sl = high + stopBuf * atr
float q = calcQty(entry, sl)
pend := 0
if q > 0
strategy.entry("Short", strategy.short, qty=q, stop=entry)
strategy.exit("Short exit", "Short", stop=sl, limit=entry - (sl - entry) * rr)
pend := -1
// ---------- Chart
plot(oldLo, "Old 20-candle low", color=color.new(color.teal, 30), style=plot.style_stepline)
plot(oldHi, "Old 20-candle high", color=color.new(color.red, 30), style=plot.style_stepline)
plotshape(dayOneLong, "Day one: new low closes below the old low", shape.triangleup, location.belowbar, color.teal, size=size.small)
plotshape(dayOneShort, "Day one: new high closes above the old high", shape.triangledown, location.abovebar, color.red, size=size.small)Trading this from India
Residents can trade EURUSD, GBPUSD and USDJPY futures and options on NSE and BSE through a SEBI-registered broker. The contracts are quoted the same way as the spot pair, one lot is 1,000 units of the base currency, and they're cash-settled in rupees. They trade only from 9 a.m. to 7:30 p.m. IST, volumes are thin and not every broker offers them, so check the hours and the spread first. On the exchange contracts one GBPUSD lot is £1,000, so a pip is worth $0.10 a lot. The NSE daily candle covers 9 a.m. to 7:30 p.m. IST, so its highs and lows differ from the 24-hour spot chart. Trading forex or CFDs with offshore online platforms isn't allowed for residents under FEMA, even if the app is easy to download. Details are in is forex trading legal in India.
Related strategies: liquidity sweep, fair value gap, order block, BOS and CHoCH, ICT kill zones, XAUUSD FVG + order block, ICT Silver Bullet. All 40 strategies are compared on one page in forex trading strategies.