Pine Script v6 是 TradingView 用于编写自定义指标和策略的语言的当前版本;每个脚本都以 //@version=6 指令开头,随后是 indicator() 声明。与 v5 相比,它执行更严格的类型系统、运行更快、更安全地处理 request.security(),并新增了内置函数,因此大多数迁移错误都是类型不匹配,可通过 int() 或 float() 类型转换修复。
什么是 Pine Script?
Pine Script 是 TradingView 的领域专用语言,用于编写在 TradingView 图表引擎中运行的自定义技术指标和策略。它不是通用编程语言——每个脚本会在图表历史的每根 K线上运行一次,状态通过 K线序列隐式管理。如果您从未用过它,建立思维模型大约需要一天;摸清各种坑则大约需要一年。
版本 6 于 2024年11月发布,是当前的正式生产版本。版本 4 和 5 仍可使用,但已不再是新脚本的默认版本。
如何编写您的第一个 v6 脚本?
每个 Pine Script 都以第 1 行的版本指令开头。创建 v6 指标的方法如下:
//@version=6 indicator("My First v6 Indicator", overlay=true) // Plot the close price as a line on the chart plot(close, color=color.new(color.aqua, 0), linewidth=2)
将其保存在 TradingView 的 Pine Editor 中并添加到图表。您会看到收盘价以青色线条绘制出来。需要注意三点://@version=6 指令是必需的,且必须位于第一个非空行;indicator() 是声明语句,用于定义您的脚本是指标(叠加或独立窗格)还是策略(含模拟交易);overlay=true 表示脚本绘制在价格图表之上,而不是下方的独立窗格中。
从 v5 到 v6 有哪些变化
1. 更严格的类型系统
这是最大的变化。v6 执行 v5 会忽略或静默处理的类型检查。最常见的情况:v5 允许您在需要 simple int 的地方传入 series int,并静默降级处理;v6 则会在编译时直接报错。
实际影响:当您迁移 v5 脚本后突然无法编译时,错误几乎总是函数参数的类型不匹配。修复方法通常是用 int()、float() 包裹该值,或使用相应的内置函数显式转换类型。
2. 更快的运行速度
v6 引入了编译器优化,显著提升了大多数脚本的执行速度。在大量使用 request.security()(多时间周期分析)、数组操作或矩阵运算的脚本上,提升最为明显。简单的绘图和着色脚本不会有明显差异。
3. 改进的 request.security() 行为
这个用于请求其他时间周期数据的函数,参数处理更清晰,并能更好地防范历史上著名的“前视偏差”陷阱。经典的 v4/v5 错误——在不理解后果的情况下使用 lookahead=barmerge.lookahead_on——如今会在脚本发布时触发更清晰的警告。
4. 新的内置函数
一些以前需要手动实现的实用函数现已内置。值得注意的新增功能包括:改进的字符串格式化、更好的矩阵切片,以及减少样板代码的数组类型便捷方法。
哪些 Pine Script 模式对 SMC 指标至关重要?
如果您在编写聪明钱概念(SMC)指标(订单块、FVG、BOS 检测、流动性扫荡),有三种 Pine Script 模式会反复出现。掌握它们,您就能构建商业 SMC 套件中的大部分功能。
模式 1:如何检测波段高点和低点?
这是所有市场结构指标的基础。使用带左右 K线窗口的 ta.pivothigh() 和 ta.pivotlow():
//@version=6 indicator("Swing Detection", overlay=true) length = input.int(5, "Pivot Length", minval=1) ph = ta.pivothigh(high, length, length) pl = ta.pivotlow(low, length, length) // Plot circles at confirmed swing points plotshape(not na(ph), location=location.abovebar, style=shape.circle, color=color.red, size=size.tiny) plotshape(not na(pl), location=location.belowbar, style=shape.circle, color=color.green, size=size.tiny)
注意:枢轴点在形成后 length 根 K线才被确认。这是一种不重绘的确认方式——一旦绘出,枢轴点就不会移动。代价是延迟:您要在 5 根 K线之后才知道枢轴点的存在(当 length=5 时)。
模式 2:如何为订单块和 FVG 绘制方框?
使用内置函数 box.new() 绘制矩形。方框可以随新 K线出现而更新、向右延伸,或在失效时删除:
//@version=6 indicator("Bullish FVG Detector", overlay=true, max_boxes_count=500) // Bullish FVG: low of current bar > high of bar 2 ago fvg_top = low fvg_bot = high[2] isFVG = fvg_top > fvg_bot if isFVG box.new(left=bar_index[2], top=fvg_top, right=bar_index, bottom=fvg_bot, bgcolor=color.new(color.green, 80), border_color=color.new(color.green, 50))
这里有两点最容易让新手开发者踩坑。第一,max_boxes_count 默认为 50——任何需要在长历史中绘制区域的指标都应调高它。第二,方框是按每根 K线在编译时绘制的;如果您在每根 K线上都绘制方框而不加条件逻辑,很快就会耗尽上限。
模式 3:跨 K线追踪状态(var 关键字)
Pine Script 在每根 K线上运行一次您的代码,但您经常需要持久保存的状态。var 关键字声明的变量只初始化一次,并在各根 K线的执行之间保持其值:
//@version=6 indicator("BOS Tracker", overlay=true) // Persistent state: track the last confirmed swing high var float lastSwingHigh = na // Update when a new pivot high is confirmed ph = ta.pivothigh(high, 5, 5) if not na(ph) lastSwingHigh := ph // Detect BOS: close above the last swing high isBOS = not na(lastSwingHigh) and close > lastSwingHigh if isBOS label.new(bar_index, high, "BOS", color=color.new(color.green, 0), textcolor=color.white)
没有 var,变量会在每根 K线上重置;使用 var,值就会保持。这是任何需要记住过往事件的指标的基础模式——每个 BOS 检测器、MSS 检测器、缓解追踪器和订单块老化系统,底层都使用这一模式。
Pine Script 新手开发者常踩哪些坑?
request.security() 调用中使用了 lookahead=barmerge.lookahead_on,或在使用 ta.pivothigh() 等前视结构时没有考虑 K线确认延迟。如果您的指标信号在历史数据上看起来完美无缺,首先应怀疑重绘。
format.mintick。硬编码的小数精度在脚本应用于不同最小变动价位的品种(BTC、EURUSD、ES)时会出错。凡是在标签或警报中显示的价格,请使用 str.tostring(price, format.mintick)。
indicator() 声明中显式设置 max_lines_count、max_boxes_count 等参数。
= 进行首次赋值,使用 := 进行重新赋值。在两处写 x = 5 会创建两个作用域变量;x := 5 则是对已有变量重新赋值。混淆二者,您会花上一个小时调试那些不更新的值。
Pine Script v6 构建模块一览
| 任务 | 内置函数 | 作用 | 注意事项 |
|---|---|---|---|
| 波段高点和低点 | ta.pivothigh() / ta.pivotlow() | 使用左右 K线窗口确认枢轴点 | 仅在枢轴点之后 'length' 根 K线才确认 |
| 订单块和 FVG 区域 | box.new() | 绘制可延伸或删除的矩形 | 默认 50 个方框;调高 max_boxes_count(最多 500) |
| 跨 K线状态 | var 关键字 | 只初始化一次并保持其值 | 用 := 重新赋值,而不是 = |
| 高时间周期数据 | request.security() | 请求其他时间周期的数据 | lookahead_on 可能泄露未来数据并导致重绘 |
| 价格标签 | str.tostring(price, format.mintick) | 按品种的最小变动价位格式化价格 | 硬编码小数位在不同品种间会出错 |
◆每个脚本都必须在第一个非空行以 //@version=6 指令开头。
如何在 TradingView 上发布脚本?
脚本运行正常后,您可以将其发布到 TradingView 的公共库——可以选择开源(任何人都能阅读和复制代码)或仅限邀请(由您控制访问权限)。两种方式都能触达 TradingView 的用户群;开源发布会依据社区规则(House Rules)进行审核,质量高的还会进入编辑精选(Editors' Picks)候选。
新作者最常触犯的三条社区规则:不要在脚本标题或描述中加入外部推广链接;不要在未披露的情况下使用重绘技术;不要在图表输出中引用您的品牌(不放 logo、不加水印标签)。前两条属于技术性规则;第三条执行严格,商业发布者经常因此栽跟头。
常见问题
我需要把 v5 脚本迁移到 v6 吗?
现有 v5 脚本会在 TradingView 上无限期继续运行——没有强制下线。仅当您需要 v6 特有功能(改进的类型系统、更好的性能、新的内置函数)或从零开始编写新脚本时,才建议迁移。对于已发布的指标,除非您在积极维护该脚本,否则迁移成本通常得不偿失。
Pine Script v6 最大的破坏性变更是什么?
强化后的类型系统。v6 执行更严格的类型检查——在 v5 中静默生效的隐式转换,如今会直接报错。最常见的迁移问题是函数参数中以前未被发现的 series 与 simple 类型不匹配。
Pine Script v6 比 v5 更快吗?
平均而言,是的。v6 编译器进行了更积极的优化,对大多数常见模式的执行速度更快。在大量操作数组或多次调用 request.security 的脚本上,提升最为明显。
我可以在同一脚本中混用 v5 和 v6 吗?
不可以。版本在脚本顶部声明(//@version=6 或 //@version=5),并适用于整个脚本。您无法在单个指标或策略中混用不同版本。
我可以在哪里发布 Pine Script v6 指标?
TradingView 的公共库同时接受 v5 和 v6 脚本。开源脚本由 TradingView 版主依据社区规则审核——无论版本如何,规则都相同。闭源(仅限邀请)脚本的审核负担较轻,但无法在公共库中获得推广。
查看实际运行的生产级 v6 指标
Quantum Algo 的免费 Neural Confluence Engine 和完整的 Zeno 套件均使用 Pine Script v6 编写。这款免费脚本是开源的——您可以克隆、研究、修改它,作为学习参考。
在 TradingView 上查看 →