BeeBot 자동매매 프로그램 개발_6단계: 봇 구현을 위한 준비 작업
지난 편에서 봇을 구현하겠다고 덮어놓고 들이댔더니 할일이 무더기 출토되었습니다. 보물 출토라면 많을수록 좋지만 해야할 일이 무더기로 발견되었으니 맥이 빠지네요. 그래도 우선순위를 정해서 하나씩 해결해 나가다 보면 끝이 보이겠지요.
지나번 글에서 일단 bol.PlaceOrder() method를 호출해 봤습니다.
그랬더니 M16 소총을 자동모드로 놓고 방아쇠를 당긴듯 매수주문이 발생했습니다.
그도 그럴것이 티커 데이타가 들어올 때 마다 RSI값을 계산해서 신호를 내기 때문에 RSI값이 임계값을 넘게되면 매 티커마다 신호가 발생하고 그에 따라서 주문이 나간것입니다.
이제 신호가 발생하면 다음과 같은 시나리오에 따라 봇이 작동되어야 합니다.
물론 아직까지는 상상력입니다.
상상력으로 들이대고 파다보면 생각 못했던 것들을 발견하게 되고 시나리오는 수정됩니다.
- 이미 나간 주문이 있는지 확인한다.
- 현재 포지션을 확인한다
- 신호가 발생한 코인에 대해서 주문도 없고 포지션도 없다면 주문을 낸다
- 주문의 체결 상황을 실시간 확인하면서 미체결, 체결 완료, 부분 체결 등의 이벤트에 따라 필요한 다음 조치를 취한다.
- 일정 시간 동안 체결이 완료되지 않으면 주문을 취소한다.
- 체결완료 또는 부분체결된 주문에 대해서는 포지션 관리에 돌입한다.
- 포지션에 대해 close 신호를 받아서 주문을 낸다.
- 4번으로
크흡~ 복잡하네요. 갑자그 할일이 늘어나니 스트레스가 밀려옵니다.
일일 많다면 잘게 잘라서 하나씩 나눠주면 됩니다.
어떻게 나눠서 누구한테 줘야하나를 생각해야합니다.
설계작업에 해당합니다. 이런 일을 할때는 서두르면 시간도 더 걸릴뿐 아니라 올바로 되지 않습니다.
왔다리갔다리 걸어도 보고, 냉장고 문도 몇번 여닫아 보고 망치질이라든가 뭐 그런 씰데 없는 짓을 하면서 뇌를 쉬어줘야 합니다.
열 받는다고 연초라든가 음주라든가 카페인이라든가~~
그런거 말고도 할수 있는 이상행동은 많습니다.
물론 아무도 없을 때 하는게 좋습니다.
반려동물이 이상행동하면 걱정하고 돌봐주지만 인간이 이상행동하면 어케 되는지 다들 아시잖아요.
일단은 이 일은 누구한테 시키면 좋을까요?
모두 주문에 관계된 일이니 마당쇠한테 시킬 순 없고, 뭔가 있어보이게 OrderAgent라는 놈에게 시키기로 합니다.
그놈은 무엇을 할 줄 알아야 할까요?
위 시나리오에 있는 일을 할 줄 알아야 합니다.
거칠게 나마 요구사항이 정리되고 어떤 오브젝이 필요한지도 결정되었습니다.
지난 글에서 우리가 bot.PlaceOrder()라고 했던일을 orderAgent.PlaceOrder()의 형태로 OrderAgent에게 시킬겁니다.
주문내기전에 해야할 일은 시나리오에 있는대로 orderAgent.CurrentOrders()
포지션을 확인하는 일은 account.GetPosition() 한테 물어보고
그 결과를 bot이 보고 받은 다음 이상 없으면 OrderAgent에게 주문을 내도록 지시합니다.
주문을 감시하는 일은 orderAgent.CheckOrderState()를 go routine으로 백그라운드로 돌립니다.
백그라운드 고루틴에서 발생한 이벤트는 주문이 체결됐거나 취소됐다는 신호인데 봇이 받아서 처리해야합니다. 한놈한테 너무 많은 일을 맡기면 사고 위험이 있으니까요.
우옛든둥 필요한 타입이랑 메소드를 다 구현하긴 했는데 한보따리가 넘어서 그것을 글로 설명하기는 어렵네요.
여기서 핵심은 bot만으로 주문처리를 하려니 너무 복잡해서 OrderAgent라는 머슴을 하나 뒀다 생각하면 되겠습니다.
bot이 승진해서 부하가 하나 생긴 셈입니다.
이제 봇은 주문에 관계된 일은 OrderAgent에게 묻거나 지시하면 됩니다.
그럼 이제 다음 해야 할 일은 무엇인가요?
일단 주문이 나가면 그 다음부터 발생하는 매매신호는 무시하도록 하는 장치를 만들어야합니다.
주문이 완료되면 그것은 포지션이 되고 포지션에 대한 신호를 감지해서 다음 주문을 내도록 해야합니다.
그럼에도 불구하고 전략은 계속해서 신호를 발생하고 있어야합니다. 바로 매도신호가 나올 수도 있으니까요.
그렇다면 신호를 무시하는 방법을 찾는게 좋을 듯합니다.
위 시나리오에서 1, 2가 그역할을 하고 있습니다. 이미 주문이 나가서 미체결 주문이 있거나, 포지션이 있는 코인에 대해서는 신호를 무시하고 주문을 내지 않도록 합니다.
이제 봇을 돌리면 잘 돌아갈까요?
할일이 대량출토되는 일이 없어야할텐데….