Pine Script Strategy Builder
Write production-ready Pine Script v5 strategies and indicators for TradingView.
Workflow
- Understand the request — What instrument, timeframe, style (scalping/intraday/swing)?
- Choose type —
strategy()for backtesting + signals,indicator()for visual-only - Follow architecture — Data → Signal → Score → Filter → Risk → Execute → Visual
- Apply non-repaint rules — MANDATORY, no exceptions
- Run pre-flight checklist — Before finalizing ANY script
- Test mentally — Walk through edge cases, verify logic on paper
- Deliver — Complete script + explanation + suggested backtest settings
Non-Negotiable Rules
Non-Repaint (ALWAYS)
- Wrap signals in
barstate.isconfirmed strategy()must havecalc_on_every_tick=false,process_orders_on_close=falserequest.security()→ usebarmerge.gaps_off, barmerge.lookahead_onwith[1]offset- NEVER use current bar data for signal generation without confirmation
Risk Management (ALWAYS)
- Every trade MUST have a stop loss — no naked positions
- Use ATR-based or swing-based SL
- RR ratio ≥ 1:2 preferred
- Max trades per day filter
- Cool-off after loss
Quality Gates (ALWAYS)
- ADX chop filter (ADX > 20 to trade)
- Session filter for appropriate trading hours
- Volume confirmation (1.2x+ average)
- Score threshold ≥ 70 for entries
Strategy Architecture
Layer 1: Data — Collect indicators (EMA, RSI, ATR, VWAP, ADX, Volume, BB, Pivots)
Layer 2: Signal — Generate signals (trend direction, breakouts, pullbacks, sweeps)
Layer 3: Score/Filter — Score + filter (multi-factor score, chop filter, session, cool-off)
Layer 4: Risk — SL/TP calculation (ATR/swing-based, partial exits, trailing)
Layer 5: Execute — Entry/exit logic (NON-REPAINT, barstate.isconfirmed)
Layer 6: Visual — Labels, boxes, tables, alerts, backgrounds
Pre-Flight Checklist
Before delivering ANY strategy, verify:
- Non-repaint logic (
barstate.isconfirmed)? - Chop filter (ADX > 20)?
- Session filter?
- Cool-off after loss?
- Score threshold ≥ 70?
- Strong breakout confirmation?
- Full EMA alignment (3+ EMAs)?
- Volume confirmation (1.2x+)?
- RR ≥ 1:2?
- Max trades per day?
- SL always set?
- Partial exit or trailing?
Templates
Strategy Template
//@version=5
strategy("Name", overlay=true,
initial_capital=10000,
default_qty_type=strategy.percent_of_equity,
default_qty_value=10,
commission_type=strategy.commission.percent,
commission_value=0.05,
slippage=1,
pyramiding=0,
process_orders_on_close=false,
calc_on_every_tick=false)
Indicator Template
//@version=5
indicator("Name", overlay=true, max_lines_count=500, max_labels_count=500)
Key Patterns
Non-Repaint Entry
var bool longSignal = false
if barstate.isconfirmed
longSignal := <conditions>
else
longSignal := false
if longSignal and strategy.position_size == 0 and barstate.isconfirmed
strategy.entry("Long", strategy.long)
Multi-Timeframe Non-Repaint
htfClose = request.security(syminfo.tickerid, "60", close[1], barmerge.gaps_off, barmerge.lookahead_on)
ATR-Based SL/TP
atrVal = ta.atr(14)
slLong = close - atrVal * 1.5
tpLong = close + atrVal * 1.5 * rrRatio
Score System (0-100)
score = 0
if close > ema50 and close > ema200 // Trend: 0-25
score += 25
if rsi > 60 // Momentum: 0-20
score += 20
if volume > ta.sma(volume, 10) * 1.2 // Volume: 0-15
score += 15
if close > high[1] and close > open // Breakout: 0-20
score += 20
if ta.atr(14) > ta.atr(14)[1] // Volatility: 0-10
score += 10
if close > ta.vwap(hlc3) // VWAP: 0-10
score += 10
totalScore = math.min(score, 100)
Cool-off After Loss
var int barsSinceLoss = 999
if strategy.closedtrades > 0
if strategy.closedtrades.profit(strategy.closedtrades - 1) < 0
barsSinceLoss := 0
barsSinceLoss += 1
coolOffOK = barsSinceLoss > 5
Common Errors & Fixes
| Error | Fix |
|---|---|
Cannot call ta.dmi().adx | [diPlus, diMinus, adxVal] = ta.dmi(len, len) |
Undeclared identifier | Declare with var before use |
Cannot call operator [] on bool | Store in var variable first |
Script could not be translated | Check commas, parentheses, v5 syntax |
Too many plot calls | Max 64 plots — use tables/labels |
Loop takes too long | Max 500K iterations — reduce loop |
Variable type mismatch | Use float() or int() casting |
Detailed References
- SMC patterns (BOS, ChoCH, FVG, Order Blocks, Sweeps): See references/smc-patterns.md
- All indicators cheat sheet: See references/indicators-cheatsheet.md
- Entry patterns (proven): See references/entry-patterns.md
- Risk management patterns: See references/risk-management.md
- Visual & alert patterns: See references/visuals-alerts.md
- Performance tracking: See references/performance-tracking.md
Output Format
When delivering a Pine Script:
- Complete, copy-paste-ready code
- Brief explanation of what it does
- Suggested TradingView backtest settings (timeframe, dates, instrument)
- Known limitations or things to watch for
- Ideas for improvement
Fixing Errors
When fixing Pine Script compilation errors:
- Read the error message carefully
- Match to known error patterns above
- Fix the specific issue — don't rewrite the whole script
- Verify the fix doesn't break other logic
- Re-check non-repaint compliance
Optimization Notes
- Don't overfit to historical data
- Test across multiple timeframes
- Verify with walk-forward (test on different date ranges)
- Keep strategies simple — complex ≠ profitable
- If win rate < 50% or profit factor < 1.3, strategy needs work