【移植#14】3本HMA判定 — 色・エントリー・決済をMQL5で1本化¶

この記事の3行まとめ
- MQL4版は表示バッファ数の都合で4ファイル構成でしたが、MQL5版は3本HMAと判定を1本へ統合しました
- 青・赤・黄は「上昇・下降・横ばい」を表し、3本同色でエントリー、1本でも崩れたら決済を表示します
- これはトレンド状態の可視化であり、単独で利益が出る売買戦略だと確認したものではありません
今回の原典は「gon777さんの3本HMA」¶
投稿日順で次に当たるのは、2009年12月26日の「gon777さんの3本HMA」です。
読者から寄せられた要望は、期間の違うHull Moving Average(HMA)を3本表示し、それぞれを上昇なら青、下降なら赤、方向が定まらなければ黄にすることでした。さらに、3本がすべて青または赤になったらエントリーし、1本でも色が異なれば決済する判定を加えます。
原典に書かれたことと、今回の判断を分けると次のようになります。
| 区分 | 内容 |
|---|---|
| 元記事の要望 | 3本のHMAを青・赤・黄で色分けし、3本一致でエントリー、不一致で決済する |
| 元記事の説明 | 見えている黄色と、判定上の「中立」は必ずしも同じではない |
| 元記事の実装 | 色付きHMAを3個と、判定用インジケータを別々にチャートへ入れる |
| 元記事の注意 | この条件だけで勝てるとは考えにくく、傾き・位置・時間・ボラティリティ・損切りなどの検討が必要 |
| 今回の追加実装 | 3本HMA、色、エントリー、決済を1ファイルへ統合する |
| 今回の安全策 | シグナルは既定で確定足だけに出し、通知は初期値で無効にする |
著者がどのような売買手法を最終的に想定していたかは、記事だけでは断定できません。本記事では、明示された色と状態遷移を再現し、実装上の曖昧さを入力仕様として整理します。
HMAは何を計算しているのか¶
HMAは、Alan Hullが考案した応答の速い移動平均です。期間を \(P\) とすると、今回の原版は次の順序で計算しています。
長いLWMAから生じる遅れを、半分の期間のLWMAを2倍した値で補正し、最後に平方根期間のLWMAで滑らかにします。今回のMQL5版も、この整数化を含めて原版の式に合わせました。
初期値は原版の判定インジケータと同じ100 / 300 / 600です。3本それぞれについて、現在のHMAと1本前を比較します。
| 判定 | 色 |
|---|---|
| \(HMA_t-HMA_{t-1} > 閾値\) | 青(上昇) |
| \(HMA_t-HMA_{t-1} < -閾値\) | 赤(下降) |
| 差の絶対値が閾値以内 | 黄(横ばい) |
InpFlatThresholdPoints=0なら原版互換で、完全に同値のときだけ黄です。明確な中立帯が必要なら、ポイント単位で0より大きい値を指定できます。
「黄色」の誤解をコードで確かめる¶
元記事の重要な指摘は、色付きHMAの黄色部分を、そのまま「方向が定まらない状態」と解釈できないことです。
原版HMAColor.mq4は、黄色の基礎線へHMAを常時代入し、その上へ青い上昇線と赤い下降線を重ねています。青と赤の線が切り替わる接続部分では、下にある黄色が見えます。ところが、判定用HMA3LineJudgement.mq4は黄色の表示バッファを読んでいません。HMAの値を直接比較して、上昇か下降かを決めています。
つまり、原版には次の2種類が混在していました。
- 色の接続を見やすくするために露出する黄色
- HMAが前の値と完全に同じときの、判定上の横ばい
MQL5版ではDRAW_COLOR_LINEを使い、各バーへ色番号を直接割り当てます。黄色は横ばい判定になったバーだけへ付きます。1本のデータバッファと1本の色インデックスバッファを組み合わせる仕組みは、DRAW_COLOR_LINEの公式例とSetIndexBufferの公式リファレンスで確認できます。
MQL4で4本、MQL5では1本にできる理由¶
当時のMQL4版では、1本の色付きHMAに黄・青・赤の3バッファを使いました。3本なら9バッファとなり、記事で説明されている8本の表示上限を超えます。そのため、チャートへ次の4本を入れる構成でした。
HMAColorの短期設定HMAColorの中期設定HMAColorの長期設定- 3本の傾きを読む
HMA3LineJudgement
MQL5にはカラーインデックス用のバッファがあり、カスタムインジケータでは最大512バッファを利用できます。カスタムインジケータの公式リファレンスにある上限の範囲内で、今回は次の10バッファを1ファイルへまとめました。
| 用途 | バッファ数 |
|---|---|
| 3本のHMAデータ | 3 |
| 3本の色インデックス | 3 |
| 買い・売りのエントリー | 2 |
| 買い・売りの決済 | 2 |
| 合計 | 10 |
外部iCustom()への依存がなくなり、ファイル名やバッファ番号の食い違いで判定できない問題も避けられます。
判定ロジックを状態遷移として整理する¶
3本の方向をまとめた状態を、上昇一致+1、下降一致-1、不一致0とします。
| 前の状態 | 現在の状態 | 表示 |
|---|---|---|
| 0または-1 | +1 | 買いエントリー矢印 |
| 0または+1 | -1 | 売りエントリー矢印 |
| +1 | 0または-1 | 買いポジションの決済ダイヤ |
| -1 | 0または+1 | 売りポジションの決済ダイヤ |
原版は、3本一致から不一致へ移ったときに決済を描きます。一方、3本上昇から3本下降へ直接反転した場合は、売り矢印を出しても買い決済のダイヤを明示しません。MQL5版は状態遷移を分け、直接反転なら決済と反対方向の新規シグナルを同じバーへ両方記録します。
ただし、これはチャート上のシグナル定義です。実際の注文、スプレッド、約定ずれ、保有中の管理は行いません。
原版コードで見直した4点¶
1. 配列の範囲外参照をなくした¶
原版のループはBarsから始まり、さらにi+1を参照します。バー番号の最大値はBars-1なので、そのまま移すと範囲外です。MQL5版は、HMAを計算できる最古シフトを期間と平方根期間から求め、比較用の1本まで確保してから処理します。
2. 毎ティック6回×全履歴の外部呼び出しをやめた¶
原版の判定は、各バーで3期間×現在と1本前、合計6回iCustom()を呼びます。しかも計算済みバー数から求めたlimitをループへ使わず、毎回全履歴を処理します。
MQL5版はHMAの中間値を配列へ一度作り、新しいバーが来たときだけ対象履歴を再計算します。同じバー内のティック更新では、最新HMAだけを更新します。
3. 未確定足と確定足を分けた¶
HMA線そのものは最新価格に追従します。しかし、形成中のバーで3本の向きが揃っても、終値までに崩れる可能性があります。InpClosedSignalsOnly=trueではバー0の矢印とダイヤを消し、確定したバーだけを売買判定に使います。
4. 通知を安全側へ変更した¶
原版はポップアップとメールが初期値で有効でした。MQL5版は両方を無効にし、有効化した場合も新しいバーが始まった時点で、直前の確定バーだけを通知します。チャートへ付けた直後に過去シグナルが連続通知されることはありません。
専用MT5での動作確認¶
売買を行わない専用テストMT5へ配置し、実際のチャートへ適用して確認します。
| 項目 | 設定・結果 |
|---|---|
| 通貨ペア・時間足 | EURUSD・1時間足 |
| HMA期間 | 100 / 300 / 600 |
| 横ばい閾値 | 0ポイント(原版互換) |
| シグナル | 確定足のみ |
| 描画 | 3本HMA、色、買い・売り・各決済バッファを確認 |
| コンパイル | 0 errors / 0 warnings |
画像はMT5から直接取得したGreen on Blackの実チャートです。緑のローソク足に対し、HMAは上昇が青、下降が赤、横ばいが黄です。エントリーは上下の矢印、3本一致が崩れた決済は小さなダイヤで表示します。
パラメータ¶
| パラメータ | 初期値 | 説明 |
|---|---|---|
InpFastPeriod | 100 | 短期HMAの期間 |
InpMiddlePeriod | 300 | 中期HMAの期間 |
InpSlowPeriod | 600 | 長期HMAの期間 |
InpAppliedPrice | PRICE_CLOSE | HMAへ使う価格 |
InpFlatThresholdPoints | 0.0 | 横ばいと判定する傾きの幅 |
InpClosedSignalsOnly | true | 確定足だけへシグナルを出す |
InpMarkerOffsetPoints | 30.0 | 矢印・ダイヤを価格から離す距離 |
InpMaxBars | 1500 | 描画する最大バー数 |
InpPopupAlert | false | 確定シグナルのポップアップ通知 |
InpEmailAlert | false | 確定シグナルのメール通知 |
期間は2 <= Fast < Middle < Slowの順で指定します。InpFlatThresholdPointsを大きくすると黄色が増え、3本一致の条件は厳しくなります。通貨ペアの桁数で同じポイント数の値幅が変わるため、閾値は銘柄ごとに調整してください。
ダウンロード¶
14_HMA3Line_Judgement_v1_00.mq5 をダウンロード
MT5のIndicatorsへ保存してコンパイルし、十分な履歴を読み込んだチャートへ適用してください。600期間HMAはさらに平方根期間の中間値を必要とするため、履歴が少ない直後は描画が始まりません。
ロジック評価の結論¶
3本のHMAが同じ方向を向く条件は、短期だけの揺れを除き、複数の速度でトレンドが揃った場面を見つける方法として筋が通っています。色と状態遷移を一画面へまとめる発想も、裁量判断の補助として分かりやすいものです。
一方、長期HMAまで反転してから入るため、トレンドの初動より遅くなります。横ばい相場では一致と不一致を繰り返し、決済が増える可能性もあります。元記事が注意したとおり、少なくとも次の検証なしに「勝てるロジック」とは評価できません。
- HMAの傾きの大きさと3本の上下関係
- 時間帯とボラティリティの条件
- 損切り、利確、反転時の建て直し
- スプレッドを含む銘柄・時間足別バックテスト
今回確認できたのは、指定された状態を再現し、確定足で一貫して記録できることまでです。シグナルの収益性は、次のEA化やバックテストで別に評価する必要があります。
関連用語¶
前後の記事¶
前: 【移植#13】OnChart RCI — 同値の順位問題をMQL5で解き直す