コンテンツにスキップ

【移植#16】ゼロライン中央固定MACD — 不可視バッファで自動スケールを上下対称にする

ゼロライン中央固定MACDをEURUSD 1時間足へ適用したMT5実行結果

この記事の3行まとめ

  • 2009年公開のMACD++.mq4を、MT5で動くMQL5インジケータへ移植しました
  • MACDの値は変えず、最大絶対値の正負を不可視線として描くことでゼロを表示領域の中央へ保ちます
  • 実MT5では右軸が+0.002444 / 0 / -0.002444となり、上下対称の自動スケールを確認できました

今回の原典は「常にゼロラインが中心にくるMACD」

投稿日順で次に当たるのは、2009年12月28日の「常にゼロラインが中心にくるMACDの作成。」です。

元記事を読む

原典では、期間の違うMACDを比べると、自動スケールによってゼロラインの位置が揃わない問題を扱っています。上限・下限を固定すればゼロは中央に置けますが、値が固定範囲を超えると線が見切れてしまいます。

そこで配布されたMACD++.mq4は、MACD本体とは別に「最大絶対値」と「その負値」を不可視の線として持たせていました。値動きに合わせた自動スケールを残しながら、表示範囲を上下対称にする工夫です。

今回のMQL5版は、公開されている原典コードを確認したうえで、次の要素を移植しました。

原典の要素 MQL5版での扱い
高速MAと低速MAの差 MACDラインとして再実装
MACDの移動平均 シグナルラインとして再実装
MACD-シグナル ヒストグラムとして表示
傾きが一定幅を超えた位置 水色・ピンクのドットで表示
最大絶対値とその負値 clrNONEの2本の線として自動スケールへ参加
初期設定 原典に合わせてMACD側・シグナル側ともLWMA

一般的な標準MACDはEMAを使うことが多い一方、原典の初期値はLWMAです。そのため、本インジケータの初期表示はMT5標準MACDと完全には一致しません。MA方式は入力パラメータでSMA・EMA・SMMA・LWMAから選べます。


値を加工せず、表示範囲だけを対称にする

高速MAを \(MA_f\)、低速MAを \(MA_s\) とすると、MACDラインは次の差です。

\[ MACD_t=MA_{f,t}-MA_{s,t} \]

シグナル期間を \(N\) とすると、シグナルとヒストグラムは次のように計算します。

\[ \begin{aligned} Signal_t &= MA_N(MACD_t) \\ Histogram_t &= MACD_t-Signal_t \end{aligned} \]

ここまでは通常のオシレータ計算です。ゼロを中央へ置くため、各バーで3系列の最大絶対値を求めます。

\[ M_t=\max\left( |MACD_t|, |Signal_t|, |Histogram_t| \right) \]

そして、画面には見えない2本の系列を追加します。

\[ Upper_t=M_t, \qquad Lower_t=-M_t \]

MT5が表示中のバーから最大値と最小値を探すと、必ず同じ絶対値の正負が見つかります。その結果、上限と下限が対称になり、0がサブウィンドウ中央へ来ます。

この処理はMACDを0~100へ変換する正規化ではありません。データウィンドウへ出るMACD・シグナル・ヒストグラムの値は元の価格差のままです。変わるのは表示用のスケールだけです。


DRAW_NONEではなく、見えないDRAW_LINEを使う

自動スケール用の2系列は、表示そのものが目的ではありません。しかし、プロット種類をDRAW_NONEにすると、スケール計算へ参加しない可能性があります。

そこでMQL5版では次の組み合わせにしました。

  • プロット種類: DRAW_LINE
  • 線色: clrNONE
  • データウィンドウ表示: 無効
  • 値: 同じバーの+M_t-M_t

線として存在するため自動スケールには反映されますが、チャート上には描かれません。今回の実画面でも、右軸の上下端が同じ絶対値になり、中央の0ラインとMACDだけが見える状態を確認しました。


MQL5移植で直した安全面

配列の向きを古い足から新しい足へ統一

価格配列と10本のインジケータバッファを通常配列へ揃え、i-1が常に1本前の足になるようにしました。原典のi+1参照をそのまま移すのではなく、初期バーと直前バーの存在を確認してから傾きを判定します。

再計算は直前の1本から

初回だけ全履歴を計算し、通常更新ではprev_calculated-1から再計算します。EMAやSMMAを選んだ場合も、その1本前に保存済みの値を使って再帰計算を続けます。

平滑化の開始値を期間内平均に統一

EMAとSMMAは前回値が必要です。最初の有効バーでは期間内の単純平均を開始値とし、0から不自然に立ち上がることを避けました。SMAとLWMAは各期間の窓を直接計算します。

入力値とバッファ接続を検査

期間が1未満、長短期間が同じ、傾き判定幅が負の場合は初期化を中止します。10本すべてのSetIndexBuffer()も成功を確認し、失敗時はエラー番号をログへ残します。


専用MT5での動作確認

売買とDLL呼び出しを無効にした専用テストMT5へ配置し、実チャートへ適用しました。

項目 設定・結果
通貨ペア・時間足 EURUSD・1時間足
高速MA・低速MA 12・26
MACD側のMA方式 LWMA
シグナル期間・方式 9・LWMA
読み込み済みバー 10,008本
自動スケール上端 +0.002444
中央 0.000000
自動スケール下端 -0.002444
キャプチャ 成功、エラー0
コンパイル 0 errors / 0 warnings

画像はMT5から直接取得したGreen on Blackの実画面です。青がMACD、橙がシグナル、緑がヒストグラムです。水色とピンクのドットは、MACDの1本前からの変化が設定幅を超えた位置を示します。

ドットは上昇・下降の勢いを簡単に見る補助表示であり、売買シグナルの有効性を検証したものではありません。特に形成中の最新足では、価格更新によって表示が変わります。売買ルールへ使う場合は確定足で判定してください。


パラメータ

パラメータ 初期値 説明
InpFastMAPeriod 12 高速MAの期間
InpSlowMAPeriod 26 低速MAの期間
InpMAMethod LWMA MACD計算に使うMA方式
InpSignalMAPeriod 9 シグナルラインの期間
InpSignalMAMethod LWMA シグナル計算に使うMA方式
InpAppliedPrice PRICE_CLOSE MAへ使う価格
InpShowSlopeDots true 傾きドットの表示切替
InpSlopeThreshold 0.000175 ドット判定幅(価格単位)

原典との互換のため、通貨ペア名にJPYを含む場合は傾き判定幅を内部で100倍します。金・指数・暗号資産など価格桁の異なる銘柄では、初期値をそのまま使わず、銘柄の値動きに合わせて調整してください。


ダウンロード

16_MACD_Zero_Centered_v1_00.mq5 をダウンロード

MT5のIndicatorsへ保存してコンパイルし、チャートへ適用してください。複数のMACDを同じサブウィンドウへ重ねる場合も、それぞれが正負のスケール用バッファを持つため、全体の表示範囲が上下対称になります。


ロジック評価の結論

原典の不可視バッファ方式は、MT5でも機能しました。固定上限・下限を指定しなくても、表示中の値に追従しながらゼロラインを中央へ保てます。

この仕組みの価値は予測精度を上げることではなく、オシレータを比較しやすくすることです。上下の余白が同じになるため、プラス側とマイナス側の振幅を視覚的に比べやすくなります。

一方、自動スケールは表示中のバーに応じて変わります。スクロールやズームで縦軸の幅が変化する点は原典と同じです。異なる時点の振幅を画像上の高さだけで比較する場合は、右軸の数値も一緒に確認してください。


関連用語


前後の記事

前: 【移植#15】SMA基準とEMA基準のボリンジャーバンド

— SPONSORED —