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は止まりますので、それを利用します。

#include 
bool 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ボタンを押させる等が考えられますが、とりあえず今日はこの辺で・・・。