ブログトップ 記事一覧 ログイン 無料ブログ開設

とあるMetaTraderの備忘秘録 RSSフィード

忙しいです。ネタもないし・・・

2011-06-30

止めるまで鳴り続けるアラート。

「まず最初に何物にも煩わされない心を保つことだ。

次に、物事を真正面から見つめ、それが何のためのものなのかを知ることだ」  

マルクス・アウレリウス

Alert() の本質とは何か?それは何のためのものなのか?を考えてみました。


Alert() を呼び出すと、ダイアログを表示すると同時に警告音を発してユーザの注意を喚起します。

たとえ、一瞬PCの画面から目をそらしていたとしても、その警告音が鳴り響くことで気づくことができます。


…でも、音が鳴るのは1回だけです。鳴った瞬間にたまたま離席していたり、他の雑音と重なってしまったら、聞き逃してしまう可能性があります本来の警告音は、火災の非常ベルのようにユーザが気づいて止めるまでは、鳴り続けるべきではないでしょうか。


と言うわけで、表題の「止めるまで鳴り続けるアラート」をこちらに用意しました。AutoHotKeyによる実装なので手抜きです..。^^;

ZIPファイルにはソースコードも含まれていますが、使用するのは MySound.exe だけです。

(1) MySound.exe を鳴らしたいwavファイルと同じ名前にリネームします。

f:id:fai_fx:20110618204943p:image

↑alert.wavを鳴らすので、alert.exe にします。


(2) alert.exe をダブルクリックすると、ボタンを押すまで鳴り続けることがわかります。

f:id:fai_fx:20110618204941p:image


(3) MT4の設定画面から、alert.wav の代わりに alert.exe を指定します。

f:id:fai_fx:20110618204942p:image


これでアラート音を聞き逃す心配は無くなりました。めでたしめでたし。

2010-11-09

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

Alert でメッセージが出た後に、当該通貨ペアのタブをクリックしてアクティブにするのが面倒な人向けに役に立つ..かもしれないコードです。テスト用のscript ですが、適宜組み込んでみてください。

f:id:fai_fx:20101109140950p:image

↑本来は、アクティブ化の一行だけでOKのはずなのですが、この一行だけではツールバーの並びが崩れてしまう事が有り得るので、その前に MT4の最大化を入れています。但しこれは環境依存かもしれません。



f:id:fai_fx:20101109140949p:image

↑MT4 をステルスモードでアレしている場合、前述のコードだけでは ステルス状態 が解除されてしまうので、ステルス判定を組み込むならこんな感じ..。


キリンさんが、Alert時にWindowをアクティブにするという記事を書かれているのを思い出したので、そちらも参考にどうぞ。

2009-11-12

複数のチャートのアラート機能を一括制御する為の工夫。

人は何かの犠牲なしに何も得ることはできない。何かを得るためには、それと同等の代価が必要になる。


自作インジケータを複数のチャートに貼り付けていて、且つ、アラートに前回紹介したようなアクティブ化機能を持たせていると、本当に何かの作業に集中したい時に、全てのチャートのインジケータの設定を変更する必要があって不便です。


アラートを見逃しにくくした工夫の代償として、そんな不便さが生じているのだとしても....それが世界の真実だと受け入れられるほど淡白な私ではないので、今日はもう少し工夫をしてみたいと思います。






方針としては、複数のチャートのインジケータの挙動を操作するために、グローバル環境変数に指示内容を書き、各インジケータがそれを参照するようにします。

まずはインジケータ側のコード。

if(!GlobalVariableGet("UseChartActivate")<0) ChartActivate();

グローバル環境変数"UseChartActivate"に負の値が入っていなかったら、実行する。というコードです。

デフォルトでは、"UseChartActivate"という環境変数は存在しないので、ゼロが取得されて、ChartActivate() が実行されます。


次に、制御用のスクリプト。

#include <WinUser32.mqh>
int start()
{
   int ret = MessageBox("ChatActivator:\nON = YES, OFF = NO","ChatActivator Control",MB_YESNO);
   if(ret == IDYES){
      if(GlobalVariableCheck("UseChartActivate")) GlobalVariableDel("UseChartActivate");
   }else{
      GlobalVariableSet("UseChartActivate",-1);
   }
   return(0);
}

これはscript として保存して実行すると、下記のようなダイアログが出てきてChartActivate() の機能をON/OFF できます。

f:id:fai_fx:20091109182845p:image

今回は、単純にON/OFF ということで、0 / -1 の2値で区別していますが、アラート機能を有効にしてよい時刻(例えば、今から2時間後の時刻)をスクリプトから書き込む…あるいは、アラートレベルの設定値とする…といった使い方も出来ると思います。この辺りはいろいろ工夫してみると良いかもしれません。

2009-11-09

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 時に チャート内で対象通貨ペアチャートをアクティブにする。

は出来るようになったと思いますが、如何でしょうか・・・

2009-11-08

PlaySoundの代りに音楽プレイヤーに再生させるコード。

コメントにあったので、参考用にコードを公開しておきます。音楽プレイヤーに再生させると、複数のMT4からの再生を重複することなく再生できるのと、ボリュームの調整がプレイヤー側で出来るというメリットがあります。


まずは、冒頭で ShellExecuteA を使えるようにします。(MQL4 では、ShellExecuteA ,MQL5 ではShellExecuteW )

#import "shell32.dll"
int ShellExecuteA(int hWnd,int lpVerb,string lpFile,string lpParameters,string lpDirectory,int nCmdShow);
#import

次に、PlaySoundEXの中身を書き換えます。

void PlaySoundEX(string wavfile)
{
   //string AppPath = "C:\\Program Files\\Winamp\\winamp.exe";
   string AppPath = "C:\\Program Files\\foobar2000\\foobar2000.exe";
   static datetime atime = 0;
   if(TimeLocal()-atime <10+MathRand()/32767.0*10) return;
   ShellExecuteA(0,0,AppPath,"\""+TerminalPath()+"\\sounds\\"+wavfile+"\"","",7);
   atime = TimeLocal();
}

AppPath には、音楽プレイヤーのファイルパスを書きます。

プレイヤーによっては、設定を変更する必要があります。例えば、foobar2000 の場合は、下記チェックを外さないとバックグラウンドで再生してもらえません。

f:id:fai_fx:20091108004430p:image


音楽プレイヤーで再生させる場合、どのプレイヤーを使えば良いのか考える必要があるのですが、メジャーな所では、WinAMPか、foobar2000 ぐらいしか候補が思い浮かびません。深く調査した訳ではないのですが、どちらのプレイヤーも一長一短な気がします。

意外と、軽量で、バックグラウンドで再生ができて、ShellExecuteして曲を追加した時のリスト管理がきちんとできるプレイヤーは見つからないのかも...。