【移植#24】LWMA版MACDのクロスをチャートへ表示する — 確定足だけに矢印を出す¶

この記事の3行まとめ
- 12期間LWMAと26期間LWMAの差をMACD本線とし、9期間LWMAのシグナル線とのクロスを検出します
- 形成中の0番バーを除外し、確定したバーだけへ上向き・下向き矢印を表示します
- EURUSD・1時間足の直近1000本では上抜け42件、下抜け41件を検出し、再計算値と一致しました
今回の原典は「クロスをメインチャートでも見たい」¶
投稿日順で次に当たる2010年1月11日の記事では、以前作成したLWMA版MACDについて、クロスシグナルを価格チャート上へ表示してほしいという要望に応えたコードが案内されていました。
元記事「LWMAのMACDのクロスシグナルをチャート上に表示する。&なっちゃんのこと」を読む
通常のMACDはサブウィンドウで2本の線を見比べます。しかし裁量判断で知りたいのが「どのローソク足でクロスしたか」なら、メインチャートへ矢印だけを重ねるほうが対応関係を追いやすくなります。
一方、原典の後半では、非常に大きな損切り幅やカーブフィットの危険性にも触れています。インジケーターのクロスが正しく表示できることと、そのシグナルで利益が出ることは別問題です。今回も売買処理は入れず、まず表示ロジックを検証できる道具として移植します。
LWMA版MACDの定義¶
今回のMQL5版では、一般的なMACDの期間に合わせて12・26・9を初期値にしました。ただし、平滑化方法にはEMAではなくLWMA(線形加重移動平均)を使います。
FastLWMA = LWMA(Close, 12)
SlowLWMA = LWMA(Close, 26)
Main = FastLWMA - SlowLWMA
Signal = LWMA(Main, 9)
LWMAは、計算窓の新しい値ほど大きな重みを与えます。9期間なら最新値の重みが9、最も古い値の重みが1です。
クロス条件は次のようにします。
| シグナル | 1本前の状態 | 現在の確定足 | 表示 |
|---|---|---|---|
| 上抜け | Main ≤ Signal | Main > Signal | 安値の下に緑の上矢印 |
| 下抜け | Main ≥ Signal | Main < Signal | 高値の上に赤の下矢印 |
等号をクロス前の条件へ含めることで、2本の値が一度一致してから離れたケースも拾います。
MQL5での実装ポイント¶
2本のLWMAはiMAハンドルで取得する¶
短期線と長期線は、MQL5標準のiMAをMODE_LWMAで2本作ります。ハンドルは初期化時に一度だけ作成し、インジケーターを外したときにIndicatorRelease()で解放します。
MACD本線は2本の取得値を引いて作ります。標準のiMACDをそのまま使わないのは、今回の主題がEMA版ではなくLWMA版だからです。
CopyBufferの取得件数を検査する¶
計算に必要な短期・長期LWMAはCopyBufferで取得します。戻り値が要求本数と一致しない場合、その回は矢印を更新しません。履歴の読み込み途中に、不完全な配列からクロスを作らないためです。
また、毎ティックで全履歴を計算し直すのではなく、初期値では直近3000本とシグナル計算に必要な余白だけを取得します。長く使い続けるチャートでも、計算範囲が際限なく増えないようにしています。
矢印はDRAW_ARROWバッファへ入れる¶
上抜けと下抜けは、DRAW_ARROWの2バッファで描画します。該当しないバーには必ずEMPTY_VALUEを設定し、古いシグナルの残像が出ないようにします。
本線とシグナル線も非表示バッファとして公開しています。チャートは矢印だけで見やすく保ちながら、EAや検証コードから値を読み出して照合できます。
形成中バーにはシグナルを出さない¶
配列の最新バーは、ティックが来るたび終値とLWMAが変わります。そこで矢印の最終計算位置をrates_total - 2とし、形成中のrates_total - 1には表示しません。
これで確定後の矢印は固定されます。ただし、「確定足だけを見る」ことは勝率を高める仕組みではなく、判定時点を明確にするための実装です。
3桁・5桁銘柄のpipsを換算する¶
矢印はローソク足から初期値4pips離して表示します。3桁・5桁のFX銘柄では1pipを_Point × 10、2桁・4桁では_Pointとして扱います。
専用MT5での動作確認¶
売買を行わない専用テストMT5で本体と検証EAをコンパイルしました。検証側では、短期・長期LWMAから本線を再計算し、本線9本の加重平均からシグナル線も再計算しています。そのうえで、全クロス条件と矢印位置を照合しました。
| 項目 | 設定・結果 |
|---|---|
| 通貨ペア・時間足 | EURUSD・1時間足 |
| パラメータ | Fast 12 / Slow 26 / Signal 9 |
| 検査本数 | 直近1000本 |
| 上抜け | 42件 |
| 下抜け | 41件 |
| MACD本線の最大誤差 | 0.000000000000 |
| シグナル線の最大誤差 | 0.000000000000 |
| 矢印位置の最大誤差 | 0.0000ポイント |
| 形成中バー | 矢印なし |
| 本体コンパイル | 0 errors / 0 warnings |
| 検証用コンパイル | 0 errors / 0 warnings |
| キャプチャ | 成功、エラー0 |
画像では緑の上矢印が上抜け、赤の下矢印が下抜けです。クロスは比較的頻繁に起きるため、単独でエントリー条件にするより、トレンド方向や値動きの大きさを検討するための起点として使うほうが安全です。
パラメータ¶
| パラメータ | 初期値 | 説明 |
|---|---|---|
InpFastPeriod | 12 | 短期LWMAの期間 |
InpSlowPeriod | 26 | 長期LWMAの期間 |
InpSignalPeriod | 9 | MACD本線を平滑化するLWMA期間 |
InpBarsToCalculate | 3000 | 計算する直近バー数 |
InpArrowOffsetPips | 4.0 | 矢印を高値・安値から離す距離 |
短期期間は長期期間より小さくする必要があります。期間を短くするとクロスは増えやすく、長くすると反応は緩やかになります。銘柄や時間足を変える場合は、表示本数だけでなく、スプレッドと取引コストを含めた別の検証が必要です。
ダウンロード¶
24_LWMA_MACD_Cross_Signals_v1_00.mq5 をダウンロード
MT5のIndicatorsへ保存してコンパイルし、確認したいチャートへ適用してください。注文を送る機能はありません。
ロジック評価の結論¶
原典の発想は、サブウィンドウで起きたクロスを価格チャートの時間軸へ戻し、ローソク足との関係を見やすくすることでした。今回の移植では、その表示をMQL5のバッファへ置き換え、さらに形成中バーを判定から外して検証可能にしました。
ただし、直近1000本で83回のクロスがあったことは、83回の売買機会や利益を意味しません。横ばい相場では短い間隔で上下のクロスが繰り返され、取引コストが積み上がる可能性があります。
EA化するなら、クロスだけで注文せず、上位足の方向、ボラティリティ、スプレッド、損切り幅を先に定義し、未使用期間で検証する必要があります。特に大きな損切り幅を「過去に到達しなかったから安全」と考えないことが、原典後半の注意にもつながります。
前後の記事¶
前: 【移植#23】チャートの窓幅をpipsで測る — 前足終値と次足始値の差を可視化
次: 【移植#25】RSIの平均方法を選べるようにする — SMA・EMA・SMMA・LWMAと確定MTF