コンテンツにスキップ

【移植#08】他通貨重ね書き — 時間同期で正確に比較

他通貨重ね書き

この記事の3行まとめ

  • 📈 他通貨ペア(例: EURUSDにUSDJPY)をチャートに重ねて表示
  • 🕒 iBarShift(標準関数)を使って時間のズレを正確に補正
  • 📏 オートスケーリング機能で、異なる価格帯でもきれいに表示

はじめに

今回は、2009年11月25日の記事「他通貨の動きをチャートに上書きするインジケータ。」をMQL5へ移植します。

元記事の概要

  • 課題: 異なる通貨ペアを重ね合わせて表示(オーバーレイ)する際、単純にバーのインデックス順に描画すると、休日やデータの欠落(サーバー時間の違いなど)によってズレが生じる
  • 解決策: 単純な配列参照ではなく、時間(Time)を基準にして、対応するバーを探し出して描画することで、ピーク(高値・安値)の位置を正確に合わせる。

FAI氏が公開していた CurrencyOverlay.mq4 はこの「ズレ補正」を行うものでした。


MQL5での実装ポイント:iBarShift

MQL4には iBarShift という便利な関数があり、「指定した時刻が、現在のチャートで何本前のバーか?」を一発で取得できました。 以前のMQL5では標準搭載されておらず自作する必要がありましたが、現在のMQL5では標準関数として iBarShift が実装されています

今回は、この標準の iBarShift をそのまま使用して、時刻同期を行います。

MQL
// 指定時刻に対応するバーのインデックスを取得
int shift = iBarShift(Symbol(), Period(), time);

この関数を使うことで、「メインチャートのこの時間は、サブチャート(USDJPY等)では何番目のバーか?」を正確に特定できます。


オートスケーリング(縮尺自動調整)

もう一つの課題は「価格帯の違い」です。 例えば、EURUSD(1.0500付近) のチャートに USDJPY(150.00付近) をそのまま描画すると、USDJPYの線はずっと上の方に表示され、画面外に出てしまいます。

これを解決するために、「現在画面に表示されている範囲」 の高値・安値を基準にして、縮尺を自動計算する機能を実装しました。

線形変換の計算式

\[ OverlayValue = (SubPrice - SubMin) \times \frac{MainMax - MainMin}{SubMax - SubMin} + MainMin \]
  • MainMax, MainMin: 現在画面で見えているメイン通貨の最高値・最安値
  • SubMax, SubMin: その期間に対応するサブ通貨の最高値・最安値

この計算を OnCalculate 内で行うことで、チャートをスクロールしても常に画面内にきれいに収まるようになります。


ダウンロード

作成したインジケータは以下からダウンロードできます。

08_MultiSymbol_Overlay.mq5 をダウンロード

パラメータ

  • SubSymbol: 重ねて表示したい通貨ペア名(例: USDJPY, EURUSD, Nikkei225 など)
  • UseAutoScaling: true にすると、画面に合わせて自動的に縮尺を調整します。false の場合は生の価格で描画します(相関が高いペア同士の場合などに使用)。

まとめ

  • 他通貨をオーバーレイ表示するときは、時間の同期が必須。
  • MQL5では iBarShift を自作して対応する。
  • 異なる価格帯を表示するには、画面範囲に基づいたオートスケーリングが有効。

このインジケータを使えば、「三角裁定」の可視化や、「合成通貨」の動きを確認する際に非常に役立ちます。


参考: サポート・レジスタンス | トレンド相場