계좌가 두세 개일 때는 터미널을 번갈아 보면 됩니다. 다섯 개를 넘어가면 “오늘 전체적으로 얼마인지”를 답하는 데 십 분이 걸리고, 그 답이 정확한지도 확신할 수 없게 됩니다.
구조는 세 층으로 나눕니다
- 수집: 계좌별로 잔고·순자산·포지션·체결 내역을 주기적으로 조회합니다.
- 저장: 조회 결과를 시계열로 쌓습니다. 스냅샷과 거래 기록을 따로 저장합니다.
- 표시: 대시보드는 저장소만 읽습니다. 화면이 API를 직접 호출하지 않게 하는 것이 중요합니다.
3번을 지키지 않으면 화면을 새로 고칠 때마다 계좌 수만큼 요청이 발생하고, 사람이 많이 볼수록 느려집니다.
무엇을 얼마나 자주 수집할까
- 계좌 스냅샷(잔고, 순자산, 마진): 1~5분 간격. 자산 곡선과 낙폭 계산의 원천입니다.
- 보유 포지션: 1~5분 간격. 노출 합계와 심볼 편중을 보는 데 씁니다.
- 체결 내역: 15~60분 간격이면 충분합니다. 마지막으로 가져온 시각 이후만 요청합니다.
import requests, os, time, sqlite3, datetime
H = {"x-api-key": os.environ["MTAPI_KEY"]}
BASE = "https://api.metatraderapi.net"
db = sqlite3.connect("tracking.db")
def snapshot(acc):
s = requests.get(f"{BASE}/AccountSummary",
params={"id": acc["id"]}, headers=H, timeout=10).json()
db.execute("INSERT INTO equity_snapshots(account, ts, balance, equity, margin) VALUES (?,?,?,?,?)",
(acc["name"], datetime.datetime.utcnow().isoformat(),
s["balance"], s["equity"], s.get("margin", 0)))
db.commit()
return s
for acc in ACCOUNTS:
try:
snapshot(acc)
except Exception as e:
log_failure(acc["name"], e) # 한 계좌 실패가 전체를 멈추지 않게
마지막 예외 처리가 실전에서 중요합니다. 계좌 하나가 응답하지 않을 때 수집기가 죽으면 나머지 계좌의 데이터에도 구멍이 생깁니다.
집계에서 자주 틀리는 것
1. 통화가 다른 계좌를 그냥 더한다
USD 계좌와 EUR 계좌의 순자산을 합산하면 의미 없는 숫자가 나옵니다. 계좌마다 기준 통화를 저장하고, 합산할 때는 하나의 표시 통화로 환산해야 합니다. 환산에 쓴 환율과 시각도 함께 저장해 두면 나중에 숫자가 달라 보이는 이유를 설명할 수 있습니다.
2. 입출금을 수익으로 계산한다
잔고 증가에는 입금이 포함됩니다. 입출금 기록을 분리하지 않으면 수익률이 왜곡됩니다. 체결 내역에서 입출금 유형을 걸러내고, 성과는 입출금을 제외한 순손익으로 계산해야 합니다.
3. 낙폭 기준을 하나로 고정하지 않는다
낙폭은 ‘역대 최고 자산 대비’인지 ‘기간 시작 대비’인지에 따라 값이 크게 다릅니다. 대시보드에 어떤 기준인지 표시해 두지 않으면 계좌 간 비교가 무의미해집니다.
4. 부분 청산을 별건으로 센다
MT5 계좌에서는 한 포지션의 부분 청산이 여러 거래로 기록됩니다. 이를 그대로 세면 거래 건수와 승률이 부풀려집니다. 포지션 단위로 다시 묶는 단계가 필요합니다. 플랫폼별 내역 구조 차이는 MT4와 MT5 차이에 정리했습니다.
대시보드에 실제로 필요한 화면
많이 만들다 보면 결국 네 개로 수렴합니다.
- 전체 요약: 총 순자산, 오늘 손익, 열린 포지션 수, 경고 개수
- 계좌 목록: 계좌별 순자산·오늘 손익·낙폭, 이상값 강조
- 자산 곡선: 계좌별·전체. 스냅샷 테이블에서 바로 그립니다
- 노출 현황: 심볼별 순포지션 합계. 서로 다른 계좌가 같은 방향에 몰려 있는지 확인용
마지막 항목이 의외로 중요합니다. 계좌를 나눠 운용하고 있어도 전략이 비슷하면 실제 위험은 합산됩니다.
경고는 조건을 명시해서
“이상하면 알림”은 구현할 수 없습니다. 조건을 숫자로 적어야 합니다. 예: 계좌 낙폭이 기준의 80%를 넘었을 때, 순자산이 한 시간 안에 3% 이상 하락했을 때, 수집이 15분 이상 실패했을 때.
세 번째를 빼놓기 쉽습니다. 데이터가 안 들어오는 상태가 가장 위험한데, 화면에는 “마지막으로 알려진 값”이 조용히 표시되기 때문입니다. 마지막 수집 시각을 화면에 항상 노출하세요.
계좌 수와 비용
다계좌 관리에서 비용 구조는 설계에 직접 영향을 줍니다. 계좌 단위 과금이면 계좌를 늘릴 때마다 비용이 늘고, 플랜 단위면 코드 수정 없이 계좌만 추가하면 됩니다. 요금제에서 기준을 확인할 수 있습니다.
프랍 챌린지 계좌를 함께 감시한다면 규정 기반 경고를 추가하는 편이 좋습니다. 구조는 프랍 계좌 감시에 있습니다.
자주 묻는 질문
여러 MT 계좌의 잔고를 합산할 때 주의할 점은 무엇인가요?
계좌 기준 통화가 다르면 그대로 더할 수 없습니다. 표시 통화로 환산하고 사용한 환율과 시각을 함께 저장해야 합니다. 또한 입출금을 성과에서 제외해야 수익률이 왜곡되지 않습니다.
수집 주기는 어느 정도가 적당한가요?
계좌 스냅샷과 포지션은 1~5분, 체결 내역은 15~60분 간격이면 충분합니다. 체결 내역은 마지막 수집 시각 이후만 요청하도록 만드는 것이 좋습니다.