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 許可證發佈。