Skip to content
Finance
Skill

/pine-developer

Writes production-quality Pine Script v6 code following TradingView guidelines. Use when implementing indicators, strategies, or any Pine Script code.

BOOST
From plugin
pinescript
21412 skills3 agents3 commands2 hooks
+1
Install
$ npx -y skills add traderspost/pinescript-agents --skill pine-developer --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/pine-developer

Context preview

The summary Claude sees to decide when to auto-load this skill.

Writes production-quality Pine Script v6 code following TradingView guidelines. Use when implementing indicators, strategies, or any Pine Script code.

SKILL.md

pine-developer.SKILL.md
name: pine-developer
description: Writes production-quality Pine Script v6 code following TradingView guidelines. Use when implementing indicators, strategies, or any Pine Script code.
allowed-tools: Read, Write, Edit, Glob, Grep, Bash

Pine Script Developer

Specialized in writing production-quality Pine Script v6 code for TradingView.

⚠️ CRITICAL: Pine Script v6 2025 Updates

**These updates are essential for writing correct, modern Pine Script code:**

December 2025: Updated Line Wrapping Rules

Expressions in parentheses now support flexible indentation:

// ✅ NOW VALID - Any indentation inside parentheses
plot(series,
    title="My Plot",    // Can use any indentation
    color=color.blue)

// ✅ Also valid
longCondition = (ta.crossover(ema50, ema200) and
    rsi < 30 and
    volume > ta.sma(volume, 20))

// ⚠️ STILL REQUIRED outside parentheses - non-multiple-of-4 indentation
longCondition = ta.crossover(ema50, ema200) and
     rsi < 30   // Must NOT be multiple of 4 spaces

March 2025: BREAKING CHANGE - For Loop Dynamic Boundaries

`for` loops now evaluate `to_num` **before every iteration**, not just once.

**PREFERRED: Use `for...in` loops for collections:**

// ✅ BEST: Use for...in for arrays (safe, clean, preferred)
for element in myArray
    // Process element directly

// ✅ BEST: Use for...in with index when needed
for [index, element] in myArray
    // Have both index and value

// ✅ for...in works with arrays, matrices, and maps
for [key, value] in myMap
    // Iterate key-value pairs

**If you must use traditional `for` loop:**

// ⚠️ BREAKING: This creates infinite loop!
var arr = array.new<int>()
for i = 0 to array.size(arr)  // Re-evaluated each iteration
    array.push(arr, i)  // Array grows, loop never ends!

// ✅ FALLBACK: Cache the boundary if using traditional for
size = array.size(arr)
for i = 0 to size
    array.push(arr, i)

**Note:** `for...in` allows modifying array/matrix sizes during iteration. Maps cannot be resized during `for...in` - use `map.keys()` array instead.

February 2025: Scope Limit Removed

  • Previously limited to 550 total scopes
  • Now **unlimited** scopes across functions, methods, loops, conditionals, types, and enums

February 2025: Bid/Ask Variables

// Only available on 1T (tick) timeframe
bidPrice = bid  // Highest buyer price (na on other timeframes)
askPrice = ask  // Lowest seller price (na on other timeframes)

Pine Script v6 2025 New Features

July 2025: Input `active` Parameter

All input functions now support conditional activation:

useCustomMA = input.bool(false, "Use Custom MA")
customMALength = input.int(20, "Custom MA Length",
    active=useCustomMA,  // Grayed out when useCustomMA is false
    tooltip="Only available when 'Use Custom MA' is enabled")

July 2025: `syminfo.current_contract`

// For continuous futures - returns underlying contract ticker
currentContract = syminfo.current_contract  // Returns na for non-continuous

November 2025: `syminfo.isin`

// International Securities Identification Number (12 chars)
isinCode = syminfo.isin  // Empty string if unavailable

September 2025: Plot Line Styles

plot(series, linestyle=plot.linestyle_solid)   // Default
plot(series, linestyle=plot.linestyle_dashed)  // Dashed line
plot(series, linestyle=plot.linestyle_dotted)  // Dotted line

October 2025: Enhanced `time()` and `time_close()`

New `timeframe_bars_back` parameter:

// Get time from 5 bars back on the DAILY timeframe (not current chart)
dailyTimeBack = time("D", timeframe_bars_back=5)

// Positive = past bars, Negative = future (expected) timestamps
futureTime = time("D", timeframe_bars_back=-1)  // Expected next bar

August 2025: Increased String Length

  • Maximum string length: **40,960 characters** (was 4,096)

June 2025: Library Constant Exports

// In library:
//@version=6
library("MyLib")
export const float PI = 3.14159265359
export const int MAX_BARS = 500
export const string VERSION = "1.0.0"

May 2025: `time_close` on Non-Time-Based Charts

For Renko, Line Break, Kagi, Point & Figure, Range charts:

  • `time_close` of open realtime bar now returns `na`
  • `time_close[1]` now works immediately after bar closes

April 2025: Percentage-Based Ticker Styles

// New "PercentageLTP" style for percentage box sizing
renkoTicker = ticker.renko(syminfo.tickerid, "PercentageLTP", 1.0)
kagiTicker = ticker.kagi(syminfo.tickerid, "PercentageLTP", 0.5)
pnfTicker = ticker.pointfigure(syminfo.tickerid, "PercentageLTP", 1.0)

March 2025: `box.set_xloc()`

// Modify box x-coordinates after creation
box.set_xloc(myBox, left, right, xloc.bar_index)
box.set_xloc(myBox, leftTime, rightTime, xloc.bar_time)

CRITICAL: Line Wrapping Rules (Updated December 2025)

Inside Parentheses (FLEXIBLE)

// ✅ Any indentation works inside ()
plot(series,
    title="Plot",
        color=color.blue,  // Different indentation OK
    linewidth=2)

indicator("Title",
    overlay=true,
    max_bars_back=500)

Outside Parentheses (STRICT)

// ✅ CORRECT - Non-multiple-of-4 indentation
longCondition = ta.crossover(ema50, ema200) and
     rsi < 30 and
     volume > ta.sma(volume, 20)

// ❌ WRONG - Multiple of 4 (or same level)
longCondition = ta.crossover(ema50, ema200) and
    rsi < 30  // Error: 4 spaces

longCondition = ta.crossover(ema50, ema200) and
rsi < 30  // Error: same indentation

CRITICAL: Ternary Operators - Keep on ONE Line

// ❌ NEVER split ternary across lines
text = condition ?
    "value1" :
    "value2"  // ERROR!

// ✅ ALWAYS keep on one line
text = condition ? "value1" : "value2"

// ✅ For long ternaries, use intermediate variables
trueText = str.format("Long value {0}", param1)
falseText = str.format("Other va
Read more
Ships withpinescript

A comprehensive Pine Script development environment powered by Claude Code's Skills system. This tool helps you create professional TradingView indicators and strategies with AI assistance. Just type start to begin!

Get the whole plugin

Other skills on pinescript.