Pine Script MTF戦略の未来参照防止|request.security | SG Group
本文へ移動
TradingView解説 · 最終内容確認 Read in English
MTF DATA TIMING · TV14

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開発者

まず押さえる重要ポイント

WHEN DOES THE VALUE EXIST?

1時間足closeは、四本目の15分足が閉じるまで完成しない

CHART15m chart
REQUESTED60m request
  1. 09:00–09:15temporaryHTF forming
  2. 09:15–09:30temporaryHTF forming
  3. 09:30–09:45temporaryHTF forming
  4. 09:45–10:00confirmed at boundaryHTF closes

BEFORE CLOSE09:00–10:00:前の確定HTF値

AFTER CLOSE10:00以降:09:00–10:00の確定値

LOOKAHEAD RISKfuture leak:完成値を09:00から見えていたように配る

時刻は説明用です。session、market hours、timezone、欠損barによって境界は変わります。
DIRECT ANSWER

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で停止します。

01 · AVAILABILITY TIMELINE

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以降に新しい確定値へ切り替えます。

HTF値の三状態
状態LTF側で見えるものreload後用途
前の確定HTF固定値同じになりやすい再現性重視のbaseline
open中HTFtickごとに変化途中値が消える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を確認して実際の境界を決めます。
HTF利用可能性の失敗境界
条件期待する処理残す証拠
requested=chartHTF用関数を拒否両timeframeの秒数とerror
requested<chartLTF問題として分離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を架空に補わず、利用不能を監査結果へ残します。

02 · LOOKAHEAD MODES

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の違い
PatternHistoricalRealtime判定
close + lookahead_on未来値を早く配る危険current HTFHTFでは避ける
close + lookahead_offHTF末で更新未確定値を返し得る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の確定は別の状態です。

03 · REQUEST CONTRACT

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を確認します。

request contract証拠台帳
Field記録値不一致時の扱い
contextchart ticker ID・session・timeframe秒別contextのrunを比較から外す
requestrequested ticker・timeframe秒・gaps暗黙defaultを明示する
expression計算式・length・history offsetoffset変更を別versionにする
alignmentlookahead・最初の利用可能bar早すぎる値をfuture leakへ分類
runtimehistorical・realtime・reload値三者差を未解決flagへ残す

同じplot色や近い最終値は同一contractの証拠ではありません。入力と時刻を一行単位で比較します。

failure boundaryでは、request先のsessionだけをextendedへ変えたcase、gaps_onでnaが出るcase、銘柄切替でexchange timezoneが変わるcaseを用意します。signal数の増減を見る前に、どのseriesがどのbarで利用可能になったかを比較し、暗黙の前値埋めを確定情報と取り違えていないか確認します。

04 · PINE V6 EXAMPLE

前の確定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情報より遅くなります。

Pine Script v6:confirmed HTF request samplepine
//@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で確認します。

05 · RELOAD TEST

historical・realtime・reloadの三つを同じbarで比較する

  1. Known boundaryを選ぶ

    HTF close前後のLTF barを一組選び、時刻を保存します。

  2. Historicalを記録

    reload直後のHTF value、signal、order markerを保存します。

  3. Realtimeを観察

    open HTF中に値が固定か変動かをtimestamp付きで記録します。

  4. HTF closeを確認

    どのLTF barから新しい確定値へ切り替わったか確認します。

  5. 再度reload

    同じbarのvalueとsignalが残るかdiffを取り、違えば原因を分類します。

さらにsafe patternと危険patternを同じperiodへ並べ、signal count、最初の利用可能bar、trade timestampを比較します。成績差ではなく、未来値がいつ過去へ現れたかを証拠化します。BT07のoverfittingとは異なり、ここで直すのはparameter選択ではなくdata availability bugです。

known-boundary再現台帳
観測点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出力へ進めます。

06 · CLEAN DATA FIRST

未来参照を除去した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を含む新しい仕様として扱います。

MTF CONFIRMATION CLOCK

HTF closeまでの待ち時間とbar比率を確認

requested HTFがchart timeframeより大きい場合だけ使います。両timeframeとHTF開始後の経過分、expression offsetを入力し、単純化した確認時計を作ります。requestedがchart以下なら本稿のHTF計算対象外です。

HTF / chart比bars
HTF closeまでminutes
参照offsetHTF bars

前提は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差を記録してください。

根拠資料と確認先

  1. TradingView Pine Script | Other timeframes and datarequest.security、gaps、lookahead、HTF/LTF behaviorの公式manual
  2. TradingView Pine Script | RepaintingHTF requestのhistorical/realtime差とconfirmed pattern
  3. TradingView Pine Script FAQ | Other data and timeframestimeframe requestに関する公式FAQ
  4. TradingView Pine Script | Timeframestimeframe string、比較、変換の公式説明
  5. TradingView Pine Script | Limitationsrequest数やdata accessの現行limit

編集・発行: SG Group · 編集方針: TradingView公式ヘルプとPine Script公式文書を優先し、金融市場・商品に関する説明は取引所、監督当局、一次資料で補完しています。機能、データ、料金、接続条件は変わるため、実際の利用前に公式画面とリンク先の最新情報を確認してください。

重要事項: 本記事はTradingViewの画面、チャート、アラート、スクリーナー、ペーパートレード、Pine Script等の一般的な学習情報です。投資助言、売買シグナル、特定商品・データ提供者・ブローカーの推奨、将来価格や利益の保証ではありません。機能、料金、データ、取引所区分、通知、注文連携、Pine Scriptの仕様はプラン・地域・接続先・時点で異なり変更されることがあります。実際の資金を使う前に、TradingView公式資料、データ提供元、接続先事業者の最新条件を確認し、架空データまたはペーパートレードで手順を検証してください。