주식
상한가 자동 매매 - 5. 계좌 정보 불러오기
devshj
2019. 4. 5. 23:16
계좌 정보 불러오기
키움 Open API를 통해 자동 매매를 하기 위해선
아래와 같이 키움 모듈에 직접 계좌 비밀번호를 입력해야 합니다.
해당 부분은 진행상 자주 놓치는 부분이기 때문에 자동 거래를 정상적으로 하기 위해
사용자가 해당 부분을 무조건 입력할 수 있도록
거래시작 버튼을 클릭 시 계좌정보를 조회하여 D2예수금을 가져와서 노출하도록 했습니다.
(또한 D2예수금은 전체 거래를 할 수 있는 금액이기도 합니다.)
D2예수금을 노출하기 위해 예수금상세현황요청(opw00001) 키움 API를 사용하도록 하겠습니다.
먼저 기존에 설치한 KOAStudioSA.exe 파일을 더블 클릭하여 실행하도록 합니다.
그럼 아래와 같이 노출이 됩니다.
TR목록 부분에 opw00001을 입력 후 Enter를 입력해 줍니다.
그럼 아래와 같이 노출이 되는데요.
살펴보면 INPUT 값은 계좌번호, 비밀번호, 비밀번호입력매체구분, 조회구분 으로 4개이며
OUTPUT의 값은 싱글데이터, 멀티데이터로 아주 많습니다.
그중에 저희는 싱글데이터 중에 "d+2추정예수금" 을 사용할 예정입니다.
계좌번호는 = 전문 조회할 보유계좌번호
비밀번호 = 사용안함(공백)
비밀번호입력매체구분 = 00
조회구분 = 1:추정조회, 2:일반조회
해당 값들이 소스코드에 들어갈 예정입니다.
KOAStudioSA에서 예수금상세현황요청 API에 대해 살펴보았다면
다음으로 아래의 소스 코드를 upperLimitPriceTrading.py 파일에 작성 또는 전체를 변경해줍니다.
그리고 수정된 소스 코드가 적용된 upperLimitPriceTrading.py 파일을 Ctrl + Shift + F10 을 눌러 실행하거나
upperLimitPriceTrading.py 파일을 우클릭 후 Run 'upperLimitPriceTrading' 버튼을 클릭하여 실행하여
로그인 후 투입금을 입력 후 거래시작 버튼을 클릭합니다.
그럼 아래와 같이 "조회에 사용한 계좌비밀번호를 입력하십시오.(44)" 얼럿이 노출되게 됩니다.
처음 키움 API를 사용하여 자동 거래 구현 시 해당 부분을 자주 놓치게 됩니다.
해당 계좌 비밀번호를 설정하는 방법은 로그인 후 화면 오른쪽 하단에
^ 버튼을 클릭하면 퍼즐모양 같은 키움 아이콘을 확인할 수 있습니다.
해당 키움 아이콘을 마우스 우클릭 하면 아래와 같이 계좌비밀번호 저장이라고 노출되게 됩니다.
해당 계좌비밀번호 저장 버튼을 클릭 합니다
그럼 아래와 같은 창이 노출됩니다.
해당 창에서 계좌확인에 본인의 계좌 비밀번호를 입력 후 등록 버튼을 클릭합니다.
이후 닫기 버튼을 클릭합니다.
계좌비밀번호 등록이 완료되었다면 거래시작 버튼을 다시 클릭 시
아래와 같이 D2예수금 항목이 노출되는 것을 확인할 수 있습니다.
그럼 이제 추가된 소스 코드에 대해 살펴보겠습니다.
먼저 투입금을 저장할 global 변수를 선언하였습니다.
1 2 | global globalPrice # 전체에서 투입금을 사용하기 위해 global로 선언을 해줌(전역변수) globalPrice = '0' # 투입금에 0을 셋팅해줌 |
그리고 키움 기타 메시지가 발생될 경우 수신할 on_receive_msg를 만들어 연결하였습니다.
1 | self.kiwoom.OnReceiveMsg.connect(self.on_receive_msg) # 키움 기타 메시지가 발생할 경우 on_receive_msg 함수 호출 |
이후 거래시작 버튼을 클릭할 경우 btn_start 함수가 호출 되도록 연결하였습니다.
1 | self.btnStart.clicked.connect(self.btn_start) # ui 파일을 생성할때 작성한 거래시작 버튼의 objectName 으로 클릭 이벤트가 발생할 경우 btn_start 함수를 호출 |
키움 데이터 수신 관련 이벤트가 발샐할 경우 receive_trdata 함수가 호출 되도록 연결하였습니다.
1 | self.kiwoom.OnReceiveTrData.connect(self.receive_trdata) # 키움 데이터 수신 관련 이벤트가 발생할 경우 receive_trdata 함수 호출 |
on_receive_msg 함수 입니다.
키움에서 기타 메시지가 발생될 경우 해당 함수가 호출되게 됩니다.
현재는 단순 로그만 남기고 있지만 차후에 해당 부분에도 증거금 부족 등 로직이 들어가게 됩니다.
(ex. [INFO|158] 2019-04-07 16:48:33,464 > OnReceiveMsg sScrNo: 0102, sRQName: opw00001_req, sTrCode: opw00001, sMsg: [100000] 조회가 완료되었습니다.)
1 2 | def on_receive_msg(self, sScrNo, sRQName, sTrCode, sMsg): # 키움 기타 메시지 수신 함수 logger.info("OnReceiveMsg sScrNo: " + sScrNo + ", sRQName: " + sRQName + ", sTrCode: " + sTrCode + ", sMsg: " + sMsg) # info 레벨 로그를 남김 |
다음은 btn_start 함수 입니다.
거래시작 버튼 클릭 시 호출되는 함수로 투입금 입력 여부 확인 및 계좌번호가 있는지 확인하여
예수금상세현황요청 키움 API를 요청하도록 하였습니다.
해당 예수금상세현황요청 키움 API를 요청 후 데이터가 수신될 경우 receive_trdata 함수가 호출됩니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | def btn_start(self): # 거래시작 버튼 클릭 시 실행되는 함수 logger.debug("거래시작 버튼 클릭") # debug 레벨 로그를 남김 tempPrice = self.lePrice.text().strip().replace(',', '') # 입력된 종목당 투입금을 가져옴 if tempPrice == None or tempPrice == '': # 투입금이 있는지 체크 QMessageBox.about(self, "message", "종목당 투입금을 입력해주세요.") # 투입금이 없다면 안내 얼럿 노출 return # 아래 로직을 진행하지 않도록 처리함 else: globalPrice = tempPrice # 투입금을 전역변수에 셋팅 logger.debug("투입금(globalPrice): " + str(globalPrice)) # debug 레벨 로그를 남김 acctNo = self.cbAcctNo.currentText().strip() # 선택된 계좌번호를 가져옴 if acctNo == None or acctNo == '': # 계좌번호가 있는지 체크 QMessageBox.about(self, "message", "계좌번호를 선택해주세요.") # 계좌번호가 없다면 안내 얼럿 노출 return # 아래 로직을 진행하지 않도록 처리함 else: logger.debug("예수금상세현황요청 시작") # debug 레벨 로그를 남김 ret = self.kiwoom.dynamicCall('SetInputValue(QString, QString)', "계좌번호", acctNo) # 계좌번호 셋팅 ret = self.kiwoom.dynamicCall('SetInputValue(QString, QString)', "비밀번호", "") # 비밀번호 셋팅 ret = self.kiwoom.dynamicCall('SetInputValue(QString, QString)', "비밀번호입력매체구분", "00") # 비밀번호입력매체구분 셋팅 ret = self.kiwoom.dynamicCall('SetInputValue(QString, QString)', "조회구분", "1") # 조회 구분 셋팅 ret = self.kiwoom.dynamicCall('CommRqData(QString, QString, int, QString)', "opw00001_req", "opw00001", 0, "0102") # 키움 dynamicCall 함수를 통해 CommRqData 함수를 호출하여 opw00001 API를 구분명 opw00001_req, 화면번호 0102으로 호출함 |
예수금상세현황요청 키움 API를 요청 시 데이터가 수신될 경우 처리하는 receive_trdata 함수입니다.
d+2추정예수금을 가져와 천단위 콤마 포멧으로 변경하여 D2예수금 입력란에 표기합니다.
이후 거래중지 버튼을 활성화 하고 거래시작 버튼을 비활성화 합니다.
1 2 3 4 5 6 7 8 9 | def receive_trdata(self, screen_no, rqname, trcode, recordname, prev_next, data_len, err_code, msg1, msg2): # 키움 데이터 수신 함수 if rqname == "opw00001_req": # 수신된 데이터 구분명이 opw00001_req 일 경우 (예수금상세현황) d2Price = self.kiwoom.dynamicCall('CommGetData(QString, QString, QString, int, QString)', trcode, "", rqname, 0, "d+2추정예수금") # d+2추정예수금을 가져옴 d2Price = self.change_amt_format(d2Price, 0) # 금액을 천단위 콤마(",")를 추가함 logger.debug("D2예수금: " + str(d2Price)) # debug 레벨 로그를 남김 self.leD2Price.setText(str(d2Price)) # 2추정예수금을 D2예수금 입력란에 표기함 self.btnStop.setDisabled(False) # 거래중지 버튼을 활성화 상태로 변경 self.btnStart.setDisabled(True) # 거래시작 버튼을 비활성화 상태로 변경 |
이상으로 예수금상세현황요청 키움 API 요청에 대해서 알아보았습니다.
주식 자동매매, 주식 어플, 주식 정보 웹 스크래이핑, 공시 정보 연동 등
주식에 관심이 있는 사람들에게 도움이 될 정보를 기본부터 차근차근 정리할 예정입니다.
해당 글을 보고 지적 사항, 수정 사항이 있다면 언제든지 댓글, 또는 메일로 연락 부탁드립니다.
여러분의 관심이 글을 보는 다음 누군가에겐 큰 도움이 될 것입니다. 감사합니다.