XAUUSD247だとメンテナンス時間跨ぎの1時1分以降で決済できない

2026/10/13 19:39
79

まず、MT5で通常のXAUUSDだと動作に問題はありません。しかし、XAUUSD247のリアル環境だと1日の中でのメンテナンス時間(添付ファイル参照)を挟んだらEAで決済できず、今のところ手動で決済するしかなくて困ってます。

0時台(月00:00-00:45,火-金00:00-01:00)にエントリーするところまでは問題ないのですが、メンテナンス時間(月00:45-01:01,火-金01:00-01:01)を挟んで1時1分以降に決済がされません。

EAつくーるで出力したMQL5のコードだと、取引時間が1日の中でぶつ切りになるこの銘柄では1時1分以降は認識外になってしまうのでしょうか?コード修正案等あればご教示頂きたく思います。

コメント

yusuke
2026/10/13 19:42

画像が添付できてなかったので追記させて頂きます。
2026-10-13_19h06_46.png

GogoJungle
2026/10/14 14:29

ご質問ありがとうございます。

EAつくーるで出力したMQL5のコードには、特定の時刻以降を取引時間外として扱う仕組みはありません。
決済は、価格が更新された(ティックが来た)タイミングで決済条件を判定して実行しています。
メンテナンス中はティックが来ないため、EAの判定処理自体が動きません。

このため、決済条件によってはメンテナンスを挟むと決済されないことがあります。
特に「指定時刻に決済」は、指定した時刻から3分以内にティックが来たときだけ決済します。
この3分がメンテナンスと重なると、その日は決済されません。

原因を絞り込むため、以下の2点を教えていただけますでしょうか。

  1. 決済方法の設定内容(特に、「指定時刻に決済」をお使いの場合は、その時刻と曜日)
  2. 決済されなかった時間帯に、MT5の「エキスパート」タブに [OrderClose Error] というログが出ていないか

よろしくお願いいたします。

yusuke
2026/10/14 18:39

早速ご回答頂きましてありがとうございます。

  1. 決済方法の設定内容(特に、「指定時刻に決済」をお使いの場合は、その時刻と曜日)

⇒「指定時刻に決済」を使っており、メンテナンス直後の1時1分(全曜日)で指定してます。一応メンテナンスと重なってるわけではないのですけどね・・・

  1. 決済されなかった時間帯に、MT5の「エキスパート」タブに [OrderClose Error] というログが出ていないか

⇒「エキスパート」タブを毎度確認してますが、特にエラーは出ていません。

GogoJungle
2026/10/15 20:36

ご確認いただきありがとうございます。

エラーが出ていないことから、決済注文が拒否されたのではなく、決済の処理自体が動いていない可能性が高いと考えております。

「指定時刻に決済」は、指定時刻から3分間(01:01の場合は01:01〜01:04)にティック(価格更新)が来たときだけ決済を行います。メンテナンス明けは価格配信の再開が遅れることがあり、この3分間にティックが来なかった場合は決済されません。

お手数ですが、以下の2点をご確認いただけますでしょうか。

  1. XAUUSD247の1分足チャートで、決済されなかった日の01:01〜01:03の足があるか(足が無ければ、その時間にティックが来ていないことになります)
  2. メンテナンス時間(月00:45-01:01、火-金01:00-01:01)は、MT5のチャートに表示される時刻(サーバー時間)と同じ基準でしょうか(EAはサーバー時間で判定しています)

暫定的な対処としては、決済時刻を01:05など少し後ろにずらしていただくと、決済できる可能性があります。

また、決済時刻を01:01のままにしたい場合は、コードを修正して、決済を判定する時間を3分から延ばす方法もございます。

【修正方法】
EAつくーるで出力したmq5ファイルをMetaEditorで開き、関数「ExitByTime」の中にある以下の行を探してください。

if(TimeCurrent() >= t_exit && TimeCurrent() < t_exit + 180) {

「180」(秒=3分)を「600」(秒=10分)に変更してください。

if(TimeCurrent() >= t_exit && TimeCurrent() < t_exit + 600) {

変更後、コンパイルしてチャートにセットし直してください。

これで01:01〜01:11の間にティックが来れば決済されるようになります。ただし、この10分間に新しくエントリーしたポジションも決済対象になりますので、ご注意ください。

よろしくお願いいたします。

yusuke
2026/10/16 07:11

ご回答頂きましてありがとうございます。

1.XAUUSD247の1分足チャートで、決済されなかった日の01:01〜01:03の足があるか(足が無ければ、その時間にティックが来ていないことになります)

あります。メンテナンス中の1:00-1:01の足もあります。1:01台に手動決済自体はできますし、ティックはきているはずです。

2.メンテナンス時間(月00:45-01:01、火-金01:00-01:01)は、MT5のチャートに表示される時刻(サーバー時間)と同じ基準でしょうか(EAはサーバー時間で判定しています)

同じです。

ご提案頂いたExitByTime関数内の180→600は修正させて頂きましたが、できれば1:01で決済したいんですよね。1:01にティックがきてる可能性が高く、ティックがきててもEAが決済できてないという状況だと思うのですが、他に何か考えられる原因はありますでしょうか?

GogoJungle
2026/10/17 15:33

ご確認いただきありがとうございます。

ティックが来ていて、エラーも出ていないとのことですので、EAつくーるの決済処理(closePosition)の中で、エラーを出さずに処理が終わっている可能性が高いと考えております。
この処理には、取引可否の判定などで決済をスキップした場合にログを出さない箇所がございます。

そこで、「指定時刻に決済」の関数を、EAつくーるの決済処理を経由せず、MT5の標準機能で直接決済する内容に置き換える方法をご案内いたします。

【変更点】
・01:01以降、最初のティックで決済します(3分・10分といった時間の制限はありません)
・決済に失敗した場合は、次のティックで自動的に再度決済を試みます
・01:01以降に新しくエントリーしたポジションは、決済の対象外です
・決済に失敗した場合は、「エキスパート」タブに理由が表示されます

【修正方法】
EAつくーるで出力したmq5ファイルをMetaEditorで開き、関数「void ExitByTime(~」から、その関数の最後の「}」までをすべて削除して、以下の内容に置き換えてください。
(前回ご案内した180→600の変更箇所も、この置き換えで不要になります)

―――――――― ここから ――――――――
void ExitByTime(string exit_time, int magic, bool &day[])
{
  string time = TimeToString(TimeCurrent(), TIME_DATE);
  datetime t_exit = StringToTime(time + " " + exit_time);

  if(t_exit > TimeCurrent()) return;     // 決済時刻前は何もしない
  if(day[DayOfWeek()] == false) return;  // 決済しない曜日は何もしない

  for(int i = PositionsTotal() - 1; i >= 0; i--) {
    ulong ticket = PositionGetTicket(i);
    if(ticket == 0) continue;
    if(PositionGetString(POSITION_SYMBOL) != Symbol()) continue;
    if(PositionGetInteger(POSITION_MAGIC) != magic) continue;
    if((datetime)PositionGetInteger(POSITION_TIME) >= t_exit) continue;  // 決済時刻以降のポジションは対象外

    MqlTradeRequest req;
    MqlTradeResult  res;
    ZeroMemory(req);
    ZeroMemory(res);

    req.action    = TRADE_ACTION_DEAL;
    req.position  = ticket;
    req.symbol    = Symbol();
    req.volume    = PositionGetDouble(POSITION_VOLUME);
    req.deviation = Slippage;
    req.magic     = magic;

    if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) {
      req.type  = ORDER_TYPE_SELL;
      req.price = SymbolInfoDouble(Symbol(), SYMBOL_BID);
    } else {
      req.type  = ORDER_TYPE_BUY;
      req.price = SymbolInfoDouble(Symbol(), SYMBOL_ASK);
    }

    long filling = SymbolInfoInteger(Symbol(), SYMBOL_FILLING_MODE);
    if((filling & SYMBOL_FILLING_FOK) == SYMBOL_FILLING_FOK)      req.type_filling = ORDER_FILLING_FOK;
    else if((filling & SYMBOL_FILLING_IOC) == SYMBOL_FILLING_IOC) req.type_filling = ORDER_FILLING_IOC;
    else                                                          req.type_filling = ORDER_FILLING_RETURN;

    if(!OrderSend(req, res) || (res.retcode != TRADE_RETCODE_DONE && res.retcode != TRADE_RETCODE_PLACED)) {
      Print("[ExitByTime] 決済失敗 ticket=", ticket, " retcode=", res.retcode, " ", res.comment);
    }
  }
}
―――――――― ここまで ――――――――

置き換え後、コンパイルしてチャートにセットし直してください。
なお、本番運用の前に、デモ口座や少額で動作をご確認いただくことをおすすめいたします。

よろしくお願いいたします。

yusuke
2026/10/20 16:17

コード修正案のご提示ありがとうございます。

このExitByTime関数で決済されなかった場合のログを確認してみたいと思いますが、こちらで確認する限り多分決済だけの問題ではなさそうです。

そもそも0時台しかエントリーが入りませんし、別業者(下記画像参照)でも土曜日だと00:00-10:05の間ではエントリー・イグジットともに入りますが、後半の10:35-24:00の間にはエントリー・イグジットともに行われません。
2026-10-20_15h56_31.png

やはり取引時間が1日の中でぶつ切りになるこの銘柄だと、MT5仕様の画面で言うところの左側の時間帯(00:00-10:05,10:35-24:00であれば左側の00:00-10:05)でしかEAが動いていないようです。

GogoJungle
2026/10/20 16:57

ご確認いただきありがとうございます。
詳しい状況をお知らせいただいたおかげで、おそらく、原因を特定できました。

EAつくーるのMT5版では、エントリー・決済の前に、ライブラリ(Tkool.mqh)の関数「MarketOpenCheck」で「現在取引できる時間か」を判定しています。
この関数が、1日の取引時間帯のうち1つ目しか確認をしていないため、2つ目以降の時間帯ではEAが「取引できない」と判断し、エラーを出さずにエントリー・決済をスキップしておりました。
取引時間帯が1日に1つの銘柄では、この問題は起きません。

以下の手順で、すべての取引時間帯を判定するように修正できます。

【修正方法】

  1. MT5のメニュー「ファイル」→「データフォルダを開く」を選び、「MQL5」→「Include」→「Tkool」フォルダにある「Tkool.mqh」をMetaEditorで開きます。

  2. 「bool MarketOpenCheck(string symbol)」で始まる関数を探し、その関数の最後の「}」までをすべて削除して、以下の内容に置き換えてください。

―――――――― ここから ――――――――
bool MarketOpenCheck(string symbol)
{
int trade_day = DayOfWeek();
datetime from = 0, to = 0;
string currentTime = TimeToStr(TimeCurrent(), TIME_SECONDS);

if(!SymbolInfoSessionTrade(symbol, (ENUM_DAY_OF_WEEK)trade_day, 0, from, to))
{
Alert(“MarketOpenCheck Failure”);
return(false);
}

// 1日に複数ある取引時間帯をすべて確認する
for(int i = 0; SymbolInfoSessionTrade(symbol, (ENUM_DAY_OF_WEEK)trade_day, i, from, to); i++)
{
string openTime = TimeToStr(from, TIME_SECONDS);
string closeTime = TimeToStr(to, TIME_SECONDS);
if(closeTime == “00:00:00”) closeTime = “23:59:59”;
if(currentTime >= openTime && closeTime >= currentTime) return(true);
}
return(false);
}
―――――――― ここまで ――――――――

  1. Tkool.mqhを保存します。

  2. EAのmq5ファイルを開いてコンパイルし直し、チャートにセットし直してください。
    (Tkool.mqhの修正は、EAをコンパイルし直したときに反映されます)

これで、2つ目以降の取引時間帯(01:01以降など)でも、エントリー・決済が行われるようになるはずです。
前回ご案内したExitByTime関数の置き換えは、そのままでも元に戻していただいても、どちらでも問題ございません。

なお、本番運用の前に、デモ口座や少額で動作をご確認いただくことをおすすめいたします。
よろしくお願いいたします。

yusuke
2026/10/23 02:23

Tkool.mqhのコード修正案ありがとうございます。

“”の箇所がInvalid suffixになるので、""にこちらで修正してセットし直してます。

今のところ上手くいってるように見えないのですが、まだ微妙なので土日に想定通りに動くのか確認してまた連絡させて頂きます。

これで駄目ならもうEAつくーる使わずにコーディングした方が早いかもしれませんね・・・

yusuke
2026/10/27 18:24

この度は誠にありがとうございます。

土日を挟んで暫く様子を見てましたが、今のところぶつ切りの時間帯を跨いでも正常動作してるように見えます。

一部エントリーが上手くいってない箇所もあるのですが、別の原因も含めてこちらで引き続き検証しており、もし問題があればまた相談させて頂きます。

GogoJungle
2026/10/27 18:54

ご確認ありがとうございます。
取引時間の途切れを跨いでも正常に動作しているとのこと、安心いたしました。

引き続きご検証なさるとのことですので、ほかに気になる点があれば、お気軽にこちらでご相談ください。

関連トピックス

検索結果がありません。

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

注目トピックス

検索結果がありません。