コンテンツにスキップ

【移植#82】平滑平均足を方向バーにする — 赤と白に残す情報、捨てる情報

EURUSD H1の価格と、SMMA6・LWMA2による赤白の平滑平均足方向バーを表示したMT5実画面

この記事の3行まとめ

  • 平滑平均足の方向を、高さ1の赤白バーにしてサブウィンドウへ表示します
  • 元コードは方向に応じて並べ替えた高値・安値を平滑化して比較します。平均足の実体だけの比較とは異なります
  • 初期値を定義し、同値は赤、形成中の足は既定で非表示にしました。バーの高さは強さを表しません

平均足の形を省き、方向だけを見る

今回の原典は、2010年4月14日の記事です。

元記事「heikenashismoothed2をサブウィンドウでBar表示。」を読む

読者の要望は、平滑平均足をローソクの形ではなく、上がっているか下がっているかを色で見る表示へ変えることでした。原典は2本のヒストグラムを使い、片方を1、もう片方を0にして赤白のバーを作っています。

移植#21の平均足サブウィンドウは平均足のローソクそのものを表示します。今回は平滑化と方向の圧縮が主題です。実体やヒゲの大きさを捨てるので、表示は単純になりますが、読み取れる情報も減ります。

配布コードまで読むと、比較しているものが分かる

原典から案内されている配布ZIP「SW_MD45.zip」には、方向バー版のMT4コードが含まれています。その既定設定は、最初がSMMA・期間6、二段目がLWMA・期間2です。

処理は次の順番です。

  1. 通常足の始値・高値・安値・終値を、それぞれSMMAで平滑化します。
  2. 平滑化後の4価格から、平均足の始値・高値・安値・終値を計算します。
  3. 平均足の終値が始値より高ければ、Aへ平均足安値、Bへ平均足高値を入れます。それ以外は逆に入れます。
  4. AとBを別々にLWMAで平滑化します。
  5. 平滑化後のAがBより小さければ白、それ以外は赤にします。

比較対象は、二段目で平滑化した「方向付きの高値・安値」です。 平滑平均足の始値と終値を比較する別の実装へ置き換えると、転換する場所が変わり得ます。

たとえば期間2のLWMAでは、直近足の重みが2、その前が1です。直近の平均足が上向きでも、前の下向き足の値幅が大きければ赤が続くことがあります。現在の平均足の色を、そのままコピーした表示ではありません。

計算式と初期値

最初のSMMAの期間を \(p\) とします。最初の有効値は、最古の \(p\) 本の単純平均です。それ以降は、4価格それぞれに次式を使います。

\[ S_t = \frac{(p-1)S_{t-1}+P_t}{p} \]

平滑化した4価格を \(O_t,H_t,L_t,C_t\) とすると、平均足は次のように計算します。

\[ HC_t = (O_t+H_t+L_t+C_t)/4 \]
\[ HO_t = (HO_{t-1}+HC_{t-1})/2 \]
\[ HH_t = \max(H_t,HO_t,HC_t),\quad HL_t = \min(L_t,HO_t,HC_t) \]

最初の平均足始値だけは、\((O_t+C_t)/2\) と定義しました。原典には最古の足で配列の一つ先を参照する処理があるため、その境界処理をそのまま持ち込みません。

\(HO_t<HC_t\) なら \((A_t,B_t)=(HL_t,HH_t)\)、それ以外なら \((A_t,B_t)=(HH_t,HL_t)\) です。二段目の期間を \(q\) とすると、A側は次式で平滑化します。B側も同じです。

\[ \bar A_t = \frac{\sum_{j=0}^{q-1}(q-j)A_{t-j}}{q(q+1)/2} \]

最古の足を0番としたとき、最初に表示できる位置は \(p+q-2\) です。既定値では7本目から計算できますが、確定足だけを表示するには、その後ろに形成中の足も必要です。

初期値を明示して再実装しているため、旧MT4版と全履歴で完全に同じ数値になるとはしていません。移植対象は原典の既定の計算順序と方向判定です。原典にあるMA方式の切替は省き、SMMA→LWMAに固定しました。

赤と白をどう読むか

表示 条件 意味
白 平滑化後のA < B 値幅と重みを含めた上向き側の判定
赤 平滑化後のA ≥ B 下向き側、または同値の判定
空白 準備期間、または非表示設定の形成中足 判定を表示していない

両者が等しい場合も、原典の分岐に合わせて赤にします。したがって、赤を必ず「下落している」と読み替えることはできません。

赤も白も高さは1です。高さから勢い、値幅、確信度を比較することはできません。また、二段階の平滑化は転換への反応を遅らせます。掲載画像のEURUSD・H1でも、価格の小さな反発と色の転換が一対一には対応していません。

MT5版の使い方

82_Smoothed_HA_Direction_v1_00.mq5 をダウンロード

MT5の「ファイル → データフォルダを開く」から、MQL5/Indicatorsへ保存し、MetaEditorでコンパイルしてください。ナビゲータからチャートへ適用すると、下段に方向バーが出ます。売買注文を出す機能はありません。

入力 既定値 内容
InpSmoothingPeriod 6 最初のSMMA期間
InpDirectionPeriod 2 方向付き高安値にかけるLWMA期間
InpClosedOnly true 形成中の足を表示しない

期間の受付範囲は1〜10,000です。大きい期間には長い履歴が必要で、特に二段目を大きくすると初回計算の負荷が増えます。通常は既定値から確認してください。

InpClosedOnly=falseなら右端の形成中足も表示します。その色は価格更新で変わり得ます。trueでも、新たな過去履歴の取得や期間変更で初期値から再計算した場合まで、過去の色が永久に固定されるという意味ではありません。

MT5ではDRAW_COLOR_HISTOGRAMを使います。0番バッファは高さ、1番は色番号(赤0・白1)です。高さだけを読んでも方向は判別できません。CopyBufferで取得する際は、足位置と取得件数を確認し、準備期間や非表示の足のEMPTY_VALUEを除外してください。

実機検証で確認したこと

MT5 Build 6182、EURUSD・H1で実行しました。配布インジケーターと検証用EAは、どちらもコンパイル0エラー・0警告です。冒頭画像はその実画面です。

設定 取得した履歴 準備期間後の照合本数
SMMA6 / LWMA2・確定足表示 10,012本 10,006本
SMMA6 / LWMA2・形成中足も表示 10,012本 10,006本
期間1 / 期間1・形成中足も表示 10,012本 10,012本

全履歴を使った別実装の計算と、合計30,024本分の判定を照合しました。A・Bの数値は絶対誤差 \(10^{-12}\) 以内、色番号と表示条件は一致しました。確定足表示のケースでは、形成中足の高さがEMPTY_VALUEであることも含めて確認しています。

準備期間の空白、現在足の表示切替、期間1の境界も確認しました。Aに0.001を加えた負対照は一致として受け入れられませんでした。注文数とポジション数も変わっていません。同値の赤判定はコードの分岐と別実装の一定価格データで確認しており、MT5で同値の人工相場を動かした試験ではありません。

この検証は、定義した計算式とMT5出力の照合です。旧MT4との全足一致、全入力期間の網羅、将来の価格を当てる力や収益性の検証ではありません。

方向を見やすくする代わりに、情報を減らす

方向バーは、ローソクの形を追うより色の連続を確認しやすい表示です。一方、平均足の実体とヒゲ、元の値幅は見えなくなります。

価格チャートと並べて「平滑化した判定がどう続いているか」を見る用途が合っています。赤白の切替だけで売買の良し悪しを決めず、何を圧縮した表示なのかを意識して使ってください。

あわせて読みたい記事


前後の記事

前: 【移植#81】iCustomの入力を省略すると何が返る? — 6通りの呼出しと3バッファを照合

次: 【移植#83】MAクロスへ終値タグを付ける — 表示価格と約定価格を分ける

— SPONSORED —