Ichimoku Cloud Breakout

How this strategy trades, what it scored, and the measurements the score was read from: every symbol and timeframe, on real and resampled history.

How It Trades

  1. Build the cloud from the bar extremes: midpoints of the 9-, 26- and 52-bar high-low ranges become the conversion line, base line and Span B, and the two spans are projected 26 bars ahead.
  2. Buy when the close rises above the top of the cloud: price has cleared the entire band the market built a month ago, which is Ichimoku's definition of a bullish regime.
  3. Sell when the close drops below the bottom of the cloud. Inside the cloud the strategy simply holds: that zone is explicitly treated as undecided, not as a signal.

Example Strategy

Pine Script

Paste it into TradingView’s Pine Editor to run these rules on any chart.

//@version=6
// Ichimoku Cloud Breakout — sort.finance. Fills at the signal bar's close, 0.02% fee a side,
// whole account per trade, as the backtest. History and indicator warm-up
// differ from the site's, so expect close to the same trades, not identical.
strategy("Ichimoku Cloud Breakout", overlay=true,
     initial_capital=100, default_qty_type=strategy.percent_of_equity,
     default_qty_value=100, commission_type=strategy.commission.percent,
     commission_value=0.02, process_orders_on_close=true, pyramiding=0)

// The bar the current position opened on, and the bar the last one closed on.
var int entryBar = na
var int exitBar = -1

// ── Signals ──────────────────────────────────────────────────────────────
midpoint(len) => (ta.highest(high, len) + ta.lowest(low, len)) / 2
conversion = midpoint(9)
base = midpoint(26)
// The cloud at this bar is the one drawn 26 bars ago.
spanA = ((conversion + base) / 2)[26]
spanB = midpoint(52)[26]
cloudTop = math.max(spanA, spanB)
cloudBottom = math.min(spanA, spanB)
enterNow = close[1] <= cloudTop[1] and close > cloudTop
exitNow = close[1] >= cloudBottom[1] and close < cloudBottom

// ── Orders ───────────────────────────────────────────────────────────────
// Open on the first bar the entry holds while flat; close on the first
// later bar the exit holds; never reopen on the bar a position closed.
inTrade = strategy.position_size != 0
if inTrade and bar_index > entryBar and exitNow
    strategy.close("Long")
    exitBar := bar_index
else if not inTrade and bar_index > exitBar and enterNow
    strategy.entry("Long", strategy.long)
    entryBar := bar_index

// ── Drawing ──────────────────────────────────────────────────────────────
plot(conversion, "Conversion", color=#4d8dff)
plot(base, "Base", color=#e0a03a)
plot(spanA, "Span A", color=#459b61)
plot(spanB, "Span B", color=#b54a48)