파이썬으로 MT 계좌를 다루는 방법은 크게 두 가지입니다. MetaQuotes가 배포하는 MT5용 파이썬 패키지를 쓰는 방법과, HTTP로 계좌에 접근하는 클라우드 API를 쓰는 방법입니다. 코드 모양은 비슷해 보이지만 운영 제약이 다릅니다.
먼저 결론
내 PC에서 분석과 백테스트를 한다면 파이썬 패키지가 편합니다. 서버에 올려 24시간 돌리거나 MT4를 다뤄야 하거나 계좌가 여러 개라면 HTTP 방식이 맞습니다.
경로 1: MT5 파이썬 패키지
MT5 터미널과 같은 컴퓨터에서 통신하는 방식입니다.
import MetaTrader5 as mt5
mt5.initialize() # 같은 PC의 MT5 터미널에 붙는다
info = mt5.account_info()
print(info.balance, info.equity)
rates = mt5.copy_rates_from_pos("EURUSD", mt5.TIMEFRAME_H1, 0, 500)
mt5.shutdown()
강점: 과거 시세를 대량으로 받아오기 쉽고, pandas로 바로 넘겨 분석할 수 있습니다. 지연이 짧고 무료입니다.
제약: MT5 터미널이 같은 머신에 설치되어 실행 중이어야 합니다. 즉 윈도 환경이 필요하고, 리눅스 서버에 올리려면 우회 구성이 필요합니다. MT4는 지원하지 않습니다. 계좌 여러 개를 동시에 다루려면 터미널을 여러 개 띄우고 각각 붙어야 합니다.
경로 2: HTTP(REST + WebSocket)
터미널 연결을 서비스 쪽 인프라가 유지하고, 내 코드는 요청만 보냅니다.
import requests, os
H = {"x-api-key": os.environ["MTAPI_KEY"]}
BASE = "https://api.metatraderapi.net"
def summary(acc):
return requests.get(f"{BASE}/AccountSummary",
params={"id": acc}, headers=H, timeout=10).json()
def market_buy(acc, symbol, volume, sl=None, tp=None):
p = {"id": acc, "symbol": symbol, "operation": "buy", "volume": volume}
if sl: p["stoploss"] = sl
if tp: p["takeprofit"] = tp
r = requests.post(f"{BASE}/OrderSend", json=p, headers=H, timeout=15)
r.raise_for_status(); return r.json()
# 계좌 여러 개도 그냥 반복문
for acc in ACCOUNTS:
s = summary(acc)
if s["freeMargin"] > 500:
market_buy(acc, "EURUSD", 0.10)
강점: 운영체제 제약이 없습니다. 리눅스 컨테이너, 서버리스 함수, 라즈베리파이 어디서든 같은 코드가 돕니다. MT4와 MT5를 같은 방식으로 다루고, 계좌 수가 늘어도 코드 구조가 바뀌지 않습니다.
제약: 네트워크 구간이 하나 늘어나고, 월 이용료가 발생합니다. 과거 시세 대량 수집은 시세 데이터 전용 소스를 따로 쓰는 편이 나은 경우가 많습니다.
기준별 비교
실행 환경
패키지 방식은 윈도 + 터미널 상시 실행이 조건입니다. HTTP 방식은 조건이 없습니다. 이 한 줄이 두 방식의 실질적인 차이 대부분을 설명합니다.
MT4 지원
패키지는 MT5만 지원합니다. MT4 계좌를 다뤄야 하면 선택지가 아닙니다.
다계좌
패키지는 터미널 하나에 계좌 하나가 기본입니다. 계좌 10개면 프로세스 관리 문제가 됩니다. HTTP 방식은 계좌 ID 리스트를 순회하면 끝입니다.
백테스트
패키지는 과거 시세를 받아오기 쉬워 백테스트 준비가 빠릅니다. HTTP 방식은 시세 이력을 별도로 확보해야 하는 경우가 있습니다.
배포
패키지 방식은 “윈도 서버에 터미널과 파이썬을 함께 설치”가 배포입니다. HTTP 방식은 일반 파이썬 앱 배포와 같습니다.
섞어 쓰는 구성이 현실적입니다
분석과 전략 개발은 내 PC에서 파이썬 패키지로 하고, 실제 운영은 HTTP 방식으로 서버에서 돌리는 조합이 많습니다. 전략 로직을 순수 함수로 분리해 두면 두 환경에서 같은 코드를 재사용할 수 있습니다.
# 데이터 소스와 실행 계층을 함수 밖으로 분리한다
def signal(candles) -> str | None:
... # "buy" | "sell" | None — 순수 함수
# 연구: 패키지로 캔들 확보 -> signal() 검증
# 운영: 서버에서 캔들 확보 -> signal() -> HTTP 주문
정리
선택 기준은 성능이 아니라 실행 환경입니다. 내 PC에서 연구하면 패키지, 서버에서 운영하면 HTTP, MT4가 섞여 있으면 HTTP입니다. 전략 로직을 실행 계층과 분리해 두는 것이 어느 쪽을 고르더라도 가장 이득입니다.
요금 기준은 요금제, 연결 순서는 한국 사용자 안내에 있습니다.
자주 묻는 질문
MetaTrader5 파이썬 패키지로 MT4 계좌를 다룰 수 있나요?
아닙니다. 해당 패키지는 MT5 전용이며 MT5 터미널이 같은 컴퓨터에서 실행 중이어야 합니다. MT4 계좌를 파이썬으로 다루려면 HTTP 기반 인터페이스가 필요합니다.
리눅스 서버에서 파이썬으로 MT 자동매매를 돌릴 수 있나요?
MT5 파이썬 패키지는 터미널이 같은 머신에 있어야 하므로 리눅스에서는 우회 구성이 필요합니다. HTTP 기반 API를 쓰면 리눅스와 컨테이너에서 제약 없이 동작합니다.