Alert時にチャートをアクティブにする。

一般的なWindowsアプリのマナーとして、バックグラウンドで動いているアプリが勝手に最前面にアクティブになることは推奨されていません。ユーザが文字入力している最中に、他のアプリにフォーカスが移ったら不便な訳です。
しかし、トレーダーにとっては、アラートシグナルを見逃すことによる機会損失の方が大きいので、無理にでもアクティブになった方が好ましいと考えられます。


そこで、今日は、Alert時にチャートをアクティブにするコードを紹介します。
(同様の目的で以前紹介した記事は、インジケータやEAのコードが改造できない状況で使えるツールでしたが、今回は自作のコードに組み込むことを前提としています。)


まずは、WindowsAPIの組み込み。

#import "user32.dll"
int  BringWindowToTop(int hWnd);
int  GetParent(int hWnd);
void SwitchToThisWindow(int hWnd,bool flag);
bool ShowWindow(int hWnd,int nCmdShow);
int  GetForegroundWindow();
bool IsZoomed(int hWnd);
#import

単にアクティブにしたいだけなのに、ウィンドウの状態を調べつつ操作してゆくので使用する関数が増えています。 SetForegroundWindow は役に立たないので、その代わりに SwitchToThisWindow を使用します。


…で、実際のアクティブ化の関数は、

void ChartActivate(bool MT4Activate = true)
{
   int hwnd = GetParent(WindowHandle(Symbol(),Period()));
   if(MT4Activate){
      int htop = GetParent(GetParent(hwnd));
      if(GetForegroundWindow() !=htop)SwitchToThisWindow(htop,true);
      if(!IsZoomed(htop))ShowWindow(htop,1);
   }
   BringWindowToTop(hwnd);//MDI内でのアクティブ化
}

です。使い方は、アクティブにしたい時に

ChartActivate();

と書くだけです。これで、MT4 を最前面にし、MT4 内の複数のチャートの中からもアクティブにします。MT4 を最前面にする必要が無い時は、 ChartActivate(false); とします。


これで、Alert考。 の
>5. Alert 時に MT4 を最前面にもってくる。
>6. Alert 時に チャート内で対象通貨ペアチャートをアクティブにする。
は出来るようになったと思いますが、如何でしょうか・・・