지난 1일 차에 토스증권 OpenAPI를 통해 실시간 현재가를 정수형 데이터로 완벽하게 가져오는 데 성공했습니다. 오늘 2일 차에는 자동매매 시스템의 심장이라고 할 수 있는 ‘조건문 감시 루프’와 ‘자동 주문 전송 엔진’을 구현해 보겠습니다.
프로그램이 쉬지 않고 실시간 시세를 감시하다가, 내가 미리 설정해 둔 목표 가격 이하로 주가가 떨어지는 순간 0.1초 만에 자동으로 매수 주문을 밀어 넣는 실전 시스템의 백본 코드가 오늘 완성됩니다.
—1. 토스증권 주문(Order) API 규격의 핵심 특징
실시간 시세를 조회할 때와 마찬가지로, 주문 API 역시 까다로운 게이트웨이 보안 규격을 가지고 있습니다. 우리가 테스트를 통해 밝혀낸 핵심 규칙은 다음과 같습니다.
- 엔드포인트 및 메서드:
POST /api/v1/orders - 데이터 타입 제약: 수량(quantity)과 가격(price) 데이터를 전송할 때, 일반적인 숫자형(Int)이 아닌 반드시 문자열(String, “10”)로 감싸서 보내야 오류가 나지 않습니다.
- clientOrderId 필수 생성: 시스템 간의 중복 주문 전송을 원천 차단하기 위해, 개발자가 직접 고유한 주문 식별값(UUID 및 타임스탬프 조합)을 생성하여 바디에 실어 보내야 합니다.
2. 조건문 감시 엔진(Sentinel Loop) 설계의 논리 구조
자동매매 프로그램은 장이 열려 있는 동안 무한히 시세를 체크해야 합니다. 이를 위해 파이썬의 while True 루프를 가동합니다. 전체적인 흐름은 다음과 같은 알고리즘을 따릅니다.
—[감시 알고리즘 흐름]
① 설정한 주기(예: 5초)마다 토스 서버에서 현재가 획득
② ‘현재가 ≤ 내가 설정한 목표가’ 조건이 충족되는지 대소 비교
③ 조건이 참(True)이면 즉시 주문 함수 호출 후 루프 안전 종료(break)
④ 조건이 거짓(False)이면 아무 작업도 하지 않고 다시 대기(sleep)
3. 2일 차 최종 완성형 파이썬 스크립트
아래는 시세 조회 인프라와 자동 주문 API 전송 로직이 유기적으로 결합된 전체 코드입니다. 안전한 테스트를 위해 목표 매수 가격을 현재가보다 아주 낮게 잡아 주문이 나가지 않고 대기하는 ‘방어적 가동성 테스트’에 초점을 맞추었습니다.
import os
import requests
import time
import uuid
BASE_URL = "https://openapi.tossinvest.com"
TARGET_SYMBOL = "005930" # 감시 및 매수할 종목 코드 (예시: 삼성전자)
TARGET_BUY_PRICE = 45000 # 매수 감시 가격 (이 가격 이하일 때만 작동)
ORDER_QUANTITY = 1 # 조건 충족 시 매수할 수량
def execute_order(token, account_seq, symbol, side, order_type, quantity, price):
url = f"{BASE_URL}/api/v1/orders"
headers = {
"Authorization": f"Bearer {token}",
"Content-Type": "application/json",
"X-Tossinvest-Account": account_seq
}
# 중복 주문 방지용 고유 식별자 생성
unique_client_id = f"ord_{int(time.time())}_{uuid.uuid4().hex[:6]}"
payload = {
"clientOrderId": unique_client_id,
"symbol": symbol,
"side": side, # "BUY" (매수)
"orderType": order_type, # "LIMIT" (지정가)
"quantity": str(quantity), # 문자열 규격 준수
"price": str(price) # 문자열 규격 준수
}
response = requests.post(url, json=payload, headers=headers)
if response.status_code in [200, 201]:
print("🎉 [주문 성공] 토스증권 서버에 주문이 정상 접수되었습니다.")
return True
return False
# (중략 - 토큰 발급 및 시세 조회 함수가 루프문과 결합하여 주기적으로 현재가를 비교 검증)
—
4. 실전 구동 테스트 결과 및 안전 종료 확인
코드를 실행하면 엔진이 계좌를 안전하게 링크한 뒤, 지정한 주기마다 실시간 가격을 추적하기 시작합니다. 주말이나 장외 시간에도 토스 서버는 가격 데이터를 정상 피딩해 줍니다.
장시간 켜놓고 테스트를 진행하다가 터미널에서 Ctrl + C를 누르면 시스템이 KeyboardInterrupt 예외를 발생시키며 비정상 종료가 아닌 안전한 수동 종료 상태로 진입하는 것까지 교차 검증을 마쳤습니다.
마치며 & 3일 차 예고
이제 시세 추적과 조건 만족 시 주문을 쏘는 코어가 완성되었습니다. 하지만 이대로 실전에 장시간 켜두기엔 리스크가 있습니다. 순간적인 와이파이 끊김이나 네트워킹 불안정이 발생하면 프로그램이 곧바로 뻗어버리기 때문입니다.
다음 3일 차에는 **네트워크 예외 처리(Try-Except)를 통한 무중단 구동성 보강**과 주문이 성공했을 때 내 스마트폰으로 즉시 메시지를 보내주는 **메신저 알림 기능**을 결합해 한 단계 더 완벽한 트레이딩 봇으로 진화시켜 보겠습니다.