コンテンツにスキップ

【移植#12】SMMA=2×EMA−1?— 期間換算をMT5で確かめる

SMMA10とEMA19をGreen on BlackのEURUSD 1時間足へ重ねた実行結果

この記事の3行まとめ

  • 「SMMA = 2×EMA−1」は移動平均の値を計算する式ではなく、期間の換算則です
  • N期間SMMAと(2N−1)期間EMAは平滑化係数がどちらも1/Nになります
  • MT5標準のiMA()同士をEURUSD 1時間足で比較すると、直近500本の最大差は0.000000 pointsでした

今回はコード移植ではなく「短い知見の検証」

元記事は、2009年12月24日に公開された「SMMA= 2*EMA -1」です。

元記事を読む

今回は移植できるMQL4ソースが掲載された記事ではありません。そこで、元記事に書かれた期間換算をMQL5で再現し、実際の価格データで確かめるアイデア再構成型の回としました。

元記事が明言していることと、本記事で追加したものを先に分けておきます。

区分 内容
元記事の明示 N期間SMMAは、期間を2N−1としたEMAと同じになる。SMMA10ならEMA19
数式から確認できること 両者の再帰計算に使う平滑化係数が1/Nで一致する
今回の追加実装 2本を重ね、最新差と直近区間の最大差をポイント単位で表示する
本記事では主張しないこと この換算が売買成績を改善する、特定の手法が利益になる、といった効果

元記事前半にある「手法の読み方」も面白い

元記事の前半は、ロブ・ブッカー氏のFX本を読んだ感想です。そこで紹介されているのが、トレード手法を読むときの次の問いでした。

  • 市場の大多数がその戦略を使ったら、相場はどう動くのか
  • 同じ戦略へ乗るべきか、それとも一手先を考えるべきか
  • その戦略が通じない値動きは何か

著者自身も「大多数が同じ戦略を取る」という仮定は確かめようがない、と留保しています。つまり、手法名や成績をそのまま信じるのではなく、成立条件と崩れる条件まで考える読み方です。

今回のSMMAとEMAも同じです。「同じらしい」で終わらず、式と実データの両方で確かめます。


「2×EMA−1」は値の計算ではない

元記事の表題だけを見ると、次のような値の計算に見えるかもしれません。

Text Only
SMMAの値 = EMAの値 × 2 − 1

しかし、意味しているのは期間です。

Text Only
EMAの期間 = 2 × SMMAの期間 − 1

例えばSMMAの期間が10なら、対応するEMAの期間は次のようになります。

Text Only
2 × 10 − 1 = 19

したがって、比較する組み合わせはSMMA(10)EMA(19)です。


なぜ同じになるのか

N期間SMMAは、前回値と現在価格を使って次のように更新できます。

\[ \operatorname{SMMA}_t = \frac{(N-1)\operatorname{SMMA}_{t-1}+P_t}{N} = \left(1-\frac{1}{N}\right)\operatorname{SMMA}_{t-1} +\frac{1}{N}P_t \]

一方、M期間EMAの平滑化係数を \(\alpha\) とすると、一般的な更新式は次の形です。

\[ \operatorname{EMA}_t = (1-\alpha)\operatorname{EMA}_{t-1}+\alpha P_t, \qquad \alpha=\frac{2}{M+1} \]

ここでEMAの期間を \(M=2N-1\) と置くと、

\[ \alpha = \frac{2}{(2N-1)+1} = \frac{1}{N} \]

となります。つまり、SMMA(N)とEMA(2N−1)は、前回値と新しい価格へ掛ける重みが同じです。

MetaTrader 5では、標準のiMA()MODE_SMMAまたはMODE_EMAを渡して両方を作成できます。指定できる平滑化方式はMetaTrader 5公式リファレンスiMA()の引数とハンドルの扱いはiMA公式リファレンスで確認できます。

初期値は無視できない

再帰式の係数が同じでも、初期値や読み込んだ履歴範囲が違えば、計算開始直後には差が出る可能性があります。別会社のチャートや別プラットフォームで比較するときは、同じ適用価格を選び、十分な過去データを読み込んでから確認してください。


実MT5で比較した結果

専用のテストMT5で、標準iMA()から2本の移動平均を作成して比較しました。

項目 設定・結果
通貨ペア・時間足 EURUSD・1時間足
適用価格 Close
SMMA 10期間・オレンジ実線
EMA 19期間・水色の点列
最新バーの差 0.000000 points
直近500本の最大差 0.000000 points

水色の点がオレンジ線の中央に並んでいるのは、2本が同じ価格座標にあるためです。今回の同一MT5・同一履歴・同一適用価格という条件では、表示上だけでなく数値上も一致しました。

この結果は「どのチャートソフトでも常にビット単位で同じ」という保証ではありません。確認できたのは、今回のMT5標準実装と取得済みデータの範囲です。


インジケータの実装

インジケータは、初期化時に2つのハンドルを一度だけ作成します。

C++
g_smma_handle = iMA(_Symbol, _Period, InpSMMAPeriod, 0,
                    MODE_SMMA, InpAppliedPrice);

g_ema_period = 2 * InpSMMAPeriod - 1;
g_ema_handle = iMA(_Symbol, _Period, g_ema_period, 0,
                   MODE_EMA, InpAppliedPrice);

OnCalculate()ではBarsCalculated()で準備状態を確認し、CopyBuffer()の取得件数が要求数と一致したときだけ描画バッファを更新します。終了時には両ハンドルをIndicatorRelease()で解放します。

表示は、完全一致した2本を判別できるよう次の役割に分けました。

  • オレンジ実線: N期間SMMA
  • 水色の点列: (2N−1)期間EMA
  • 左上の数値: 最新差と直近区間の最大絶対差

パラメータ

パラメータ 初期値 説明
InpSMMAPeriod 10 比較元となるSMMAの期間
InpAppliedPrice PRICE_CLOSE 2本へ共通して使う適用価格
InpMaxBars 3000 描画する最大バー数
InpStatsBars 500 最大差を調べる直近バー数
InpShowDashboard true 左上の比較結果を表示

EMA期間は入力値から自動的に2N−1で計算されます。


ダウンロード

12_SMMA_EMA_Equivalence_v1_00.mq5 をダウンロード

任意のチャートへ適用してください。2本が見えない場合はヒストリカルデータの読込を待ち、左上の差が更新されることを確認します。


この換算をどう使うか

この知識が役立つのは、SMMAを直接選べないチャートで近い設定を再現したいときです。例えばMT5で使っていたSMMA10を、EMAしか選べない環境へ持っていくならEMA19が候補になります。

ただし、線が同じことと、売買ルールが有効であることは別問題です。元記事前半の問いに戻れば、その移動平均が機能しない相場や、エントリー・手仕舞いの条件まで検証して初めてトレード手法になります。

短い一行のTipsでも、数式へ戻し、実データで確かめ、適用範囲を限定する。今回は、今後のアイデア再構成型の記事で使う基本姿勢も確認できる回になりました。


関連用語


前後の記事

前: 【移植#11】ADX2Pairs — 2通貨のADXでクロス円の動き出しを探す

— SPONSORED —