コンテンツにスキップ

【移植#28】シフトの違うMAの間へ雲を描く — 表示時刻をそろえてから塗りつぶす

EURUSD 1時間足で5本先へシフトしたEMA20とEMA50の間を橙色と青色の雲で塗ったMT5画面

この記事の3行まとめ

  • 横シフトが違う2本のMAは、同じバッファ番号同士を結ぶだけでは表示時刻が一致しません
  • 共通シフトを決め、各MAの値を同じ横位置へ再配置してからDRAW_FILLINGで塗ります
  • 専用MT5で499点を照合し、雲の境界誤差0ポイントと形成中バー未使用を確認しました

今回の原典は「ずれた2本の間をどう結ぶか」

投稿日順で次に当たる2010年1月15日の記事では、横方向の移動量が違う2本の移動平均線の間へ雲を描くとき、どのバー同士を組にすればよいかが取り上げられていました。

元記事「シフトした移動平均線の間に雲を描く」を読む

移動平均の計算自体は難しくありません。ややこしいのは、同じバッファ位置の値でも、横シフトが違えばチャート上では別の時刻へ描かれることです。

たとえば短期MAを5本先、長期MAを0本先へ表示するとします。短期MAのバッファ位置0と長期MAのバッファ位置0は、計算上は同じバーですが、画面上では5本離れます。その2値をそのまま雲の境界にすると、線と雲が一致しません。

今回の公開版では、EMA20を5本先、EMA50をシフトなしで表示し、画面上の同じ横位置に見えている2値を組にして雲を描きます。


前回のMA雲との違い

移植#20でも、2本のMA間をDRAW_FILLINGで塗りました。ただし、あちらは両方とも横シフト0なので、同じバー番号同士をそのまま使えます。

今回は次のように表示位置が異なります。

期間 横シフト 画面上の意味
短期EMA 20 +5 計算値を5本先へ表示
長期EMA 50 0 計算したバーへ表示

公式資料では、PLOT_SHIFTは描画を時間軸方向へバー単位でずらすプロパティと定義されています。一方、DRAW_FILLINGは2本のバッファ値の間を塗る描画方式です。

つまり、雲に渡す前に「異なるシフトを持つ2本の値が、画面上のどこで出会うか」をそろえる必要があります。


共通シフトへ再配置する

まず、2本のうち小さい横シフトを雲の共通シフトにします。

Text Only
CommonShift = min(FastShift, SlowShift)
FastOffset  = FastShift - CommonShift
SlowOffset  = SlowShift - CommonShift

初期値では次の結果です。

Text Only
CommonShift = min(5, 0) = 0
FastOffset  = 5 - 0 = 5
SlowOffset  = 0 - 0 = 0

古い足から新しい足へ増える通常配列の位置をiとすると、雲の境界は次の対応になります。

Text Only
CloudFast[i] = FastMA[i - FastOffset]
CloudSlow[i] = SlowMA[i - SlowOffset]

短期側は5本古い計算値を現在の雲位置へ置きます。その値はPLOT_SHIFT=+5で5本先へ動かした短期線と、画面上で同じ位置になります。長期側はシフト0なので、そのままです。

時系列配列を「位置0が最新」として読む場合は方向が逆になり、短期側の参照位置は現在位置 + 5です。通常配列と時系列配列の表記を混ぜないことが大切です。


MQL5実装の構成

MA計算と表示シフトを分ける

内部のiMAは横シフト0で作り、純粋なMA値を取得します。そのうえで、短期線の描画へPLOT_SHIFT=5、長期線へPLOT_SHIFT=0を設定しました。

MA計算と表示位置を分けたため、雲の再配置式をコード上で明示できます。どの値がどの表示時刻へ移ったかも検証しやすくなります。

雲は1つの共通シフトを持つ

DRAW_FILLINGは2本のバッファを1つのプロットとして扱うため、境界ごとに別のPLOT_SHIFTを指定できません。そこで雲全体にはCommonShiftを設定し、2本のバッファ値そのものを事前にずらします。

橙色はシフト後の短期EMAが長期EMAより上、青色は下の区間です。色は将来の上昇・下落を予測するものではなく、2本の表示上の上下関係を表します。

確定足だけを描画する

MAラインも雲も、形成中の最新バーに対応する計算値をEMPTY_VALUEにしています。ティックごとに変わるバーを検証結果へ混ぜず、確定した値だけで再現できるようにするためです。

シフト先が未来側でも、使っているのは過去に確定したMA値です。未来の価格を参照しているわけではありません。

ハンドルとコピー件数を検査する

2本のiMAハンドルは初期化時に1回だけ作り、終了時に解放します。BarsCalculated()で準備状況を確認し、CopyBuffer()が要求本数を返さなければ計算を完了扱いにしません。


外部EAからシフト付きバッファを読むときの注意

表示結果を検証EAから読むときにも、横シフトを無視できません。シフト付きプロットを生の計算位置へそろえて取得する場合、CopyBuffer()の開始位置を-PLOT_SHIFT相当に補正します。

今回の検証では次の開始位置を使いました。

バッファ 描画シフト 検証時の開始位置
雲・短期境界 0 0
雲・長期境界 0 0
短期EMAライン +5 -5
長期EMAライン 0 0

すべてを開始位置0で読むと、画面上では別の時刻にある値を同じバーとして比較してしまいます。これはコンパイルでは見つからない、表示シフト特有の時系列ずれです。


専用MT5での動作確認

売買無効の専用テストMT5で、本体インジケーターと検証EAをコンパイルし、雲の各境界を対応するMAラインから独立に照合しました。

項目 設定・結果
通貨ペア・時間足 EURUSD・1時間足
短期MA EMA20、シフト+5
長期MA EMA50、シフト0
数値照合 499点
短期が上/下 251点/248点
上下関係の交差 20回
雲境界の最大誤差 0.0000ポイント
形成中バー 全対象バッファが空
本体コンパイル 0 errors / 0 warnings
検証用コンパイル 0 errors / 0 warnings
キャプチャ 成功、エラー0

画像では、橙色と青色の雲の外周がそれぞれ対応する橙色・水色のEMAラインへ重なっています。シフト量を無視した雲に見られる、境界線との横ずれはありません。


パラメータ

パラメータ 初期値 説明
InpFastPeriod 20 短期MAの期間
InpFastShift 5 短期MAの横シフト。正は未来側
InpSlowPeriod 50 長期MAの期間
InpSlowShift 0 長期MAの横シフト。正は未来側
InpMAMethod EMA MA方式
InpAppliedPrice Close 適用価格

横シフトは-100から+100まで指定できます。負の値は過去側への表示です。期間とシフトの組み合わせを変えても、共通シフトと各オフセットは自動で再計算されます。


ダウンロード

28_Shift_Aligned_MA_Cloud_v1_00.mq5 をダウンロード

MT5のIndicatorsへ保存してコンパイルし、チャートへ適用してください。注文機能はなく、表示だけを行うインジケーターです。


ロジック評価の結論

原典の要点は、バッファ番号が同じでも、横シフトが違えばチャート上の時刻は同じではないということです。雲は数値の組を塗る機能なので、表示時刻の対応付けは実装側で解決しなければなりません。

今回のMQL5版では、個別シフトの線を描きつつ、雲用には共通シフトへ値を再配置しました。これにより、線と雲の境界を数値でも画面でも一致させられます。

ただし、MAシフトは確定済みの値を別の位置へ表示する操作です。予測値を作るものではなく、この雲だけで売買の優位性や将来方向を判断することもできません。用途は、異なる時間配置を持つライン同士の関係を見やすくすることです。


前後の記事

前: 【移植#27】OCO両建て注文の状態遷移を可視化する — 実注文なしでキャンセル順序を検証

次: 【移植#29】複数のMT5で状態ファイルを共有する — FILE_COMMONで安全に受け渡す

— SPONSORED —