連敗した際に稼働を一時的に中止にしたい。

2025/06/02 23:46
16

EAを動かしている際に急変動等で連敗した時に、〇連敗で〇〇分停止等は出来ないでしょうか?

コメント

GogoJungle
2025/06/04 11:58

EAつくーるの機能のみではご作成いただけないロジックですが、EAつくーるで作成したEAのソースコードを少し編集することで、ご要望の機能を実装することが可能です。
修正方法を考えてみましたので、提案させていただきます。

変数の追加

可変パラメーターに
MaxLoseCount:許容する連敗数
StopInterval:EAを停止する時間(分)
LimitTime:停止を解除する時刻
を追加します。

なお、停止解除時刻については
停止中:時刻
解除後、未エントリーの場合(チェック不要):"-"
エントリー後(要チェック):""
とします。

input int Magic1 = 1;と書いてある行を探し、その下に追加してください。

【修正前】

input int Magic1 = 1;

【修正後】

input int Magic1 = 1;
input int MaxLoseCount = 5; // 許容する連敗数
input int StopInterval = 60; // EAを停止する時間(分)
string LimitTime = "-"; // 停止を解除する時刻

トレードの可否を制御する処理の追加

連敗でEAを一時停止する処理の本体です。OnTick()関数内でTrade = true;と書いてある行を探し、その下に追加します。
Trade = true;と書いてある行はプログラム全体にいくつか存在しますが、必ずOnTick()関数内で探し、その下に追加してください。

【修正前】

   Trade = true;

【修正後】

   Trade = true;

   //-------- 連敗でEAを一時停止する処理ここから --------//
   if (LimitTime == "-") {
      Trade = true;
   } else if (LimitTime != "") {
      // 現在時刻が停止解除時刻を過ぎている場合のみTradeを許可
      if (TimeCurrent() > StringToTime(LimitTime)) {
         Trade = true;
         LimitTime = "-"; // 停止解除時刻をリセット
      } else {
         Trade = false;
      }
   } else {
      int    lose   = 0;   // 連敗数
      double profit = 0.0; // 利益

      // 連敗数を取得
      for (int i = OrdersHistoryTotal() - 1; i >= 0; i--) {
         if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)     == false)  continue;
         if (OrderSymbol() != Symbol() || OrderMagicNumber() != Magic1) continue;
         
         profit = OrderProfit(); // 選択中のポジションの利益を取得
         
         if      (profit <  0.0) lose++;   // 利益がマイナスの場合は連敗数をインクリメント
         else if (profit == 0.0) continue; // 利益が0の場合は次のポジションへ
         else                    break;    // 利益がプラスの場合はループを抜ける
      }

      // 連敗数がMaxLoseCountに達したらEAを一時停止(ポジションを持っていない場合のみ)
      if (lose >= MaxLoseCount && getOpenLots(Magic1) == 0) {
         Trade = false; // トレードを停止
         LimitTime = TimeToString(TimeCurrent() + StopInterval * 60, TIME_DATE | TIME_MINUTES); // 停止解除時刻を設定
         Print("連敗数が " + IntegerToString(MaxLoseCount) + " 以上のため、EAを一時停止します。連敗数: " + IntegerToString(lose) + "、停止解除時刻: " + LimitTime);
      }
   }
   //-------- 連敗でEAを一時停止する処理ここまで --------//

停止解除時刻を要チェックに変更

エントリーしたら、停止解除時刻を要チェックの状態に変更する処理を追加します。
エントリー処理が複数存在する場合は、すべてのエントリー処理を修正してください。

【修正前】

if(openPosition(signal, lots, take_profit, stop_loss, Magic1)) {
   bars1 = Bars;
}

【修正後】

if(openPosition(signal, lots, take_profit, stop_loss, Magic1)) {
   bars1 = Bars;
   LimitTime = ""; // この行を追加
}

注意点

上記変更によって連敗数のカウントが行われるポジションは、マジックナンバーがMagic1となっているものに限られます。複数のポジションを持つ場合には対応していない点、ご了承ください。

以上でございます。
ご参考になりましたら幸いです。

関連トピックス

検索結果がありません。

ノーコードで誰でも簡単EA開発!MQL言語学習にも使える! | GogoJungle

注目トピックス

検索結果がありません。