版本迁移与进阶

写完基础指标和策略之后,本章带你进入 Pine Script 的进阶领域:版本迁移、跨周期数据、代码复用、集合类型和性能优化。这些是让脚本从「能跑」到「好用、可维护」的关键能力。

一、版本号与迁移

Pine Script 目前最新版本是 v6。在脚本第一行用 //@version=6 声明。如果你从社区找到老脚本(v3/v4/v5),可能需要迁移。

主要版本变化

版本关键变化
v3→v4study() 改名 indicator();颜色用 color.* 常量
v4→v5函数命名空间化:smata.smasecurityrequest.security;布尔关键字 true/false 保留
v5→v6布尔值用 true/false(不再接受 1/0);部分类型系统收紧

v4 → v5 迁移要点

最常见的迁移场景,核心改动是把内置函数加上命名空间前缀:

v4 写法v5/v6 写法
sma(close, 20)ta.sma(close, 20)
ema(close, 20)ta.ema(close, 20)
crossover(a, b)ta.crossover(a, b)
security(sym, tf, expr)request.security(sym, tf, expr)
rsi(close, 14)ta.rsi(close, 14)
macd(...)ta.macd(...)
cross(a, b)ta.cross(a, b)
iff(cond, a, b)cond ? a : b

TradingView 编辑器内置迁移工具:打开老脚本后,编辑器会提示「转换为 v5/v6」,一键自动迁移大部分代码。

布尔值(v6 重点)

在 v6 中,条件判断必须用真正的布尔值 true/false,不能再用 1/0

// v5 可以,v6 报错
isLong = 1

// v6 正确写法
isLong = true

二、跨周期数据 request.security

request.security() 让你在当前周期的图表上读取其他品种或周期的数据——这是做多周期分析的核心函数。

//@version=6
indicator("日线均线在周线图上", overlay = true)

// 取日线收盘价的 20 日均线,画在当前图上
dailyMA = request.security(syminfo.tickerid, "1D", ta.sma(close, 20))
plot(dailyMA, color = color.blue, linewidth = 2)

参数说明:

参数含义
symbol品种代码,syminfo.tickerid 表示当前品种
timeframe目标周期,"1D" 日线、"1W" 周线、"240" 4 小时、"" 当前周期
expression要在目标周期上计算的表达式
gaps高周期数据未更新时是否返回 na
lookahead是否允许预读未来数据(默认 off,慎开)

跨品种对比

// 在当前品种图上叠加标普 500 的走势
spxClose = request.security("SPX", timeframe.period, close)
plot(spxClose, color = color.gray)

避免重绘(repainting)

高周期数据在实时 K 线上可能尚未收盘就返回了「未来值」,导致历史和实时结果不一致。常用技巧:

// 用 close[1] 确保只取已收盘的高周期数据
htfClose = request.security(syminfo.tickerid, "1D", close[1], gaps = barmerge.gaps_off)

三、库(Library)复用

当你有多个脚本要共用同一段逻辑时,用 library 导出函数,其他脚本通过 import 引入。

创建库

//@version=6
library("MyUtils", overlay = true)

// 导出函数(必须用 export 关键字,参数需声明类型)
export myAlert(source, threshold) =>
    result = source > threshold ? "强" : "弱"
    result

使用库

//@version=6
import userName/MyUtils/1 as utils
signal = utils.myAlert(close, 100)
plot(signal == "强" ? 1 : 0)

import 用户名/库名/版本号 as 别名,然后通过别名调用导出的函数。

四、数组 Array

Pine 的 array.* 命名空间提供动态数组,适合做自定义统计、滑动窗口等复杂计算。

//@version=6
indicator("数组示例", overlay = false)

// 创建数组
prices = array.new_float(0)

// 每根 K 线存入收盘价(最多保留 10 个)
array.push(prices, close)
if array.size(prices) > 10
    array.shift(prices)    // 移除最早的

// 计算自定义中位数
median = array.median(prices)
plot(median)

常用数组函数:

函数含义
array.new_float(size) / array.new_int(size)创建数组
array.push(arr, val) / array.pop(arr)末尾添加 / 移除
array.unshift(arr, val) / array.shift(arr)头部添加 / 移除
array.get(arr, index) / array.set(arr, index, val)读 / 写指定位置
array.size(arr)元素个数
array.sort(arr)排序
array.avg(arr) / array.median(arr)均值 / 中位数
array.max(arr) / array.min(arr)最大 / 最小

五、Map 映射

map.* 提供键值对存储:

m = map.new<string, float>()
map.put(m, "AAPL", close)
aaplPrice = map.get(m, "AAPL")

六、绘图对象(Drawing Objects)

Pine 提供多种高级绘图对象,比 plot*() 系列更灵活:

类型函数用途
线段line.new(x1, y1, x2, y2)画直线/趋势线
标签label.new(x, y, text)文字标注
矩形box.new(x1, y1, x2, y2)画方框/区间
表格table.new(position, columns, rows)在图表角落放数据表
// 在最后一根 K 线画一个数据表
if barstate.islast
    var table stats = table.new(position.top_right, 2, 2)
    table.cell(stats, 0, 0, "收盘价", text_color = color.white)
    table.cell(stats, 1, 0, str.tostring(close), text_color = color.yellow)
    table.cell(stats, 0, 1, "RSI", text_color = color.white)
    table.cell(stats, 1, 1, str.tostring(ta.rsi(close, 14)), text_color = color.yellow)

绘图对象数量有上限(默认各 50 个),可在 indicator() / strategy() 里用 max_lines_countmax_labels_count 等参数调整(最大 500)。

七、性能与最佳实践

  1. 避免不必要的 request.security 调用:每次调用都消耗资源,尽量在全局作用域一次性请求。
  2. 历史引用深度合理close[500] 会分配 500 根的缓冲区,按需使用。
  3. 用内置函数代替手写循环ta.sma 等内置函数经过优化,比 for 循环手算更快。
  4. var 变量减少重复计算:跨 bar 保留的中间结果用 var 声明。
  5. 限制绘图对象数量:及时用 line.delete()label.delete() 清理不再需要的对象。

八、调试技巧

  • log.info() / log.warning() / log.error():输出到 Pine Logs 面板(需在设置里开启)。
  • label.new() 临时标注:在关键 K 线上画标签检查中间值。
  • plot() 画中间变量:把要检查的变量画出来,肉眼对比。

小结

  • 版本迁移:v5 主要给函数加命名空间前缀(ta.request.);v6 收紧布尔类型。
  • request.security() 读取跨品种/跨周期数据,注意防重绘。
  • library 导出函数供 import 复用;array / map 做复杂数据结构。
  • 高级绘图用 line / label / box / table;性能上多用内置函数、少用循环。

至此,从入门语法指标绘图回测再到进阶,Pine Script 的完整知识体系已覆盖。 回到 TradingView Pine 总览 随时查阅。