분류
플랫폼
난이도
초급
사용 상황
MT5 운용EA 평가전략 설계

엑스퍼트 어드바이저

MQL5로 작성되어 MetaTrader 5 안에서 실행되며, 프로그램된 규칙에 따라 수동 개입 없이 주문을 넣고 수정하고 청산하는 자동매매 프로그램.

다른 표현: EA, Expert Advisor, 트레이딩 로봇, 트레이딩 봇

업데이트일

쉽게 말하면

MetaTrader 안에서 사용자를 대신해 거래하는 프로그램이다. 판단력도 없고, 사용자가 넣어준 것 이상의 기억도 없다. 플랫폼이 호출하면 깨어나서, 보도록 작성된 몇 가지만 보고, 행동한다.

왜 중요한가

백테스트, 낙폭 수치, 매직 넘버, VPS 가동 시간이 존재하는 이유는 주문을 내는 주체가 사람이 아니라 프로그램이기 때문이다. 플랫폼이 EA에게 무엇을 건네주고 무엇을 건네주지 않는지 아는 것이, 결과를 제대로 읽는 것과 결과에 놀라는 것의 차이를 만든다.

  • EA는 망설임 없이 실행한다. 그것이 EA의 가치 전부이자 위험 전부다. 유효한 신호를 한 번도 거르지 않는 규칙 집합은, 오늘이 평소와 다르다는 사실도 결코 알아차리지 못한다.
  • EA가 보는 범위는 좁다. 자기 심볼의 가격, 자신이 요청한 지표 값, 계좌의 포지션과 잔고가 전부다. 뉴스, 다른 브로커의 호가, 사용자의 다른 계좌는 코드가 직접 가져오지 않는 한 그 범위 밖에 있다.
  • EA는 컴파일된 상태로 배포된다. .ex5 파일은 실행되지만 읽을 수 없으므로, 구매자의 신뢰는 소스 코드가 아니라 공개된 테스트 증거에서 나와야 한다.
  • EA는 터미널이 켜져 있는 동안에만 작동한다. 잠든 노트북 위의 EA는 거래하지 않는 EA이며, 이것이 VPS를 쓰는 이유 전부다.

MetaTrader 5에서

MT5에서의 위치

  • 내비게이터 → 엑스퍼트 어드바이저 — 터미널이 인식하는 컴파일된 EA 목록
  • 파일 → 데이터 폴더 열기 → MQL5/Experts — .ex5 파일이 이 위치에 있어야 목록에 나타난다
  • 툴바 → 알고리즘 트레이딩 — 최상위 스위치. 차트에 슬픈 얼굴이 뜬 EA는 이 버튼이 막고 있는 EA다
  • 차트 → EA 속성(F7) → 입력 변수 / 공통 — 파라미터와 EA별 권한
  • 보기 → 전략 테스터(Ctrl+R) — 같은 EA를 과거 데이터 위에서 실행

EA가 사용하는 방식

  • 터미널은 부착 시 OnInit()을 한 번, 차트 심볼로 호가가 들어올 때마다 OnTick()을, 제거 시 OnDeinit()을 호출한다.
  • 작업은 보통 매 틱이 아니라 마감된 봉에서 일어난다. EA는 현재 봉의 시가 시각을 저장해 둔 값과 비교해, 새로 생긴 것이 없으면 즉시 반환한다.
  • 주문은 값이 채워진 MqlTradeRequest로 나가거나, 대부분을 대신 채워 주는 CTrade 래퍼를 통해 나간다.
  • 각 인스턴스는 자기 주문에 매직 넘버를 붙여 자기 포지션만 관리한다. 이것이 없으면 두 EA가 같은 티켓을 두고 다툰다.

일반적인 설정

설정 일반적인 값 비고
알고리즘 트레이딩(터미널) 활성화 설치 직후에는 꺼져 있다. 켜기 전까지는 아무것도 거래되지 않는다.
알고리즘 트레이딩 허용(EA별, F7 → 공통) 활성화 터미널 전체 스위치와는 별개의 권한이다.
지정 URL에 대한 WebRequest 허용 EA가 필요로 하지 않으면 끔 외부 데이터를 가져오는 EA만 필요하다. URL 단위로 허용하고 일괄 허용은 하지 않는다.
차트 시간대 해당 EA가 설계된 시간대 H1 차트 위의 M15 전략은 다른 전략이다. OnTick은 틱마다 발생하지만 봉 로직은 차트의 주기를 읽는다.
MagicNumber 실행 중인 인스턴스마다 고유하게 제품 단위가 아니다. 같은 EA를 두 차트에서 돌리면 값도 두 개가 필요하다.

자주 생기는 운용 문제

  • 터미널이 닫혀 있거나 절전 상태이거나 업데이트로 재시작 중이면 EA는 그저 작동하지 않으며, 어떤 오류도 기록되지 않는다.
  • 브로커와 설정 사이의 심볼 이름 불일치(EURUSD와 EURUSD.m)는 EA를 부착된 채 침묵하게 만든다.
  • 가용 증거금 부족: OrderSend가 시도마다 실패하는데도 EA는 계속 시도하므로, 계좌는 아무 일도 하지 않는 동안 로그만 쌓인다.
  • 여러 EA가 동시에 주문을 보내면 거래 컨텍스트가 사용 중이 된다. 간헐적이고 재현하기 어려운 실패다.
  • 체결 방식이나 계약 크기가 다른 브로커에서 테스트한 EA는 코드를 한 줄도 바꾸지 않았는데 실계좌에서 다르게 움직인다.

관련 MT5 함수

OnInit() / OnDeinit()
부착 시 한 번, 제거 시 한 번 호출된다. 입력값을 검증하고 핸들을 만드는 자리다.
OnTick()
차트 심볼로 호가가 들어올 때마다 호출된다. 주된 진입점이다.
OnTimer()
EventSetTimer()로 정한 고정 간격마다 호출된다. 틱이 들어오는지에 좌우되면 안 되는 작업용이다.
OrderSend(request, result)
모든 거래 작업을 내보내는 단 하나의 호출이며, 어떤 종류인지는 요청 구조체가 결정한다.
CTrade (Trade/Trade.mqh)
대부분의 EA가 MqlTradeRequest를 직접 채우는 대신 사용하는 표준 라이브러리 래퍼다.

예시

거의 모든 EA를, 플랫폼이 호출하는 순서로만 줄여 놓은 것이다. 여기에 전략은 하나도 없다. 전략이 들어앉는 틀일 뿐이다.

1. OnInit()
부착 시 한 번
입력값 검증, 지표 핸들 생성, 매직 넘버 설정.
2. OnTick()
호가가 들어올 때마다
새 봉이 생기지 않았으면 즉시 반환하고, 생겼으면 규칙을 평가한다.
3. OrderSend()
규칙이 발동할 때
작업 하나당 채워진 MqlTradeRequest 하나 — 진입, 수정 또는 청산.
4. OnDeinit()
제거 시 한 번
핸들을 해제한다. 미결제 포지션은 이 단계로 청산되지 않고 그대로 남는다.

차트에서 EA를 제거해도 그 EA가 연 포지션은 청산되지 않는다. 포지션은 남고, 관리하는 주체만 사라진다.

계산 if (iTime(_Symbol, PERIOD_CURRENT, 0) == lastBarTime) return;

결과 결정과 결정 사이의 수천 개 틱을 무시하는 봉 마감 기준 EA

사용하는 법

직접 만들지 않은 EA를 판단하는 일은 증거의 문제다. 컴파일된 파일은 아무것도 알려주지 않는다. 아래는 무엇을 요구해야 하는지에 대한 것이다.

  • 백테스트가 어떤 데이터를 썼고 어떻게 모델링했는지 물어보라. 실제 틱과 모델링 품질 수치는 의미가 있지만, 설명 없는 자산 곡선은 그렇지 않다.
  • 거래 횟수와 측정 기간을 물어보라. 여기 공개된 중앙값 EA는 여러 해에 걸쳐 362건을 종료했다. 넉 달에 마흔 건은 일화일 뿐이다.
  • 전략이 손실 포지션을 열어 두는지 확인하라. 물타기와 그리드 회복은 회복하지 못하는 바스켓이 나오기 전까지 아름다운 곡선을 만들며, 종료된 거래로 계산한 어떤 지표도 이를 경고하지 않는다.
  • 자금을 넣기 전에 자신의 브로커에서 데모로 돌려 보라. 체결 방식, 스프레드, 계약 크기, 심볼 명명이 모두 다르고, 모두 결과를 바꾼다.
  • 인스턴스마다 고유한 매직 넘버를 부여하고, 둘 이상을 돌리기 전에 어느 것이 어느 것인지 기록해 두라.

여기 실린 모든 EA는 테스트 기간, 데이터 출처, 모델링 품질, 전체 거래 원장을 공개하므로 이 증거들은 요청하는 것이 아니라 직접 확인할 수 있다.

흔한 오해

EA를 판단력 있는 트레이더로 대하는 것

EA는 플랫폼이 매 틱마다 호출하는 규칙 집합이다. 시장이 달라졌다는 것도, 십 분 뒤에 중앙은행이 발언한다는 것도, 자기 성과가 나빠졌다는 것도 알아차리지 못한다. 누군가 정확히 그것을 위한 규칙을 써 넣지 않았다면 그렇다.

백테스트 결과가 내 계좌로 그대로 옮겨온다고 가정하는 것

스프레드, 수수료, 체결 방식, 계약 크기, 심볼 구성은 모두 결과의 일부다. 한 브로커에서의 테스트는 그 브로커에 대한 증거이며, 자신의 계좌에서 데모로 돌려 보는 것이 얼마나 옮겨오는지 확인하는 가장 싼 방법이다.

EA를 제거해 멈췄으니 거래도 멈췄다고 생각하는 것

EA를 떼어내도 그 EA의 미결제 포지션은 그 자리에 남는다. 이후에는 추적하거나 청산하는 주체가 없으며, 손절이나 목표가나 스톱아웃에 닿을 때까지 그대로 있다.

여러 EA를 한 계좌에서 구분 없이 돌리는 것

매직 넘버가 서로 다르지 않으면 각 EA가 모든 포지션을 자기 것으로 여겨 관리하고, 서로의 거래를 청산해 버린다. 이 고장은 조용하다. 오류는 나지 않고, 어느 전략과도 맞지 않는 결과만 남는다.

자세히

실제 EA 기록은 어떤 모습인가

정의는 작동 방식을 설명하고, 기록은 경험을 설명한다. 여기에 공개된 14개 EA는 종료된 거래 전체 목록을 함께 공개한다 — 2019년 이후 9,702건이다.

공개된 14개 EA 전체
종료된 거래9,702
EA당 거래 수(중앙값)362, 108에서 4,725까지
프로핏 팩터(중앙값)1.39, 1.27에서 1.52까지
최악의 연속 손실(중앙값)6거래, 최악 14
신고점 없이 지난 최장 기간(중앙값)423일, 최악 775
검증된 실계좌 운용0

EA는 수익이 나는가는 그 기록을 EA별로 살펴보고, EA와 수동 매매 비교는 사람이 실제로 적용하는 중단 규칙으로 같은 거래를 다시 돌려본다.

자주 묻는 질문

MetaTrader 5에서 엑스퍼트 어드바이저란 무엇인가?
MQL5로 작성해 .ex5 파일로 컴파일한 프로그램으로, 터미널 안에서 실행되며 자기 규칙대로 거래한다. 플랫폼은 EA가 부착된 차트로 호가가 들어올 때마다 EA를 호출하고, EA는 키보드 앞에 아무도 없는 상태에서 주문을 넣고 수정하고 청산한다.
EA가 작동하려면 컴퓨터를 켜 두어야 하는가?
그렇다. EA는 터미널 안에서 실행되므로 터미널이 켜져 있고 연결되어 있는 동안에만 거래한다. 감시자 없이 돌리는 EA가 절전이나 재시작이 있는 컴퓨터 대신 보통 VPS에 올라가는 이유가 이것이다.
구매한 EA 안의 전략을 읽을 수 있는가?
.ex5 파일에서는 읽을 수 없다. 컴파일된 EA는 로직을 드러내지 않고 실행되며, 판매자가 그렇게 배포하는 이유도 바로 그것이다. 전략은 상품 설명에서 정직하게 서술되고 공개된 테스트 증거로 뒷받침되어야 한다.
같은 계좌에서 EA를 여러 개 돌릴 수 있는가?
가능하고 흔한 일이다. 각 인스턴스는 자기가 연 포지션만 관리하도록 고유한 매직 넘버가 필요하고, 계좌에는 그 전부를 동시에 감당할 가용 증거금이 필요하다. 전략들은 서로의 존재를 알지 못한다.