コンテンツにスキップ

【移植#33】確定足と予報を分けるメール通知 — MACDゼロクロスを同一バー1回だけ送る

EURUSDの1時間足でMACDゼロクロス、確定足モード、最新SELLシグナル、通知停止状態を表示したMT5画面

この記事の3行まとめ

  • MACDのゼロラインクロスを、確定足または形成中バーのどちらで判定するか選べます
  • 初回の過去通知と同一バーの連打を防ぎ、通貨・時間足・価格・時刻をそろえた本文を作ります
  • 専用MT5で標準MACD、最新クロス、矢印、12バッファを照合し、外部通知は送らずに検証しました

今回の原典は「通知部品を複数インジケーターへ追加する」

投稿日順で次に当たる2010年1月20日の記事では、ZeroLag EMA、NINA、FX FISH 2MAという複数のMQL4インジケーターへ、共通のポップアップとメール機能を追加していました。

元記事「ZeroLag_EMAとNINAとFX_FISH_2MAにメール機能をつけてみた。」を読む

原典の重要な点は、通知関数そのものより次の設計です。

  • 画面通知とメールを個別にON/OFFできる
  • メールへ通貨ペア、時間足、売買方向、Bid/Ask、時刻、指標名、業者名を入れる
  • 確定前に知らせる予報モードと、確定足で知らせるモードを分ける
  • 同じバーで通知を繰り返さない
  • リペイントする指標では、途中で条件が消える可能性を説明する

今回は特定の旧インジケーターを再配布するのではなく、この通知設計をMACDゼロラインクロスへ適用します。原典で示された2本前はゼロより上、1本前はゼロ以下という下降クロスの例を、そのまま上下両方向へ広げました。


判定するクロス

初期設定は標準的なMACD 12/26/9です。通知条件に使うのはMACDメインラインとゼロラインの関係で、オレンジのシグナル線とのクロスではありません。

方向 古い側の値 新しい側の値
BUY 0以下 0より上
SELL 0以上 0より下

水色のヒストグラムがMACDメインライン、オレンジ線がシグナル線です。上抜けには緑の上矢印、下抜けには赤の下矢印を置きます。

直近300本のMACDとシグナル線から上下対称の表示範囲を計算し、一時的な大きな値によって最近の変化が潰れにくいようにしました。この縮尺は見やすさのためだけに使い、クロス判定値は変更しません。


確定足モードと予報モード

モード 比較する足 長所 注意点
CONFIRMED BAR 2本前と1本前 足確定後も条件が変わらず再現しやすい 通知は足の確定まで遅れる
PREVIEW CURRENT BAR 1本前と形成中の0番足 クロス途中で早く気づける 足確定前にクロスが消えることがある

初期設定はCONFIRMED BARです。原典のQuick Alertに相当するのがPREVIEW CURRENT BARですが、これは確定シグナルではなく予報です。

形成中バーで一瞬ゼロを越えて通知した後、終値では元へ戻ることがあります。これはコードの誤動作ではなく、0番足の値がティックごとに変わるためです。予報モードを使う場合は、通知後にチャートで再確認する前提にしてください。


同一バーでは1回だけ通知する

インジケーターの計算は、同じバーでもティックごとに繰り返されます。クロス条件だけを書くと、条件が成立している間に同じ通知を連打する恐れがあります。

配布版は次の順序で通知を制御します。

  1. 通知対象のバー時刻を取得する
  2. 初回読み込みでは現在の条件を記録するだけにして、過去シグナルを送らない
  3. クロスが成立しても、前回送信したバー時刻と同じなら送らない
  4. 新しいバー時刻のクロスだけ、ポップアップとメール処理へ渡す

予報モードも1バーにつき最大1回です。同じ形成中バーで上抜けと下抜けを繰り返しても、通知の連打を優先して防ぎます。


メール本文へ入れる情報

通知本文は、どのチャートで何が起きたかを後から判断できるよう、次の項目を毎回同じ順番で組み立てます。

項目 内容
Symbol 通貨ペア名
Timeframe 判定時間足
Signal BUYまたはSELL
Bid / Ask メッセージ作成時の価格
Signal bar クロスを判定したバー時刻
Generated メッセージ作成時刻と時刻基準
Indicator 実行中のインジケーター名
Broker 接続先の会社名。取得できない場合はN/A

生成時刻はサーバー時刻を初期値にしています。InpUseLocalTimeを有効にするとPC時刻へ切り替わります。シグナルバーの時刻はチャートの時刻です。


SendMailを使う前に知っておくこと

MQL5のSendMail()は、MT5のメール設定で指定した宛先へメールを送信キューとして登録します。端末側でメール送信が有効か確認し、戻り値がfalseならGetLastError()をログへ出します。

MQL5公式「SendMail」

重要なのは、SendMail()Alert()がストラテジーテスターでは実行されないことです。公式リファレンスにも、外部とやり取りするこれらの関数はテスターで動かないと明記されています。

MQL5公式「Testing Trading Strategies」

そのため、バックテストではクロス位置、バッファ、メッセージ作成条件を確認し、実メールは通常チャートで端末のメール設定を済ませてから試します。初期設定ではポップアップとメールを両方OFFにしてあるので、チャートへ適用しただけで外部通知は発生しません。


専用MT5で確認した結果

検証画像は、専用MT5のEURUSD・H1通常チャートへ配布版を適用して撮影しました。メール送信の成功画像ではなく、通知判定と表示の検証画像です。

確認内容 結果
通貨ペア・時間足 EURUSD・H1
MACD設定 12/26/9・終値
配布版コンパイル 0エラー・0警告
専用検証EAコンパイル 0エラー・0警告
MACDメインライン 標準iMACD()と一致
シグナル線 標準iMACD()と一致
最新確定クロス SELL・標準MACDからの独立検出と一致
上下矢印 最新クロスの方向・位置と一致
出力バッファ 12個を照合
異常期間モデル 3パターンを拒否
注文処理 なし
ポップアップ/メール OFF・外部送信なし
画面取得 成功、エラー0

検証時の市場データでは、最新確定クロスはSELLでした。市場データが更新されれば最新方向と時刻は変わります。

12個のバッファには、MACD、シグナル線、上下矢印、最新方向、最新シフト、評価シフト、確定足モード、ポップアップ、メール、テスターフラグ、メッセージ作成可否を出力します。


入力パラメーター

パラメーター 初期値 内容
InpFastPeriod 12 MACD短期EMA期間
InpSlowPeriod 26 MACD長期EMA期間
InpSignalPeriod 9 シグナル期間
InpBarMode 確定足 確定足または形成中バーを選択
InpUseLocalTime false 生成時刻をPC時刻にするか
InpEnablePopup false ポップアップを出すか
InpEnableEmail false メールを送るか
InpShowPanel true 状態パネルを表示するか

期間は1 <= 短期 < 長期 <= 1000、シグナル期間は1〜1000を受け付けます。不正な組み合わせでは初期化を中止します。


ダウンロード

33_MACD_Zero_Cross_Email_v1_00.mq5 をダウンロード

MT5のIndicatorsへ保存してコンパイルし、確認したいチャートへ適用してください。メールを使う場合は、端末のメール設定でテスト送信が成功することを先に確認してからInpEnableEmailを有効にします。

このインジケーターは通知と表示だけを行い、注文の送信・変更・決済は行いません。


使えないこと・注意点

  • MACDゼロクロスは相場状態の観測点であり、利益や売買方向を保証しません。
  • 形成中バーの予報は足確定までに消える場合があります。
  • ストラテジーテスターではポップアップとメールの実送信を確認できません。
  • SendMail()がtrueでも送信キューへの登録結果であり、最終的なメール到着までは保証しません。
  • 通知先やSMTP情報はMQLファイルへ書かず、MT5の端末設定で管理します。
  • 端末やネットワークを停止している間のシグナルを後から自動送信する機能はありません。

ロジック評価の結論

原典の価値は、アラート処理を毎回書き直さず、通知チャンネル、時刻、メッセージ、重複防止を共通部品として扱った点にあります。

現在のMQL5でも、この考え方はそのまま有効です。ただし、早い通知と確定した通知は別物です。配布版は既定を確定足にし、予報モードを明示的な選択肢として分けました。

通知を増やす前に、「どの足を見たか」「同じバーで何回送るか」「本文だけで状況を識別できるか」を決める。この順番が、鳴りすぎるアラートや後から説明できないメールを防ぎます。


前後の記事

前: 【移植#32】バックテスト後の確認チャートを毎回同じ見た目にする — tester.tpl向け表示プリセット

次: 【移植#34】7行のCTSLをほどいて再構成する — Gann Swing OscillatorをMQL5へ

— SPONSORED —