공부방 ›
[강좌] [EA 제작] 꼭 넣어야 할 안전장치 체크리스트
수익 로직보다 먼저 만들어야 하는 것이 사고를 막는 장치입니다. 직접 EA나 봇을 만든다면 아래를 하나씩 확인해 보세요.
체크리스트
- 하루 손실 한도: 오늘 손실이 계좌의 일정 비율을 넘으면 신규 진입 중단
- 최대 포지션 수: 오류로 주문이 반복돼도 일정 개수 이상 열리지 않게
- 스프레드 필터: 스프레드가 평소보다 크면 진입하지 않기
- 매직넘버: 여러 EA를 같이 돌려도 서로의 포지션을 건드리지 않게
- 손절 필수: 주문을 보낼 때 손절가를 함께 보내기 (나중에 따로 걸면 연결이 끊겼을 때 손절 없이 남습니다)
- 주요 지표 발표 시간 회피: 발표 전후 일정 시간 진입 중지
- 재시작 대비: PC·VPS가 재부팅돼도 이미 열린 포지션을 다시 인식하는지
- 주말·장 마감 처리: 갭(가격 건너뜀) 위험을 어떻게 다룰지
예시: MQL5 하루 손실 한도와 스프레드 필터
input long MagicNumber = 20261031;
input double MaxDailyLossPct = 3.0; // 하루 최대 손실 %
input int MaxSpreadPoints = 35; // 허용 스프레드 (포인트)
bool SpreadOK()
{
return SymbolInfoInteger(_Symbol, SYMBOL_SPREAD) <= MaxSpreadPoints;
}
bool DailyLossExceeded()
{
datetime dayStart = iTime(_Symbol, PERIOD_D1, 0); // 브로커 서버 기준 오늘 0시
HistorySelect(dayStart, TimeCurrent());
double closedPL = 0;
for(int i = HistoryDealsTotal() - 1; i >= 0; i--)
{
ulong t = HistoryDealGetTicket(i);
if(HistoryDealGetInteger(t, DEAL_MAGIC) != MagicNumber) continue;
closedPL += HistoryDealGetDouble(t, DEAL_PROFIT)
+ HistoryDealGetDouble(t, DEAL_SWAP)
+ HistoryDealGetDouble(t, DEAL_COMMISSION);
}
double floating = AccountInfoDouble(ACCOUNT_EQUITY) - AccountInfoDouble(ACCOUNT_BALANCE);
double dayStartBalance = AccountInfoDouble(ACCOUNT_BALANCE) - closedPL;
return (closedPL + floating) <= -dayStartBalance * MaxDailyLossPct / 100.0;
}
// OnTick 안에서 진입 전에
// if(DailyLossExceeded() || !SpreadOK()) return;위 코드의 평가손익(floating)은 계좌 전체 기준입니다. 여러 EA를 함께 돌린다면 매직넘버별로 열린 포지션 손익을 따로 더하도록 바꿔 쓰세요. "오늘"의 기준은 브로커 서버 시간이라 한국 시간과 다를 수 있습니다.

