1. 코딩만 하면 돈 복사기 될 줄 알았지?
안녕하세요! 방구석에서 주식 봇 깎고 있는 초보 개발자(?)입니다. 지난 3강에서 드디어 로그인까지 성공하고 "이제 나도 자동매매로 돈 좀 벌어보자" 하며 기세등등하게 봇을 돌려봤거든요? 근데 웬걸... 역시 세상은 호락호락하지 않더라고요. ㅋㅋㅋ 이론이랑 실전은 하늘과 땅 차이였습니다. 분명히 코딩한 대로 착착 돌아가야 하는데, 제 봇이 제 말을 안 듣고 제멋대로 사고를 치기 시작했습니다.
오늘 제가 겪은 아주 황당하고 '킹받는' 상황들을 공유해보려고 해요. "이게 왜 안 되지?" 하며 머리 싸매고 고민했던 시간들이 아깝지만, 여러분은 저처럼 삽질하지 마시라고 아주 디테일하게 까발려보겠습니다. 애드센스 승인을 위해서라도 이런 생생한 실전 기록은 필수인 거 아시죠? 자, 눈물 없이 볼 수 없는 제 삽질기 시작합니다!
2. 첫 번째 사고: 눈치 없는 내 봇, 15시 30분에 왜 다 사버리니? (ATS 대참사)
제 전략의 핵심 중 하나가 바로 '대체거래소(NXT)' 낚시였습니다. 한국거래소 종목들은 장 마감 직전인 15시 30분에 종가베팅으로 사고, 대체거래소 전용 종목들은 밤이 깊은 19시 50분 야간 시장에서 낚아채는 전략이었죠. ats_list.txt라는 파일까지 따로 만들어서 관리할 정도로 나름 철저했습니다.
그런데 오늘 로그를 확인해보니 이 눈치 없는 봇이 15시 30분에 ATS 종목을 싹 다 사버린 겁니다! 분명 로그창에는 [PASS] 종목이름 -> ATS 종목 (19:50 대기)라고 메시지는 멋지게 띄워놨더라고요. 말로는 "얘는 나중에 살 거야~ 패스!"라고 해놓고 몸은 이미 주문을 던지고 있었던 거죠. ㅋㅋㅋ 진짜 어이가 없어서...
[검색기에 포착된 종목]

[15시 20분 주문발생]

[로그] 유진로봇은 19시 50분 종목이라...!!! 대기라며!!! 주문 들어갔자나!!!!!!! (수동으로 취소했음..)

알고 보니 범인은 **continue**라는 명령어 한 줄이었습니다. 조건문으로 "이게 ATS 종목이니?"라고 물어만 보고, "맞으면 아래 코드는 읽지 말고 그냥 넘어가!"라고 명령을 안 내린 거예요. 말로만 패스라고 하고 아래에 있는 매수 코드를 그대로 읽어버린 거죠. 코딩은 정말 토씨 하나, 줄 하나에 돈이 왔다 갔다 한다는 걸 뼈저리게 느꼈습니다.
[코딩 내역 1: 15:30 매수 방어막 코드]
# [수정 전] 로그만 찍고 주문은 그대로 나갔던 바보 같은 코드
if code in ats_available_stocks:
print(f"⏩ [PASS] {code} -> ATS 종목 (19:50 대기)")
# 여기서 그냥 아래로 내려가서 주문이 실행됨 ㅠㅠ
# [수정 후] 확실하게 건너뛰도록 continue 추가!
if code in ats_available_stocks:
print(f"⏩ [PASS] {code} -> ATS 종목 (19:50 대기)")
continue # 이 한 줄이 생명입니다 여러분...
3. 두 번째 사고: 수익률 3% 돌파! 근데 왜 구경만 해? (1주 보호막의 배신)
더 기가 막힌 건 내가 지지와 저항 테스트해보려고 수동으로 산 종목이었습니다. 수익률이 3.3%까지 아주 시원하게 올라가더라고요! 제가 설정한 첫 목표가가 2.9%였으니까 당연히 1주가 팔렸어야 했죠. 근데 제 봇은 수익 실현은커녕 묵묵부답이었습니다. "야! 지금 3% 넘었다고!" 소리를 질러도 봇은 요지부동...
범인은 제가 공들여 만든 '본전 수호 보호막' 로직이었습니다. "마지막 1주는 소중하니까 본전 올 때까지 팔지 마!"라고 if qty <= 1: return 코드를 맨 위에 박아놨거든요. 근데 하필 에스피지가 딱 1주밖에 없었던 겁니다. 봇 입장에서는 "어? 1주네? 주인님이 얜 지키라고 했지" 하고는 아래에 있는 익절 로직은 쳐다보지도 않은 거죠. 주식을 너무 아끼려다 정작 챙겨야 할 수익을 놓치는 바보 같은 상황이 벌어진 겁니다. ㅋㅋㅋ

그래서 익절 구간도 **2, 3, 5, 7%**로 더 촘촘하게 나누고, 마지막 1주 보호막도 확실히 구분해서 수정했습니다.
[코딩 내역 : 정교해진 2-3-5-7% 익절 & 보호막 로직]
def process_betting(self, code, name, profit, qty):
# ... 생략 ...
sc = hist["sold_count"]
# [수정] 마지막 1주 보호막은 모든 익절 단계가 끝난 후에만 가동!
if qty <= 1:
if sc >= 4 and profit <= 0.1:
self.send_market_order(self.acc_betting, code, 1, "마지막 1주 본전수호 매도")
return
# [수정 완료] 2%부터 시작하는 정교한 분할 매도 타겟
target = {0: 1.9, 1: 2.9, 2: 4.9, 3: 6.9}.get(sc)
if target is not None and profit >= target:
self.send_market_order(self.acc_betting, code, 1, f"베팅 익절 매도 실행")
hist["sold_count"] += 1
4. 결론 및 오늘의 교훈: 코딩 어렵다...
오늘 이렇게 크게 두 번 데이고 나서 코드를 싹 뜯어고쳤습니다. 자동매매 봇을 만든다는 건 단순히 기능을 구현하는 게 아니라, 발생할 수 있는 모든 '예외 상황'과의 전쟁이라는 걸 깨달았습니다. 여러분, 저처럼 수익 다 놓치고 눈물 흘리지 마시고 꼭 본인의 로직을 두 번, 세 번 검증하세요. 특히 if문 쓰실 때 '건너뛰기' 설정 잘 되어 있는지 꼭 보시고요!
내일은 과연 이 수정된 코드가 성공할지, 19시 50분 야간 베팅 결과와 함께 돌아오겠습니다. 코딩 몰라도 할 수 있습니다! 저랑 같이 봇 만들어서 경제적 자유 누려보자고요! 화이팅! 🔥