Skip to content

跨标的与多时间框架

request.security() 在不同标的和/或时间框架的上下文中对表达式求值,并将结果对齐到当前图表 bar。它是 Pine Script 中访问多时间框架(MTF)数据和其他标的数据的主要方式。

基本语法

pine
request.security(symbol, timeframe, expression, gaps, lookahead, ignore_invalid_symbol, currency)
参数类型说明
symbolstring标的标识符,如 "NASDAQ:AAPL"syminfo.tickerid
timeframestring时间框架字符串,如 "D""W""60"
expression任意 series在请求的标的/时间框架上求值的表达式
gapsgaps_typegaps.off(默认)或 gaps.on——是否用 na 填充空缺
lookaheadlookahead_typelookahead.off(默认)或 lookahead.on
ignore_invalid_symbolbool若为 true,未知标的返回 na 而不报错
currencystring价格转换的目标货币

基础示例

高时间框架收盘价

pine
//@version=6
indicator("日线图上的周线收盘价", overlay=true)

weekly_close = request.security(syminfo.tickerid, "W", close)
plot(weekly_close, "周线收盘", color=color.blue)

其他标的

pine
//@version=6
indicator("AAPL 图上的 SPY", overlay=false)

spy_close = request.security("AMEX:SPY", "D", close)
plot(spy_close)

高时间框架指标

pine
//@version=6
indicator("周线 RSI")

weekly_rsi = request.security(syminfo.tickerid, "W", ta.rsi(close, 14))
plot(weekly_rsi)
hline(70)
hline(30)

时间框架字符串

字符串含义
"1""5""15""60"分钟
"D"日线
"W"周线
"M"月线
"3M""6M"多月

使用 timeframe.period 引用图表自身的时间框架。

gaps(空缺填充)

当请求的时间框架高于图表时间框架时,高时间框架 bar 收盘的频率低于图表 bar 推进的频率。

  • gaps.off(默认):最后已知值向前延续——序列中不会出现 na
  • gaps.on:每个高时间框架 bar 尚未收盘的图表 bar 都会发出 na
MTF 对齐与 gapsMTF 对齐与 gaps
pine
// 延续(默认):weekly_close 始终有值
weekly_close = request.security(syminfo.tickerid, "W", close)

// 空缺填充:除周五(周线 bar 收盘)外的所有交易日均为 na
weekly_close_gaps = request.security(syminfo.tickerid, "W", close, gaps=gaps.on)

lookahead(超前读取)

lookahead.on 使表达式在周期内的第一个图表 bar 就能看到高时间框架 bar 的最终值,而不是正在形成中的值。这会在历史 bar 中引入未来数据泄漏——仅在明确需要时使用。

lookahead.off 与 lookahead.on 对比lookahead.off 与 lookahead.on 对比
pine
// 默认:看到正在形成的周线开盘价(本周内持续更新)
weekly_open = request.security(syminfo.tickerid, "W", open)

// 使用 lookahead:周一即可看到已确认的周线开盘价
weekly_open_confirmed = request.security(syminfo.tickerid, "W", open, lookahead=lookahead.on)

varvarip 变量

varvarip 变量需在脚本顶层声明,不能在 expression 参数内部声明。 子实例会在请求的标的/时间框架上执行完整程序体,因此顶层的 var 状态会在请求的时间框架的各个 bar 之间独立累积:

pine
//@version=6
indicator("累计成交量(周线)")

// 在顶层声明——子实例在周线 bar 上累积此变量
var float cum = 0.0
cum += volume

weekly_cum_vol = request.security(syminfo.tickerid, "W", cum)
plot(weekly_cum_vol)

每个 request.security 调用点都有独立的子实例——其 var 状态与主脚本及其他 request.security 调用互相独立。

元组

表达式可以以元组形式返回多个值:

pine
//@version=6
indicator("周线 OHLC")

[w_open, w_high, w_low, w_close] =
    request.security(syminfo.tickerid, "W", [open, high, low, close])

plotcandle(w_open, w_high, w_low, w_close)

ignore_invalid_symbol

当标的可能不存在于数据提供者中时使用此参数:

pine
price = request.security("SOME:SYMBOL", "D", close, ignore_invalid_symbol=true)
// 标的未识别时 price 为 na,不会触发运行时错误

不使用此参数时,未识别的标的会触发运行时错误并中止执行。

request.security_lower_tf

获取低时间框架数据时,使用 request.security_lower_tf。它返回一个 array<T>,包含当前图表 bar 内所有子 bar 的值,按升序排列:

security_lower_tf — 子 bar 收集为数组security_lower_tf — 子 bar 收集为数组
pine
//@version=6
indicator("日线图上的分钟级最高价")

// 返回每根日线 bar 内所有 1 分钟 bar 的最高价
minute_highs = request.security_lower_tf(syminfo.tickerid, "1", high)

// 当前日线 bar 内的最高 1 分钟最高价
intraday_high = array.max(minute_highs)
plot(intraday_high)

当某个 bar 内没有子 bar 数据时,数组为空(array.size() == 0)。

Ticker 表达式

Ticker 表达式是一个将多个标的通过算术运算符组合的字符串。OpenPine 会将其分解为独立的 DataProvider 请求,逐 bar 对表达式求值,并将结果作为单一序列返回。

支持的运算符

运算符示例结果
*"AAPL*2"标的值 × 标量
/"AAPL/SPY"两个标的的比值
+"AAPL+MSFT"两个标的之和
-"AAPL-MSFT"两个标的之差

操作数可以是标的字符串("EXCHANGE:TICKER")或数字字面量。运算符优先级与标准数学一致,必要时可使用括号。

示例

加权组合(50/50 投资组合)

pine
blend = request.security("NASDAQ:AAPL*0.5+AMEX:SPY*0.5", "D", close)

相对表现(比值)

pine
// AAPL 相对于 SPY 的价格——买一股 AAPL 需要多少股 SPY?
ratio = request.security("NASDAQ:AAPL/AMEX:SPY", "D", close)
plot(ratio)

价差(差值)

pine
// 黄金/白银价差
spread = request.security("COMEX:GC1!/COMEX:SI1!", "D", close)
plot(spread)

多标的等权指数

pine
// 四只科技股等权平均
tech = request.security(
    "NASDAQ:AAPL*0.25+NASDAQ:MSFT*0.25+NASDAQ:GOOGL*0.25+NASDAQ:AMZN*0.25",
    "D", close)
plot(tech)

执行原理

对于 "AAPL*0.5+SPY*0.5" 这样的表达式,OpenPine 的处理步骤:

  1. 提取各个标的(AAPLSPY),通过 DataProvider 获取对应的 K 线数据。
  2. 每个 bar 上,使用各标的子实例中请求的 expression 字段(如 close)对算术表达式求值。
  3. 将计算得到的标量结果对齐到图表 bar 后返回。

表达式中的每个标的都计入 max_security_calls 限制,与普通 request.security 调用相同。

限制

  • 嵌套深度:默认情况下,request.security 表达式内部最多可嵌套调用 request.security 3 层(可通过 ExecutionLimits::max_security_depth 配置)。
  • 调用次数:每个唯一的 (symbol, timeframe) 组合计入 ExecutionLimits::max_security_calls(默认 40)。

参阅

基于 MIT 许可证发布。