VisualMode でのバックテスト中に、日付が変わる度に一時停止させる。

自作EAの動作テストを兼ねてバックテストを行う場合、VisualMode が大活躍するのですが、テストスピードの設定がいまいち使いづらい気がしています。スピード調節バーを31にするとちょっと遅めで、32にすると速すぎて、ゆっくり見てみたい時間帯を見逃してしまうことが多々あります。


Pause キーを押せば、VisualMode が一時停止するので、タイミングよく押して止めれば良いのですが、反射神経が鈍い人には結構難しいものがあります...。
…そんな時は、プログラムに押させてしまえばいい...というのが今日の話。 (ネタ元は某J氏です..thx !!

インジケータから止める方法


日付が変わったらPause キーを押すインジケータのコードです。

#include 
#property indicator_chart_window
int start()
 {
   static int day=0;
   if(day !=TimeDay(Time[0])){
      int hwnd = WindowHandle(Symbol(),Period());
      PostMessageA(hwnd, WM_KEYDOWN, 19, 0);//19=Pause
      PostMessageA(hwnd, WM_KEYUP, 19, 0);
   }
   day =TimeDay(Time[0]);
   return(0);
 }

このコードを .mq4 ファイルとして indicators フォルダに保存します。
バックテスト開始時には、VisualMode のスピードを1にするか、素早くPause キーを押して止める等してから、このインジケータをチャートに貼り付けます。(あらかじめテンプレートとして設定しておいても良いかもしれません。)
これで、チャート上の日付が変わる度にPause キー が押されるので一時停止します。応答タイミングの遅れがあるので、厳密に日付が変わった瞬間には止まりませんが、これだけでも役に立つ機会があるのではと思います。


これを応用して、指定時刻(の直後..)で止めるには、

TimeDay(Time[0])

TimeDay(Time[0]+2*60*60)

のように書けば、日付の変わる2時間前=22時過ぎに止まるようになります。

EAから止める方法


EAのソースコードが改造できる人は、もっと精確に止めることが可能です。今度は、MessageBox を表示させると、それをOKするまでプログラムが止まってしまう性質を利用します。
但し、MQL4 標準のMessageBox は、バックテストでは無視されてしまうので、user32.dll のネイティブなMessageBoxA を使います。
(ちなみに、http://articles.mql4.com/72 を読むと、Sleep(), Alert(), SendMail(), PlaySound(), MessageBox(), WindowFind(), WindowHandle(), WindowIsVisible() がバックテスト時に機能しない関数らすぃ..)

#include 
#import "user32.dll"
   int    MessageBoxA(int hWnd, string lpText, string lpCaption, int uType);
#import

上記の宣言で、MessageBoxA を使えるようにし、

   static int day=0;
   if(day !=TimeDay(Time[0])){
      int hwnd = WindowHandle(Symbol(),Period());
      PostMessageA(hwnd, WM_KEYDOWN, 19, 0);//19=Pause
      PostMessageA(hwnd, WM_KEYUP, 19, 0);
      string msg = day + "->"+TimeDay(Time[0])+ " Stopped...";
      MessageBoxA(hwnd,msg,"BreakPoint",0);
   }
   day =TimeDay(Time[0]);

インジケータの時と同様のコードでPause を押した後に、MessageBoxを出します。

バックテストを再開するには、MessageBox のOKを押してから、Pause ボタンを押して一時停止を解除します。



このテクニックは、単に定時で止めるだけではなく、何か一定の条件を満たした時に止める..といった応用が出来ますので、自作EAのVisualMode でのデバッグ時にご活用ください。