Pine ScriptのMTF戦略で未来参照を防ぐ:request.securityとlookahead bias
15分足strategyへ1時間足closeを追加すると、情報量が増えたように見えます。しかし、履歴barへ「その時点ではまだ確定していなかった1時間足終値」を配ると、strategyは未来を知った状態になります。逆にopen中の1時間足をそのまま使えば、realtimeで揺れ、reload後に値が変わることがあります。本稿はMTF手法の収益性ではなく、`request.security()`がどのcontextのどの値を、いつchart barへ渡すかをtimelineで監査します。
この記事が役立つ方: MTF indicatorをstrategyへ変換した人、request.securityを使うと成績が良すぎる人、reload後にHTF signalが変わる原因をcode levelで確認したいPine開発者
まず押さえる重要ポイント
- HTF barの最終値は、そのHTF barが閉じるまでLTF側で確定情報として利用できない。
- lookahead_onをoffsetなしでHTF requestへ使うと、履歴barへ未来値を漏らす危険がある。
- 確定HTF値の代表patternはexpressionへhistory offsetを置き、lookahead_onと組み合わせる。
- lookahead_offでもrealtimeの未確定HTF値とreload後の確定値が違う可能性を別に監査する。
- known boundaryでhistorical・realtime・reloadを三方向比較し、成績を見る前にHTF値の最初の利用可能barを証拠化する。
1時間足closeは、四本目の15分足が閉じるまで完成しない
BEFORE CLOSE09:00–10:00:前の確定HTF値
AFTER CLOSE10:00以降:09:00–10:00の確定値
LOOKAHEAD RISKfuture leak:完成値を09:00から見えていたように配る
MTF監査の核心は、値ではなく利用可能時刻
上位時間足の最終close、high、low、indicator値は、その上位barが閉じるまで確定しません。 15分chart上の09:00時点で、09:00〜10:00の1時間closeを使うことはできません。historical plotが09:00から完成値を表示するなら、future informationが過去へ漏れていないかを確認します。
MTF code reviewでは、symbol、requested timeframe、expression、gaps、lookahead、offset、historical/realtime挙動を一つのrequest contractとして保存します。「1時間足を使う」という説明だけでは不十分です。どの1時間足の、確定前か確定後か、LTFのどのbarから利用可能かを文章で答えられる必要があります。
本稿でHTFと呼ぶのは、requested timeframeがchart timeframeより厳密に大きい場合だけです。60分chartから60分をrequestする同一時間足、60分chartから15分をrequestする下位時間足は、このconfirmed HTF patternの対象外です。両方を秒数へ変換してrequested > chartを満たさなければ、値を使わずruntime errorで停止します。
HTF barの確定境界をLTF barへ写す
15分足4本が1時間足1本に対応する単純例では、09:00〜10:00 HTF barの最終値は10:00の境界で初めて確定します。それ以前のrealtime更新で見えるhigh、low、closeは流動値です。確定値だけを使うdesignなら、09:00〜10:00の間は一つ前の確定HTF barを保持し、10:00以降に新しい確定値へ切り替えます。
| 状態 | LTF側で見えるもの | reload後 | 用途 |
|---|---|---|---|
| 前の確定HTF | 固定値 | 同じになりやすい | 再現性重視のbaseline |
| open中HTF | tickごとに変化 | 途中値が消える | realtime観察・別仕様 |
| 未来漏洩 | 完成値が過去へ早く表示 | 履歴が異常に整う | 使用不可・code修正 |
data revisionやsession差は別途残るため、「同じになりやすい」は完全一致保証ではありません。
available(HTF final value) = HTF close boundary以後confirmed request = previous HTF expression + lookahead alignmentfuture leak = final HTF value assigned before it existedchartとHTFのtimezone、session、欠損barを確認して実際の境界を決めます。| 条件 | 期待する処理 | 残す証拠 |
|---|---|---|
| requested=chart | HTF用関数を拒否 | 両timeframeの秒数とerror |
| requested<chart | LTF問題として分離 | request式と別test ID |
| 非整数比・session分断 | 単純な本数比で断定しない | 実barのopen/close時刻 |
| 休日・欠損bar | 想定境界を実dataで再計算 | 前後のticker IDとtimestamp |
| 形成中HTF | 確定baselineでは前回値を保持 | realtime更新とreload後の値 |
「60÷15=4」だけでは市場時刻上の四本対応を証明できません。実在するbarを使って境界を再現します。
例えば通常営業日の整列した四本、短縮取引日の終端、休日明けの最初のbarを別caseにします。各caseでHTF開始、HTF終了、直前LTF、直後LTFを時刻付きで記録し、完成値が最初に現れるbarを目視とlogの双方で照合します。欠損したはずのbarを架空に補わず、利用不能を監査結果へ残します。
lookahead_onはoffsetの有無で意味が逆転し得る
`barmerge.lookahead_on`は、それだけで安全または危険と決まるoptionではありません。HTF expressionが現在barの`close`なら、historical chartで完成値をperiod冒頭へ配り、未来漏洩を起こす危険があります。一方、`close[1]`のように一つ前の確定HTF expressionをrequestし、lookahead_onでLTFへ揃えるpatternは、historicalとrealtimeで確定値を安定して受け取る代表的な方法です。
| Pattern | Historical | Realtime | 判定 |
|---|---|---|---|
| close + lookahead_on | 未来値を早く配る危険 | current HTF | HTFでは避ける |
| close + lookahead_off | HTF末で更新 | 未確定値を返し得る | reload差を監査 |
| close[1] + lookahead_on | 前の確定HTFを揃える | 前の確定HTF | 確定値baseline |
同じtimeframeやlower timeframe requestでは意味が異なります。HTF前提を検証してからpatternを選びます。
`barstate.isconfirmed`をLTF strategyへ足すだけでは、request expressionへ混入したfuture HTF valueを取り除けません。chart barの確定と、requested contextの確定は別の状態です。
symbol・timeframe・gaps・sessionも同時に固定する
request先symbolがchartと同じでも、session、adjustment、currency、ticker constructionが違えば別seriesです。`gaps_off`で前値を埋めるか、`gaps_on`で利用不能barを`na`にするかもsignal timingへ影響します。HTF boundaryだけでなく、休場、extended hours、週末、daylight saving timeを含む実際のbar alignmentを確認します。
- 完全な`syminfo.tickerid`または明示したticker IDを保存する。
- chart timeframeより本当に高いtimeframeかruntimeで拒否条件を置く。
- expression内のindicator lengthとhistory offsetを保存する。
- gapsとlookaheadを省略せず、意図をcommentへ書く。
- session・timezone境界のsample日時を手計算で確認する。
| Field | 記録値 | 不一致時の扱い |
|---|---|---|
| context | chart ticker ID・session・timeframe秒 | 別contextのrunを比較から外す |
| request | requested ticker・timeframe秒・gaps | 暗黙defaultを明示する |
| expression | 計算式・length・history offset | offset変更を別versionにする |
| alignment | lookahead・最初の利用可能bar | 早すぎる値をfuture leakへ分類 |
| runtime | historical・realtime・reload値 | 三者差を未解決flagへ残す |
同じplot色や近い最終値は同一contractの証拠ではありません。入力と時刻を一行単位で比較します。
failure boundaryでは、request先のsessionだけをextendedへ変えたcase、gaps_onでnaが出るcase、銘柄切替でexchange timezoneが変わるcaseを用意します。signal数の増減を見る前に、どのseriesがどのbarで利用可能になったかを比較し、暗黙の前値埋めを確定情報と取り違えていないか確認します。
前の確定HTF値を明示的にrequestする
下のPine v6 sampleは、chartより高いtimeframeだけを許可し、`close[1]`と`ta.ema(close, 20)[1]`をHTF contextで評価して`lookahead_on`でLTFへ揃えます。cross ruleはcode timing説明用で、entry手法や20期間を推奨しません。確定値を使う代償として、現在形成中のHTF情報より遅くなります。
//@version=6
strategy("Confirmed HTF audit demo", overlay = true)
string higherTf = input.timeframe("60", "Higher timeframe")
int chartSeconds = timeframe.in_seconds()
int higherSeconds = timeframe.in_seconds(higherTf)
if higherSeconds <= chartSeconds
runtime.error("Choose a timeframe higher than the chart timeframe")
float confirmedHtfClose = request.security(
syminfo.tickerid,
higherTf,
close[1],
lookahead = barmerge.lookahead_on
)
float confirmedHtfEma = request.security(
syminfo.tickerid,
higherTf,
ta.ema(close, 20)[1],
lookahead = barmerge.lookahead_on
)
bool longCondition = ta.crossover(confirmedHtfClose, confirmedHtfEma) and barstate.isconfirmed
bool exitCondition = ta.crossunder(confirmedHtfClose, confirmedHtfEma) and barstate.isconfirmed
if longCondition
strategy.entry("L", strategy.long)
if exitCondition
strategy.close("L")
plot(confirmedHtfClose, "Confirmed HTF close", color.teal)
plot(confirmedHtfEma, "Confirmed HTF EMA", color.orange)このpatternはHTF確定値向けです。session、gaps、symbol、compilerの現行挙動を必ず確認してください。
二つのrequestは同じHTF barのprevious closeとprevious EMAを返します。HTF closeをLTFで20回並べてからEMAを計算するのではなく、EMA自体をHTF contextで計算してoffsetする点を区別します。request countとperformance limitも現行manualで確認します。
historical・realtime・reloadの三つを同じbarで比較する
- Known boundaryを選ぶ
HTF close前後のLTF barを一組選び、時刻を保存します。
- Historicalを記録
reload直後のHTF value、signal、order markerを保存します。
- Realtimeを観察
open HTF中に値が固定か変動かをtimestamp付きで記録します。
- HTF closeを確認
どのLTF barから新しい確定値へ切り替わったか確認します。
- 再度reload
同じbarのvalueとsignalが残るかdiffを取り、違えば原因を分類します。
さらにsafe patternと危険patternを同じperiodへ並べ、signal count、最初の利用可能bar、trade timestampを比較します。成績差ではなく、未来値がいつ過去へ現れたかを証拠化します。BT07のoverfittingとは異なり、ここで直すのはparameter選択ではなくdata availability bugです。
| 観測点 | confirmed版 | 危険版 | 判定 |
|---|---|---|---|
| HTF close直前 | 前回確定値を保持 | 完成値が見えれば失敗 | 利用可能時刻 |
| HTF close直後 | 新確定値へ切替 | 切替barを記録 | 一barずれを説明 |
| realtime形成中 | 固定 | 流動値なら別仕様 | tick変化を保存 |
| reload後 | 同じbar・同じ値 | 差分を分類 | 再現性 |
比較する二版はexpression offsetとlookahead以外を同じ設定フィンガープリントへ固定します。
再現は一度の画像で終えません。最初にhistorical runの対象barと値をCSVへ保存し、次に同じHTFが形成中のforward観察で更新時刻を記録し、確定後にreloadします。三つの表をticker ID、version ID、timezone、sessionで結びます。データ改訂、session差、code差を区別できない行は「同じ」と丸めず未解決のまま公開判定から外します。
公開判定用のavailability台帳には、各LTF barの開始時刻・終了時刻、対応するHTF開始・終了、予想した最初の利用可能時刻、実際に値が切り替わった時刻を別列で残します。値だけが同じでも、時刻が早ければ合格にしません。休日、短縮取引、extended session、gaps設定が異なるrunは同じ母集団へ混ぜず、境界ごとのcase IDを付けます。
negative controlも必須です。offsetなしのlookahead_on版を意図的に並べ、監査が早すぎる完成値を本当に検出できるか確認します。危険版まで合格する台帳は検出力がないため作り直します。confirmed版はHTF close前に前回確定値を保持し、close後の最初のeligible barでのみ更新し、reload後も同じbarへ残ることを四条件すべて満たして初めてCSV出力へ進めます。
未来参照を除去したstrategy結果だけをLabへ送る
known boundaryとreload後の両方で未来参照が消えたことを証明してから、修正版Strategy Tester CSV/XLSXをBacktest & Robustness Labへ読み込みます。漏洩あり/なしのversionについて、成績指標、DD、stress、OOS、parameter stabilityの差を追えば、未来情報が作っていた見かけのperformanceを切り分けられます。比較証拠を保持する段階では有料のversion管理が自然です。
無料インジケーターをMTF条件の観察に使う場合も、indicator plotはstrategy出力ではありません。source公開範囲、requested timeframe、確定値、alert timingを確認し、strategy変換は注文とfillを含む新しい仕様として扱います。
HTF closeまでの待ち時間とbar比率を確認
requested HTFがchart timeframeより大きい場合だけ使います。両timeframeとHTF開始後の経過分、expression offsetを入力し、単純化した確認時計を作ります。requestedがchart以下なら本稿のHTF計算対象外です。
前提はB>Aです。比率=B÷A、待ち時間=C≤0ならB、0
よくある質問
lookahead_onは常に未来参照ですか?
常にではありません。HTF current valueをoffsetなしで使うと危険ですが、前の確定HTF expressionへhistory offsetを置く代表patternではlookahead_onが整列に使われます。
lookahead_offなら必ずリペイントしませんか?
保証されません。historicalでは未来漏洩を避けても、realtimeで未確定HTF値を返し、reload後に確定値へ変わる場合があります。
barstate.isconfirmedを足せばHTF値も確定しますか?
chart barの確定とrequested contextの確定は別です。request expression、offset、lookaheadを合わせて監査します。
前の確定HTF値を使うとsignalが遅くなりませんか?
形成中HTF値より遅くなりますが、それは確定を待つ因果的な代償です。open中の値を使うなら、確定値baselineとは別のrealtime仕様としてreload差を記録してください。
根拠資料と確認先
- TradingView Pine Script | Other timeframes and datarequest.security、gaps、lookahead、HTF/LTF behaviorの公式manual
- TradingView Pine Script | RepaintingHTF requestのhistorical/realtime差とconfirmed pattern
- TradingView Pine Script FAQ | Other data and timeframestimeframe requestに関する公式FAQ
- TradingView Pine Script | Timeframestimeframe string、比較、変換の公式説明
- TradingView Pine Script | Limitationsrequest数やdata accessの現行limit
編集・発行: SG Group · 編集方針: TradingView公式ヘルプとPine Script公式文書を優先し、金融市場・商品に関する説明は取引所、監督当局、一次資料で補完しています。機能、データ、料金、接続条件は変わるため、実際の利用前に公式画面とリンク先の最新情報を確認してください。
重要事項: 本記事はTradingViewの画面、チャート、アラート、スクリーナー、ペーパートレード、Pine Script等の一般的な学習情報です。投資助言、売買シグナル、特定商品・データ提供者・ブローカーの推奨、将来価格や利益の保証ではありません。機能、料金、データ、取引所区分、通知、注文連携、Pine Scriptの仕様はプラン・地域・接続先・時点で異なり変更されることがあります。実際の資金を使う前に、TradingView公式資料、データ提供元、接続先事業者の最新条件を確認し、架空データまたはペーパートレードで手順を検証してください。

