サンプルコード 一覧へ戻る

MQL5サンプルコード

【MT5(MQL5)サンプルコード】ExpertRemove

スポンサーリンク

MT4(MQL4)/MT5(MQL5)のExpertRemove

EAを停止して、チャートから取り外します。

void  ExpertRemove();

現在の実行中の処理を一通り流し終わってからOnDeinit()を流した後でチャートから取り外されます。

MT4→MT5になっても変わらず使えます。

サンプルコード

void OnInit()  
{
   return;
}

void OnTick()
{

   if(AccountInfoDouble(ACCOUNT_BALANCE)<100000000)  //口座残高が1億円以下ならEAを取り外す
   {
         ExpertRemove();

         Print("てすと");
   }
}

void OnDeinit(const int reason)  //EAが終了する時にに1回だけ動く
{
   Print("現在の口座残高 = ",AccountInfoDouble(ACCOUNT_BALANCE));  
   return;
}

結果

ExpertRemove() function called
てすと
現在の口座残高 = 11111.0

(追記)最適化で使えるか?

「最適化時はうまくいったか?」という質問を頂いたので、確認した結果を追記しました。

【結論】最適化でも稼動していそう

結論としては、最適化でも稼動してそうです。

サンプルコード

ちょっと長いです。

3分に1回、すぐ決済されるような狭いSLTP(スプレッド差分負け続ける)で売り注文を出し続けます。口座残高が2000万円を下回ったらテスト終了…というロジックです。(初期入金額が2000万円にセットしてあるので、ちょっとでもマイナスの決済がプラスを上回った瞬間テスト終了)

TesterStopで使ったコードを流用しました。

input int Dummyloop = 10; //DummyLoop テスト回数(ロジックには使用されていない)
int minuteTime = -1;
void OnInit()  
{

   return;
}

void OnTick()
{

   if(minuteTime + 3 * 60 <= iTime(NULL, PERIOD_M1, 0))  //5分毎にひたすら売買し続ける
   {
      minuteTime = iTime(NULL, PERIOD_M1, 0);

      MqlTick last_tick;
      SymbolInfoTick(_Symbol,last_tick);
      
      double SL = 0.01;
      double TP = 0.01;
         
      double Ask=last_tick.ask;
      double Bid=last_tick.bid;
      
      int MagicNumber = 123456;
      double lots = 0.1;
   
      MqlTradeRequest request = {};
      MqlTradeResult result = {};
   
      request.action = TRADE_ACTION_DEAL;
      request.type = ORDER_TYPE_SELL;             // 注文タイプ
      request.magic = MagicNumber;             // マジックナンバー(識別用)
      request.symbol = Symbol();              // 通貨ペア名
      request.volume = lots;              // ロット数
      request.price = SymbolInfoDouble(Symbol(),SYMBOL_ASK);// 注文価格
      request.sl = Bid+SL;             // ストップロス価格
      request.tp = Bid-TP;           // リミット価格
      request.deviation = 3;               // スリッページ
      request.expiration = 0;             // 有効期限
      request.comment = "aaa";              // コメント
   
      OrderSend(request, result);
      //return result.retcode;
   
      Print("現在の口座残高 = ",AccountInfoDouble(ACCOUNT_BALANCE));
      if(AccountInfoDouble(ACCOUNT_BALANCE)<20000000)  //口座残高が2千万円以下ならテスト終了
      {
            ExpertRemove();
      }
      
   
   }
   return;
}

void OnDeinit(const int reason)  //EAが終了する時にに1回だけ動く
{
   
   Print("現在の口座残高 = ",AccountInfoDouble(ACCOUNT_BALANCE));  
   Print("テスト中の出金額は",TesterStatistics(STAT_WITHDRAWAL));
   Print("テストの頭金は",TesterStatistics(STAT_INITIAL_DEPOSIT));
   return;
}

ポイントは

if(AccountInfoDouble(ACCOUNT_BALANCE)<20000000)  //口座残高が2千万円以下ならテスト終了
   {
         ExpertRemove();
   }

の部分。

この部分を有効化した場合とコメントアウトした場合でテスト結果を比較します。

結果

【 ExpertRemove()コマンドを有効化した場合】

損益が-290、取引回数が2回で止まっています。

【 ExpertRemove()コマンドをコメントアウトした場合】

損益が-7236855、取引数が106212回で、口座残高が2000万円を下回っても延々と取引が繰り返されているのが確認できます。

コメント

タイトルとURLをコピーしました