들어가며
드디어 매수주문 예제다. 주식거래에 대한 지식이 풍부해서 그래프를 그려 본인이 의도하는 포인트를 찾아 표시해주거나 자신의 전략을 위해 매매동향 데이터 등의 지표를 조회하는 등의 기능을 쓰는 경우가 아니라면, 앞서 분석한 주식종목 정보 조회와 매수/매도주문만으로도 트레이딩 프로그램을 완성할 수 있다. (어쨋든 트레이딩을 하는 프로그램인건 사실이니까..ㅋㅋ)
코드
import win32com.client
# 연결 여부 체크
objCpCybos = win32com.client.Dispatch("CpUtil.CpCybos")
bConnect = objCpCybos.IsConnect
if (bConnect == 0):
print("PLUS가 정상적으로 연결되지 않음. ")
exit()
# 주문 초기화
objTrade = win32com.client.Dispatch("CpTrade.CpTdUtil")
initCheck = objTrade.TradeInit(0)
if (initCheck != 0):
print("주문 초기화 실패")
exit()
# 주식 매수 주문
acc = objTrade.AccountNumber[0] #계좌번호
accFlag = objTrade.GoodsList(acc, 1) # 주식상품 구분
print(acc, accFlag[0])
objStockOrder = win32com.client.Dispatch("CpTrade.CpTd0311")
objStockOrder.SetInputValue(0, "2") # 2: 매수
objStockOrder.SetInputValue(1, acc ) # 계좌번호
objStockOrder.SetInputValue(2, accFlag[0]) # 상품구분 - 주식 상품 중 첫번째
objStockOrder.SetInputValue(3, "A003540") # 종목코드 - A003540 - 대신증권 종목
objStockOrder.SetInputValue(4, 10) # 매수수량 10주
objStockOrder.SetInputValue(5, 14100) # 주문단가 - 14,100원
objStockOrder.SetInputValue(7, "0") # 주문 조건 구분 코드, 0: 기본 1: IOC 2:FOK
objStockOrder.SetInputValue(8, "01") # 주문호가 구분코드 - 01: 보통
# 매수 주문 요청
objStockOrder.BlockRequest()
rqStatus = objStockOrder.GetDibStatus()
rqRet = objStockOrder.GetDibMsg1()
print("통신상태", rqStatus, rqRet)
if rqStatus != 0:
exit()
실행결과
주식 장이 열려있지 않은 시간에 프로그램을 실행하니 아래와 같은 실행결과가 출력됐다. 빨간색으로 가려진 부분은 내 대신증권 주식계좌번호이다;
아랫줄에 출력된 문자열 중 16088을 포함한 그 이후 부분은 모두 매수주문요청에 대한 결과 메시지이다.
분석내용
CpTrade.CpTdUtil, CpTrade.CpTd0311 두 가지 객체를 사용하여 주식을 매수한다. 예제 코드 상의 구조적인 부분은 딱히 없으므로 사용된 두 가지 COM 객체의 사용에 대한 분석만 있으면 될 것 같다.
- CpTrade.CpTdUtil
- TradeInit(), GoodsList() 메소드만 호출하고 있다.
- TradeInit()의 정확한 역할은 딱히 주석으로 설명되어 있지 않은데 CREON 공식 홈페이지 도움말에 따르면 주문을 하기 위한 예비과정을 수행한다고 한다. 주식 매수/매도 코드를 사용하기 위해 앞서서 호출되야 하는 메소드로 보인다. (모르니까 외워야지..)
- GoodsList()는 주석으로 주식상품 구분이라고 표기되어 있는데 결과값은 배열이며 첫번째 값은 01이고 이는 주식을 의미한다. 주식 외에는 선물/옵션, 해외선물, EUREX 등이 있는데 대신증권에서 저러한 상품을 이용한적이 없다면 '01' 하나의 값만 가지고 있는 배열이 반환된다.
- CpTrade.CpTd0311
- 사용법이 꽤나 간단하다. 예제코드의 주석만으로 거의 모든 것이 설명이 된다. 실제로 CpTd0311 객체에 SetInputValue() 메소드로 설정할 수 있는 항목은 예제에 있는 0~8번이 전부다.
- SetInputValue() 메소드로 설정하는 부분 중 1,2, 8번은 고정적인 사용법이라고 봐도 무방할 것 같은데 8번의 의미를 정확히 모르겠다. 이 부분은 주식에 대한 기본지식이 필요할 것 같다..
- 7번 항목이 꽤나 중요한 부분인데 IOC, FOK에 대한 설명은 아래와 같으니 참고하면 된다.
※ IOC 및 FOK 주문
>> IOC (Immediate - Or-Cancel Order) : 주문즉시 체결 그리고 잔량 자동취소
호가접수시점에서 호가한 수량 중 매매계약을 체결할 수 있는 수량에 대하여는 매매거래를 성립시키고,
매매계약이 체결되지 아니한 수량은 취소하는 조건
>> FOK ( Fill- Or- kill Order) : 주문즉시 전부체결 또는 전부자동취소
호가의 접수시점에서 호가한 수량의 전부에 대햐여 매매계약을 체결할 수 있는 경우에는 매매거래를
성립시키고 그러하지 아니한 경우에는 당해수량의 전부를 취소하는 조건
☞ 보통(지정가), 시장가, 최유리지정가에 한해서만 주문조건 부여가 가능합니다.
참고
CpTrade.CpTd0311에 대한 공식 홈페이지 도움말
크레온플러스 도움말 - 크레온
설명: 장내주식/코스닥주식/ELW주문(현금주문) 데이터를요청하고수신한다 통신종류: Request/Reply 모듈위치: CpTrade.dll Method object.SetInputValue(type,value) type에해당하는입력데이터를 value 값으로지정합
money2.creontrade.com
'알고리즘 트레이딩 > CREON API 예제 분석' 카테고리의 다른 글
CREON API (Python) 주식 잔고 종목 조회 및 실시간 현재가 업데이트 (0) | 2022.03.06 |
---|---|
CREON API (Python) 주식 현금 매도주문 (0) | 2022.03.01 |
CREON API (Python) 주식 현재가 조회/실시간 (0) | 2022.02.20 |
CREON API (Python) 주식 일자별 조회 (0) | 2022.02.16 |
CREON API (Python) 주식 현재가 조회 (0) | 2022.02.15 |
댓글