스톱 레벨과 프리즈 레벨|SL이 안 걸리는 진짜 이유
목차
SL이 안 걸리는 이유가 반드시 EA 오류는 아니다
결론부터 말씀드리겠습니다. SL을 걸 수 없거나 SL을 움직일 수 없는 원인은 대부분 EA의 로직이 아니라 **종목 사양으로 정해진 '최소 거리'**입니다. MT5에는 현재 가격에서 얼마나 떨어뜨려야 SL·TP를 걸 수 있는지를 정하는 '스톱 레벨(Stop Level)'과, 가격이 SL·TP나 대기 주문에 가까워졌을 때 수정을 금지하는 '프리즈 레벨(Freeze Level)'이 있습니다.
까다로운 점은 이 거리가 항상 같지는 않다는 것입니다. 평소에는 문제없이 통과하던 거리의 SL이 지표 발표 직후에만 거부되는 경우가 있습니다. 저희가 EA를 만들 때는 이 거리를 주문 전에 반드시 체크하도록 하고 있습니다. 이 글에서는 구조와 확인 절차, 그리고 EA 쪽 대책의 한계를 정리합니다.
추천 브로커 비교 →
🎁 무료 EA 다운로드📧 무료 이메일 강좌(총 8통) + 구독자 전용 MT5 지표 13종 팩
※ 개인정보는 엄격히 보호. 언제든 구독 해지 가능.
구조: 두 가지 '최소 거리'
스톱 레벨
스톱 레벨(SYMBOL_TRADE_STOPS_LEVEL)은 현재 가격에서 SL·TP까지의 최소 거리를 포인트로 나타낸 값입니다. 매수 포지션이라면 청산 기준인 Bid에서, 매도 포지션이라면 Ask에서 측정합니다. 이 거리보다 가까운 SL을 설정하려고 하면 주문은 서버에서 거부되고, MT5 리턴 코드로는 'Invalid stops'(10016)가 됩니다.
프리즈 레벨
프리즈 레벨(SYMBOL_TRADE_FREEZE_LEVEL)은 가격이 SL·TP나 대기 주문 가격에 가까워졌을 때 그 주문을 수정·삭제할 수 없게 되는 거리입니다. 트레일링 스톱 EA가 청산 직전에 SL을 움직이려다 거부되는 경우는 대개 이쪽이 원인입니다. 리턴 코드는 'Frozen'(10029)입니다.
| 항목 | 의미 | 영향을 받는 동작 | 주요 거부 코드 |
|---|---|---|---|
| 스톱 레벨 | 현재 가격에서 SL·TP까지의 최소 거리 | 신규 주문 시 SL/TP 지정, SL 수정 | Invalid stops(10016) |
| 프리즈 레벨 | SL·TP나 대기 주문에 가격이 가까워졌을 때 수정을 금지하는 거리 | SL/TP 수정, 대기 주문 수정·취소 | Frozen(10029) |
'0'은 제한 없음이라는 뜻이 아니다
종목 사양에서 스톱 레벨이 0으로 표시되어 있어도, 아무리 가깝게 두어도 통과된다는 보장은 없습니다. 0인 경우 서버 쪽에서 다른 규칙(스프레드를 기준으로 한 거리 등)을 적용하는 브로커도 있는 것 같습니다. 브로커별 구현을 모두 확인한 것은 아니기 때문에 저희는 **'0 = 최소한 스프레드 이상은 떨어뜨린다'**로 보수적으로 취급하고 있습니다.
지표 발표 때 거리가 넓어진다
스톱 레벨과 프리즈 레벨은 고정값이 아니라 브로커의 판단에 따라 바뀔 수 있습니다. 중요 지표 발표 전후, 주 초 거래 개시 직후, 롤오버 시간대 등에 일시적으로 넓히는 브로커가 있습니다. 게다가 스프레드도 같은 시간대에 넓어지기 때문에, Ask에서 측정하는 매도 SL은 실제 값 움직임 이상으로 멀리 떨어뜨려야 하게 됩니다.
즉 평소 종목 사양을 보고 '이 거리면 괜찮다'고 판단해도, 가장 중요한 순간에는 통과되지 않을 수 있다는 뜻입니다. SL 없이 진입만 체결되는 구조의 EA라면 무방비 포지션이 남을 위험도 있습니다.
확인 절차와 체크리스트
사용 중인 계좌에서 다음 항목을 확인해 주세요.
- 종목 사양 열기: 시세 표시 창에서 종목을 오른쪽 클릭 → '사양'. '스톱 레벨'과 '프리즈 레벨' 값을 메모합니다(단위는 포인트).
- 포인트를 가격으로 환산하기: XAUUSD와 USDJPY는 1포인트의 가격 폭이 다르므로, 소수점 자릿수를 확인한 뒤 가격 차이로 환산합니다.
- EA의 SL 거리와 비교하기: EA 설정이나 로직에서 쓰는 SL 거리가 스톱 레벨에 스프레드를 더한 거리보다 충분히 큰지 확인합니다.
- 지표 발표 전후에 다시 보기: 같은 화면을 발표 직전에도 열어 값이 바뀌는지 확인합니다. 값이 바뀌는 브로커인지는 실제로 보기 전에는 알 수 없습니다.
- 로그 확인하기: '저널' 탭과 '전문가' 탭에서 'Invalid stops'나 'Frozen'이 나왔는지 확인합니다. 주문이 거부됐을 때의 원인 분석 방법은 EA·MT5 노하우에도 정리해 두었습니다.
EA 설정 방법 자체는 EA 설정 방법을, 브로커별 거래 조건의 차이는 FX 브로커 비교를 참고해 주세요.
EA 쪽 최소 거리 체크
저희 EA는 주문을 내기 직전에 다음 순서로 체크합니다.
- 그 시점의 스톱 레벨·프리즈 레벨·스프레드를 매번 가져온다(기동 시 한 번만 가져온 값은 쓰지 않는다)
- 최소 거리는 '스톱 레벨과 프리즈 레벨 중 큰 쪽'에 스프레드와 약간의 여유를 더한 값으로 한다
- SL이 이 거리보다 가까운 경우에는 SL을 임의로 넓히지 않고 진입을 보류한다
SL을 자동으로 넓히는 설계를 하지 않는 이유는, SL을 넓히면 1회당 손실액이 설계보다 커지기 때문입니다. 로트를 SL 거리에서 역산하고 있다면 SL만 넓힐 경우 리스크 %가 무너집니다. 보류하면 기회는 줄어들지만, 예상하지 못한 리스크를 지는 것보다는 낫다고 저희는 판단합니다.
한계와 주의점
이 체크로 모든 문제를 막을 수 있는 것은 아닙니다.
- 백테스트로는 재현하기 어렵다: 저희가 이해하기로 MT5 스트래티지 테스터는 종목 사양의 현재 설정을 사용하며, 과거 지표 발표 때 거리가 넓어졌던 것까지는 재현하지 않습니다. SL이 짧은 EA일수록 테스트 결과와 실제 결과의 차이가 커질 수 있습니다. 예를 들어 GOLD TRIPWIRE는 백테스트상 평균 보유 시간이 0:21:12로 짧은 유형이라, 이런 차이의 영향을 받기 쉬운 부류라고 생각합니다.
- 보류가 성적을 바꾼다: 체크 때문에 보류한 트레이드 중에는 원래라면 이겼을 것도 포함됩니다. 체크를 넣으면 백테스트와는 다른 거래가 됩니다.
- 주문 순간에도 달라진다: 체크를 통과한 뒤 서버에 도달하기까지 사이에 조건이 바뀔 수도 있어서, 거부를 완전히 0으로 만들 수는 없습니다.
- SL 자체가 슬리피지를 겪는다: SL을 걸 수 있었더라도 시장이 급변하면 SL보다 불리한 가격에 체결될 수 있습니다. 최소 거리 체크는 슬리피지 대책이 아닙니다.
정리
- SL이 안 걸리는 원인의 대부분은 종목 사양의 스톱 레벨(최소 거리)과 프리즈 레벨(수정 금지 거리)
- 거부되면 리턴 코드는 'Invalid stops' 또는 'Frozen'이 된다
- 스톱 레벨 0은 '제한 없음'이 아닐 수 있다. 최소한 스프레드 이상은 떨어뜨린다
- 지표 발표 전후 등에 거리나 스프레드가 넓어지는 브로커가 있어, 가장 중요한 순간에 거부될 수 있다
- EA 쪽에서는 매번 그 시점의 값을 가져와 체크하고, 부족하면 SL을 넓히지 않고 보류하는 것이 저희의 설계
- 백테스트는 과거 거리 변화를 재현하기 어렵다. SL이 짧은 EA일수록 실제 운용에서의 차이에 주의한다
관련 기사
📧 무료 이메일 강좌(총 8통) + 구독자 전용 MT5 지표 13종 팩
※ 개인정보는 엄격히 보호. 언제든 구독 해지 가능.
EA나 FX에 대해 궁금한 점이 있나요?
Nattzy 트레이딩 포럼에 질문을 올릴 수 있습니다(무료 가입). 이 글의 내용이 아니어도 EA 설정이나 브로커 선택 등 어떤 질문이든 환영합니다.
Nattzy에서 질문하기 ↗