EAのプログラム内から無理やりEAを止める方法。
何かの条件を満たしたらEA を止めたい場合…というのはよくあります。
正攻法では、
bool EAenable = true;//グローバルにEA実行可否判定変数を宣言 int start() { if(!EAenable){ ClosePositions(); return(0); } // //条件を満たしたらfalseに if(????) EAenable = false;
といった感じで、start()関数は呼ばれるけれど、何もしないで(あるいは、ポジションクローズだけして)return;するのが良いと思います。
ただ、世の中には start()関数すら呼ばせたくないという人も居ると思うので、他のEAの止め方をいくつか紹介しておきます。
その1 EA内でエラーを発生させて無理やり止める。
EA内部で、プログラム上のエラーが発生するとEAが止まります。
これを利用したのが以下のコードです。以前は、ゼロ割の発生でも止まっていたらしいのですが、今はEAを止められるエラータイプが限られているようです。
#import "dummy.dll" //存在しないDLLから、存在しない関数を宣言 void EA_STOP(); #import bool EAenable = true;//グローバルにEA実行可否判定変数を宣言 int start() { if(!EAenable){ ClosePositions(); EA_STOP();//ここで、存在しないDLLが呼ばれてエラー発生 } // //条件を満たしたらfalseに if(????) EAenable = false;
このコードでEAを止めると、Expertログに
17:42:55 MACD Sample EURUSD,M5: cannot load library 'dummy.dll' (error 126)
17:42:55 MACD Sample EURUSD,M5: expert stopped
というメッセージが残ります。
その2 チャートの強制クローズで止める。
チャートが閉じられれば、EAは止まりますので、それを利用します。
#includebool EAenable = true;//グローバルにEA実行可否判定変数を宣言 int start() { if(!EAenable){ ClosePositions(); //以下のチャートクローズメッセージを送信 PostMessageA(WindowHandle(Symbol(),Period()), WM_COMMAND, 57602, 0); } // //条件を満たしたらfalseに if(????) EAenable = false;
このコードでEAを止めると、Expertログに
17:50:19 MACD Sample EURUSD,M5: uninit reason 4
17:50:19 MACD Sample EURUSD,M5: removed
というメッセージが残ります。
他にもShellExecute から、ExpertAdvisorボタンを押させる等が考えられますが、とりあえず今日はこの辺で・・・。