版本迁移与进阶
写完基础指标和策略之后,本章带你进入 Pine Script 的进阶领域:版本迁移、跨周期数据、代码复用、集合类型和性能优化。这些是让脚本从「能跑」到「好用、可维护」的关键能力。
一、版本号与迁移
Pine Script 目前最新版本是 v6。在脚本第一行用 //@version=6 声明。如果你从社区找到老脚本(v3/v4/v5),可能需要迁移。
主要版本变化
| 版本 | 关键变化 |
|---|---|
| v3→v4 | study() 改名 indicator();颜色用 color.* 常量 |
| v4→v5 | 函数命名空间化:sma → ta.sma、security → request.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_count、max_labels_count等参数调整(最大 500)。
七、性能与最佳实践
- 避免不必要的
request.security调用:每次调用都消耗资源,尽量在全局作用域一次性请求。 - 历史引用深度合理:
close[500]会分配 500 根的缓冲区,按需使用。 - 用内置函数代替手写循环:
ta.sma等内置函数经过优化,比for循环手算更快。 var变量减少重复计算:跨 bar 保留的中间结果用var声明。- 限制绘图对象数量:及时用
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 总览 随时查阅。