🚀 快速安装
复制以下命令并运行,立即安装此 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 代码之前,请记住:
- 三元运算符(
? :)— 必须放在一行,或使用中间变量 - 行续行 — 所有续行必须比起始行缩进更多
- 常见错误:“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 有严格的行续行规则,必须遵循:
- 缩进规则:续行必须比第一行缩进更多
- 在运算符/逗号处换行:在运算符或逗号之后换行,而不是之前
- 函数参数:每个续行必须缩进
- 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 原始英文文档,方便对照翻译。
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

评论(0)