[FX마진거래 15편] FX 자동매매(EA)와 알고리즘 트레이딩 입문 — MQL4·MQL5·5대 전략·백테스트 함정
03
02
01

올바른 해외거래소 선택을 돕는 브로커컨펌입니다.

FX마진거래 시리즈는 1편부터 14편까지 시장 구조·차트 분석·리스크 관리·주문 집행·매매일지·플랫폼·시장 양면성·트레이딩 심리까지 트레이더의 실전 회로 전체를 정리했습니다. 14편에서 짚어둔 자동화 도구(OCO·트레일링 스탑)를 본격적으로 확장하면 도달하는 영역이 바로 EA(Expert Advisor) 자동매매와 알고리즘 트레이딩입니다.

EA는 단순히 "사람 대신 매매를 클릭해주는 도구"가 아닙니다. 본인의 트레이딩 시스템을 코드로 박제해 24시간 감정 개입 없이 실행할 수 있게 해주는 동시에, 백테스트로 시스템의 수학적 검증을 가능하게 하고, 다중 통화쌍·다중 시간프레임에 동시 적용하는 확장성까지 제공합니다. 14편에서 정리한 트레이딩 심리의 4대 함정 중 적어도 3가지(감정 통제·확증 편향·보복 매매)는 EA 활용으로 구조적으로 차단됩니다.

그러나 EA를 잘못 만들면 오히려 "자동으로 계좌를 녹이는 기계"가 됩니다. 백테스트 결과만 보고 실거래에 투입한 EA의 90% 이상이 첫 3개월 안에 평균 R 음수로 전환되는 것이 업계의 공공연한 사실입니다. 그 이유는 코드 실력의 문제가 아니라 과적합(Overfitting)·곡선 맞춤(Curve Fitting)·생존 편향·실거래 환경의 차이를 모른 채 백테스트 수치만 믿었기 때문입니다.

이번 15편에서는 EA 개발을 처음 접하시는 분들을 위해 (1) EA의 개념·작동 원리·MT4/MT5와의 연동, (2) 5대 전략 유형 — 추세·역추세·스캘핑·HFT·뉴스 트레이딩, (3) MQL4·MQL5 기본 구조와 최소 EA 코드 예시, (4) 백테스트의 핵심과 초보 EA 개발자가 반드시 마주치는 5대 함정 + Walk-Forward·Out-of-Sample 검증법을 차례로 정리합니다. 표면적 입문이 아니라 실제 한 줄이라도 코드를 짜본 사람의 시각에서 짚어드리겠습니다.

📌 먼저 짚어두는 핵심 원리: EA의 핵심은 코드가 아니라 "검증 가능한 트레이딩 시스템"입니다. 11편의 R-multiple 매매일지에서 양수 기대값이 검증된 시스템만이 코드화 가치가 있습니다. 검증 안 된 직감을 EA로 만드는 것은 직감을 자동화로 가속시킬 뿐, 결과는 더 빠르게 더 큰 손실로 이어집니다. EA 개발의 출발점은 코드가 아니라 본인 시스템의 매매일지 검증입니다.

롱베너01

① EA 개념·작동 원리·MQL4와 MQL5의 본질적 차이

EA(Expert Advisor)는 MetaTrader 플랫폼에서 작동하는 자동매매 프로그램입니다. MQL4(MT4용) 또는 MQL5(MT5용) 언어로 작성된 후 컴파일되어 .ex4 / .ex5 파일로 만들어지고, 차트에 부착되면 그 차트의 시간프레임 단위로 가격 이벤트가 발생할 때마다 사전에 정의된 로직을 실행합니다.

EA 작동 흐름 — 가격 이벤트 → 로직 → 주문

EA는 다음 4가지 핵심 이벤트 함수로 작동합니다.

이벤트 함수 호출 시점 주된 용도
OnInit() EA가 차트에 부착될 때 1회 변수 초기화·핸들 생성·파라미터 검증
OnTick() 새 호가(틱)가 들어올 때마다 진입·청산 로직 판단
OnTimer() 지정된 시간 간격마다 (선택) 틱과 무관한 주기적 작업
OnDeinit() EA가 차트에서 제거될 때 1회 핸들 해제·정리 작업

가장 핵심은 OnTick()입니다. 시장이 활발하면 1초에 수십 번 호출되고, 한산하면 몇 초에 한 번 호출됩니다. 즉 EA의 모든 진입·청산 판단은 OnTick() 안의 로직이 결정합니다. 초보 EA 개발자가 가장 자주 마주치는 함정 중 하나가 바로 "매 틱마다 같은 신호가 반복 발생해 같은 자리에 수십 번 진입"하는 사고입니다 — 신호 발생 시 한 번만 진입하도록 상태 관리를 해줘야 합니다.

MQL4 vs MQL5 — 단순 버전 차이가 아닌 패러다임 차이

두 언어는 문법은 비슷하지만 본질적 차이가 있습니다. C 기반인 점은 같지만, MQL5는 객체 지향과 멀티스레드를 본격 도입한 새로운 패러다임입니다.

항목 MQL4 MQL5
언어 패러다임 절차지향 중심 (함수형) 객체지향 도입 (클래스·상속·다형성)
주문 함수 OrderSend() 단일 함수 MqlTradeRequest 구조체 + OrderSend()
포지션 관리 해징 모드 기본 (같은 종목 매수·매도 동시 가능) Netting/Hedging 모드 선택
매매 이력 OrderSelect()로 직접 순회 HistorySelect()로 기간 지정 후 순회
이벤트 모델 단일 스레드 멀티 스레드 + 차트별 독립 컨텍스트
실행 속도 중간 약 2~3배 빠름 (네이티브 컴파일)
백테스트 엔진 단일 통화쌍 기본 다중 통화쌍·실제 틱 데이터 백테스트 지원
시장 점유 한국 EA 커뮤니티 70% 이상 약 30% (성장 중)

실무자 시각의 권고: 처음 EA를 배우신다면 MQL4부터 시작하시는 것이 합리적입니다. 한국어 학습 자료가 압도적으로 많고, EA 자산도 풍부하며, 절차지향 스타일이라 학습 곡선이 완만합니다. MQL4로 EA의 흐름과 함정을 모두 익힌 뒤 MQL5로 넘어가면 객체지향 구조가 훨씬 자연스럽게 흡수됩니다. 반면 처음부터 객체지향에 익숙하시거나 다중 통화쌍 백테스트가 절실하다면 MQL5로 바로 시작하셔도 좋습니다.

EA가 트레이딩 회로에서 차지하는 위치

14편까지 정리한 회로에 EA를 매핑하면 다음과 같습니다.

  • 8편 차트 분석 → 진입 신호 함수로 코드화 (예: 200EMA 돌파 + RSI 30 회복)
  • 9편 리스크 관리 → 1% 룰을 자동 포지션 사이징 함수로 구현
  • 10편 주문 유형 → 시장가·지정가·OCO·트레일링 모두 OrderSend로 자동 발주
  • 11편 매매일지 → EA 실행 로그 + Account History 자동 추출 → 매매일지 자동 생성
  • 12편 MT4 사용법 → 차트에 EA 부착, AutoTrading 버튼 활성화
  • 14편 거래 심리 → 감정 개입 자체를 코드 단계에서 차단

즉 EA는 14편까지의 모든 회로를 한 곳에 박제하는 그릇입니다. 코드 한 줄이 시스템의 한 규칙에 대응됩니다. 이 매핑이 명확할수록 EA가 안정적으로 작동합니다.

02

② EA 전략 5대 유형 — 추세·역추세·스캘핑·HFT·뉴스 트레이딩

EA로 구현 가능한 전략은 무수히 많지만, 실무에서 자주 쓰이는 것은 5가지 유형으로 정리됩니다. 각 유형의 작동 원리, 적합한 시장 국면, 그리고 실무자가 흔히 빠지는 함정까지 짚어드립니다.

유형 적합 시장 대표 지표·로직 주된 함정
1. 추세 추종(Trend-Following) 방향성 강한 추세장 이동평균 골든크로스·MACD·돈치안 채널 횡보장에서 신호 노이즈 폭증
2. 역추세(Mean Reversion) 박스권·횡보장 RSI·볼린저밴드·스토캐스틱 강한 추세 진입 시 한 번에 큰 손실
3. 스캘핑(Scalping) 고유동성 통화쌍·런던 세션 1~5분봉 단기 돌파·반등 스프레드·슬리피지에 민감
4. HFT(High-Frequency Trading) 마이크로 단위 가격 비효율 호가창 깊이·차익거래 VPS 지연 1ms 차이로 손실 전환
5. 뉴스 트레이딩 NFP·CPI·FOMC 발표 직후 가격 갭·변동성 폭증 활용 슬리피지 5~50핍, 리쿼트 빈발

유형 1 — 추세 추종(Trend-Following)

가장 고전적이고 가장 많이 시도되는 EA 유형입니다. "이동평균선 골든크로스 시 매수, 데드크로스 시 청산" 같은 단순한 로직에서부터 다중 시간프레임의 추세 정렬을 확인하는 복잡한 로직까지 다양합니다.

  • 강점: 큰 추세에 올라타면 손익비 1:5~10까지 가능, 코드 구현이 단순
  • 약점: 횡보장에서 신호가 자주 발생해 가짜 진입 누적, 승률 30~40% 수준이라 심리적 부담
  • 흔한 함정: 백테스트에서 양수 R로 나오는 것은 대부분 강한 추세장 데이터에 곡선 맞춤된 결과. 횡보장 데이터 별도 검증 없이 실거래 투입 시 첫 횡보 구간에서 −5R 누적
  • 실무 권고: ADX(추세 강도) 필터로 ADX > 25 구간에서만 진입하는 추가 조건을 넣으면 횡보장 신호 노이즈를 약 60% 차단

유형 2 — 역추세(Mean Reversion)

가격이 평균에서 벗어나면 결국 평균으로 돌아온다는 가설에 기반합니다. RSI 30 이하에서 매수, 70 이상에서 매도 같은 단순 로직부터 볼린저밴드 ±2σ 터치 후 반등 패턴까지 다양합니다.

  • 강점: 횡보장에서 승률 60~70%까지 가능, 자주 진입해 데이터 누적 빠름
  • 약점: 한 번 강한 추세 진입 시 RSI가 70 이상에 며칠 머물 수 있고, 그동안 매도 포지션이 −20R까지 깨질 수 있음
  • 흔한 함정: "역추세는 안전하다"는 잘못된 인식. 실제로는 작은 수익 누적 후 한 번의 큰 손실로 전체 누적 수익이 한 번에 사라지는 패턴이 압도적으로 많음 (꼬리가 두꺼운 분포)
  • 실무 권고: 반드시 손절가 설정 + 일일 손실 한도 + 추세 필터(예: ADX < 20 구간에서만 진입) 3중 안전장치를 EA 코드에 박아둘 것

유형 3 — 스캘핑(Scalping)

1~5분봉 단위로 5~15핍 작은 수익을 빠르게 누적하는 전략입니다. 진입 빈도가 매우 높아 하루 30~100회 거래도 흔합니다.

  • 강점: 큰 시장 노출 없이 작은 수익 빠르게 누적, 야간 위험 최소화
  • 약점: 거래 비용(스프레드 + 수수료)이 누적 수익의 30~50%까지 잠식
  • 흔한 함정: 백테스트가 평균 스프레드 가정으로 돌아가지만 실거래는 변동성 구간 스프레드 폭증으로 EA 백테스트 +30R이 실거래 −10R로 변질되는 사례 빈발
  • 실무 권고: 백테스트 시 반드시 "실제 변동 스프레드" 모델 사용 (MT5만 지원, MT4는 외부 도구 필요), 그리고 ECN 계좌 + 낮은 커미션 + 빠른 VPS 필수

유형 4 — HFT(High-Frequency Trading)

마이크로 초 단위로 호가창의 가격 비효율을 노리는 가장 고급 전략입니다. 일반 개인 트레이더가 접근 가능한 영역은 사실 매우 제한적입니다.

  • 강점: 시장이 효율적으로 돌아갈수록 작은 가격 차이를 끊임없이 잡아냄
  • 약점: VPS 위치(거래소 서버와의 물리적 거리)·네트워크 지연·MT4의 단일 스레드 한계로 일반 환경에서는 거의 불가능
  • 흔한 함정: "HFT EA"라는 이름의 상용 제품 대부분이 실제로는 1~5분봉 스캘핑 EA이고, 진정한 HFT는 자체 API + 코로케이션 + C++ 수준의 저레벨 최적화가 필요
  • 실무 권고: 일반 개인 트레이더는 시도하지 않는 것을 강력 권장. 도전하시려면 MQL5의 멀티스레드 + 거래소 본사 데이터센터 위치 VPS + 고급 라이선스 거래소 조합 필수

유형 5 — 뉴스 트레이딩

NFP·CPI·FOMC 같은 거시 지표 발표 직후의 가격 폭증을 잡는 전략입니다. 발표 전 양방향 OCO를 걸어두는 방식이 흔합니다.

  • 강점: 한 번의 진입으로 50~100핍 잡을 수 있는 큰 기회
  • 약점: 슬리피지 5~50핍, 리쿼트(주문 거부) 빈발, 변동성 구간 스프레드 5~10배 확대
  • 흔한 함정: 백테스트에서는 깔끔하게 작동하지만 실거래에서는 거래소 서버가 발표 순간 폭주해 주문 자체가 거부되거나 30~50핍 슬리피지로 체결
  • 실무 권고: 변동성 구간 체결 안정성이 검증된 거래소를 반드시 사용, 그리고 발표 직전·직후 30초~1분간 주문 미발송 로직(News Filter) 코드에 박아 슬리피지 폭주 구간 자체를 회피

본인에게 맞는 EA 전략 유형 선택 가이드

본인의 시간·자본·기술 수준에 따라 적합한 유형이 다릅니다. 일반적 권장 흐름은 다음과 같습니다.

  1. EA 입문자 → 추세 추종 단순 EA로 코드·백테스트 흐름 학습
  2. 중급 → 역추세 + 추세 필터 결합 EA로 시장 국면 분기 학습
  3. 고급 → 다중 통화쌍·다중 시간프레임 EA, 뉴스 필터 통합
  4. 전문가 → MQL5 객체지향 + 멀티스레드 + 자체 백테스트 인프라
  5. HFT → 일반 개인 영역 아님, 별도 인프라·자본 필요
01

③ MQL4·MQL5 기본 구조 — 실제 코드로 이해하는 EA의 뼈대

이 단락은 EA를 처음 짜시는 분도, 이미 짜본 분도 한 번 돌아보면 좋은 최소 단위 EA의 구조를 다룹니다. 실제 컴파일 가능한 MQL4 코드 예시로 짚어드립니다.

MQL4 EA의 최소 골격

모든 MQL4 EA는 다음 4가지 이벤트 함수의 골격을 가집니다.

//+------------------------------------------------------------------+
//|                                            MinimalEA.mq4         |
//+------------------------------------------------------------------+
#property strict

// 외부 입력 파라미터 (백테스트·최적화에서 변경 가능)
extern int    MagicNumber  = 12345;   // 이 EA의 고유 번호
extern double LotSize      = 0.10;    // 진입 랏
extern int    StopLoss     = 300;     // 손절 거리(포인트)
extern int    TakeProfit   = 600;     // 익절 거리(포인트, RR 1:2)
extern int    MA_Period    = 200;     // 이동평균 기간

//+------------------------------------------------------------------+
//| EA 차트 부착 시 1회 실행                                          |
//+------------------------------------------------------------------+
int OnInit()
{
    Print("MinimalEA initialized on ", _Symbol);
    return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| 새 호가 도착 시마다 실행 — EA의 핵심                              |
//+------------------------------------------------------------------+
void OnTick()
{
    // 1단계: 동일 EA의 기존 포지션이 있으면 중복 진입 차단
    if(CountMyPositions() > 0) return;

    // 2단계: 진입 신호 — 종가가 200EMA 위로 돌파 시 매수
    double ma     = iMA(_Symbol, 0, MA_Period, 0, MODE_EMA, PRICE_CLOSE, 0);
    double prevMA = iMA(_Symbol, 0, MA_Period, 0, MODE_EMA, PRICE_CLOSE, 1);
    double prevClose = iClose(_Symbol, 0, 1);

    if(prevClose > prevMA && Bid > ma) {
        // 3단계: 매수 진입 (시장가 + 손절 + 익절 동시 설정 = OCO 효과)
        double sl = NormalizeDouble(Ask - StopLoss * _Point, _Digits);
        double tp = NormalizeDouble(Ask + TakeProfit * _Point, _Digits);
        int ticket = OrderSend(_Symbol, OP_BUY, LotSize, Ask, 3, sl, tp,
                               "MinimalEA", MagicNumber, 0, clrBlue);
        if(ticket < 0) Print("OrderSend failed: ", GetLastError());
    }
}

//+------------------------------------------------------------------+
//| EA 차트에서 제거 시 1회 실행                                      |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
    Print("MinimalEA deinitialized, reason=", reason);
}

//+------------------------------------------------------------------+
//| 동일 EA의 현재 보유 포지션 개수 반환 (Magic Number로 식별)        |
//+------------------------------------------------------------------+
int CountMyPositions()
{
    int count = 0;
    for(int i = OrdersTotal() - 1; i >= 0; i--) {
        if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
            if(OrderSymbol() == _Symbol && OrderMagicNumber() == MagicNumber)
                count++;
        }
    }
    return count;
}

이 골격에서 짚어둘 핵심 5가지

  1. Magic Number의 중요성 — 같은 계좌에 여러 EA를 동시에 운영하시는 경우, 각 EA가 본인 포지션만 관리하려면 Magic Number로 식별해야 합니다. 이게 없으면 EA-A가 EA-B의 포지션을 잘못 청산하는 사고가 발생합니다.
  2. 중복 진입 차단(CountMyPositions) — 위에서 짚은 OnTick의 함정. 신호 조건이 만족되면 매 틱마다 진입이 발생하므로 반드시 기존 포지션 체크 후 진입.
  3. NormalizeDouble + _Point + _Digits — 손절·익절 가격은 반드시 NormalizeDouble로 자릿수를 맞춰야 합니다. 이를 빼먹으면 OrderSend가 가격 거부로 실패하는 일이 빈번합니다. 5자리 호가 브로커(예: EURUSD가 1.08501)에서는 _Point가 0.00001이므로 StopLoss=300이면 30핍이 됩니다.
  4. iMA(symbol, 0, period, ...)의 두 번째 인자 0 — 현재 차트 시간프레임을 의미합니다. 명시적으로 PERIOD_H1·PERIOD_H4로 지정하면 멀티 시간프레임 분석 가능합니다.
  5. OrderSend 슬리피지 인자(3) — 시장가 진입 시 허용 슬리피지 핍 수. 너무 작으면 변동성 구간에 주문 거부, 너무 크면 손익비 왜곡. 일반적으로 3~5 권장.

MQL5에서 같은 로직을 짤 때의 변화

MQL5는 OrderSend 호출 방식이 구조체 기반으로 바뀝니다.

// MQL5 - 매수 주문 예시
MqlTradeRequest request = {};
MqlTradeResult  result  = {};

request.action       = TRADE_ACTION_DEAL;
request.symbol       = _Symbol;
request.volume       = 0.10;
request.type         = ORDER_TYPE_BUY;
request.price        = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
request.sl           = request.price - 300 * _Point;
request.tp           = request.price + 600 * _Point;
request.deviation    = 3;
request.magic        = 12345;
request.comment      = "MinimalEA";
request.type_filling = ORDER_FILLING_FOK;

if(!OrderSend(request, result)) {
    Print("OrderSend failed: ", result.retcode);
}

코드는 길어지지만 구조체 방식이 멀티스레드 환경에서 더 안전하고, 부분 체결·재시도 로직 구현이 더 명료합니다. 또한 MQL5는 클래스를 활용해 다음과 같은 구조도 가능합니다.

// MQL5 - 객체지향 스타일
class CTrendStrategy : public CStrategyBase {
public:
    virtual bool ShouldEnter() override {
        double ma = iMA(_Symbol, PERIOD_H1, 200, 0, MODE_EMA, PRICE_CLOSE);
        return iClose(_Symbol, PERIOD_H1, 1) > ma;
    }
    virtual double CalculateLotSize() override {
        // 1% 룰 자동 적용
        return AccountInfoDouble(ACCOUNT_EQUITY) * 0.01 / RiskPerLot();
    }
};

이 객체지향 패턴이 MQL5의 강점입니다. 여러 전략을 클래스 상속으로 관리하면 EA가 5개·10개 늘어나도 코드 유지보수가 가능합니다.

실무자가 자주 빠뜨리는 코드 디테일 5가지

  1. 주말/금요일 마감 직전 진입 차단if(DayOfWeek() == 5 && Hour() >= 22) return; 같은 시간 필터로 주말 갭 위험 회피
  2. 스프레드 필터if((Ask - Bid)/_Point > MaxSpread) return;로 변동성 구간 진입 차단 (스프레드 5배 이상 시 자동 미진입)
  3. 최소 마진 체크if(AccountFreeMargin() < MinMargin) return;로 마진콜 직전 진입 차단
  4. OrderSend 실패 시 재시도 — 한 번의 실패가 전체 EA 멈춤으로 이어지지 않도록 GetLastError 분기별 재시도 로직 필수
  5. 로그 출력Print()를 진입·청산·에러 모든 지점에 박아두면 실시간 디버깅·매매일지 자동 추출에 활용 가능

이 다섯 가지는 모든 EA에 공통으로 들어가야 하는 안전장치입니다. 누락되면 백테스트는 깔끔하게 돌아가도 실거래에서 예외 상황 한 번에 EA가 멈추거나 잘못된 주문을 발송합니다.

④ 백테스트 핵심 + 초보 EA 개발자 5대 함정 + Walk-Forward 검증

이 단락이 15편의 본질입니다. EA 코드를 짜는 것은 1주일이면 가능하지만, "이 EA가 실거래에서도 양수 R인지"를 검증하는 것은 평균 3개월~1년 작업입니다. 그리고 이 검증 단계에서 EA 개발자 95%가 같은 함정에 빠집니다.

백테스트의 기본 — Strategy Tester 활용

MT4·MT5는 Strategy Tester라는 내장 백테스트 엔진을 제공합니다. 핵심 사용 흐름:

  1. MetaEditor에서 EA 컴파일 → .ex4 파일 생성
  2. MT4 메뉴 [보기 → 전략 테스터] 또는 단축키 Ctrl+R
  3. EA 선택 → 통화쌍·시간프레임·기간 지정 → 모델(Every Tick / Control Points / Open Prices) 선택
  4. Start 버튼 → 백테스트 실행
  5. 결과 확인: 총 손익·수익 팩터·최대 드로다운·승률·평균 R

Strategy Tester 결과 해석 핵심 지표 4가지

지표 의미 건전한 EA의 기준
Net Profit 총 순수익 양수 (당연)
Profit Factor 총 수익 ÷ 총 손실 1.5 이상 (1.0 미만은 손실 EA)
Maximum Drawdown 최대 누적 손실폭 20% 이하 (40% 이상은 위험)
Sharpe Ratio 위험 조정 수익률 1.0 이상 (2.0 이상은 우수)

그러나 이 지표들이 모두 좋게 나오는 EA가 실거래에서 망하는 일이 압도적으로 많습니다. 그 이유가 다음 5대 함정입니다.

초보 EA 개발자 5대 함정

함정 1 — 과적합(Overfitting)·곡선 맞춤(Curve Fitting)

가장 흔하고 가장 치명적인 함정입니다. 백테스트 결과를 좋게 만들기 위해 파라미터를 끝없이 조정하다 보면, EA가 "과거 특정 기간에만 잘 작동하는 도구"로 변질됩니다.

  • 파라미터 10개를 각 10단계로 최적화하면 10^10 = 100억 개 조합. 그중 1만 개는 우연히 좋은 결과를 만듦
  • 그 1만 개 중 가장 좋은 것을 선택하면 "검증된 EA"가 아니라 "운으로 맞춰진 곡선"
  • 증상: 백테스트 Profit Factor 3.0 이상인데 실거래 첫 달부터 −5R 누적
  • 방어법: 파라미터 수 최소화 (3~5개 이하), 최적화는 Out-of-Sample로 검증

함정 2 — Look-Ahead Bias (미래 데이터 사용)

코드 실수로 EA가 "미래 가격"을 알고 있는 상태로 백테스트되는 경우입니다. 흔한 사례:

  • iClose(_Symbol, 0, 0)를 신호 판단에 사용 → 0번 인덱스는 현재 진행 중인 봉의 종가, 즉 아직 확정 안 된 값
  • 전 세계 트레이더가 보는 종가는 봉이 닫힌 후 확정되는데 코드는 그 전에 봉이 닫힌 것처럼 작동
  • 해결: 신호 판단은 반드시 iClose(_Symbol, 0, 1) (이전 봉 = 확정된 봉) 사용

이 한 줄 차이로 백테스트 결과가 +10R에서 −2R로 뒤집히는 일이 흔합니다.

함정 3 — 거래 비용 누락 또는 비현실적 가정

Strategy Tester의 기본 설정은 평균 스프레드 가정입니다. 실거래는 다릅니다.

  • 아시아 새벽 시간대 EUR/USD 스프레드: 평균 1.5핍 (백테스트 기본값)
  • FOMC 발표 직후: 5~10핍 (스캘핑 EA의 손익비 완전 무력화)
  • 주말 갭: 백테스트는 갭 모델링 안 함, 실거래는 매주 발생
  • 커미션·스왑: 백테스트는 종종 누락

방어법: MT5의 "Real Tick Data" 백테스트 모드 사용 (실제 변동 스프레드 반영), 또는 외부 도구로 실제 스프레드 데이터 임포트.

함정 4 — 생존 편향(Survivorship Bias) — 통화쌍·기간 선택의 함정

EA를 EUR/USD에 적용했을 때 잘 작동한다고 다른 통화쌍에서도 잘 작동하는 것이 아닙니다. 또한 강한 추세가 있던 2020~2022년 데이터로 백테스트하면 추세 추종 EA가 매우 좋게 나오지만, 횡보장이 길었던 2023~2024년에는 망합니다.

  • 해결: 다중 통화쌍 + 다중 시간 구간 백테스트 필수
  • 최소 검증: EUR/USD·GBP/USD·USD/JPY·AUD/USD 4개 + 최근 3년·과거 3년 두 구간
  • EA가 모든 조합에서 양수 R이면 견고, 일부에서만 양수면 그 일부에 곡선 맞춤된 EA

함정 5 — 실거래 환경 차이 (Real Market vs Tester)

가장 무시되지만 가장 큰 함정입니다. Strategy Tester와 실거래의 본질적 차이:

  • 슬리피지 — Tester는 0 또는 고정값, 실거래는 시장 변동성에 따라 0~50핍
  • 리쿼트 — Tester는 100% 체결, 실거래는 변동성 구간 거부 빈발
  • 플랫폼 지연 — Tester는 즉시 처리, 실거래는 거래소 서버 응답 지연
  • 비대칭 데이터 — Tester는 Bid 기반, 실거래는 Bid·Ask 분리
  • 마진콜·스톱아웃 — Tester는 모델링하지만 실거래의 실제 강제 청산 메커니즘과 다름

Walk-Forward Analysis — 과적합을 검출하는 표준 방법

업계 표준의 견고성 검증법입니다. 데이터를 시간 순으로 분할해 다음 흐름으로 검증합니다.

  1. 전체 기간 분할 — 예: 2018~2024년 데이터를 6개월 단위 12구간으로 분할
  2. 최적화 구간(In-Sample) — 첫 4구간(2018~2020년)에서 파라미터 최적화
  3. 검증 구간(Out-of-Sample) — 최적화한 파라미터를 다음 구간(2020년 후반기)에 그대로 적용해 결과 확인
  4. 창문 슬라이딩 — 검증 구간을 1단계씩 미루며 위 과정 반복
  5. 결과 종합 — Out-of-Sample 구간들의 평균 R이 양수면 견고, 음수면 In-Sample에 곡선 맞춤된 EA

MT5는 Strategy Tester에 Walk-Forward 옵션이 내장되어 있어 즉시 활용 가능합니다. MT4는 외부 도구(예: Tickstory + 별도 스크립트) 필요. Walk-Forward 검증 통과한 EA만 실거래 투입하시는 것이 모든 손실 사고의 90%를 방지합니다.

실거래 진입 전 최소 검증 절차 5단계

단계 액션 기준
1. 기본 백테스트 최근 3년 데이터로 단일 통화쌍 백테스트 Profit Factor 1.5↑, MDD 20%↓
2. 다중 통화쌍 검증 4개 통화쌍 동일 파라미터 백테스트 모두 양수 R
3. Walk-Forward Analysis 6개월 단위 분할 검증 Out-of-Sample 구간 평균 R 양수
4. 데모 계좌 실시간 운영 최소 1개월 데모 계좌 가동 백테스트 대비 평균 R 차이 30% 이내
5. 소액 실거래 검증 최소 자본·낮은 랏으로 1개월 실운영 데모 대비 평균 R 차이 20% 이내

이 5단계를 모두 통과한 EA만이 본격 운영 자격을 가집니다. 단계를 줄이려는 시도가 모든 손실의 시작입니다.

브로커컨펌의 견해

브로커컨펌이 한국 EA 트레이더 환경을 점검하면서 가장 자주 마주치는 사실은, "백테스트 결과만 보고 실거래에 EA를 투입했다가 첫 1~3개월 안에 평균 R 음수로 전환되어 운영 중단하는 사례가 압도적 다수"라는 점입니다. 이는 EA 코드 실력이나 전략 선택의 문제가 아니라 — 15편에서 짚은 5대 함정(과적합·Look-Ahead Bias·거래 비용 누락·생존 편향·실거래 환경 차이)을 검증 단계에서 걸러내지 못한 결과입니다. 검증 절차 단축이 모든 EA 실패의 시작이고, Walk-Forward Analysis + 다중 통화쌍 + 데모 1개월 + 소액 실거래 1개월의 5단계 절차를 인내심 있게 따라가는 것이 유일한 방어책입니다.

실전 EA 운영 흐름을 한 줄로 정리하면 — (1) 11편 매매일지로 검증된 양수 기대값 시스템 보유 → (2) 그 시스템을 MQL4·MQL5 코드로 박제 → (3) Magic Number·중복 진입 차단·스프레드 필터·시간 필터 등 안전장치 5종 박아두기 → (4) 단일 통화쌍 백테스트로 기본 검증 → (5) 다중 통화쌍 + Walk-Forward로 견고성 검증 → (6) 데모 1개월 운영 → (7) 소액 실거래 1개월 검증 → (8) 본격 운영 + 매매일지 자동 추출로 분기별 시스템 개선. 이 8단계 흐름이 EA를 운에 의존하는 도박 도구에서 검증된 자동매매 시스템으로 전환시킵니다.

그런데 여기서 EA 트레이더에게만 특별한 결정적 단서가 있습니다. EA의 모든 검증·운영은 거래소 인프라가 받쳐줄 때만 의미를 가집니다. 일반 수동 트레이더는 거래소의 단점을 본인의 판단으로 일부 우회할 수 있지만, EA는 코드대로만 작동하므로 거래소 인프라의 결함이 그대로 손익에 반영됩니다.

  • VPS 무료 제공 여부 — EA를 24시간 안정적으로 운영하려면 VPS 필수. 거래소가 무료 VPS를 제공하면 월 20~50달러 비용 절감 + 거래소 서버에 가까운 위치에 자동 할당되어 지연 시간 감소
  • Stops Level 정책 — 거래소가 Stops Level을 너무 크게 강제하면 9편 정밀 손절·15편 스캘핑 EA 자체가 작동 불가능
  • 실제 변동 스프레드 안정성 — 백테스트가 가정한 평균 스프레드와 실거래 스프레드의 격차가 작아야 EA의 백테스트 결과가 실거래에서도 재현됨
  • EA·Hedging 모드 지원 — MQL4 EA의 해징 전략은 Netting 모드 거래소에서 작동 안 함, 반드시 Hedging 모드 명시 거래소 선택
  • API 안정성과 리쿼트 빈도 — 변동성 구간 OrderSend 실패율이 거래소별로 5배 이상 차이. 뉴스 트레이딩·HFT EA의 사활을 결정
  • MetaQuotes 공식 파트너 등급 — 일부 거래소는 MetaQuotes에서 이른바 Ultency 통합 등 기관급 파트너십을 보유하는데, 이는 MT4·MT5 서버의 안정성·LP 연결 깊이·API 우선순위에 직접 영향

이런 EA 친화적 인프라는 거래소의 다층 글로벌 라이선스 구조, 운영 이력, 기관급 유동성 공급자 직접 연결, MetaQuotes사와의 공식 파트너십 깊이, VPS·API 정책에서 결정됩니다. 예를 들어 호주 ASIC, 케이맨 CIMA, 바누아투 VFSC 등 다층 라이선스 구조와 2009년 설립 이래 누적된 운영 이력, 그리고 최근 MetaQuotes Ultency 통합을 통한 기관급 유동성 공급자 등극까지 이어진 밴티지마켓(Vantage Markets)의 사례는, EA 백테스트 결과가 실거래에서도 재현되도록 받쳐주는 인프라가 어떤 모습인지 보여주는 한 예시입니다.

FX마진거래 시리즈는 15편까지 진행되며 시장 구조부터 차트 분석, 리스크 관리, 주문 집행, 매매일지 검증, 플랫폼 사용법, 시장 양면성, 거래 심리, 그리고 이번 편의 EA·알고리즘 트레이딩까지 트레이더의 실전 회로 전체와 그것을 자동화하는 도구까지 모두 다뤘습니다. 본인의 11편 매매일지에서 검증된 시스템을 MQL4·MQL5로 코드화하시고, 15편의 5대 함정을 Walk-Forward Analysis로 걸러내신 뒤 데모·소액 검증을 거치신다면 — 평균 R 양수 EA가 본인의 통장에 실제 수익으로 누적되기 시작합니다.

다음 [FX마진거래 16편]에서는 한국 트레이더가 EA를 포함한 모든 FX 트레이딩 활동에서 반드시 알아야 하는 금융 규제와 FX마진거래의 법적 위치를 다룹니다. 한국에서 FX마진거래의 법적 위치, CFD·FX의 장외 파생상품 분류, 합법적 거래 방식, 해외 거래소 사용 시 유의사항, 금융 규제 변화와 리스크까지 — 트레이더가 시장에 진입하기 전 반드시 점검해야 할 법적 안전망을 정리합니다. 다음 편에서 계속해서 한국 FX 트레이더의 실전 가이드를 이어가겠습니다.