공부방 ›

[강좌] [EA 제작] 꼭 넣어야 할 안전장치 체크리스트

大현자 마스터운영진2026. 10. 31. 01:47조회 471추천 10댓글 0

수익 로직보다 먼저 만들어야 하는 것이 사고를 막는 장치입니다. 직접 EA나 봇을 만든다면 아래를 하나씩 확인해 보세요.

체크리스트

  1. 하루 손실 한도: 오늘 손실이 계좌의 일정 비율을 넘으면 신규 진입 중단
  2. 최대 포지션 수: 오류로 주문이 반복돼도 일정 개수 이상 열리지 않게
  3. 스프레드 필터: 스프레드가 평소보다 크면 진입하지 않기
  4. 매직넘버: 여러 EA를 같이 돌려도 서로의 포지션을 건드리지 않게
  5. 손절 필수: 주문을 보낼 때 손절가를 함께 보내기 (나중에 따로 걸면 연결이 끊겼을 때 손절 없이 남습니다)
  6. 주요 지표 발표 시간 회피: 발표 전후 일정 시간 진입 중지
  7. 재시작 대비: PC·VPS가 재부팅돼도 이미 열린 포지션을 다시 인식하는지
  8. 주말·장 마감 처리: 갭(가격 건너뜀) 위험을 어떻게 다룰지

예시: 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를 함께 돌린다면 매직넘버별로 열린 포지션 손익을 따로 더하도록 바꿔 쓰세요. "오늘"의 기준은 브로커 서버 시간이라 한국 시간과 다를 수 있습니다.

댓글 0

목록
Vantage 앱 광고광고
현자 탄생기념 부스터 이벤트