关键词:Pine Script、TradingView、request.security、多时间周期、跨币种引用、指标复用、脚本调试
无论是想在15 分钟图上叠加日线级别的布林带,还是同时捕捉美股 A 股的主控曲线,Pine Script 的 request.security() 都是唯一官方认证的“跨周期 — 跨市场”利器。本文以「复合波段交易策略」为主线,穿插 10 行以内的最小可运行示例,带你深度拆解 request.security() 的硬伤坑点、常见报错,以及进阶提速技巧。
request.security() 能做什么
一句话:它能把任何时间周期、任何交易标的的指标值「纯读」回当前图表。
以「日线 RSI 辅助 5 分钟交易」为例:
//@version=6
indicator("主图 5min + 日线隔价RSI", overlay=true)
rsiDaily = request.security(syminfo.tickerid, "D", ta.rsi(close, 14))
hLine = hline(70, "Overbought", color=color.red )
lLine = hline(30, "Oversold", color=color.green)
plot(rsiDaily, "日线RSI", color=color.gray, linewidth=2)syminfo.tickerid:自动识别当前主图标的;"D":目标周期,写成"240"亦可;ta.rsi(close, 14):远端计算逻辑,可嵌套任何函数。
👉 不妨直接把这 7 行贴进云脚本,一小时复刻跨周期震荡滤网。
失败的典型姿势对照表
| 错误代码示例 | 现象 | 根因 |
|---|---|---|
request.security("BINANCE:BTCUSDT", "15", close) | 报「Ticker 不合法」 | 未使用 syminfo.tickerid 或交易所前缀拼接错误 |
request.security(syminfo.tickerid, 240, rsi) | 报「Unknown argument」 | 周期请传字符串 "240",而非整数 |
连续 20 个 security 并发调用 | 图表不停加载 | 总延迟=来回次数×每周期更新间隔,官方建议 ≤16 |
三条优化原则
- 一次请求,返回多值:
通过元组写法([val1, val2 ...])把所有需要在远端计算的指标一次性打包拉回,减少对远端 K 线的冗余访问。 - 避免实时重画(Repaint):
request.security(..., lookahead=barmerge.lookahead_on)强制使用未收盘的高价/低价数据,实盘极易“排到恶心”。大多数策略请保持缺省barmerge.lookahead_off,或手动延迟 1 根确认信号。 - 做好符号对齐:
主图期货换月后符号变更,远端可能对应「不存在的合约」。用ticker.new(...)手动拼装,或统一换月方案,否则策略会莫名其妙空仓。
实战:升级「复合波段交易策略」
把原策略改造成既能在现货 1h K 线下单,又能感知日线级别 RSI ≥70 的多周期风控,步骤如下:
1. 分离主指标 & 远端风险控制
//@version=6
strategy("多周期波段策略", overlay=true,
initial_capital=100000, pyramiding=1)
// ==== 输入 ====
src = input.source(close, "数据源")
localFastLen = input.int(10, "1h-快线")
localSlowLen = input.int(20, "1h-慢线")
// ==== 远端风控 ====
[rsiDaily, bbUpperD, bbLowerD] = request.security(
syminfo.tickerid, "D",
[ ta.rsi(close, 14),
ta.bb(close, 20, 2)[0],
ta.bb(close, 20, 2)[2] ]
)
// ==== 本地化信号(带延迟确认) ====
emaFast = ta.ema(src, localFastLen)
emaSlow = ta.ema(src, localSlowLen)
golden = ta.crossover(emaFast, emaSlow)
death = ta.crossunder(emaFast, emaSlow)
// ==== 复合过滤器 ====
longFilter = golden and rsiDaily < 30 and src < bbLowerD
shortFilter = death and rsiDaily > 70 and src > bbUpperD
// ==== 下单模块 ====
if (longFilter)
strategy.entry("Long", strategy.long)
if (shortFilter)
strategy.entry("Short", strategy.short)通过一次 security() 返回 3 个值,指标与策略文件均更轻便。
2. 子窗口体可视化
plotchar(rsiDaily, "日线RSI", "", location.bottom, color=color.blue)
plot(char=golden ? "▲":na, color=color.green)
plot(char=death ? "▼":na, color=color.red)性能黑洞:为何 request.security() 卡死?
多数脚本作者的直观误区是“只要异步返回就无感”。但 TradingView 每发一次 security 相当于向远端发起一次独立 HTTP 请求,延迟从几十毫秒到 300 毫秒不等;若你在 30 条均线都用各自 security 调取日线,总延迟 ≈ 300×30 ≈ 9 秒钟。
优化手段:
- 窗口复用:把所有日线指标写成单一函数
fDaily(),共用一个security()一次拉回; - 降低刷新频率:远端若非必要,改用
request.security(interval="D", gaps=barmerge.gaps_on),避免空洞无数据时段反复拉; - 错开网络高峰:实盘时手动刷新或改用「图表缓存」。
调试清单
| 检查项 | 快捷操作 |
|---|---|
| 远端 Symbol 正确性 | 在「添加交易品种」先搜同名,复制整串 NASDAQ:TSLA |
| 周期合法性 | 政策限制地区部分交易所不可用 1m |
| 数据一致性 | RSI 跨周期 视觉 不一致多半是复盘源差异 |
FAQ:request.security 高频疑难 5 问
- Q:为何同名不同交易所标的远端值完全不同?
A:不同交易所的结算时间、合约规则有差异,请确保两边交易品种完全一致。 - Q:实盘期间出现「远端指标延迟一根」?
A:这是 TradingView默认防止回溯机制;如确有必要,可在远端函数加barmerge.gaps_off。 - Q:
security()可否变更股票/币种?
A:可以。把syminfo.tickerid换成任意完整标的字符串即可,例如"BINANCE:ETHUSDT";务必保证当前账户可视该标的。 - Q:如果远端时间周期小于主图会怎样?
A:会出现多行对齐回包(一行下发、多次返回),策略逻辑需自行过滤,建议使用barstate.isconfirmed做额外校验。 - Q:Pine Script 限制并发 16 条
security吗?
A:并非硬顶 16,但超过后的延时会呈指数级增长;官方文档提示建议保持 ≤16,超量请合并元组。
小结
- 用
request.security()不是黑科技,而是一门合规模块化拼装术; - 元组一次拉回、滤波防重画、符号对齐三点搞定 90 % 的脚本故障;
- 组合本地 + 远端信号,可在低级别图表实现高胜率风控。