跨标的与多时间框架
request.security() 在不同标的和/或时间框架的上下文中对表达式求值,并将结果对齐到当前图表 bar。它是 Pine Script 中访问多时间框架(MTF)数据和其他标的数据的主要方式。
基本语法
request.security(symbol, timeframe, expression, gaps, lookahead, ignore_invalid_symbol, currency)| 参数 | 类型 | 说明 |
|---|---|---|
symbol | string | 标的标识符,如 "NASDAQ:AAPL" 或 syminfo.tickerid |
timeframe | string | 时间框架字符串,如 "D"、"W"、"60" |
expression | 任意 series | 在请求的标的/时间框架上求值的表达式 |
gaps | gaps_type | gaps.off(默认)或 gaps.on——是否用 na 填充空缺 |
lookahead | lookahead_type | lookahead.off(默认)或 lookahead.on |
ignore_invalid_symbol | bool | 若为 true,未知标的返回 na 而不报错 |
currency | string | 价格转换的目标货币 |
基础示例
高时间框架收盘价
//@version=6
indicator("日线图上的周线收盘价", overlay=true)
weekly_close = request.security(syminfo.tickerid, "W", close)
plot(weekly_close, "周线收盘", color=color.blue)其他标的
//@version=6
indicator("AAPL 图上的 SPY", overlay=false)
spy_close = request.security("AMEX:SPY", "D", close)
plot(spy_close)高时间框架指标
//@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。
// 延续(默认):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 中引入未来数据泄漏——仅在明确需要时使用。
// 默认:看到正在形成的周线开盘价(本周内持续更新)
weekly_open = request.security(syminfo.tickerid, "W", open)
// 使用 lookahead:周一即可看到已确认的周线开盘价
weekly_open_confirmed = request.security(syminfo.tickerid, "W", open, lookahead=lookahead.on)var 和 varip 变量
var 和 varip 变量需在脚本顶层声明,不能在 expression 参数内部声明。 子实例会在请求的标的/时间框架上执行完整程序体,因此顶层的 var 状态会在请求的时间框架的各个 bar 之间独立累积:
//@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 调用互相独立。
元组
表达式可以以元组形式返回多个值:
//@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
当标的可能不存在于数据提供者中时使用此参数:
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 的值,按升序排列:
//@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 投资组合)
blend = request.security("NASDAQ:AAPL*0.5+AMEX:SPY*0.5", "D", close)相对表现(比值)
// AAPL 相对于 SPY 的价格——买一股 AAPL 需要多少股 SPY?
ratio = request.security("NASDAQ:AAPL/AMEX:SPY", "D", close)
plot(ratio)价差(差值)
// 黄金/白银价差
spread = request.security("COMEX:GC1!/COMEX:SI1!", "D", close)
plot(spread)多标的等权指数
// 四只科技股等权平均
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 的处理步骤:
- 提取各个标的(
AAPL、SPY),通过DataProvider获取对应的 K 线数据。 - 每个 bar 上,使用各标的子实例中请求的
expression字段(如close)对算术表达式求值。 - 将计算得到的标量结果对齐到图表 bar 后返回。
表达式中的每个标的都计入 max_security_calls 限制,与普通 request.security 调用相同。
限制
- 嵌套深度:默认情况下,
request.security表达式内部最多可嵌套调用request.security3 层(可通过ExecutionLimits::max_security_depth配置)。 - 调用次数:每个唯一的
(symbol, timeframe)组合计入ExecutionLimits::max_security_calls(默认 40)。