How It Trades
- 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.
- 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.
- 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)