コンテンツにスキップ

【移植#45】MTF補間を確定足だけで再設計 — 30分足バンドを5分足へ滑らかに投影する

EURUSDのM5チャートへM30の確定EMA・ATRバンドを青い補間帯とオレンジの階段線で重ねたMT5画面

この記事の3行まとめ

  • 30分足の値を5分足へそのまま複製すると、6本ごとに値が飛ぶ階段状の線になります
  • 未確定の30分足終値を過去へ埋めず、2本の確定足を次の30分区間で補間する方式へ再設計しました
  • MT5実機では600点を描画し、時間足比1:6、階段線との最大差48.6ポイントを確認しました

今回の原典は「MTFのギザギザを滑らかにする」

投稿日順で次に当たる2010年2月3日の記事は、5分足チャートへ30分足の移動平均バンドを表示したときの「ギザギザ」を取り上げていました。

元記事「MTF補間」を読む

原典はとても短い記事です。30分足の値を5分足へ表示すると階段状になりますが、その区間を線で結べば滑らかになる、という見た目の違いを画像で紹介していました。

MTFはMulti Time Frameの略です。下位足チャートを見ながら、上位足のトレンドや指標を重ねて確認する方法ですね。

見た目を滑らかにするだけなら、隣り合う上位足の値を直線で結べば実現できます。ただし、売買判断へ使う場合は「その値が当時わかっていたのか」を確認しなければなりません。

今回は滑らかさを再現しつつ、未確定の上位足を過去へ埋めない構成へ読み替えました。


なぜMTFは階段状になるのか

30分足1本の中には、5分足が6本あります。

Text Only
30分足 1本 = 5分足 6本

直近で確定した30分足のEMAが1.13800だったとします。その値を次の30分間にある6本の5分足へそのまま割り当てると、次のようになります。

Text Only
1.13800, 1.13800, 1.13800, 1.13800, 1.13800, 1.13800

次の30分足が確定して1.13840へ変われば、表示値は一度に切り替わります。

Text Only
1.13840, 1.13840, 1.13840, 1.13840, 1.13840, 1.13840

これを線で描けば、水平線と縦の段差が繰り返されます。計算が壊れているのではなく、低い時間解像度の値を高い解像度のチャートへ複製した結果です。

配布版では、この階段表示をオレンジの破線で残しました。滑らかな線だけを出すより、補間前後を同時に見た方が違いを理解しやすいためです。


単純な補間には未来参照の問題がある

2点ABの間を直線で結ぶ線形補間は、次の式で計算できます。

Text Only
補間値 = A + (B - A) × 区間内の進捗率

30分足の開始から15分経過していれば、進捗率は0.5です。

Text Only
補間値 = A + (B - A) × 0.5

式は単純ですが、Bに「現在形成中の30分足が最後に確定する値」を使うと問題が生まれます。30分足の途中では、最終的なEMAやATRはまだ決まっていません。

それにもかかわらず、30分足が閉じたあとに最終値Bを使って、その区間内の5分足を滑らかに描き直すと、過去の線が後から変わります。見た目はきれいでも、当時は知らなかった終点を使っているわけです。

チャート観賞用なら許容できる場合もありますが、シグナル判定に使えば、実運用と過去表示が一致しません。


今回は1区間遅らせて補間する

配布版は、確定済みの上位足だけを使います。

現在形成中の30分足をC、その直前に確定した足をB、さらに1本前をAとします。

Text Only
A(確定済み) -> B(確定済み) -> C(形成中)

階段線は、Cの区間へBの値を表示します。これは直近確定値なので、その時点で利用できます。

滑らかな線は、Cの30分間を使ってAからBへ少しずつ移動します。

Text Only
Cの開始: A
Cの途中: AとBの中間
Cの終了直前: Bへ接近

ABはどちらもCが始まった時点で確定しています。したがって、Cの途中で終点が変わりません。

代わりに、滑らかな線は階段線より1つの30分区間だけ遅れます。未来参照を避けながら滑らかさを得るための、明示的な代償です。


MQL5では時刻から上位足を対応付ける

各5分足がどの30分足へ含まれるかは、iBarShift()の公式資料にある時刻検索で求めます。

C++
const int higher_shift =
   iBarShift(_Symbol, InpHigherPeriod,
             time[chart_shift], false);

exact=falseなので、同じ開始時刻のバーがなければ、指定時刻より前に始まった最も近い30分足が返ります。

対応する30分足がhigher_shiftなら、使用する確定足は次の2本です。

C++
const int recent_closed = higher_shift + 1;
const int older_closed  = higher_shift + 2;

higher_shift自身は、その5分足時点で形成中だった30分足です。そこを使わず、必ず+1+2へずらします。


EMAとATRの両方を補間する

今回は中心線だけでなく、上限・下限を持つバンドにしました。

Text Only
中心線 = M30 EMA(8)
上限   = 中心線 + M30 ATR(8) × 0.35
下限   = 中心線 - M30 ATR(8) × 0.35

EMAはiMA()、ATRはiATR()でハンドルを作成し、CopyBuffer()で必要数を一括取得します。

補間時はEMAだけでなくATRもAからBへ動かします。そのため、青い帯の中心と幅が一緒に変化します。

C++
const double smooth_ma =
   older_ma + (recent_ma - older_ma) * fraction;
const double smooth_atr =
   older_atr + (recent_atr - older_atr) * fraction;

毎回1本ずつCopyBuffer()を呼ぶのではなく、必要な上位足データを先にまとめて取得しています。取得件数が要求数と一致しない場合は計算を進めません。


画像の線と帯の意味

実機画像では、次の色分けを使っています。

表示 意味
青い帯 確定した2本のM30 EMA・ATRを、次の区間で補間
水色の実線 青い帯の中心線
オレンジの破線 直近確定M30値を6本のM5へ複製した階段表示
緑のローソク足 EURUSD M5の価格

下落が強い区間を見ると、オレンジ線が6本単位で下がる一方、青い帯は連続的に傾いています。原典が示していた「ギザギザを線で結ぶ」違いを、同じ画面で比較できます。


入力パラメーター

パラメーター 初期値 役割
InpHigherPeriod PERIOD_M30 参照する上位時間足
InpMAPeriod 8 上位足EMAの期間
InpMAMethod MODE_EMA 移動平均方式
InpAppliedPrice PRICE_CLOSE 移動平均の適用価格
InpATRPeriod 8 上位足ATRの期間
InpBandATRMultiplier 0.35 バンド幅のATR倍率
InpMaxBars 600 描画する下位足の最大本数
InpMinValidationPoints 100 準備完了とする最低有効点数
InpShowStepLines true オレンジの階段線を表示
InpShowPanel true 検証パネルを表示

上位時間足は、チャート時間足より大きく、秒数が割り切れる組み合わせを指定します。初期設定のM5とM30なら比率は1:6です。


MT5実機で補間値を独立検証

専用MT5へ配布インジケーターと独立検証EAを配置し、コンパイル、値の再計算、画面取得を行いました。

コンパイル結果

対象 エラー 警告
配布インジケーター 0 0
独立検証EA 0 0

実行条件

項目
MT5 Build 5836
通貨 EURUSD
チャート M5
上位時間足 M30
時間足比 1:6
EMA / ATR期間 8 / 8
ATR倍率 0.35

検証結果

確認項目 結果
有効な描画点 600
階段線との最大差 48.6ポイント
独立確認位置の階段値 1.13773
独立確認位置の補間値 1.13769
同位置での差 4.0ポイント
パネルオブジェクト 6
画面保存 成功

独立検証EAは、配布インジケーターとは別にM30のEMAとATRを取得しました。対象M5バーの時刻からM30シフトと進捗率を求め、階段値、補間値、上下バンドを再計算しています。

6本の表示バッファを1点ずつ読み、許容誤差0.25ポイント以内で一致すること、上下関係が上限 > 中心 > 下限になることも確認しました。

48.6ポイントは、検証した600点の中で補間線と階段線が最も離れた箇所です。常にこれだけ離れるわけではありません。


ダウンロードと使い方

45_MTF_Confirmed_Interpolation_Band_v1_00.mq5 をダウンロード

MT5のIndicatorsへ保存してコンパイルし、初期設定ではEURUSDなどのM5チャートへ適用してください。

青い帯だけを見たい場合は、InpShowStepLines=falseにするとオレンジの比較線を非表示にできます。最初は両方を表示し、どれだけ遅れと形状差があるか確認するのがおすすめです。

パネルがVALIDATION READYになれば、最低有効点数を満たし、補間線と階段線の両方が計算されています。


使えないこと・注意点

  • 滑らかな線は、直近確定値より1つの上位足区間だけ遅れます。
  • 一般的な「形成中の上位足を補間するMTF」とは表示タイミングが異なります。
  • 補間によって新しい価格情報や予測力が生まれるわけではありません。
  • 上位足の値を下位足へ見やすく投影する表示補助です。
  • 業者の履歴修正や欠損データがあれば、過去の計算結果が変わる可能性はあります。
  • 時間足が割り切れない組み合わせは初期化を拒否します。
  • ATR倍率は見やすさのための設定で、売買に最適な値を示すものではありません。
  • バンドへの接触だけを売買シグナルとして扱うことは想定していません。
  • 売買処理はなく、取引成績を評価するインジケーターではありません。

ロジック評価の結論

MTFの階段線は、上位足データを下位足へ正直に複製した形です。ギザギザに見えるから間違い、滑らかだから正しい、という関係ではありません。

補間は情報を増やす処理ではなく、点と点の間をどのように見せるかという表示方法です。そして終点が当時わかっていなければ、きれいな線と引き換えに過去を書き換えることになります。

今回は、補間に使う2点を確定足へ限定し、1区間の遅れを受け入れました。原典の滑らかな見た目を残しながら、「いつ値が利用可能だったか」も揃えるためです。

MTF表示で大切なのは、線の美しさだけではありません。階段、補間、確定足、未確定足のどれを使ったのかを明示することです。そこまで書いて初めて、過去チャートとリアルタイムを同じ前提で比べられます。


前後の記事

前: 【移植#44】Homeキー連打を卒業 — MT5のM1履歴を3通貨ずつ順番に同期する

— SPONSORED —