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

この記事の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バーにつき最大1回です。同じ形成中バーで上抜けと下抜けを繰り返しても、通知の連打を優先して防ぎます。
メール本文へ入れる情報¶
通知本文は、どのチャートで何が起きたかを後から判断できるよう、次の項目を毎回同じ順番で組み立てます。
| 項目 | 内容 |
|---|---|
| Symbol | 通貨ペア名 |
| Timeframe | 判定時間足 |
| Signal | BUYまたはSELL |
| Bid / Ask | メッセージ作成時の価格 |
| Signal bar | クロスを判定したバー時刻 |
| Generated | メッセージ作成時刻と時刻基準 |
| Indicator | 実行中のインジケーター名 |
| Broker | 接続先の会社名。取得できない場合はN/A |
生成時刻はサーバー時刻を初期値にしています。InpUseLocalTimeを有効にするとPC時刻へ切り替わります。シグナルバーの時刻はチャートの時刻です。
SendMailを使う前に知っておくこと¶
MQL5のSendMail()は、MT5のメール設定で指定した宛先へメールを送信キューとして登録します。端末側でメール送信が有効か確認し、戻り値がfalseならGetLastError()をログへ出します。
重要なのは、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へ