コンテンツにスキップ

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

EURUSD H1のSMA13とSMA16、およびクロスした確定足の終値タグを表示したMT5実画面

この記事の3行まとめ

  • SMA13とSMA16がクロスした確定足へ、その足の終値を価格タグで表示します
  • タグは過去の終値です。シグナル発生時のBidや、その価格で売買できた証拠ではありません
  • 確定500本を4回照合し、上向き25件・下向き25件のタグと、削除・再装着の動作を確認しました

矢印だけでなく、価格も見たい

投稿日順で先にある4月15日は、MT4用インストーラの紹介です。今回は新しい配布支援ツールを作る課題には広げません。4月16日の外部IMとDLLによる通知も、価格表示とは別の接続環境を必要とするため、番号を使わず進みます。

今回採用したのは、4月17日の記事です。

元記事「クロスシグナルに価格を表示する。」を読む

原典では、シグナルが矢印や丸だけでは、どの価格だったのかを確認しにくいという相談に対し、移動平均のクロスへ価格タグを追加しています。改造後の配布コードと改造前のコードを比較すると、クロスの計算を変えるのではなく、オブジェクトの作成・更新・削除を足した改造でした。

移植#22は、一定間隔の価格の節目へタグを置くものでした。今回は、条件が成立した足の時刻と価格へタグを置きます。

元コードのタグは、Bidではなく足の終値

相談文にはBidを表示したいという例が出てきますが、配布コードがタグの価格座標へ渡しているのはClose[i]です。時刻の座標はTime[i]です。

したがって、表示しているのはその足の終値であって、クロスが最初に起きたティックのBidではありません。原典は形成中の足も処理するため、その足では価格や判定が更新され得ます。

MT5版では意味をそろえやすくするため、次の仕様に限定しました。

  • 現在のチャートと同じ時間足で、終値のSMA13とSMA16を使います。
  • 形成中の0番足はタグの対象にせず、確定した1番足以降を判定します。
  • タグの価格はシグナル足の終値、時刻はその足の開始時刻です。
  • 上向きは水色、下向きはピンクです。

形成中のMA線は更新されますが、形成中足に価格タグは出ません。確定した足を判定できるのは、その次の足が始まった後です。タグが足の開始位置に付くことを、「その開始時刻にシグナルを知っていた」と読み替えないでください。

同値への到達もクロスに含める

新しい確定足の短期MAを \(F_t\)、長期MAを \(S_t\) とすると、原典の上向き条件は次の式です。

\[ F_{t-1}<S_{t-1}\quad\land\quad F_t\ge S_t \]

下向きは反対です。

\[ F_{t-1}>S_{t-1}\quad\land\quad F_t\le S_t \]

「現在の足では同値でもよい、前の足では明確に反対側」という条件です。移植版もこの不等号を保ちました。

前の確定足 → 新しい確定足 判定
短期が下 → 同値、または上 上向きタグ
短期が上 → 同値、または下 下向きタグ
同値 → 上、または下 新しいタグなし
同じ側のまま 新しいタグなし

これは「2本の線が足の途中の何時何分に交わったか」を推定する処理ではありません。足ごとのMA値を比較しています。同値判定に独自の許容幅は加えていません。

MT5では価格オブジェクトを使う

移動平均はMT5のiMA()でハンドルを作り、CopyBuffer()で取得します。取得件数が不足している間は、未取得値を使ってクロスを判定しません。

価格タグにはOBJ_ARROW_LEFT_PRICEを使います。矢印の描画バッファへ価格の文字列を書き込む方法ではありません。MT5版では2本のMA線と価格タグを表示し、元コードの矢印の併記は省きました。

内部のシグナルバッファにも終値を入れているので、別のプログラムから取り出せます。

バッファ番号 値
0 短期SMA
1 長期SMA
2 上向きクロスの足の終値。それ以外はEMPTY_VALUE
3 下向きクロスの足の終値。それ以外はEMPTY_VALUE

形成中足の2番・3番バッファは空です。描画対象には上限があり、古い全履歴のシグナルを無制限に保存する仕組みではありません。

使い方と入力

83_Cross_Price_Tags_v1_00.mq5 をダウンロード

MT5の「ファイル → データフォルダを開く」からMQL5/Indicatorsへ保存し、MetaEditorでコンパイルします。ナビゲータからチャートへ適用してください。

入力 既定値 内容
InpFastPeriod 13 短期SMAの期間
InpSlowPeriod 16 長期SMAの期間
InpLookback 500 タグを表示する直近の確定足数
InpInstanceId A 同じチャート内で区別するID

期間は短期1以上・長期は短期より大きく10,000以下、表示本数は1〜10,000です。IDは英数字とアンダースコアで1〜12文字。同じチャートへ複数追加するときは、A・Bなど異なるIDにしてください。使用中の同じIDでは起動しません。

通常のティックごとにタグ全体を作り直さず、新しい足が始まったときに対象を更新します。対象外になった古いタグは削除し、指標を外すと、そのIDに属するタグを削除します。

原典の別時間足への投影、MA方式・適用価格・シフトの切替、音・メール通知は今回の移植には含めません。現在の時間足・終値SMA・確定足へ範囲を限定しています。

実機で照合した結果

MT5 Build 6182、EURUSD・H1で検証しました。配布インジケーターと検証EAは、どちらもコンパイル0エラー・0警告です。

MAは、検証側で終値を期間本数分合計して割る別計算と照合しました。そのMAからクロスを再判定し、タグの種類・時刻・価格・色・総数まで確認しています。

検査 結果
確定足の対象 500本
上向き/下向きのタグ 25件/25件
通常状態の照合 3回、不一致0
削除して再装着した後の照合 1回、不一致0
4バッファ×500本×4回 8,000値一致(空値を含む)
タグ価格を1ポイントずらした負対照 一致判定を拒否
指標を外した後 自分のタグは0件、無関係のオブジェクトは残存
注文数・ポジション数 変更なし

数値の比較許容差は \(10^{-10}\) 未満です。同じ50件のシグナルを繰り返し検査したもので、200件の別シグナルが見つかったという意味ではありません。形成中足のシグナルバッファが空であることも確認しました。

冒頭画像は、履歴側へスクロールして撮影した実画面です。この試験では全入力の網羅や、人工ティックによる新足切替の再現までは行っていません。同値への到達・離脱の扱いは上の条件式として定義しています。

終値が分かっても、その価格で約定するとは限らない

終値タグがあると、目視でクロスの場所と価格を確認しやすくなります。一方、次の足の始値とのずれ、売買のBid・Ask差、手数料やスリッページは、この表示に含まれません。

また、短い間隔でクロスが続くと価格タグが重なります。原典でも指摘されている表示上の限界です。チャートを拡大したり、タグのツールチップやデータウィンドウを確認してください。タグを離して配置するために、価格座標を実際の終値からずらすことはしていません。

今回の道具は「クロス足の終値を確認するもの」です。値札が付いたことで、その価格で売買できたことや、クロス戦略に利益が出ることまで検証できたわけではありません。

あわせて読みたい記事


前後の記事

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

次: 【移植#84】MAクロスを次足始値で仮想約定する — インジケーター内損益線の読み方

— SPONSORED —