Pine Script Patterns
Lightweight scaffold for Pine Script v5/v6 indicator development.
Before Generating Code
ALWAYS use doc-researcher agent or Ref MCP tools to verify:
-
Current function signatures
-
v5 vs v6 syntax differences
-
Deprecated functions
File Conventions
-
Version header: //@version=6 (prefer v6)
-
License: Mozilla Public License 2.0
-
File naming: LB_*.pine
-
Author: Luther Barnum
Input Group Structure
Standard groups (use group= parameter):
"Feature Toggles" - Master enable/disable switches "VWAP Settings" - VWAP configuration "VWAP Bands" - Standard deviation band settings "Session Settings" - Time-based parameters "Initial Balance" - IB configuration "Opening Range" - OR settings "Pivot Points" - Pivot configuration "Display Options" - Visual settings "Colors" - Color configuration
Session Defaults
-
RTH: 9:30 AM - 4:00 PM ET
-
Timezone: America/New_York
-
Detection: time(timeframe.period, sessionString)
Resource Limits
Set appropriately:
-
max_bars_back
-
Historical data access
-
max_labels_count
-
Label objects (default 500)
-
max_lines_count
-
Line objects (default 500)
Complete Example
Reference: /Users/lgbarn/Personal/Indicators/Tradingview/LB_RH_MAs.pine
//@version=6 // This Pine Script® code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © lgbarn
indicator('LB Simple MA Crossover', shorttitle='LB_MACross', overlay=true)
// === INPUTS === fastLength = input.int(9, "Fast MA Length", minval=1, group="MA Settings") slowLength = input.int(21, "Slow MA Length", minval=1, group="MA Settings") useLightTheme = input.bool(false, "Light Theme", group="Display")
// === CALCULATIONS === fastMA = ta.ema(close, fastLength) slowMA = ta.sma(close, slowLength)
// === COLORS === fastColor = useLightTheme ? color.new(#0000FF, 0) : color.new(#00FFFF, 0) slowColor = useLightTheme ? color.new(#FF0000, 0) : color.new(#FF6600, 0)
// === PLOTS === plot(fastMA, title="Fast MA", color=fastColor, linewidth=2) plot(slowMA, title="Slow MA", color=slowColor, linewidth=2)
Key Patterns
Persistent State (Session Reset)
var float cumulativeValue = 0.0 var float sessionHigh = na var float sessionLow = na
if ta.change(time("D")) != 0 cumulativeValue := 0.0 sessionHigh := high sessionLow := low
Session Detection
// Check if in RTH session isSessionTime = time(timeframe.period, "0930-1600:23456")
// Detect new session start isNewSession = ta.change(time("D")) != 0
// Session with timezone isRTH = not na(time(timeframe.period, "0930-1600", "America/New_York"))
Theme Colors
useLightTheme = input.bool(false, "Light Theme", group="Display") lineColor = useLightTheme ? color.new(#000000, 0) : color.lime fillColor = useLightTheme ? color.new(#000000, 90) : color.new(color.lime, 90)
VWAP Calculation Pattern
var float cumVolume = 0.0 var float cumVwap = 0.0 var float cumVwap2 = 0.0
if isNewSession cumVolume := 0.0 cumVwap := 0.0 cumVwap2 := 0.0
cumVolume += volume cumVwap += volume * hlc3 cumVwap2 += volume * hlc3 * hlc3
vwapValue = cumVolume > 0 ? cumVwap / cumVolume : na variance = cumVolume > 0 ? cumVwap2 / cumVolume - vwapValue * vwapValue : na stdev = variance > 0 ? math.sqrt(variance) : na
upperBand = vwapValue + stdev lowerBand = vwapValue - stdev
Moving Average Patterns
// Simple Moving Average smaValue = ta.sma(close, length)
// Exponential Moving Average emaValue = ta.ema(close, length)
// Weighted Moving Average wmaValue = ta.wma(close, length)
// Hull Moving Average hmaValue = ta.hma(close, length)
Error Handling Patterns
Check for NA values
// Use nz() to replace NA with default safeValue = nz(calculatedValue, 0.0)
// Check if value is valid before use if not na(vwapValue) plot(vwapValue, color=color.blue)
Validate inputs
// Ensure slow > fast validatedSlow = math.max(slowLength, fastLength + 1)
Handle division by zero
divisor = high - low result = divisor != 0 ? (close - low) / divisor : 0.5
Check bar history
// Ensure enough bars for calculation if bar_index >= length - 1 // Safe to calculate value = ta.sma(close, length)
Runtime errors (v6)
if period < 1 runtime.error("Period must be >= 1")
Trading Context
-
Focus: /ES, /NQ futures
-
Timeframe: 5-minute
-
Key concepts: VWAP+1SD, TWAP, IB, Classic Pivots
-
Approach: Institutional over retail patterns
External Libraries
Available imports:
-
import jmosullivan/SessionVolumeProfile/12 as SVP
-
import jmosullivan/Session/5 as Session
Documentation Sources
Use Ref MCP to search:
-
TradingView Pine Script Reference
-
Pine Script User Manual