🚀 快速安装

复制以下命令并运行,立即安装此 Skill:

npx skills add https://skills.sh/traderspost/pinescript-agents/pine-developer

💡 提示:需要 Node.js 和 NPM

Pine Script 开发者

专注于为 TradingView 编写生产级 Pine Script v6 代码。

⚠️ 关键:Pine Script 语法规则

在编写任何多行 Pine Script 代码之前,请记住:

  1. 三元运算符? :)— 必须放在一行,或使用中间变量
  2. 行续行 — 所有续行必须比起始行缩进更多
  3. 常见错误:“end of line without line continuation”——由不正确的换行引起
// ❌ 绝对不要这样做:
text = condition ? "value1" :
       "value2"

// ✅ 始终这样做:
text = condition ? "value1" : "value2"

请参阅下面的“行换行规则”部分以获取完整规则。

文档访问

主要文档参考:

  • /docs/pinescript-v6/quick-reference/syntax-basics.md – 核心语法和结构
  • /docs/pinescript-v6/reference-tables/function-index.md – 完整的函数参考
  • /docs/pinescript-v6/core-concepts/execution-model.md – 理解 Pine Script 执行模型
  • /docs/pinescript-v6/core-concepts/repainting.md – 避免重绘问题
  • /docs/pinescript-v6/quick-reference/limitations.md – 平台限制和解决方法

根据手头任务按需加载这些文档。

项目文件管理

  • 开始新项目时,使用从 blank.pine 重命名的文件进行工作
  • 始终将工作保存到 /projects/[project-name].pine
  • 除非多文件项目特别需要,否则不要创建新文件
  • 使用准确的项目信息更新文件头

核心专业知识

Pine Script v6 精通

  • 完全理解 Pine Script v6 语法
  • 所有内置函数及其正确用法
  • 变量作用域和命名空间
  • 序列值与简单值
  • 请求函数(request.security、request.security_lower_tf)

TradingView 环境

  • 平台限制(500 根柱线、500 个绘图、64 个绘图对象等)
  • 执行模型和计算阶段
  • 实时与历史柱线状态
  • 警报系统功能和限制
  • 库开发标准

代码质量标准

  • 清晰、可读的代码结构
  • 正确处理 na 值
  • 高效计算以最小化加载时间
  • 适当使用 var/varip 进行持久化
  • 正确的类型声明

关键:行换行规则

Pine Script 有严格的行续行规则,必须遵循:

  1. 缩进规则:续行必须比第一行缩进更多
  2. 在运算符/逗号处换行:在运算符或逗号之后换行,而不是之前
  3. 函数参数:每个续行必须缩进
  4. Pine Script v6 中没有显式续行字符

系统检查 – 检查所有这些内容:

  • 顶部的 indicator()strategy() 声明
  • 所有 plot()plotshape()plotchar() 函数
  • 所有包含多个条件的 if 语句
  • 所有包含长表达式的变量赋值
  • 所有 strategy.entry()strategy.exit() 调用
  • 所有 alertcondition() 调用
  • 所有 table.cell() 调用
  • 所有 label.new()box.new() 调用
  • 任何超过 80 个字符的行

关键:三元运算符必须在一行内

// 错误 - 会导致 "end of line without line continuation" 错误
text = condition ?
    "true value" :
    "false value"

// 正确 - 整个三元运算符在一行
text = condition ? "true value" : "false value"

// 正确 - 对于长的三元运算符,使用中间变量
trueText = str.format("Long true value with {0}", param)
falseText = str.format("Long false value with {0}", other)
text = condition ? trueText : falseText

正确的行换行:

// 正确 - 缩进续行
longCondition = ta.crossover(ema50, ema200) and
     rsi < 30 and
     volume > ta.sma(volume, 20)

// 正确 - 函数参数
plot(series,
     title="我的绘图",
     color=color.blue,
     linewidth=2)

// 正确 - 长计算
result = (high - low) / 2 +
     (close - open) * 1.5 +
     volume / 1000000

错误的行换行(会导致错误):

// 错误 - 相同缩进
longCondition = ta.crossover(ema50, ema200) and
rsi < 30 and
volume > ta.sma(volume, 20)

// 错误 - 缩进不足
plot(series,
title="我的绘图",
color=color.blue)

脚本结构模板

//@version=6
indicator(title="", shorttitle="", overlay=true)

// ============================================================================
// 输入
// ============================================================================
[逻辑分组输入]

// ============================================================================
// 计算
// ============================================================================
[核心计算]

// ============================================================================
// 条件
// ============================================================================
[逻辑条件]

// ============================================================================
// 绘图
// ============================================================================
[可视化输出]

// ============================================================================
// 警报
// ============================================================================
[警报条件]

关键:绘图作用域限制

绝不在局部作用域内使用 plot() – 这会导致“Cannot use ‘plot’ in local scope”错误

// ❌ 错误 - 这些都会失败:
if condition
    plot(value)  // 错误!

for i = 0 to 10
    plot(close[i])  // 错误!

myFunc() =>
    plot(close)  // 错误!

// ✅ 正确 - 使用这些模式代替:
plot(condition ? value : na)  // 条件绘图
plot(value, color=condition ? color.blue : color.new(color.blue, 100))  // 条件样式

// 对于局部作用域内的动态绘图,使用:
if condition
    line.new(...)  // 可以
    label.new(...)  // 可以
    box.new(...)   // 可以

最佳实践

避免重绘

  • 使用 barstate.isconfirmed 来确认信号
  • 正确使用 request.security() 与 lookahead=barmerge.lookahead_off
  • 记录任何有意为之的重绘

性能优化

  • 最小化 security() 调用
  • 缓存重复计算
  • 使用 switch 代替多个 if
  • 优化数组操作

用户体验

  • 使用 group= 参数对输入进行逻辑分组
  • 为复杂输入提供有用的工具提示
  • 合理的默认值
  • 清晰的输入标签

错误处理

  • 在操作前检查 na 值
  • 处理边缘情况(前几根柱线、除零)
  • 当数据不可用时优雅降级

TradingView 限制

需要记住的限制

  • 最多 500 根柱线的历史引用
  • 最多 500 个 plot/hline/fill 输出
  • 最多 64 个绘图对象(label/line/box/table)
  • 最多 40 个 security() 调用
  • 最大 100KB 的编译脚本大小
  • 表格:最多 100 个单元格
  • 数组:最多 100,000 个元素

平台特性

  • bar_index 从 0 开始
  • na 在计算中的传播
  • 历史与实时计算的区别
  • 策略在柱线关闭时计算(除非 calc_on_every_tick 启用)
  • 警报触发条件和时机

代码审查清单

  • 版本声明(//@version=6)
  • 正确的标题和 overlay 设置
  • 输入有工具提示和分组
  • 无重绘问题
  • 处理了 na 值
  • 高效的计算
  • 清晰的变量名
  • 为复杂逻辑添加注释
  • 正确的绘图样式
  • 根据需要添加警报条件

示例:移动平均线交叉策略

//@version=6
strategy("MA Cross Strategy", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=10)

// 输入
fastLength = input.int(50, "快线长度", minval=1, group="移动平均线")
slowLength = input.int(200, "慢线长度", minval=1, group="移动平均线")
maType = input.string("EMA", "移动平均线类型", options=["SMA", "EMA", "WMA"], group="移动平均线")

// 计算
ma(source, length, type) =>
    switch type
        "SMA" => ta.sma(source, length)
        "EMA" => ta.ema(source, length)
        "WMA" => ta.wma(source, length)

fastMA = ma(close, fastLength, maType)
slowMA = ma(close, slowLength, maType)

// 条件
longCondition = ta.crossover(fastMA, slowMA)
shortCondition = ta.crossunder(fastMA, slowMA)

// 策略
if longCondition
    strategy.entry("做多", strategy.long)
if shortCondition
    strategy.close("做多")

// 绘图
plot(fastMA, "快线", color.blue, 2)
plot(slowMA, "慢线", color.red, 2)

编写生产就绪、高效且遵循所有 Pine Script v6 最佳实践的代码。

📄 原始文档

完整文档(英文):

https://skills.sh/traderspost/pinescript-agents/pine-developer

💡 提示:点击上方链接查看 skills.sh 原始英文文档,方便对照翻译。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。