コンテンツにスキップ

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

SMA基準とEMA基準のボリンジャーバンドをEURUSD 1時間足で比較した実行結果

この記事の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は窓内を同じ重みで平均します。

\[ SMA_t=\frac{1}{N}\sum_{j=0}^{N-1}P_{t-j} \]

EMAは直近価格ほど大きな重みを持つ再帰式です。

\[ EMA_t=\alpha P_t+(1-\alpha)EMA_{t-1}, \qquad \alpha=\frac{2}{N+1} \]

今回の標準偏差は、同じ期間の価格から母標準偏差として計算します。

\[ \sigma_t= \sqrt{ \frac{1}{N}\sum_{j=0}^{N-1}P_{t-j}^{2}-SMA_t^{2} } \]

標準偏差倍率を \(K\) とし、2組のバンドを次のように定義しました。

\[ \begin{aligned} SMAUpper_t &= SMA_t+K\sigma_t \\ SMALower_t &= SMA_t-K\sigma_t \\ EMAUpper_t &= EMA_t+K\sigma_t \\ EMALower_t &= EMA_t-K\sigma_t \end{aligned} \]

幅を共通にしたため、上限同士と下限同士の差はどちらも \(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本化

— SPONSORED —