부분 청산과 트레일링 병용 시 깨지기 쉬운 곳과 점검
목차 (5)
목차
결론: 깨지는 것은 로직이 아니라 '상태 전달'입니다
부분 청산과 트레일링 스톱은 각각 따로 보면 어려운 처리가 아닙니다. 문제는 두 기능을 같은 포지션에 함께 적용할 때 생깁니다. 저희 개발 경험에서도 문제는 거의 다음 3곳에 집중되었습니다.
- 잔량 관리: 'EA가 이미 부분 청산을 했는지'를 기억하지 못함
- 로트 단위: 청산 수량이 브로커의 최소 로트나 로트 단위(step)와 맞지 않음
- SL 재설정 순서: 부분 청산, 본전 이동, 트레일링이 서로 덮어씀
모두 백테스트에서는 잘 드러나지 않고, 실운용에서 처음 알게 되는 경우가 많은 유형의 문제입니다.
추천 브로커 비교 →
🎁 무료 EA 다운로드📧 무료 이메일 강좌(총 8통) + 구독자 전용 MT5 지표 13종 팩
※ 개인정보는 엄격히 보호. 언제든 구독 해지 가능.
왜 병용하면 깨질까
잔량을 EA의 '기억'에 의존할 수 없다
MT5에서는 부분 청산을 해도 포지션의 티켓은 그대로이고 POSITION_VOLUME만 줄어듭니다. '부분 청산 완료' 여부를 bool 변수로만 들고 있으면 EA 재시작, VPS 재접속, 시간 프레임 전환 때 값이 사라집니다. 그 뒤 첫 틱에서 남은 포지션을 다시 절반 청산해 버리는 것이 전형적인 사고입니다.
대책으로 저희는 HistorySelectByPosition()으로 해당 포지션의 체결 이력을 따라가며 최초 진입 수량과 현재 잔량을 비교해 부분 청산 단계를 판단합니다. 메모리상의 플래그는 보조 수단으로만 둡니다.
로트는 '반올림'이 아니라 '버림'으로 처리한다
0.03랏을 절반으로 나누면 0.015입니다. 로트 단위가 0.01인 계좌에서 반올림하면 0.02를 청산하게 되어 의도보다 많이 정리하게 됩니다. 청산 수량은 SYMBOL_VOLUME_STEP 기준으로 버림 처리하고, 나아가 청산 후 잔량이 SYMBOL_VOLUME_MIN 이상인지도 확인해야 합니다. 0.01랏은 애초에 분할할 수 없으므로, '부분 청산을 하지 않는다'와 '전량 청산한다' 중 무엇으로 할지 사양으로 정해 두지 않으면 EA는 계속 오류를 반환합니다.
SL 쓰기는 마지막에 한 곳에서 일괄 처리한다
PositionModify()는 SL과 TP를 동시에 지정하는 함수입니다. 트레일링 처리에서 TP에 0을 넘기면 TP가 사라집니다. 또 부분 청산 후 SL을 본전으로 옮기는 처리와 트레일링으로 SL을 끌어올리는 처리가 같은 틱에서 따로 동작하면, 나중에 쓴 쪽이 이깁니다. 그 결과 한 번 본전까지 올린 SL이 다시 내려가는 일이 생깁니다.
저희가 채택한 순서는 다음과 같습니다.
- 부분 청산 주문을 보낸다 → 포지션을 다시 선택해 잔량을 확인한다
- 본전 SL과 트레일링 SL 후보를 둘 다 계산한다
- '현재 SL보다 유리한 쪽'으로만 움직인다(매수는 높은 쪽, 매도는 낮은 쪽)
- 스톱 레벨과 프리즈 레벨을 확인한 뒤, TP는 현재 값을 다시 넘겨 한 번만 변경한다
구현·확인 체크리스트
| 확인 항목 | 깨졌을 때의 증상 | 확인 방법 |
|---|---|---|
| 부분 청산 단계를 체결 이력으로 판단하는가 | 재시작 후 부분 청산이 이중으로 실행됨 | 가동 중 EA를 다시 부착하고 잔량 변화를 확인 |
| 청산 수량을 로트 단위로 버림 처리하는가 | 의도보다 많이 청산되거나 오류가 발생함 | 최소 로트로 진입해 로그 확인 |
| 최소 로트일 때 분할 처리를 정해 두었는가 | 매 틱 청산에 실패함 | 0.01랏으로 테스트 |
| SL이 불리한 방향으로 되돌아가지 않는가 | 본전 SL 설정 후 손실로 청산됨 | 로그에서 SL 추이를 시계열로 추적 |
| SL 변경 시 TP를 지우지 않는가 | 익절이 작동하지 않음 | 변경 후 포지션의 TP 항목 확인 |
| 부분 청산이 실패했을 때 SL을 움직이지 않는가 | 잔량과 SL의 전제가 어긋남 | 장 마감 직전 등에 주문을 넣어 일부러 실패시킴 |
| 넷팅 계좌에서 운용하고 있지 않은가 | 다른 EA의 포지션과 합산됨 | 계좌 유형 확인 |
사용자 입장에서는 데모 계좌에서 최소 로트로 가동하며 EA를 중간에 다시 부착해도 동작이 달라지지 않는지 보는 것이 가장 빠른 점검입니다. 기본 설정은 EA 설정 방법에 정리해 두었습니다.
한계와 주의점
전략 테스터는 체결이 즉시 이루어지고, 주문 일부만 체결되는 일도 거의 일어나지 않습니다. 그래서 부분 청산 관련 문제는 백테스트 수치에서는 거의 보이지 않습니다. 실계좌의 체결 방식(필링 모드) 차이나 리퀘스트 시의 동작은 브로커별로 직접 확인하는 수밖에 없다는 것이 솔직한 이야기입니다.
부분 청산을 넣는다고 성적이 좋아지는 것도 아닙니다. 승률은 낮고 소수의 큰 수익이 전체를 떠받치는 추세추종형(예를 들어 DONCHIAN ENGINE은 백테스트 승률 34.5%)에서는, 수익이 늘어나는 구간에서 수량을 줄이게 되어 기대값이 낮아질 수 있습니다. 손익의 변동폭은 작아지지만, 그 대가로 무엇을 잃는지는 EA마다 검증해 보지 않으면 알 수 없습니다. 저희도 모든 조합을 확인한 것은 아닙니다.
DONCHIAN ENGINE 같은 전략에 직접 부분 청산을 나중에 추가할 때는, 원래의 검증 결과가 그대로 들어맞지 않게 된다는 점에 유의하세요.
정리
- 부분 청산과 트레일링을 병용할 때 깨지기 쉬운 것은 로직보다 '상태 전달'
- 부분 청산 단계는 메모리 플래그가 아니라 체결 이력과 잔량으로 판단한다
- 로트는 단위 기준으로 버림 처리하고, 잔량이 최소 로트 아래로 내려가지 않는지 확인한다
- SL 변경은 한 곳에 모으고, 유리한 방향으로만 움직이며, TP를 지우지 않는다
- 백테스트로는 잘 보이지 않으므로 데모 계좌에서 재부착 테스트를 한다
- 부분 청산은 손익의 변동폭을 줄여 주는 한편, 기대값을 낮추기도 한다
그 밖의 구현상 주의점은 EA·MT5 노하우에도 정리해 두었습니다.
관련 기사
📧 무료 이메일 강좌(총 8통) + 구독자 전용 MT5 지표 13종 팩
※ 개인정보는 엄격히 보호. 언제든 구독 해지 가능.
EA나 FX에 대해 궁금한 점이 있나요?
Nattzy 트레이딩 포럼에 질문을 올릴 수 있습니다(무료 가입). 이 글의 내용이 아니어도 EA 설정이나 브로커 선택 등 어떤 질문이든 환영합니다.
Nattzy에서 질문하기 ↗