【移植#15】SMA基準とEMA基準のボリンジャーバンド — 中心線の違いをMT5で比較¶

この記事の3行まとめ
- 2009年の原典で示された「SMA基準の赤いバンドとEMA基準の青緑バンドは少し違う」をMT5で再検証しました
- 標準偏差の幅を共通にすると、2組の差は中心線であるSMAとEMAの反応速度の差として読めます
- 表示差は確認できましたが、どちらが売買で有利かを示す検証ではありません
今回の原典はForex Tester 2のインジケータ作成記事¶
投稿日順で次に当たるのは、2009年12月27日の「ForexTester2 のインジケータを作る方法。」です。
原典の中心は、当時のForex Tester 2向けインジケータをLazarusやDelphiでビルドする手順でした。その実例として、SMA基準の赤いボリンジャーバンドと、EMA基準の青緑のバンドを同じチャートへ表示し、「微妙に違う」と紹介しています。
古い開発環境の導入手順をそのまま再掲しても、現在のMT5では役立ちません。そこで今回は、記事で確認できる技術的な問いをMQL5で再構成しました。
中心線をSMAからEMAへ変えると、同じ価格・期間・標準偏差倍率のバンドはどう変わるのか?
原典と今回の実装の関係は次のとおりです。
| 区分 | 内容 |
|---|---|
| 元記事の主題 | Forex Tester 2向けインジケータの作成方法 |
| 元記事の実例 | SMA基準の赤いバンドとEMA基準の青緑バンドを比較 |
| 元記事で確認できる結論 | 2組の線には小さいながら見た目の差がある |
| 今回の再構成 | SMAとEMAの中心線を同じMT5チャートへ同時表示 |
| 比較を明確にする条件 | 期間、価格、標準偏差、倍率を共通にする |
| 再現上の限界 | 当時の配布ソースを移植したものではなく、記事の比較アイデアを数式から再実装 |
変えるのは中心線、幅は共通にする¶
期間を \(N\)、価格を \(P_t\) とすると、SMAは窓内を同じ重みで平均します。
EMAは直近価格ほど大きな重みを持つ再帰式です。
今回の標準偏差は、同じ期間の価格から母標準偏差として計算します。
標準偏差倍率を \(K\) とし、2組のバンドを次のように定義しました。
幅を共通にしたため、上限同士と下限同士の差はどちらも \(EMA_t-SMA_t\) です。つまり画像で見える2組のズレは、標準偏差の計算差ではなく、中心線の反応速度の差として読めます。
これは比較条件を揃えるための設計です。「EMA基準のボリンジャーバンド」に唯一の標準定義がある、と主張するものではありません。EMAからの偏差で幅まで再定義すれば、別のインジケータになります。
チャートで差が広がる場面¶
EMAは直近価格の重みが大きいため、価格が一方向へ急に動いた場面ではSMAより早く追従します。
| 相場の状態 | 見え方 |
|---|---|
| 急な上昇 | EMA基準の水色バンドがSMA基準の赤橙バンドより早く上へ移りやすい |
| 急な下落 | EMA基準の水色バンドが早く下へ移りやすい |
| 値動きが落ち着く | SMAとEMAの差が縮まり、2組の線が近づきやすい |
| 方向転換 | 反応の速いEMA側が先に曲がり、線の並びが入れ替わることがある |
一方、今回の2組は同じ \(\sigma_t\) を使うため、各時点の上下幅は等しくなります。線が離れて見える場面でも、ボラティリティを別々に評価しているわけではありません。
MQL5実装で確認した4点¶
1. EMAの初期値をSMAにした¶
EMAは前のEMAを必要とするため、どこから計算を始めるかで初期区間が変わります。今回は最初に期間分のデータが揃ったバーでSMAを初期値とし、それ以降をEMAの漸化式で更新します。
これにより、開始直後に価格と無関係な0からEMAが立ち上がることを避けています。
2. 入力配列と出力バッファの向きを揃えた¶
OnCalculate()へ渡される価格配列は、コード内で古いバーから新しいバーへ進む通常配列に統一しました。SetIndexBuffer()で接続した6本の出力バッファも同じ向きで扱い、i-1が必ず1本前になるようにしています。
OnCalculateの公式リファレンスでは、入力配列の向きに依存しないためArraySetAsSeries()を明示することが推奨されています。SetIndexBufferの公式リファレンスにも、接続後のバッファの索引方向に関する注意があります。
3. 再計算は直前の1本からにした¶
初回は全履歴を計算し、2回目以降はprev_calculated-1から更新します。形成中バーだけでなく直前のバーも計算し直すため、履歴の更新や最新値の変化を反映しながら、毎ティック全履歴を走査する負荷を避けられます。
4. 標準偏差の丸め誤差を防いだ¶
分散は理論上0以上ですが、浮動小数点の丸めによって、ごく小さい負値になる場合があります。-1.0e-12より大きい微小な負値は0へ丸め、明らかに負なら計算を中止してログへ残すようにしました。
専用MT5での動作確認¶
売買を行わない専用テストMT5へ配置し、実際のチャートへ適用しました。
| 項目 | 設定・結果 |
|---|---|
| 通貨ペア・時間足 | EURUSD・1時間足 |
| 計算期間 | 20 |
| 標準偏差倍率 | 2.0 |
| 適用価格 | 終値 |
| 読み込み済みバー | 10,004本 |
| SMA基準 | 赤橙の上限・中心・下限 |
| EMA基準 | 水色の上限・中心・下限 |
| キャプチャ | 成功、エラー0 |
| コンパイル | 0 errors / 0 warnings |
画像はMT5から直接取得したGreen on Blackの実チャートです。価格が大きく動いた区間では2組の中心線が離れ、落ち着いた区間では重なる様子を確認できます。
見た目の差は確認できましたが、この画像だけで予測精度や収益性は判断できません。反応が速いことは、転換への追従が早い一方で、短期的な揺れにも反応しやすいことを意味します。
パラメータ¶
| パラメータ | 初期値 | 説明 |
|---|---|---|
InpPeriod | 20 | SMA、EMA、標準偏差に使う期間 |
InpDeviation | 2.0 | 標準偏差へ掛ける倍率 |
InpAppliedPrice | PRICE_CLOSE | 計算に使う価格 |
適用価格は終値のほか、始値、高値、安値、中央値、典型価格、加重終値から選べます。期間は2以上、標準偏差倍率は0より大きい値が必要です。不正な値なら初期化を中止します。
ダウンロード¶
15_BB_Basis_Compare_v1_00.mq5 をダウンロード
MT5のIndicatorsへ保存してコンパイルし、チャートへ適用してください。赤橙の3本がSMA基準、水色の3本がEMA基準です。
ロジック評価の結論¶
原典の「SMA基準とEMA基準では微妙に違う」という観察は、MT5でも確認できました。比較条件を揃えると、その違いは中心線の平滑化方式から生まれます。
EMA側は急な変化へ早く追従し、SMA側は窓内を等しく平均するため相対的にゆっくり動きます。ただし、速い方が常に優れているわけではありません。用途を決めるには、少なくとも次を分けて検証する必要があります。
- バンドタッチや終値抜けの発生回数
- シグナル後の順行幅と逆行幅
- トレンド相場とレンジ相場での差
- スプレッドを含む売買ルールとしての成績
今回確認できたのは、中心線だけを変えた2組のバンドを同じ条件で計算し、実チャート上の差を再現できることまでです。
関連用語¶
前後の記事¶
前: 【移植#14】3本HMA判定 — 色・エントリー・決済をMQL5で1本化