コンテンツにスキップ

【移植#56】アクティブタブを断定しない — MT5標準イベントで最後の操作チャートを追跡

MT5のEURUSD H1チャートに、アクティブタブを断定せず標準イベントだけを待つ表示を出した検証画面

この記事の3行まとめ

  • MT4のWin32 DLLによるMDIアクティブ判定を、そのままMT5へ持ち込まない
  • OnChartEvent()で観測できた最後のクリック・キー入力を端末全体で共有する
  • イベント未観測または期限切れはUNKNOWN / STALEとし、アクティブとは表示しない

元記事の目的と、MT5で変えるべき前提

原典は、複数チャートを開いたMT4で自分のチャートがMDI上のアクティブ画面かを調べる記事です。user32.dllGetParent()WM_MDIGETACTIVEを使い、ウィンドウハンドルを比較していました。

しかしMT5の標準チャートAPIには、現在のタブがOSの入力フォーカスを持つかを返す読み取りプロパティはありません。チャートプロパティ一覧にあるCHART_BRING_TO_TOPは表示順を変更する書き込み操作で、アクティブ状態の取得ではありません。

そこで今回は「アクティブ」を偽装せず、各チャートに同じインジケータを入れて、最後に観測した操作イベントだけを共有します。これは元記事の問題意識を、MT5で検証可能な境界へ置き換える移植です。

OnChartEvent()で観測できる範囲

OnChartEvent()はクリック、オブジェクトクリック、キー入力、マウスホイールなどを受け取れます。公式イベント一覧にある通り、キー入力イベントはチャートウィンドウが入力フォーカスを持つ場合に発生します。したがって、イベントを受け取ったチャートが「操作された可能性が高い」ことは言えても、受け取っていないチャートが非アクティブだとは言えません。

実装は次のように保守的です。

  1. イベントを受けたインスタンスがChartID()、時刻、イベント種別を端末グローバル変数へ書く
  2. 全インスタンスが同じキーをタイマーで読み、最後のチャートIDと経過秒を表示する
  3. InpStaleAfterSecを超えたら、チャートIDを消してUNKNOWN / STALEに戻す

コードは56_Chart_Focus_Event_Tracker_v1_00.mq5からダウンロードできます。売買注文やDLL呼び出しは行いません。

検証結果

専用のMT5環境(ビルド6061、EURUSD・H1)でインジケータとキャプチャ用EAをコンパイルし、いずれもエラー0・警告0でした。初期状態では入力イベントをまだ観測していないため、画面はUNKNOWN / STALE相当の待機表示になります。これは失敗ではなく、フォーカスを推測しないことを確認するための状態です。

実際にチャートをクリックまたはキー入力すると、同じInpChannelを使うインスタンス間で最後の観測チャートが更新されます。OSのアクティブタブそのものが必要な用途では、この方式ではなく、UI要件を見直してください。

まとめ

MT4時代のウィンドウハンドル照会は、MT5標準APIの範囲を超えています。移植で大切なのは、似た名前のプロパティを探して断定することではありません。観測できるイベントだけを記録し、観測できない時間はUNKNOWNとして残すことで、DLLなしでも監査可能なチャート操作トラッカーにできます。


前後の記事

前: 【移植#55】古いsymbols.sel改変をやめる — 固定スプレッドのカスタム銘柄をMQL5で作る

次: 【移植#57】MODE_STOPLEVELを書き換えない — MT5の停止距離を読み、条件だけを比較する

— SPONSORED —