手把手教你用 request.security:跨市场指标调用终极写法

·

关键词: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)

👉 不妨直接把这 7 行贴进云脚本,一小时复刻跨周期震荡滤网。


失败的典型姿势对照表

错误代码示例现象根因
request.security("BINANCE:BTCUSDT", "15", close)报「Ticker 不合法」未使用 syminfo.tickerid 或交易所前缀拼接错误
request.security(syminfo.tickerid, 240, rsi)报「Unknown argument」周期请传字符串 "240",而非整数
连续 20 个 security 并发调用图表不停加载总延迟=来回次数×每周期更新间隔,官方建议 ≤16

三条优化原则

  1. 一次请求,返回多值
    通过元组写法([val1, val2 ...])把所有需要在远端计算的指标一次性打包拉回,减少对远端 K 线的冗余访问。
  2. 避免实时重画(Repaint):
    request.security(..., lookahead=barmerge.lookahead_on) 强制使用未收盘的高价/低价数据,实盘极易“排到恶心”。大多数策略请保持缺省 barmerge.lookahead_off,或手动延迟 1 根确认信号。
  3. 做好符号对齐
    主图期货换月后符号变更,远端可能对应「不存在的合约」。用 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 秒钟。

优化手段:


调试清单

检查项快捷操作
远端 Symbol 正确性在「添加交易品种」先搜同名,复制整串 NASDAQ:TSLA
周期合法性政策限制地区部分交易所不可用 1m
数据一致性RSI 跨周期 视觉 不一致多半是复盘源差异

FAQ:request.security 高频疑难 5 问

  1. Q:为何同名不同交易所标的远端值完全不同?
    A:不同交易所的结算时间、合约规则有差异,请确保两边交易品种完全一致
  2. Q:实盘期间出现「远端指标延迟一根」?
    A:这是 TradingView默认防止回溯机制;如确有必要,可在远端函数加 barmerge.gaps_off
  3. Q:security() 可否变更股票/币种?
    A:可以。把 syminfo.tickerid 换成任意完整标的字符串即可,例如 "BINANCE:ETHUSDT";务必保证当前账户可视该标的。
  4. Q:如果远端时间周期小于主图会怎样?
    A:会出现多行对齐回包(一行下发、多次返回),策略逻辑需自行过滤,建议使用 barstate.isconfirmed 做额外校验。
  5. Q:Pine Script 限制并发 16 条 security 吗?
    A:并非硬顶 16,但超过后的延时会呈指数级增长;官方文档提示建议保持 ≤16,超量请合并元组。

小结

👉 把今天写好的跨周期策略直接挂盘测试,看看净值曲线能否无缝抬升。