WTFutures.
ANATOMY OF A STRATEGY · ETH / USDT PERPETUAL · 15 MINUTES

The recovery
inside the channel.

An entry gets the attention. The rules around it make the strategy. Inside one ETH test, where Keltner recovery meets a market that keeps changing character.

Share on X
Explore the frozen chart
Net test return+27.09%$1,000 → $1,270.85
Winning trades17 / 17100% in this saved test
Maximum drawdown0.86%Equity decline from a prior peak

6 Sep 2026, 16:45 → 11 Sep 2026, 21:30 UTC
500-candle snapshot; 499 completed candles tested, including indicator warm-up. End is exclusive. After the configured fees and slippage.

A selected historical example. We chose this result for its clean record and interesting rules. It was optimised on these same candles, so the 100% win rate is a description of this short test, not an estimate of future performance.

The move starts with a return.

Price can stretch away from its recent average and keep going. This strategy waits for a different event: a completed candle returning inside a volatility channel. For a long entry, its close crosses back above the lower band. For a short, it crosses back below the upper band.

The centre is an exponential moving average, or EMA. The outer bands use Average True Range (ATR), a measure of the size of recent price movements. Wider movement makes a wider channel. The long recipe uses 11 candles and 1.7 × ATR; the short recipe uses 19 candles and 1.5 × ATR. This is the recovery version of Keltner, not a rule that buys every upper-band breakout.

For the general channel concept: TradingView’s Keltner Channels guide. The exact entry and exit rules here come from the saved Strategy Lab configuration.

A channel becomes a recovery signalInside the Pine Script

In this export, kc and revert are true. The two crossing helpers detect a move from one side of a band to the other, using completed closes. They do not trigger just because a wick touched the band.

    bool kc = kind == "keltner" or kind == "keltner-revert"
    float mid = sl_average(src, length, kc ? "ema" : "sma")
    float atr = sl_average(tr, length, "rma")
    float spread = kc ? atr : ta.stdev(src, length, true)
    float hi = mid + factor * spread
    float lo = mid - factor * spread
    bool revert = kind == "bb-revert" or kind == "keltner-revert"
    goLong := sl_up(src, revert ? lo : hi)
    goShort := sl_down(src, revert ? hi : lo)
Exact excerpt from this strategy’s export. These lines rely on the full script’s helpers and inputs; they are not a standalone strategy.

One market. Four sets of rules.

Before looking for an entry, the strategy asks which conditions apply. Its CHOP(50) threshold is 55: below it, use the trend recipes; at or above it, use the range recipes. CHOP measures how directional or choppy the recent path has been. It does not choose up or down. About CHOP

CHOP(50) < 55Trend recipesKeltner recovery · long or short
CHOP(50) ≥ 55Range recipesEMA confirmation · confirmed swing

The labels are routing rules, not a judgement made by a human looking at the chart. A trade keeps the recipe that opened it, even if CHOP later crosses the threshold. Only one position can be open; conflicting long and short entry signals are skipped.

The conditions choose the recipeInside the Pine Script

r1L and r2S are the trend long and short signals; r3L and r4S are the range signals. Missing CHOP values block entries during warm-up.

float regime = sl_chop(trueRange, regimeLength, n)
bool ranging = regime >= regimeThreshold
bool longSignal = active and not na(regime) and (ranging ? r3L : r1L)
bool shortSignal = active and not na(regime) and (ranging ? r4S : r2S)
Exact excerpt from this strategy’s export. These lines rely on the full script’s helpers and inputs; they are not a standalone strategy.
EXPLORE THE ACTUAL TRADES

Every entry. Every exit.

Fixed historical test

Start with the featured trade. Choose any of the 17 trades, pan or zoom. The candles, rules and result stay fixed.

Trade 16 / 17 · Trend · Long
O 2,606.87H 2,612.81L 2,590.85C 2,606.52VOL 138.3K
2,433.042,491.282,549.522,607.762,666.00KC REV centreUpper bandLower band10:4511:3012:1513:0013:4514:30Long · Profit target · $91.82 net P&LLong · Profit target · $91.82 net P&LShort · Profit target · $8.48 net P&LELong · Profit target · $91.82 net P&LBLong · Profit target · $91.82 net P&LE
17 candlesDrag / Shift-scroll to pan · Scroll to zoom
View: 11 Sept 10:45 – 14:45 · 500-candle history totalUTC
LONG · Trend · Long+$91.82+7.85% on trade allocation, after costs
Entry · 11 Sept, 11:30 UTC
2,455.411 USDT
Exit · 11 Sept, 14:00 UTC
2,651.3135 USDT
Exit rule
Profit target

B Buy / long entry S Sell / short entry E Exit · Lines show the selected trade’s entry recipe. Flags mark fills; an intrabar exit’s flag is anchored to its candle, not an exact second.

Inspect all 17 trades
Trade / entry UTCRecipeExit ruleNet P&LAccount after
Trend · ShortProfit target+$7.30$1,007.30
Trend · LongHolding limit+$9.07$1,016.37
Trend · ShortProfit target+$7.42$1,023.79
Trend · ShortProfit target+$7.48$1,031.27
Trend · LongIndicator exit+$11.18$1,042.45
Range · LongProfit target+$7.81$1,050.26
Range · LongProfit target+$7.86$1,058.12
Trend · ShortProfit target+$7.73$1,065.85
Range · ShortProfit target+$25.69$1,091.54
Trend · LongHolding limit+$7.79$1,099.33
Range · ShortProfit target+$26.50$1,125.83
Trend · LongHolding limit+$18.52$1,144.35
Trend · ShortProfit target+$8.36$1,152.71
Range · LongProfit target+$8.63$1,161.34
Trend · ShortProfit target+$8.48$1,169.82
Trend · LongProfit target+$91.82$1,261.64
Trend · ShortProfit target+$9.21$1,270.85

A recovery. A confirmation. A fill.

At the close of the 11:15 UTC candle, price crossed back above the lower Keltner band. CHOP(50) was 47.82, selecting the trend recipes. The long recipe’s extra CHOP(33) check was 42.55, below its threshold of 48. Both conditions agreed.

  1. 11:30 · Enter long

    The simulation buys at the next candle’s open, adjusted for slippage: 2,455.41 USDT. Its 4% fixed stop starts at 2,357.19 USDT.

  2. 14:00 candle · Target reached

    The 8% price target is touched during this candle. After exit slippage, the fill is 2,651.31 USDT. It did not need the Bollinger exit or the 21-candle holding limit.

  3. The account effect

    Net profit is $91.82, taking the compounded account from $1,169.82 to $1,261.64. The trade returned 7.85% on its allocation after costs; the advertised +27.09% belongs to all 17 trades combined.

A signal becomes an orderInside the Pine Script

This block sits inside if not fillPass and barstate.isconfirmed. With the export’s default order-processing settings, a confirmed signal schedules the next available fill. The full export also supplies position protection and order-fill alert messages.

    else if active and (not useSavedEnd or time_close < endTime) and bar_index + 1 - lastExit > cooldown and longSignal != shortSignal and strategy.equity > 0
        route := longSignal ? longRoute : shortRoute
        strategy.entry(longSignal ? "L" : "S", longSignal ? strategy.long : strategy.short, comment = sl_routeName(route), alert_message = longSignal ? "entry_long" : "entry_short", disable_alert = not enableTradeAlerts)
Exact excerpt from this strategy’s export. These lines rely on the full script’s helpers and inputs; they are not a standalone strategy.
04 / THE ENTIRE STRATEGY

The complete recipe book.

Every active branch, including the ones that share the work with Keltner. All values below are the saved settings.

KC REVEntry5 trades

Trend · Long

A close recovers above the lower Keltner band. A second CHOP check must be below 48. An 8% target gives a successful move room, while a holding limit ends trades that linger.

Entry
Keltner recovery · Length 11 · Multiplier 1.7
Confirmation
CHOPChoppiness · Length 33 · Threshold 48
Protection
4% fixed stop · 8% target
Other exits
BB REVExitBollinger recovery · Length 50 · Multiplier 2Exit on this indicator’s signal against the position. Holding limit: 21 candles (5.25 hours).
Opposite entry / cooldown
Opposite entry exit off · 0 candles after exit
KC REVEntry7 trades

Trend · Short

A close returns below the upper Keltner band. CHOP(39) must be below 66. The smaller 0.87% target and a trailing stop give this branch a different exit profile from the long side.

Entry
Keltner recovery · Length 19 · Multiplier 1.5
Confirmation
CHOPChoppiness · Length 39 · Threshold 66
Protection
2% trailing stop · 0.87% target
Other exits
RSIExitRSI recovery · Length 6 · Threshold 29Exit on this indicator’s signal against the position. Holding limit: 21 candles (5.25 hours).
Opposite entry / cooldown
Opposite entry exit off · 0 candles after exit
EMAEntry3 trades

Range · Long

Price crosses above a 2-candle EMA, with a rising 63-candle EMA and price above it. The EMA pullback module is a confirmation here: it does not require a fresh touch of the average.

Entry
Exponential moving average · Length 2
Confirmation
PULLBACKEMA pullback recovery · Length 63
Protection
3.15% fixed stop · 0.89% target
Other exits
No indicator exit. Holding limit: 80 candles (20 hours).
Opposite entry / cooldown
Opposite entry exit off · 0 candles after exit
PIVOTEntry2 trades

Range · Short

A swing high needs 16 lower highs before it and 19 lower highs after it. The signal becomes available only after those 19 confirmation candles, never back at the peak.

Entry
Confirmed swing reversal · Left candles 16 · Confirmation candles 19
Confirmation
None
Protection
2.85% fixed stop · 2.55% target
Other exits
STExitSupertrend · Length 10 · Multiplier 3Exit on this indicator’s signal against the position. Holding limit: 80 candles (20 hours).
Opposite entry / cooldown
Opposite entry exit off · 0 candles after exit

For the range-short swing entry, 19 confirmation candles mean 4 hours 45 minutes after the possible peak. Those candles must exist before the signal can be used. A historical turning point is not an entry time.

What this clean record can tell us.

All 17 trades closed with a net profit in this replay. None was forcibly closed at the end, and none touched both a stop and target in the same candle. The largest equity decline observed by this simulator was 0.86%. That does not mean each stop was 0.86%, or that a future drawdown is capped there.

The account started with $1,000 and used 100% of available equity at 1× exposure, one position at a time. Profits compounded. Fees were 0.06% per side and adverse slippage 0.02% per side. The replay deducted $22.22 in fees; its estimated slippage cost was $7.41, already reflected in the fills.

There is a limit to what five days of selected history can establish. Search favoured this result on the same data, and this snapshot does not retain a verified total number of candidates tried. There is no unseen-data or forward-test result attached. Funding, spread variation, market impact and real fill availability are outside this simulation. Candle-based drawdown can miss the path inside a candle.

The useful next question is how the unchanged rules behave on later, unseen candles with realistic costs. This page keeps the original sample fixed, so it remains a reference when that work is done.

Source, reproduction and Pine comparison

Public Strategy Library snapshot 5830062d870e97c486530e402a4549e6f7ea775e915dc3c1529ac351bb450c9e, replay engine bot-replay-1. The original snapshot was re-run and all saved totals matched. Source includes 500 candles; the unfinished last candle is excluded. Warm-up starts at the first saved candle.

The Pine excerpts were generated from this exact setup with the current chart controls. They have been checked against the exporter, but this article does not claim an independent TradingView fill-by-fill match. For a comparison, use BINANCE:ETHUSDT.P, standard 15-minute candles, the original Inputs and Properties, and keep “Match the saved Strategy Lab test” checked. Loading less history or changing costs changes the comparison.

STRATEGY FIT · EDITORIAL ASSESSMENT

A useful hypothesis. Still to be tested.

Where the rules may fit

The featured Keltner entry looks for a return inside the channel with its CHOP confirmation. Persistent moves away from the band may hit protection instead. The separate range recipes change which entries are eligible when CHOP rises.

Evidence strength: limited

Seventeen trades from one short, optimised sample are not independent proof of an edge. There is no untouched test or forward record attached. A clean win rate does not establish how often these conditions will continue.

What would strengthen it

Freeze these rules, record their performance on later candles and across separate market episodes, then check sensitivity to nearby settings and higher costs. Keep the losing periods in the record too.

This is a research interpretation of this article’s evidence, not a probability of future success or a generation score.