pine-developer
Writes production-quality Pine Script v6 code following TradingView guidelines and best practices. Use when implementing indicators, strategies, or any Pine Script code. Triggers on requests to create, write, implement, or code Pine Script functionality.
What this skill does
# Pine Script Developer
Specialized in writing production-quality Pine Script v6 code for TradingView.
## ⚠️ CRITICAL: Pine Script Syntax Rules
**BEFORE writing ANY multi-line Pine Script code, remember:**
1. **TERNARY OPERATORS** (`? :`) - MUST stay on ONE line or use intermediate variables
2. **Line continuation** - ALL continuation lines must be indented MORE than the starting line
3. **Common error**: "end of line without line continuation" - caused by improper line breaks
```pinescript
// ❌ NEVER DO THIS:
text = condition ? "value1" :
"value2"
// ✅ ALWAYS DO THIS:
text = condition ? "value1" : "value2"
```
See the "Line Wrapping Rules" section below for complete rules.
## Documentation Access
Primary documentation references:
- `/docs/pinescript-v6/quick-reference/syntax-basics.md` - Core syntax and structure
- `/docs/pinescript-v6/reference-tables/function-index.md` - Complete function reference
- `/docs/pinescript-v6/core-concepts/execution-model.md` - Understanding Pine Script execution
- `/docs/pinescript-v6/core-concepts/repainting.md` - Avoiding repainting issues
- `/docs/pinescript-v6/quick-reference/limitations.md` - Platform limits and workarounds
Load these docs as needed based on the task at hand.
## Project File Management
- When starting a new project, work with the file that has been renamed from blank.pine
- Always save work to `/projects/[project-name].pine`
- Never create new files unless specifically needed for multi-file projects
- Update the file header with accurate project information
## Core Expertise
### Pine Script v6 Mastery
- Complete understanding of Pine Script v6 syntax
- All built-in functions and their proper usage
- Variable scoping and namespaces
- Series vs simple values
- Request functions (request.security, request.security_lower_tf)
### TradingView Environment
- Platform limitations (500 bars, 500 plots, 64 drawings, etc.)
- Execution model and calculation stages
- Real-time vs historical bar states
- Alert system capabilities and constraints
- Library development standards
### Code Quality Standards
- Clean, readable code structure
- Proper error handling for na values
- Efficient calculations to minimize load time
- Appropriate use of var/varip for persistence
- Proper type declarations
## CRITICAL: Line Wrapping Rules
Pine Script has STRICT line continuation rules that MUST be followed:
1. **Indentation Rule**: Lines MUST be indented more than the first line
2. **Break at operators/commas**: Split AFTER operators or commas, not before
3. **Function arguments**: Each continuation must be indented
4. **No explicit continuation character** in Pine Script v6
### SYSTEMATIC CHECK - Review ALL of these:
- [ ] `indicator()` or `strategy()` declarations at the top
- [ ] All `plot()`, `plotshape()`, `plotchar()` functions
- [ ] All `if` statements with multiple conditions
- [ ] All variable assignments with long expressions
- [ ] All `strategy.entry()`, `strategy.exit()` calls
- [ ] All `alertcondition()` calls
- [ ] All `table.cell()` calls
- [ ] All `label.new()` and `box.new()` calls
- [ ] Any line longer than 80 characters
### CRITICAL: Ternary Operators MUST Stay on One Line
```pinescript
// WRONG - Will cause "end of line without line continuation" error
text = condition ?
"true value" :
"false value"
// CORRECT - Entire ternary on one line
text = condition ? "true value" : "false value"
// CORRECT - For long ternaries, assign intermediate variables
trueText = str.format("Long true value with {0}", param)
falseText = str.format("Long false value with {0}", other)
text = condition ? trueText : falseText
```
### CORRECT Line Wrapping:
```pinescript
// CORRECT - indented continuation
longCondition = ta.crossover(ema50, ema200) and
rsi < 30 and
volume > ta.sma(volume, 20)
// CORRECT - function arguments
plot(series,
title="My Plot",
color=color.blue,
linewidth=2)
// CORRECT - long calculations
result = (high - low) / 2 +
(close - open) * 1.5 +
volume / 1000000
```
### INCORRECT Line Wrapping (WILL CAUSE ERRORS):
```pinescript
// WRONG - same indentation
longCondition = ta.crossover(ema50, ema200) and
rsi < 30 and
volume > ta.sma(volume, 20)
// WRONG - not indented enough
plot(series,
title="My Plot",
color=color.blue)
```
## Script Structure Template
```pinescript
//@version=6
indicator(title="", shorttitle="", overlay=true)
// ============================================================================
// INPUTS
// ============================================================================
[Group inputs logically]
// ============================================================================
// CALCULATIONS
// ============================================================================
[Core calculations]
// ============================================================================
// CONDITIONS
// ============================================================================
[Logic conditions]
// ============================================================================
// PLOTS
// ============================================================================
[Visual outputs]
// ============================================================================
// ALERTS
// ============================================================================
[Alert conditions]
```
## CRITICAL: Plot Scope Restriction
**NEVER use plot() inside local scopes** - This causes "Cannot use 'plot' in local scope" error
```pinescript
// ❌ WRONG - These will ALL fail:
if condition
plot(value) // ERROR!
for i = 0 to 10
plot(close[i]) // ERROR!
myFunc() =>
plot(close) // ERROR!
// ✅ CORRECT - Use these patterns instead:
plot(condition ? value : na) // Conditional plotting
plot(value, color=condition ? color.blue : color.new(color.blue, 100)) // Conditional styling
// For dynamic drawing in local scopes, use:
if condition
line.new(...) // OK
label.new(...) // OK
box.new(...) // OK
```
## Best Practices
### Avoid Repainting
- Use barstate.isconfirmed for signals
- Proper request.security() with lookahead=barmerge.lookahead_off
- Document any intentional repainting
### Performance Optimization
- Minimize security() calls
- Cache repeated calculations
- Use switch instead of multiple ifs
- Optimize array operations
### User Experience
- Logical input grouping with group= parameter
- Helpful tooltips for complex inputs
- Sensible default values
- Clear input labels
### Error Handling
- Check for na values before operations
- Handle edge cases (first bars, division by zero)
- Graceful degradation when data unavailable
## TradingView Constraints
### Limits to Remember
- Maximum 500 bars historical reference
- Maximum 500 plot/hline/fill outputs
- Maximum 64 drawing objects (label/line/box/table)
- Maximum 40 security() calls
- Maximum 100KB compiled script size
- Tables: max 100 cells
- Arrays: max 100,000 elements
### Platform Quirks
- bar_index starts at 0
- na propagation in calculations
- Historical vs real-time calculation differences
- Strategy calculations on bar close (unless calc_on_every_tick)
- Alert firing conditions and timing
## Code Review Checklist
- [ ] Version declaration (//@version=6)
- [ ] Proper title and overlay setting
- [ ] Inputs have tooltips and groups
- [ ] No repainting issues
- [ ] na values handled
- [ ] Efficient calculations
- [ ] Clear variable names
- [ ] Comments for complex logic
- [ ] Proper plot styling
- [ ] Alert conditions if needed
## Example: Moving Average Cross Strategy
```pinescript
//@version=6
strategy("MA Cross Strategy", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=10)
// Inputs
fastLength = input.int(50, "Fast MA Length", minval=1, group="Moving Averages")
slowLength = input.int(200, "Slow MA Length", minval=1, group="Moving Averages")
maType = input.string("EMA", "MA Type", options=["SMA", "EMA", "WMA"], group="Moving AvRelated in General
modeling-omnistudio-epc-catalog
IncludedSalesforce Industries CME EPC product-modeling skill for Product2-based catalog creation. Use when creating EPC products, configuring product attributes, building offer bundles with Product Child Items, or reviewing EPC DataPack JSON metadata for product catalog changes. TRIGGER when: user creates or updates Product2 EPC records, AttributeAssignment payloads, AttributeMetadata/AttributeDefaultValues, Offer bundles, or ProductChildItem relationships. DO NOT TRIGGER when: designing OmniScripts/FlexCards/Integration Procedures (use building-omnistudio-omniscript, building-omnistudio-flexcard, or building-omnistudio-integration-procedure), implementing Apex business logic (use generating-apex), or troubleshooting deployment pipelines (use deploying-metadata).
relationship-science-coach
IncludedUse this skill for direct, practical adult relationship coaching: couples conflict, repair, trust, marriage, dating, flirting, attachment patterns, emotional connection, sex, desire differences, eroticism, kink negotiation, affection, love languages, breakups, and long-term passion. Draw on Gottman, EFT and Hold Me Tight, attachment science, modern sex research, Perel, Nagoski, Kerner, Schnarch, Love and Stosny, and flexible love-language tools. Be concrete and low-hedge. Redirect only for imminent danger, abuse, coercive control, minors, non-consent, self-harm, stalking, or medical/legal/psychiatric decisions.
building-sf-integrations
IncludedSalesforce integration architecture and runtime plumbing with 120-point scoring. Use this skill to set up Named Credentials, External Credentials, External Services, REST/SOAP callout patterns, Platform Events, and Change Data Capture. TRIGGER when: user sets up Named Credentials, External Services, REST/SOAP callouts, Platform Events, CDC, or touches .namedCredential-meta.xml files. DO NOT TRIGGER when: Connected App/OAuth config (use configuring-connected-apps), Apex-only logic (use generating-apex), or data import/export (use handling-sf-data).
venue-templates
IncludedAccess comprehensive LaTeX templates, formatting requirements, and submission guidelines for major scientific publication venues (Nature, Science, PLOS, IEEE, ACM), academic conferences (NeurIPS, ICML, CVPR, CHI), research posters, and grant proposals (NSF, NIH, DOE, DARPA). This skill should be used when preparing manuscripts for journal submission, conference papers, research posters, or grant proposals and need venue-specific formatting requirements and templates.
let-fate-decide
IncludedDraws the 12 Houses of the Zodiac Tarot spread to inject entropy into planning when prompts are vague, ambiguous, or casually delegated. Interprets the spread to guide next steps. Use when the user says 'let fate decide', 'YOLO', 'whatever', 'idk', or other nonchalant phrases, makes Yu-Gi-Oh references, or when you are about to arbitrarily pick between multiple reasonable approaches. Prefer over ask-questions-if-underspecified when the user's tone is casual or playful rather than precision-seeking.
net-ops
IncludedCross-platform network troubleshooting (Windows, macOS, Linux) via local or remote shell. Use for: DNS broken, can't resolve hostnames, nslookup/dig works but apps fail, NRPT, WFP, scutil, /etc/resolver, systemd-resolved, /etc/resolv.conf, NetworkManager, VPN DNS leak residue (ProtonVPN/Mullvad/WireGuard/AnyConnect), AV/firewall blocking DNS or DoH, Tailscale DNS interaction, intermittent connectivity, remote diagnostics over SSH.