> 블로그 > Market closed(10018 / 오류 132) 완전 해결

MT5MQL5오류문제 해결EA

Market closed(10018 / 오류 132) 완전 해결

공개일: 2026-07-07읽기 시간: 약 5분
본 기사는 게시일 시점의 정보입니다. EA의 실적 수치(PF·DD·연율)는 운용 및 재검증으로 변동하므로 최신 값은 각 EA 페이지에서 확인하세요. 최신 EA 실적 보기

Market closed(MT5/MQL5) 완전 해결

EA 로그에 Market closed 또는 market is closed가 나타났을 때, "주말이니까 당연하다"로 넘어갈 수 있는 경우는 절반뿐입니다. 평일 낮 시간인데도 발생하거나, 다른 종목은 정상적으로 주문이 들어가는데 특정 종목에서만 발생하는——이런 패턴 때문에 고민하는 분이 매우 많은 오류입니다.

원인은 "주말"만이 아니라 종목별 거래 세션(금이나 주가지수의 일일 브레이크)·브로커 서버 시간과 로컬 시간의 차이·심볼의 거래 모드 제한(close-only 등) 등 여러 가지가 있습니다. 이 글은 MT5로 EA를 사용하는 분과 MQL5로 EA를 개발하는 분 모두를 위해, Market closed정체·6가지 원인·30초 만에 할 수 있는 원인 분리·코드 측 영구 방지책까지 정리한 결정판입니다. 오류 코드 전반의 목록은 MQL5 / MT5 오류 코드 대처법 종합 가이드를 참조하세요.

이 글은 2026년 7월 시점의 MT5(build 4xxx대)를 기준으로 합니다. 세션 시간·화면 명칭은 브로커나 빌드에 따라 다를 수 있습니다.


Market closed란(10018과 132의 차이)

"시장이 닫혀 있다"를 나타내는 코드는 MT5와 MT4(MQL4)에서 서로 다릅니다. 어느 플랫폼인지, 어디서 값을 가져왔는지에 따라 구분해서 이해해야 합니다.

① TRADE_RETCODE_MARKET_CLOSED = 10018(MT5 / OrderSend()의 리턴 코드)

MQL5에서 주문한 OrderSend()의 결과는 MqlTradeResult.retcode에 담깁니다. 거래 서버가 "이 종목은 지금 거래 시간 외"라고 판단해 거부했을 때의 코드가 10018입니다. MT5 측의 내부 오류가 아니라 브로커 서버로부터의 거부 통지입니다.

의미: 시장 폐쇄 중(Market is closed)
상수: TRADE_RETCODE_MARKET_CLOSED
값  : 10018
// 로그에서 확인할 수 있는 전형적인 출력 예시
2026.07.06 23:05:11.204 EA_NAME XAUUSD,M5: OrderSend error 10018 [Market closed]

② ERR_MARKET_CLOSED = 132(MT4 / MQL4의 GetLastError())

MT4(MQL4)에서는 OrderSend()가 실패한 뒤의 GetLastError()132를 반환합니다. 의미는 10018과 동일한 "시장 폐쇄 중"입니다. MT4 버전 EA를 함께 사용하는 경우, 같은 원인이 MT5에서는 10018, MT4에서는 132로 나타납니다.

의미: 시장 폐쇄 중(Market is closed)
상수: ERR_MARKET_CLOSED(MQL4)
값  : 132

실무상 구분:

플랫폼취득처
MT5 (MQL5)MqlTradeResult.retcode / CTrade.ResultRetcode()10018
MT4 (MQL4)OrderSend() 실패 후의 GetLastError()132

둘 다 근본 원인은 공통으로 "서버의 거래 세션 외에 주문을 보냈다(또는 종목의 거래가 제한되어 있다)"입니다. 대처법도 공통이므로 아래에서 함께 설명합니다.


먼저 30초 만에 할 수 있는 원인 분리

무작정 EA를 재시작하기 전에, 다음 4가지만 확인하면 원인의 방향을 잡을 수 있습니다.

  1. 종목의 거래 세션을 본다 — 관찰창(Market Watch)에서 해당 심볼을 우클릭 → "사양(Specification)" → "거래 세션". **요일별 거래 가능 시간(서버 시간)**이 기재되어 있습니다. 지금 시각이 이 범위 밖이라면 그것이 답입니다.
  2. 서버 시간을 확인한다 — 관찰창 상단에 표시되는 시각이 브로커의 서버 시간입니다. 세션 판정은 여러분의 PC 시계가 아니라 이 시각으로 이루어집니다. 한국 시간과 몇 시간 차이가 나는 것이 일반적입니다.
  3. 거래 모드를 확인한다 — 같은 "사양" 화면의 "거래" 항목이 Full access 외의 값(Disabled / Close only 등)으로 되어 있지 않은지. 그렇다면 세션 시간 내라도 신규 주문은 거부됩니다.
  4. 다른 종목으로 시도한다 — EURUSD 등 주요 FX 페어에서 같은 EA/수동 주문이 통과된다면, 문제는 계좌나 EA가 아니라 해당 종목의 세션/제한으로 좁혀집니다.

원인과 대처(6가지 패턴)

① 주말·공휴일로 시장 전체가 닫혀 있음

증상: 토요일·일요일, 또는 연말연시나 크리스마스 등에 오류가 발생. 전 종목에서 발생.

원인: FX 시장은 대체로 서버 시간 기준 금요일 마감~월요일 개장까지 거래할 수 없습니다. 공휴일(신정·크리스마스 등)은 평일이라도 휴장하거나 단축 거래가 됩니다. EA가 바(bar) 잔여 처리나 타임프레임 사정으로 주말에도 주문을 시도하면 10018/132가 연달아 발생합니다.

대처:

  1. 오류 자체는 무해합니다. 시장이 열리면 자연히 해소됩니다
  2. 로그를 지저분하게 만들고 싶지 않다면 EA 측에 요일·세션 체크를 넣어 애초에 보내지 않도록 합니다(코드는 후술)
  3. 공휴일 캘린더는 브로커마다 다르므로 브로커의 휴장 일정 공지를 확인하세요

② 종목별 거래 세션 외(일일 브레이크)

증상: 평일인데도 특정 종목(금·은·주가지수 CFD·에너지 등)에서만 오류 발생. 매일 거의 같은 시간대에 발생.

원인: FX 페어는 평일 거의 24시간 거래할 수 있지만, 귀금속이나 주가지수 CFD에는 매일 수십 분~몇 시간의 거래 휴지 시간(일일 브레이크)이 있습니다. 기초자산 거래소의 유지보수나 롤오버에 맞춘 것으로, 시간대는 브로커와 종목에 따라 다릅니다. 이 휴지 구간에 EA가 주문을 보내면 10018이 발생합니다.

대처:

  1. "사양 → 거래 세션"에서 해당 종목의 정확한 휴지 시간대를 확인합니다(여기에 적힌 시간만이 유일한 정답입니다. 타인의 블로그에 적힌 시간을 그대로 믿지 마세요——브로커마다 다릅니다)
  2. EA의 시간 필터(TradeStartHour/TradeEndHour 등)로 휴지 구간을 피합니다
  3. 개발자는 코드로 SymbolInfoSessionTrade()를 확인합니다(후술)

또한 암호화폐(BTCUSD 등)는 주말에도 거래 가능한 브로커가 많지만, 이 역시 브로커에 따라 다릅니다. "암호화폐니까 24/7일 것"이라고 단정 짓지 말고 사양 화면에서 확인하세요.


③ 서버 시간과 로컬 시간의 혼동

증상: "사양의 세션상으로는 거래 시간 내일 텐데"라며 오류 발생. 해외 브로커 이용 시 흔함.

원인: 사양에 적힌 세션 시간도, MT5 내의 시각 표시도 모두 브로커의 서버 시간입니다. 많은 해외 브로커는 GMT+2/+3(뉴욕 마감=0시가 되는 설정)을 채택하고 있어 한국 시간과 6~7시간 차이가 납니다. 한국 시간으로 "아직 금요일 밤"이어도 서버 시간으로는 이미 토요일인 경우가 전형적입니다.

대처:

  1. 관찰창의 시각(=서버 시간)을 기준으로 생각하는 습관을 들입니다
  2. EA의 파라미터(거래 시간 필터 등)는 서버 시간으로 지정하는 사양이 일반적입니다. 한국 시간이라고 생각하고 설정하지 않았는지 재확인하세요
  3. 코드에서는 TimeTradeServer()를 사용합니다(TimeLocal()로 세션 판정을 하지 않습니다)

④ 심볼이 거래 무효/청산 전용(SYMBOL_TRADE_MODE)

증상: 세션 시간 내·평일인데도 특정 종목만 신규 주문이 전부 거부됨. 청산만 가능한 경우도 있음.

원인: 브로커는 심볼 단위로 거래 모드를 설정할 수 있습니다.

SYMBOL_TRADE_MODE의미
SYMBOL_TRADE_MODE_FULL제한 없음(통상)
SYMBOL_TRADE_MODE_CLOSEONLY청산만 가능(신규 불가). 상장폐지 예정·만기월 교체 전 CFD 등
SYMBOL_TRADE_MODE_DISABLED거래 완전 무효
SYMBOL_TRADE_MODE_LONGONLY / SHORTONLY매수만/매도만 가능

데모 계좌와 실계좌의 설정이 다르거나, 계좌 유형에 따라 거래 가능 종목이 다른 경우도 있습니다.

대처:

  1. "사양" 화면의 "거래" 항목을 확인합니다
  2. Close only라면 신규는 포기하고 포지션 정리를. 해당 종목을 계속 사용하고 싶다면 동일 명칭의 다른 만기월 심볼·다른 접미사의 심볼(예: US500.f 등)이 준비되어 있는지 확인합니다
  3. Disabled인 상태라면 해당 계좌 유형에서 거래 가능한지 브로커에 문의합니다

⑤ 월요일 개장 직후·세션 재개 직후

증상: 월요일 시장 개장 직후 몇 분 동안, 또는 일일 브레이크 종료 직후에만 오류나 체결 거부 발생.

원인: 세션이 "열린" 순간부터 실제로 안정적으로 체결되기까지는 시간차가 있습니다. 개장 직후는 유동성이 얕고 스프레드가 극단적으로 벌어지며, 브로커에 따라서는 호가가 흐르기 시작할 때까지 주문을 받지 않는(=시장 폐쇄 취급으로 거부하는) 경우가 있습니다. 월요일 아침 가장 먼저 시그널을 내는 유형의 EA, 브레이크 종료 직후를 노리는 골드 EA가 전형적으로 부딪힙니다.

대처:

  1. 개장 후 ○분간은 신규를 보류하는 필터를 넣습니다(AvoidMondayOpen 등). 본 사이트 배포 EA가 월요일 0-3시(서버 시간)를 피하는 기본값을 갖는 이유가 이것입니다
  2. 스프레드 필터(MaxSpread)를 반드시 병용합니다. 개장 직후의 이상 스프레드에서의 체결은 오류보다 오히려 손실로 더 아픕니다
  3. 10018이 발생하면 즉시 재시도하지 않고 다음 봉까지 기다리는 설계로 합니다

⑥ 뉴스·이벤트로 인한 거래 정지

증상: 중요 지표 발표 전후나 개별 종목의 이상 변동 시 일시적으로 오류 발생.

원인: 일부 브로커·종목에서는 중대 이벤트 시 거래를 일시 정지(halt)하거나 신규 주문을 제한하는 경우가 있습니다. 주가지수 CFD에서는 기초자산 시장의 서킷 브레이커와 연동되어 정지되는 경우도 있습니다. 이 동안의 주문은 시장 폐쇄 계열의 거부가 됩니다.

대처:

  1. 일시적인 것이므로 시간이 지나면 해소됩니다
  2. 경제지표 필터(본 사이트 EA의 UseEconomicFilter)로 지표 전후의 신규를 막아두면, 오류 회피와 급변동 리스크 회피를 동시에 달성할 수 있습니다

MQL5에서 이 오류를 방지하는 코드(EA 개발자용)

Market closed는 "오류가 난 뒤 대처"가 아니라, 주문 전에 세션과 거래 모드를 확인해서 닫혀 있다면 보내지 않는 것이 올바른 설계입니다. 로그가 깔끔해질 뿐만 아니라 불필요한 서버 요청과 재시도 폭주를 막을 수 있습니다.

거래 세션 내인지 확인한다

SymbolInfoSessionTrade()는 지정한 요일의 i번째 세션의 시작/종료 시각(서버 시간 0시부터의 초)을 반환합니다. 세션이 여러 개인 종목(일일 브레이크를 사이에 둔 지수 등)에 대응하기 위해 루프로 모든 세션을 확인합니다.

// 현재 서버 시간이 이 종목의 거래 세션 내인지 판정한다
bool IsTradeSessionOpen(const string symbol)
{
   MqlDateTime dt;
   TimeToStruct(TimeTradeServer(), dt);           // 반드시 서버 시간으로 판정한다
   int now = dt.hour*3600 + dt.min*60 + dt.sec;   // 0시부터의 경과 초

   datetime from, to;
   for(uint i = 0; SymbolInfoSessionTrade(symbol, (ENUM_DAY_OF_WEEK)dt.day_of_week, i, from, to); i++)
   {
      int f = (int)from;                 // 0시부터의 초
      int t = (int)to;                   // 24:00 종료는 86400이 된다
      if(now >= f && now < t)
         return true;
   }
   return false;   // 해당 요일에 세션 없음(주말 등) 또는 전 세션 외
}

거래 모드(SYMBOL_TRADE_MODE)를 확인한다

// 신규 진입 가능한 거래 모드인지 판정한다
bool IsNewEntryAllowed(const string symbol, ENUM_ORDER_TYPE type)
{
   long mode = SymbolInfoInteger(symbol, SYMBOL_TRADE_MODE);
   if(mode == SYMBOL_TRADE_MODE_DISABLED)  return false; // 거래 무효
   if(mode == SYMBOL_TRADE_MODE_CLOSEONLY) return false; // 청산 전용=신규 불가
   if(mode == SYMBOL_TRADE_MODE_LONGONLY  && type != ORDER_TYPE_BUY)  return false;
   if(mode == SYMBOL_TRADE_MODE_SHORTONLY && type != ORDER_TYPE_SELL) return false;
   return true;   // SYMBOL_TRADE_MODE_FULL 등
}

주문 전 게이트로 정리한다

// OnTick 내: 시그널이 발생해도 시장이 닫혀 있으면 보내지 않는다
if(!IsTradeSessionOpen(_Symbol) || !IsNewEntryAllowed(_Symbol, ORDER_TYPE_BUY))
{
   // 10018을 사전에 방지. 로그 한 줄만 남기고 다음 봉을 기다린다
   return;
}

그래도 10018이 반환됐을 때의 처리

세션 정보 갱신 타이밍이나 개장 직후의 거부 등, 게이트를 빠져나가는 경우를 완전히 없앨 수는 없습니다. OrderSend()의 retcode를 확인해 10018은 즉시 재시도하지 않는(다음 봉까지 기다리는) 것이 철칙입니다. 폐쇄 중에 연타해도 로그만 지저분해질 뿐 아무것도 개선되지 않습니다.

MqlTradeRequest req; MqlTradeResult res;
ZeroMemory(req); ZeroMemory(res);
// ... req 구성 ...
if(!OrderSend(req, res) || res.retcode != TRADE_RETCODE_DONE)
{
   if(res.retcode == TRADE_RETCODE_MARKET_CLOSED)   // 10018
      Print("Market closed. Skip and wait for the next session.");
   else
      PrintFormat("OrderSend failed: retcode=%d, lastError=%d", res.retcode, GetLastError());
}

솔직히 말하면, 월요일 개장 직후나 일일 브레이크 전후(특히 금·주가지수)에 주문을 넣는 EA는 이 오류를 일상적으로 마주하게 됩니다. 스케줄을 의식한 EA——세션 확인·개장 직후 보류·주말 전 청산 기능을 갖춘 EA——는 불필요한 오류를 내지 않을 뿐만 아니라 유동성이 얕은 시간대의 나쁜 체결도 피할 수 있습니다. FXEA365가 배포하는 EA는 **월요일 개장 회피(AvoidMondayOpen)·시간 필터·주말 전 청산(CloseAllBeforeWeekend)**을 표준으로 구현하고 있습니다.


우선순위 체크리스트

우선도확인대처
🚨 먼저지금 주말·공휴일인가(서버 시간 기준)기다리기만 하면 됨. 오류 자체는 무해
🚨 먼저사양의 "거래 세션" 범위 내인가종목별 휴지 구간을 시간 필터로 회피
⚠️ 다음서버 시간과 한국 시간을 혼동하고 있지 않은가관찰창의 시각을 기준으로 다시 설정
⚠️ 다음거래 모드가 Full access인가Close only / Disabled라면 브로커 사양 확인
✅ 확인개장 직후·브레이크 종료 직후는 아닌가○분 보류+스프레드 필터
🛠 개발주문 전에 세션/모드를 확인하고 있는가SymbolInfoSessionTrade 게이트 구현

정리

  • Market closedMT5에서는 10018(TRADE_RETCODE_MARKET_CLOSED)·MT4에서는 132(ERR_MARKET_CLOSED). 의미는 같은 "거래 세션 외/거래 제한 중 주문".
  • 주말뿐만 아니라 종목별 일일 브레이크(금·지수)·서버 시간과의 차이·SYMBOL_TRADE_MODE 제한·개장 직후 거부에서도 발생. 평일에 발생했다면 먼저 "사양 → 거래 세션"을 확인.
  • 세션 시간은 브로커와 종목마다 다릅니다. 여러분의 MT5 사양 화면에 적힌 시간만이 정답입니다.
  • EA 개발자는 SymbolInfoSessionTrade() + SYMBOL_TRADE_MODE + TimeTradeServer()의 주문 전 게이트로 영구 대책을 세우세요. 10018이 반환되면 즉시 재시도하지 말고 다음 봉을 기다립니다.

오류 코드 전반은 MQL5 / MT5 오류 코드 대처법 종합 가이드를, 세션 회피·시간 필터를 표준 탑재한 무료 EA는 EA 목록을 참조하세요.


FAQ

Q: 평일 낮 시간인데도 Market closed가 발생합니다. 왜 그런가요?

해당 종목 고유의 거래 휴지 시간대(일일 브레이크)이거나, 심볼의 거래 모드 제한이 원인입니다. 금·은·주가지수 CFD에는 평일이라도 매일 거래할 수 없는 시간대가 있습니다. 관찰창에서 심볼을 우클릭 → "사양" → "거래 세션"과 "거래" 항목을 확인하세요.

Q: 10018과 132는 무엇이 다른가요?

플랫폼이 다를 뿐 의미는 같습니다. 10018(TRADE_RETCODE_MARKET_CLOSED)은 MT5의 OrderSend() 리턴 코드, 132(ERR_MARKET_CLOSED)는 MT4(MQL4)의 GetLastError() 값입니다. 대처법은 공통입니다.

Q: 주말에 EA가 계속 오류를 냅니다. 방치해도 괜찮나요?

실질적인 피해는 없습니다. 시장이 열리면 자연히 멈춥니다. 다만 로그가 지저분해지거나 푸시 알림이 계속 울리는 것이 신경 쓰인다면, EA 측에 요일/세션 체크를 넣어 주문 자체를 건너뛰게 하는 것이 근본 대책입니다(본문 코드 참조).

Q: 암호화폐(BTCUSD)에서도 Market closed가 발생했습니다. 24시간 거래 가능한 것 아닌가요?

암호화폐 CFD를 주말에도 거래할 수 있는지는 브로커에 따라 다릅니다. 주말에는 거래를 정지하거나 짧은 유지보수 휴지를 두는 브로커도 있습니다. FX 페어와 마찬가지로 "사양 → 거래 세션"에서 여러분의 브로커에서 실제 거래 가능 시간을 확인하세요.

📧 가격 인상 사전 알림 + 무료 5일 이메일 강좌

모든 EA는 현재 출시 가격이며 판매 수량에 따라 단계적으로 인상됩니다. 인상 전 사전 알림과 함께 자동매매의 본질, 백테스트 해석법, 브로커 선택 요령을 매일 한 통씩 보내드립니다.

※ 개인정보는 엄격히 보호. 언제든 구독 해지 가능.

댓글 및 질문