多時間框架分析#

在技術分析中,多時間框架分析 (Multi-Timeframe Analysis,MTF) 是一個重要概念:以較大時間框架確認趨勢方向,再以較小時間框架尋找進場時機。Pine Script 的 request.security() 函式可以在任何週期的圖表上,取得其他週期的數據。

request.security — 取得其他週期數據#

request.security(symbol, timeframe, expression, gaps, lookahead)
參數說明
symbol商品代碼,使用 syminfo.tickerid 代表當前商品
timeframe目標週期,用字串表示(見下表)
expression要取得的數值(如 closeta.sma(close, 20)
gaps如何處理較大週期 K 棒尚未收盤的情況
lookahead是否允許使用未來數據(策略回測必須用 off

週期字串格式#

字串說明
"1"1 分鐘
"5"5 分鐘
"15"15 分鐘
"60"1 小時
"240"4 小時
"D"日線
"W"週線
"M"月線

基本用法#

在 5 分鐘圖上顯示日線的收盤價和均線:

//@version=6
indicator("日線均線(在分鐘圖顯示)", overlay=true)

// 取得日線的 20 日均線
dailyMA20 = request.security(syminfo.tickerid, "D", ta.sma(close, 20))

// 取得日線的高低點
dailyHigh = request.security(syminfo.tickerid, "D", high)
dailyLow  = request.security(syminfo.tickerid, "D", low)

plot(dailyMA20, "日線MA20", color=color.orange, linewidth=2)
plot(dailyHigh, "日線高點", color=color.green,  style=plot.style_stepline)
plot(dailyLow,  "日線低點", color=color.red,    style=plot.style_stepline)

gaps 參數#

gaps 控制在較大週期 K 棒還沒收盤時,如何填充小週期 K 棒的數值:

常數說明
barmerge.gaps_off使用上一根已確認週期棒的數值(預設,數值會「延伸」)
barmerge.gaps_on未確認時回傳 na
// 每根日線 K 棒收盤前,小週期都使用同一個數值(延伸)
dailyClose = request.security(syminfo.tickerid, "D", close, gaps=barmerge.gaps_off)

lookahead — 避免偷看未來#

策略回測中,lookahead 必須設為 barmerge.lookahead_off(預設值),否則會偷看到當根較大週期 K 棒的收盤價,造成虛假的回測結果。

// ❌ 有未來資料偷窺問題(lookahead_on)
dailyClose_bad = request.security(syminfo.tickerid, "D", close,
                                   lookahead=barmerge.lookahead_on)

// ✅ 正確:使用上一根已收盤的日線收盤價
dailyClose_ok = request.security(syminfo.tickerid, "D", close[1],
                                  lookahead=barmerge.lookahead_off)

正確的多時間框架寫法:取得「已確認」的較大週期數值時,使用 close[1](加上 [1] 位移),確保是上一根已收盤的數值。

實用範例:日線趨勢過濾#

在分鐘圖上,只在日線趨勢向上時才允許做多:

//@version=6
strategy("日線趨勢過濾策略", overlay=true)

fastLen = input.int(5,  "短期均線")
slowLen = input.int(20, "長期均線")

// 當前週期(例如 5 分鐘)的均線
fastMA = ta.sma(close, fastLen)
slowMA = ta.sma(close, slowLen)

// 日線趨勢:日線收盤在 20 日均線上方
dailyMA20    = request.security(syminfo.tickerid, "D", ta.sma(close, 20))
dailyClose   = request.security(syminfo.tickerid, "D", close[1],
                                 lookahead=barmerge.lookahead_off)
dailyUptrend = dailyClose > dailyMA20

// 只在日線多頭時做多
if ta.crossover(fastMA, slowMA) and dailyUptrend
    strategy.entry("Long", strategy.long, comment="順勢做多")

if ta.crossunder(fastMA, slowMA)
    strategy.close("Long", comment="出場")

// 背景色顯示日線趨勢
bgcolor(dailyUptrend ? color.new(color.green, 92) : color.new(color.red, 92))

取得多個數值#

request.security 可以用 tuple 一次回傳多個值:

// 一次取得日線的開高低收
[dOpen, dHigh, dLow, dClose] = request.security(syminfo.tickerid, "D",
                                                  [open, high, low, close])

使用 request.security_lower_tf#

request.security_lower_tf() 可以取得 比當前週期更小 的週期數據,回傳一個包含該週期所有 K 棒數值的陣列:

//@version=6
indicator("分鐘圖蠟燭統計", overlay=false)

// 在日線圖上,取得每日所有 5 分鐘 K 棒的收盤價陣列
intradayCloses = request.security_lower_tf(syminfo.tickerid, "5", close)

// 計算當日 5 分鐘 K 棒的數量
plot(array.size(intradayCloses), "當日5分K棒數")

Reference#