JSON 포지션 상태 파일 저장 초록 체크마크 개발 터미널 화면
positions_state_v4_9.json — 시스템이 꺼지기 전 포지션 상태를 파일로 저장합니다

자동매매 시스템을 계속 켜두면 편하겠지만, 현실은 그렇지 않다. 네트워크가 끊기기도 하고, 키움 API가 튕기기도 하고, 컴퓨터를 재시작해야 할 때도 생긴다.

V4.15까지는 이게 문제였다. 시스템이 꺼지면 포지션 정보가 날아갔다. 다시 켜면 지금 내가 뭘 들고 있는지 시스템이 몰랐다. 잔고를 API로 다시 받아오긴 했지만, TP1을 이미 했는지, 트레일링 스탑 기준이 어디였는지 같은 내부 상태는 복구가 안 됐다.

V4.16에서 이걸 해결했다. 포지션 상태를 JSON 파일로 저장하고, 재시작 시 그 파일을 읽어서 그대로 복구하는 구조다.

💾 포지션을 파일로 저장한다는 게 무슨 의미인가

로그에 찍힌 줄을 보면 이렇게 생겼다.

💾 [포지션저장] 2개 → logs\positions_state_v4_9.json 🔄 [포지션복구] 131970 qty=9 avg=83522 tp1=False tp2=False 🔄 [포지션복구] 089980 qty=13 avg=25900 tp1=False tp2=False ✅ 포지션 복구 완료: 2개

저장되는 정보는 단순히 "어떤 종목 몇 주"가 아니다. 평균 단가, TP1(1차 익절)을 이미 했는지 여부, tp2 상태까지 함께 저장된다. 이게 중요한 이유가 있다.

예를 들어 상아프론테크를 25주 들고 있다가 TP1으로 30%(8주)를 팔았다고 치자. 그 상태에서 시스템이 재시작되면 "나는 지금 17주 들고 있고, TP1은 이미 실행했다"는 상태를 정확히 알아야 한다. 모르면 TP1을 또 실행할 수 있다. 이미 익절한 물량을 또 팔려고 하는 것이다.

📋 3월 18일 — 포지션 복구가 실제로 작동한 날

3월 18일 로그를 보면 장 시작 전에 이런 줄이 찍혀 있다.

🔄 [포지션복구] 131970 qty=9 avg=83522 tp1=False tp2=False 🔄 [포지션복구] 089980 qty=13 avg=25900 tp1=False tp2=False ✅ 포지션 복구 완료: 2개 📦 [opw00018_row] 089980 상아프론테크 qty=13 avg=25900

두산테스나 9주, 상아프론테크 13주. 전날 들어간 포지션이 그대로 복구됐다. 평균 단가도 정확하고, TP1 상태도 False로 제대로 불러왔다.

그리고 복구 직후 API에서 실제 잔고를 받아와서 저장된 포지션과 대조 확인한다. 파일 데이터와 실제 잔고가 맞으면 그대로 사용하고, 다르면 API 데이터를 우선한다.

이 날 장이 열리자마자 상아프론테크는 트레일링 스탑으로 정리됐고, 두산테스나는 TP1을 치고 트레일링으로 마무리됐다. 전날 들어간 포지션이 다음 날 아침 정상적으로 관리된 것이다.

종목 복구 수량 평균단가 결과
상아프론테크 13주 25,900원 트레일링 정리 -1.40%
두산테스나 9주 83,522원 TP1 후 트레일링 +2.71%

※ GENIE V4.16 / 2026-03-18 로그 기준

트레이딩 시스템 종료 후 재시작 포지션 복구 데이터 노드 연결 일러스트
포지션 파일을 저장하고 재시작 시 복구하는 구조 — V4.16에서 처음 안정화됐습니다

⚙️ 왜 API 잔고만으로는 부족한가

키움 API로 현재 잔고는 언제든 받아올 수 있다. 그러면 파일 저장이 왜 필요하냐고 물을 수 있다.

API 잔고에는 "지금 몇 주 들고 있고, 평균 단가가 얼마"라는 정보만 있다. GENIE가 내부적으로 관리하는 TP1 실행 여부, 트레일링 스탑 기준가, 매수 슬롯 정보는 API에 없다. 이건 GENIE 안에서만 존재하는 데이터다.

그래서 API 잔고와 내부 상태 파일을 둘 다 사용한다. API는 실제 잔고 확인용, 파일은 내부 로직 상태 복구용. 재시작 시 두 개를 대조해서 정합성을 맞추는 것이다.

❓ Q&A

Q. 포지션 파일이 손상되거나 잘못 저장되면 어떻게 되나?

그게 가장 걱정되는 케이스다. 파일이 손상되면 복구 시 오류가 나거나 잘못된 상태로 시작할 수 있다. 그래서 복구 후 반드시 API 잔고와 대조 확인하는 단계를 넣었다. 파일 데이터와 API 잔고가 크게 다르면 파일을 버리고 API 기준으로 새로 초기화하도록 처리해뒀다. 완벽하진 않지만 가장 현실적인 안전장치다.

✍️ 7편을 마치며

자동매매 시스템에서 상태 관리는 생각보다 훨씬 중요하다. 단순히 주문을 내는 것보다, 지금 내가 어떤 상태인지를 정확히 아는 게 먼저다.

포지션 저장·복구 구조가 생기면서 GENIE는 처음으로 "이틀에 걸친 거래"를 제대로 처리할 수 있게 됐다. 전날 들어간 포지션이 다음 날 아침 정상 관리되는 것. 당연한 것 같지만 이게 안 됐던 기간이 있었다.

8편에서는 실제 매도가 어떻게 이뤄지는지를 다룬다. TP1 익절과 트레일링 스탑이 어떤 구조로 작동하는지, 로그에서 실제 숫자로 확인한다.

※ 본 글은 자동매매 시스템 개발 과정을 기록한 정보 제공 목적의 개발 일지입니다. 투자 권유나 수익 보장이 아니며, 모든 투자 판단과 책임은 본인에게 있습니다.