공부방 ›
[강좌] [EA 만들기 5] 손절·익절과 "계좌 1%만 걸기" 랏 계산 코드
4편 EA는 수량이 0.01랏으로 고정이에요. 그런데 계좌가 1천 달러든 10만 달러든 똑같이 0.01랏을 쓰면 이상하죠. 프로들은 보통 "손절에 걸리면 계좌의 1%만 잃게" 수량을 정해요. 이걸 코드로 만들어 볼게요.
원리 (금 예시)
- 계좌 1만 달러, 1% = 100달러까지 잃어도 됨
- 손절 30달러 (금값이 30달러 반대로 가면 손절)
- 금 1랏 = 100온스 → 금값 1달러 움직이면 1랏당 100달러
- 1랏으로 손절 맞으면 30 × 100 = 3,000달러 손실
- 그러니까 100 ÷ 3,000 = 0.033랏 → 0.03랏
코드 (4편 EA에 추가)
OnTick 위쪽 아무 곳에 붙여넣으세요.
input double RiskPct = 1.0; // 한 번 손절에 잃을 계좌 비율 (%)
double LotsByRisk(double riskPct, double stopPoints)
{
double risk = AccountInfoDouble(ACCOUNT_EQUITY) * riskPct / 100.0;
double tickValue = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE);
double tickSize = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE);
if(tickValue <= 0 || tickSize <= 0 || stopPoints <= 0) return 0;
double lossPerLot = stopPoints * _Point / tickSize * tickValue; // 1랏 손절 시 손실
double lots = risk / lossPerLot;
double step = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_STEP);
double minL = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN);
double maxL = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MAX);
lots = MathFloor(lots / step) * step; // 브로커가 받는 단위로 내림
if(lots < minL) return 0; // 최소 수량보다 작으면 거래 안 함
return MathMin(lots, maxL);
}그리고 4편 코드의 주문 부분에서 `Lots` 대신 아래처럼 쓰면 돼요.
double lots = LotsByRisk(RiskPct, StopPts);
if(lots <= 0) return;
if(goldenCross) trade.Buy(lots, _Symbol, ask, ...); // 나머지는 그대로왜 이렇게 계산해요?
- TICK_VALUE / TICK_SIZE: "가격이 최소 단위만큼 움직이면 1랏에 얼마가 변하나"를 브로커가 알려주는 값이에요. 금·외환·지수마다 달라서 직접 외울 필요 없이 이걸 쓰면 어느 종목이든 맞게 계산돼요.
- MathFloor로 내림: 0.0337랏 같은 숫자는 주문이 안 돼요. 브로커 단위(보통 0.01)로 내려서 위험이 1%를 넘지 않게 해요.
- 최소 수량보다 작으면 거래 안 함: 계좌가 작아서 0.01랏도 1%를 넘으면, 억지로 들어가지 않는 게 맞아요.
손절·익절 정하는 팁
- 손절은 "이 가격까지 오면 내 생각이 틀린 것"인 자리에 둬요. 너무 좁으면 잡음에 털리고, 너무 넓으면 랏이 작아져요.
- 익절은 손절의 1.5~2배부터 시작해서 백테스트로 비교해 보세요.
- 손절 없는 EA는 만들지 마세요. 한 번의 큰 움직임에 계좌가 끝날 수 있어요.
1% 규칙의 의미는 "10번 연속 져도 계좌의 약 10%만 잃는다"는 거예요. 살아남아야 다음 기회가 있어요.

