자동매매라는 것은 말 그대로 사람이 손을 쓰지 않더라도 100% 자동으로 매매가 이루어져야 합니다. 100% 자동화를 위해서 정말 중요한 부분 중 하나가 바로 '미체결 주문'을 관리하는 것이라고 생각합니다. 대부분은 단순히 매수, 매도에만 집중을 하는데, 매수와 매도 주문을 넣었음에도 체결되지 않은 '미체결' 상태로 남아있게 된다면 자동매매 프로그램은 순조롭게 돌아가지 않을 것입니다. 물론 시장가 주문으로만 구동을 한다면 이러한 경우는 거의 발생하지 않겠지만, 슬리피지를 고려하여 '현재가'를 기준으로 주문을 한다면 체결이 되지 않는 경우가 종종 발생합니다. 시장가와 현재가에 대해서 잘 모르시는 분은 아래 포스팅을 먼저 읽어보시기 바랍니다.
2022.06.24 - [재테크/주식] - 주식 현재가와 시장가, 주문화면 호가창 알아보기
오늘 포스팅에서는 미체결 상태인 매수와 매도 주문을 어떤 방법으로 처리할 수 있을지 자동매매 개발 방법 및 전략에 대해서 이야기해보려고 합니다. 저는 코드 레벨의 상세 구현 방법을 설명드리는 것이 아니라 로직과 전략의 개념으로 설명드리니 자동매매를 개발하시는 분들은 저의 포스팅을 읽고 '어떻게' 개발 및 구현을 해야 할지 고민해보시면 좋을 것 같습니다.
미체결 주문
미체결 주문이라는 것은 말 그대로 체결이 되지 못하고 대기 상태로 남아있는 주문을 말합니다. 급상승하고 있는 종목에 탑승하여 빠르게 매수 후 짧게 익절 하는 전략을 구동한다고 가정해봅시다.
- 급상승인 종목을 포착하여 현재가인 1000원으로 매수 주문을 넣는다
- 그런데 1000원 매도 매물이 금방 소진되어 나의 주문이 체결되지 않고 가격이 상승한다
- 이 경우 매수 주문은 계속 미체결 상태로 남이있게 된다
위와 같이 매수 주문이 미체결 상태가 되면 어떤 문제가 발생할 수 있을까요? 크게 두 가지가 있을 것 같습니다.
- 자금 중 일부가 매수 주문으로 들어가있기 때문에 다른 종목에 투자할 자금이 줄어든다
- 고점까지 도달 후 하락할 때 매수가 되어 기대 결과와 달라질 수 있다
매도 상황도 가정해보겠습니다.
- 고점 터치 후 급격히 하락하여 트레일링 스탑에 의해 매도 주문을 넣는다
- 하락 속도가 빨라 주문이 체결되지 않고 가격은 더 내려간다
- 나의 주문이 체결되지 못하고 미체결 상태로 대기한다
- 결국 가격은 손절 타점까지 내려갔지만 미체결 주문으로 인해 잔고를 처리하지 못하여 더 큰 손실을 맞이한다
매수와 매도 둘 다 참 안타까운 상황이 되죠. 만약 수동으로 매매를 했다면 빠르게 정정을 하거나 주문을 취소했을 텐데 말입니다. 자 그렇다면 수동으로 하던 미체결 주문 처리를 자동매매 개발 구현 시에는 어떤 순서와 방법으로 처리가 가능할지 고민해봅시다.
자동매매 미체결 주문 관리
수동으로 매매할 때를 생각해봅시다. 주문을 넣고 체결되기를 기다립니다. 어느 정도 기다리다가 체결이 되지 않는다면 가격을 정정해보거나 그냥 주문을 취소하게 되죠. 여기에 포인트가 있습니다. 바로 '어느 정도'를 기다릴 것이냐, 가격을 '어떻게 정정'할 것이냐, 그냥 '취소'할 것이냐입니다. 이 포인트를 가지고 매수와 매도 주문을 어떻게 처리해야 할지 전략을 만들어봅시다.
매수 미체결 주문
일반적으로 매수가 체결되지 않는 이유는 두 가지가 있을 듯 합니다. 하나는 거래량이 너무 적어서 가격 변동은 없으나 매매가 이루어지지 않는 경우, 다른 하나는 체결되기 전에 가격이 상승한 경우입니다. 장 중에 무조건 지정 가격으로 매수하려는 목적이라면 미체결 주문을 굳이 정정하거나 취소해야 할 필요는 없습니다. 하지만 단타를 위한 매수라면 빠르게 대응을 해야 합니다.
제가 생각하는 매수 주문 처리 방법을 간단히 그려보면 아래와 같습니다. 기본적으로 최초 주문을 '현재가(지정가)'로 하는 시나리오입니다. 한 단계씩 자세하게 설명해보도록 하겠습니다.
1) 현재가 매수 주문
현재가 매수 주문이라는 것은 '지정가' 매수 주문이라고 보시면 될 것 같습니다. 조건 검색식 편입 또는 자동매매 프로그램의 차트 분석에 의한 매수 시점이 되었을 때, 현재가 또는 매수 1호가로 주문을 넣을 수 있습니다. 이후 매수가 체결되기까지 대기하게 됩니다. 체결이 되어야 매도 전략이 동작할 수 있으니까요. 최초 매수 주문 이후 체결 완료까지의 동작을 하나하나 보겠습니다.
2) N초 대기
본인의 자동매매 전략에 따라 매수 체결까지 얼마나 대기할지 정해야 합니다. 급등 종목 위주로 매매를 하는 경우에는 1분 미만으로 기다린 후 바로 다음 단계를 수행하는 것이 좋은 듯하고, 스윙 또는 장기 전략인 경우에는 시간 단위로 대기를 해도 괜찮습니다. 물론 본인의 전략을 충분히 백테스팅한 후에 적정한 대기 시간을 찾는 것이 중요합니다. 대기 시간 내에 매수 체결이 되면 매도 단계로 넘어가면 되고, 만약 여전히 미체결 상태라면 다음과 같은 대응을 할 수 있습니다.
3-1) 현재가 정정 매수
현재가가 내가 주문한 가격보다 높은 경우, 현재가로 다시 정정 주문을 합니다. 무조건 최초 매수가로 사야 하는 경우라면 정정할 필요가 없지만, 좀 더 체결 확률을 높이고자 한다면 현재가 정정을 해볼 수 있습니다. 하지만 목표한 가격보다 너무 높은 가격에 사지 않도록 하기 위해 다음과 같은 제약을 설정할 수도 있습니다.
- 현재가가 최초 매수가 대비 +N% 이내인 경우에만 정정 매수
최초 매수 가격에서 N% 범위 내에 있는 경우에만 정정 매수를 하도록 제한하면 너무 높은 가격으로 매수하지 않도록 조절할 수 있습니다. 단, 현재가 정정 매수를 하더라도 여전히 체결이 되지 않을 수가 있습니다. 이 때는 주문 대기 > 정정을 몇 차례 시도해볼 지에 대해서도 고민해볼 수 있습니다. 또는 정정 매수인 경우에는 최초 매수보다 대기 시간을 더 길게 해 볼 수도 있습니다. 단순한 기능이지만 세부 옵션을 다르게 적용하여 본인만의 최적화된 매수 전략을 구현할 수 있습니다. 저는 이런 부분에도 관심이 많기 때문에 얼마나 대기할지, 몇 번을 정정 시도할지 등에 대해 고민을 많이 해봅니다. 자동매매 개발을 하고 있다면 이러한 부분도 다양하게 만들어본다면 또 다른 재미를 느낄 수 있을 거라 생각합니다.
3-2) 시장가 정정 매수
목표 가격과의 차이는 상관이 없고 무조건 빠르게 매수를 해야 하는 것이라면 바로 시장가로 정정 매수하면 됩니다. 주로 급등하는 차트에서 유용할 듯합니다. 이 경우 개인적으로 최초 매수 이후 체결 대기 시간을 수 초 내로 짧게 적용하는 것을 추천합니다.
3-3) 매수 주문 취소
최초 매수 이후 일정 시간 동안 체결되지 않았을 때, 더 이상 대기할 필요가 없고 빨리 새로운 종목을 찾아 들어가야 한다면 그냥 주문 취소를 하면 됩니다. 또는 정정 매수를 N번 반복한 이후 더 이상 정정하지 않겠다 하면 그때도 매수 주문을 취소할 수 있겠죠. 어느 타이밍에 주문을 취소해야 할지는 각자의 전략에 따라 달라지기 때문에 항상 본인의 전략에 어떤 방식이 잘 맞을지 고민을 해봐야 합니다.
매도 미체결 주문
매도 주문이 체결되지 않는 이유도 매수 주문과 비슷합니다. 거래량이 적어서 매수자가 없는 경우와 가격이 급락하여 매도가를 벗어난 경우겠죠. 매도 미체결 주문도 매수 주문과 같이 현재가 정정, 시장가 정정, 그리고 매도 주문 취소를 할 수 있습니다. 다만 그 목적이 조금 다를 것 같은데요. 매도 주문은 어떤 관점에서 정정과 취소를 해야 할지 알아보도록 하겠습니다.
1) 현재가 매도 주문
매수 이후 본인이 설정한 익절, 트레일링 스탑, 손절 가격에 도달했을 때 '현재가' 또는 '매도 1호가'로 주문을 넣게 됩니다. 이후 빨리 주문이 체결되기를 기다리게 되죠.
2) N초 대기
매도 주문 이후 체결되기까지 N초의 시간 동안 대기합니다. 참고로 저는 매수보다 매도 주문을 더 민감하게 관리해야 한다고 생각합니다. 왜냐하면 본인이 원하는 가격에 매도하지 못하고 가격이 계속 하락하게 되면 예상치 못한 큰 손실을 입을 수 있기 때문이죠. 그렇기 때문에 저는 매수 대기시간보다 매도 대기시간을 더 짧게 적용하는 편입니다.
3-1) 현재가 정정 매도
최초 매도 주문 가격과 현재가가 다른 경우, 현재가로 정정 주문하는 방법입니다. 저의 경우 슬리피지를 줄이기 위해 최대한 시장가가 아닌 현재가를 기준으로 매도를 시도하기 위해 사용하는 방법인데, 다음과 같은 옵션을 두어 상황에 따라 현재가 정정을 하기도 합니다.
- 최초 매도가와 현재가의 차이가 0.5% 이내라면 정정하지 않고 최초 주문을 좀 더 대기한다
이는 짧은 구간에서의 상승과 하락에 의해 최초 주문이 체결될 가능성을 보는 것입니다. 여기에 체결강도와 같은 정보를 활용하면 더 좋은 선택을 할 수 있습니다. 예를 들어 체결 강도가 100 이상이라면 매매 체결이 아직은 활발하게 진행되고 있기 때문에 최초 주문가에 도달할 확률이 높다가 볼 수 있겠죠.
- -0.5% 미만으로 내려간 경우 현재가 정정 매도를 시도한다
이는 최초 매도 주문가와 현재가의 차이가 더 벌어지기 전에 정정하여 매도를 하고자 하는 목적입니다. 이러한 기준 역시 본인이 어떤 매매 전략을 구동하느냐에 따라 세부 방법들은 달라질 수 있습니다. 그러니 세부 전략에 앞서 항상 본인의 기본 매매 전략을 잘 파악하고 있는 것이 중요합니다.
3-2) 시장가 정정 매도
급락하는 장에서 목표가를 벗어났더라도 무조건 매도를 해야 하는 상황이라면 시장가로 정정 매도를 하면 됩니다. 이 역시 현재가 정정 매도에서 사용할 수 있는 세부 옵션(가격 범위)을 활용하여 특정 % 이상 벌어진 경우 시장가 주문으로 정정할 수도 있습니다. 매수보다 매도에서 시장가 주문이 더 중요하다고 생각하는데, 물론 빠르게 체결이 되는만큼 슬리피지에 대한 고민도 필요합니다.
3-3) 매도 주문 취소
매수 주문을 취소하는 목적은 쉽게 알 수 있는데, 매도 주문을 취소해야 하는 이유는 무엇인지 생각을 해봤습니다. 제 경험상으로는 아래와 같은 케이스가 될 것 같습니다. 하지만 본인만의 전략을 위해 확실하게 매도 주문 취소를 해야하는 것이 아니라면 굳이 필요할 것 같지는 않습니다.
- 익절 가격에 도달했을 때 매도 주문을 했으나 체결되지 않고 목표 가격을 벗어난 경우, 굳이 정정 주문을 통해 매도를 하지 않고 다시 가격 감시 모드로 전환하여 매도 시점을 기다린다
설명이 조금 길었는데요, 예를 들면 이렇습니다. 익절을 1, 2, 3차 목표가 설정하고, 손절을 1, 2차로 설정했다고 가정해봅니다. 가격이 상승하여 익절 1차 목표가에 도달한 후 매도 주문을 했으나 체결되지 않았습니다. 이때 주문을 취소하고 다시 익절 또는 손절가에 도달하는 지를 지켜봅니다. 매도하지 않았으니 보유 수량은 변동이 없죠. 여기서 잠시 하락했다가 다시 1차 익절가에 도달할 수고 있고, 또는 1차 손절가로 내려갈 수도 있습니다. 그러면 이때 다시 목표가로 매도 주문을 하는 것이죠. 만약 다시 상승했다고 한다면 본인의 목표대로 익절을 할 수 있게 됩니다. 이는 "익절 목표가보다 낮은 가격으로는 절대 익절 하지 않겠다!"라는 고집이 있다면 가능한 전략일 것 같습니다. 아니면 내가 찾은 종목들 대부분이 매수 이후 하락했다가 높게 상승한다는 패턴이 있다면 말이죠. '최초 주문을 계속 대기하면 되지 않을까?'라고 생각할 수 있지만 이렇게 하면 손절 대응을 할 수가 없기 때문에 일단 매도를 취소한 후 가격을 감시하는 방법을 사용할 수 있습니다.
마무리
여기까지 제가 지금까지 고민해봤던 미체결 주문 관리와 처리 방법에 대한 이야기를 해봤습니다. 재미있게 읽으셨기를 바라고, 자동매매를 개발하는 분들에게도 도움이 되기를 바라며 포스팅을 마칩니다. 주말 잘 보내세요 :)