본문 바로가기

주식 자동매매 개발기

[주식 자동매매 6] ATS 자동매수 또 실패... 그리고 매도 로직의 배신 (코딩은 만만치 않다 ㅋ)

어제 블로그에 큰소리쳤다. 대체거래소(ATS) 자동매수 로직 보완해서 성공해서 돌아오겠다고. ㅋ 근데 결론부터 말하자면? 오늘 또 시원하게 실패했다. ㅋㅋㅋ 주식 시장은 역시 내(?) 코드대로 움직여주지 않는다는 걸 다시 한번 뼈저리게 느낀 하루다.(사실 AI 코드..)

1. ATS 자동매수, 왜 또 실패했나? (기술적 분석)

 

"어제 분명 ATS 매수 성공해서 돌아오겠다고 공언했는데, 코딩만 성공하고 체결은 실패했습니다. ㅋ"

 

어제 실패 원인을 분석하고 나름대로 로직을 다듬었다고 생각했다. 하지만 오늘 실전에서 깨달은 건, 내 코드의 문제가 아니라 **'시장의 유동성과 타점 설정의 괴리'**였다.

코딩으로 치면 if문 조건은 완벽했는데, 그 조건에 들어맞는 데이터(체결가) 자체가 발생하지 않은 거다. ㅋ 테마가 워낙 강하다 보니 ATS에서 내가 설정한 낮은 가격까지 내려올 물량이 없었다. 결국, 프로그램은 정상 작동했지만 체결은 0건. 이건 코딩의 승리가 아니라 시장의 승리였다. ㅋ 내일 외출 전까지 이 '공백'을 어떻게 메울지, 가격 보정 알고리즘을 넣어야 할지 고민이 깊어진다.

 

어제 실패했던 시간 설정 부분 코드

 

 

오늘 새로 짠 커스텀 매도 감시 로직

 

그래도 오늘은 잘되길 바래야지...

 

2. '자동감시주문 50개'의 한계를 깨부수려다 당한 뒤통수

키움 영웅문의 자동감시주문은 딱 50개까지만 등록된다. ㅋ 봇 개발자로서 이 50개라는 '하드웨어적 한계'를 넘고 싶어서, 아예 실시간 가격 수신 API를 활용해 직접 매도 로직을 짰다.

파이썬의 QThread를 돌려서 수백 개 종목의 호가 데이터를 실시간으로 감시하고, 조건에 맞으면 즉시 SendOrder를 쏘는 방식이다. 이론적으로는 영웅문의 50개 제한을 비웃으며 무한대로 감시할 수 있는 완벽한 시스템이었다. ㅋ 코드를 짜놓고 "이제 50개 제한 따위 안 무섭다"며 자부심에 차 있었는데...

 

원래는 키움에서 제공하는 기능을 썼는데, 이게 딱 50개까지만 감시가 되더라. 종목은 수백 개인데 손발이 묶인 기분이라 이걸 탈피하고 싶었다.

 

 

 

3. 매도 로직 미작동: "코드는 완벽했는데 왜?"

오늘 드디어 우리기술이 수익권에 진입하며 내 커스텀 매도 로직이 시험대에 올랐다. 수익률 2% 돌파! 로그창에는 실시간 가격이 찍히고 있었다. 그런데 주문 함수가 호출되지 않았다. ㅋ

나중에 코드를 뜯어보니 몇 가지 의심되는 범인이 있다. 첫 번째는 실수(float) 연산의 함정. 주식 가격은 딱딱 떨어지는 것 같지만, 프로그램 내부에서는 2.000000001 같은 오차 때문에 비교 연산자(>=)가 제대로 안 터질 때가 있다. 두 번째는 이벤트 루프의 병목 현상. 실시간 데이터를 너무 많이 처리하느라 매도 주문을 쏘는 쓰레드가 제때 일을 못 했을 가능성도 있다.

결국 봇은 멍하니 구경만 하고, 내가 수동으로 매도 버튼을 눌러야 했다. ㅋ 50개 제한을 풀겠다고 만든 코드가 정작 '1개'의 매도도 못 하는 상황... 개발자로서 자존심 상하지만 이게 현실이다. ㅋ

 

그래서 직접 파이썬으로 실시간 감시 로직을 짰다. 50개 제한도 풀고 ATS까지 대응하려고 야심 차게 준비했는데... 정작 수익권에서 if문이 안 터지더라. ㅋ 이론은 완벽했지만 실전 코딩의 무서움을 맛봤다.

 

4. 실패를 디버깅하며: 내일은 진짜 된다?

어제에 이어 오늘도 "실패 성공기"가 아니라 "실패 분석기"를 쓰고 있다. ㅋ 하지만 에드센스 승인을 노리는 개발 블로그라면 이런 삽질 기록이 오히려 보물이다.

오늘 밤에는 두 가지를 집중적으로 고칠 거다.

  1. ATS 타점 보정 로직: 체결 확률을 높이기 위한 유동적 가격 설정.
  2. 매도 로직 예외 처리: 소수점 오차 방지를 위한 decimal 모듈 도입이나 반올림 처리, 그리고 주문 함수 호출 우선순위 조정.

내일 용인 쪽으로 이동해야 할 일이 있는데, 운전하는 동안 봇이 일하게 하려면... 차 안에서 봇이 알아서 매도 척척 해주는 걸 보고 싶다. ㅋ 오늘의 실패 데이터를 싹 긁어모아서 코드 멱살 잡으러 간다. ㅋ 성공할 때까지 계속된다!ㅋ