多時間框架分析#
在技術分析中,多時間框架分析 (Multi-Timeframe Analysis,MTF) 是一個重要概念:以較大時間框架確認趨勢方向,再以較小時間框架尋找進場時機。Pine Script 的 request.security() 函式可以在任何週期的圖表上,取得其他週期的數據。
request.security — 取得其他週期數據#
request.security(symbol, timeframe, expression, gaps, lookahead)| 參數 | 說明 |
|---|---|
symbol | 商品代碼,使用 syminfo.tickerid 代表當前商品 |
timeframe | 目標週期,用字串表示(見下表) |
expression | 要取得的數值(如 close、ta.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棒數")