이 섹션에서는 거래소 API를 사용하여 실제 주문을 실행하는 방법을 상세히 설명합니다. 백테스팅에서 검증된 전략을 바탕으로, 자동매매 시스템이 실제 시장에서 거래를 수행하는 핵심 단계입니다. 지정가 주문, 시장가 주문 등 다양한 주문 방식을 구현하고, 각 방식의 장단점을 이해하는 것이 중요합니다.
단계 1: API 키 설정 및 인증
거래소 API를 사용하기 위해서는 API 키가 필요합니다. 업비트, 바이낸스 등 각 거래소에서 API 키를 발급받아야 합니다. 발급받은 API 키는 안전하게 보관하고, 코드 내에서 사용할 수 있도록 설정해야 합니다. API 키를 잘못 관리하면 계정 보안에 문제가 발생할 수 있으므로 주의해야 합니다.
예시 (pyupbit):
import pyupbit
# API 키 설정
access_key = "YOUR_ACCESS_KEY"
secret_key = "YOUR_SECRET_KEY"
# 업비트 객체 생성
upbit = pyupbit.Upbit(access_key, secret_key)
# 잔고 조회
print(upbit.get_balance("KRW")) # 원화 잔고 조회
print(upbit.get_balance("KRW-BTC")) # 비트코인 잔고 조회
위 코드는 업비트 API를 사용하기 위한 기본 설정을 보여줍니다. YOUR_ACCESS_KEY
와 YOUR_SECRET_KEY
는 실제 발급받은 키로 대체해야 합니다. upbit.get_balance()
함수를 사용하여 계좌 잔고를 조회할 수 있습니다.
단계 2: 주문 함수 구현 (시장가 주문)
시장가 주문은 현재 시장 가격으로 즉시 체결되는 주문 방식입니다. 빠르게 거래를 체결해야 할 때 유용합니다. 하지만, 예상치 못한 가격 변동으로 인해 불리한 가격에 체결될 수 있다는 단점이 있습니다.
예시 (pyupbit):
# 시장가 매수
def buy_market_order(ticker, amount):
try:
ret = upbit.buy_market_order(ticker, amount)
print(ret)
return ret
except Exception as e:
print(e)
return None
# 시장가 매도
def sell_market_order(ticker, volume):
try:
ret = upbit.sell_market_order(ticker, volume)
print(ret)
return ret
except Exception as e:
print(e)
return None
# 예시: KRW-BTC 시장가 매수 (10000원)
buy_market_order("KRW-BTC", 10000)
# 예시: KRW-BTC 시장가 매도 (보유량 전부)
# volume = upbit.get_balance("KRW-BTC")
# sell_market_order("KRW-BTC", volume)
위 코드는 시장가 매수 및 매도 함수를 구현한 예시입니다. upbit.buy_market_order()
함수는 지정된 금액만큼 시장가로 매수합니다. upbit.sell_market_order()
함수는 지정된 수량만큼 시장가로 매도합니다.
단계 3: 주문 함수 구현 (지정가 주문)
지정가 주문은 특정 가격에 도달했을 때만 체결되는 주문 방식입니다. 원하는 가격에 거래를 체결할 수 있다는 장점이 있습니다. 하지만, 가격이 도달하지 않으면 주문이 체결되지 않을 수 있다는 단점이 있습니다.
예시 (pyupbit):
# 지정가 매수
def buy_limit_order(ticker, price, volume):
try:
ret = upbit.buy_limit_order(ticker, price, volume)
print(ret)
return ret
except Exception as e:
print(e)
return None
# 지정가 매도
def sell_limit_order(ticker, price, volume):
try:
ret = upbit.sell_limit_order(ticker, price, volume)
print(ret)
return ret
except Exception as e:
print(e)
return None
# 예시: KRW-BTC 지정가 매수 (가격: 50000000, 수량: 0.0001)
buy_limit_order("KRW-BTC", 50000000, 0.0001)
# 예시: KRW-BTC 지정가 매도 (가격: 60000000, 수량: 0.0001)
sell_limit_order("KRW-BTC", 60000000, 0.0001)
위 코드는 지정가 매수 및 매도 함수를 구현한 예시입니다. upbit.buy_limit_order()
함수는 지정된 가격과 수량으로 지정가 매수 주문을 넣습니다. upbit.sell_limit_order()
함수는 지정된 가격과 수량으로 지정가 매도 주문을 넣습니다.
단계 4: 주문 상태 확인 및 처리
주문이 정상적으로 체결되었는지 확인하는 과정이 필요합니다. 거래소 API를 통해 주문 상태를 조회하고, 체결되지 않은 주문은 취소하거나 재주문해야 합니다.
예시 (pyupbit):
import time
# 주문 조회 함수
def get_order(uuid):
try:
ret = upbit.get_order(uuid)
print(ret)
return ret
except Exception as e:
print(e)
return None
# 주문 취소 함수
def cancel_order(uuid):
try:
ret = upbit.cancel_order(uuid)
print(ret)
return ret
except Exception as e:
print(e)
return None
# 주문 후 10초 대기
time.sleep(10)
# 주문 UUID (주문 실행 결과에서 확인 가능)
uuid = "YOUR_ORDER_UUID"
# 주문 상태 확인
order_status = get_order(uuid)
# 주문 상태가 'wait'이면 주문 취소
if order_status and order_status['state'] == 'wait':
cancel_order(uuid)
위 코드는 주문 상태를 확인하고, 체결되지 않은 주문을 취소하는 예시입니다. upbit.get_order()
함수는 주문 UUID를 통해 주문 상태를 조회합니다. upbit.cancel_order()
함수는 주문 UUID를 통해 주문을 취소합니다.
단계 5: 예외 처리 및 로깅
주문 실행 과정에서 발생할 수 있는 예외 상황을 처리해야 합니다. API 요청 제한, 네트워크 오류, 잔고 부족 등이 발생할 수 있습니다. 오류 발생 시 로그를 기록하여 문제 해결에 도움을 줍니다.
주문 방식 비교
주문 방식 | 장점 | 단점 | 활용 예시 |
---|---|---|---|
시장가 주문 | 즉시 체결 가능, 빠른 거래 속도 | 예상치 못한 가격 변동으로 불리한 가격에 체결 가능성 | 빠른 손절매, 급등/급락 상황에서 즉시 대응 |
지정가 주문 | 원하는 가격에 거래 체결 가능 | 가격 미도달 시 주문 미체결 가능성 | 특정 가격에 매수/매도, 안정적인 거래 선호 |
이 단계를 통해 자동매매 시스템은 실제 시장에서 주문을 실행할 수 있습니다. 다음 단계에서는 주문 상태 관리 및 계좌 관리 시스템을 구축하여 자동매매 시스템의 안정성을 높입니다.