Install
openclaw skills install @iliaal/compound-eng-pinescriptPine Script v6: syntax, performance, error diagnosis, backtesting, visualization. Use when writing or debugging .pine files or TradingView Pine indicators/strategies.
openclaw skills install @iliaal/compound-eng-pinescriptVerify before implementing: For Pine Script version-specific syntax or new built-in functions, look up current docs via Context7 (query-docs) before writing code. TradingView updates Pine Script frequently and training data may be stale.
isBull = close > open
barColor = isBull ? color.green : color.red
plot(condition ? value : na)barstate.isconfirmed when signals require the chart bar's closing values. It does not establish that requested higher-timeframe values are confirmed; inspect request.security() offsets and lookahead separately.Check the current platform limits before sizing a script: 64 plot counts (one call can consume several); up to 500 line, box, or label IDs each and 100 polyline IDs; 40 unique request.*() calls, or 64 on Ultimate; 100,000 compiled tokens. History buffers, requested intrabars, and chart history have distinct limits; there is no general 500-bar request.security() history limit.
xloc.bar_index reach at most 9,999 bars into the past and 500 into the future; for anything older, switch the drawing to xloc.bar_time and pass a timestamp (a time value without xloc.bar_time is treated as a future bar index and errors)max_*_count declaration parameter and cap growth with a rolling buffer: push each object, then line.delete(arr.shift()) after the intended line count is exceeded. The default display count is approximately 50 per drawing type.request.security() returning [close, high, low] instead of 3 separate callsarray.new<type>(size) instead of push-and-resizefor item in myArray (or for [i, item] in myArray) instead of for i = 0 to array.size(...) - 1 -- the indexed form re-evaluates the bound each pass and breaks when the loop mutates the array's sizetype Trade with float entry, int startBar, plus method functions, stored in one array<Trade>. Parallel arrays (entries, startBars, ...) desync on any missed push/remove and every operation must be repeated per array; one typed array keeps each object's fields togetherUse Pine Logs through log.info(), log.warning(), and log.error(), plus these visual checks:
label.new(bar_index, high, str.tostring(myVar)) to inspect values; cap retained labels explicitly.table.new() with barstate.islast for real-time variable dashboardif input.bool(false, "Debug") for local debug code; keep plot calls global.value[1] refers to the preceding bar and does not detect revisions to an earlier calculation.strategy.* functions: strategy.wintrades, strategy.losstrades, strategy.grossprofitmaxEquity = math.max(strategy.equity, nz(maxEquity[1])), then dd = (maxEquity - strategy.equity) / maxEquity * 100t, score prediction[horizon] against the now-realized outcome, such as close > close[horizon], excluding warmup bars. Positive offsets reference the past, never future bars; see history referencing.color.from_gradient() for trend strength coloringsize.small for intraday, size.normal for daily+input.*(..., active = condition) greys out an input when its controlling toggle is off (e.g. a smoothing length only editable while "Use smoothing" is checked) -- clearer than a tooltip saying "ignored unless..."indicator()/strategy()@version, @description, @param tagstooltip="Line 1" + "\n" + "Line 2"input() -- makes the script untestable across instruments.