We will find a way. We always have.

고려대학교에서 인공지능과 금융공학을 연구하고 있는 어느 대학원생의 블로그입니다.

금융(Finance)/시스템 트레이딩(System Trading)

[개발] 대신증권API를 이용한 트레이딩 시스템 - 예수금 가져오기

MinsukSung 2020. 9. 22. 20:34

안녕하세요 성민석입니다.

진행하는 튜토리얼의 모든 코드는 대신증권 사이보스플러스 자료실에서 제공하는 걸 기반으로 만들었습니다.

그리고 여기에 사용된 모든 코드는 저의 GitHub에서 확인하실 수 있습니다.


지난 시간에는 주식의 현재가 조회에 대해서 알아보았습니다.

 

 

[개발] 대신증권API를 이용한 트레이딩 시스템 - 주식 현재가 조회

안녕하세요 성민석입니다. 진행하는 튜토리얼의 모든 코드는 대신증권 사이보스플러스 자료실에서 제공하는 걸 기반으로 만들었습니다. 그리고 여기에 사용된 모든 코드는 저의 GitHub에서 확인

minsuksung-ai.tistory.com

 

이번 시간에는 본인 계좌의 잔고에서 예수금이 얼마큼 남아있는지 확인해보겠습니다. 시작에 앞서, 여기에 사용되는 모든 내용은 모의투자를 기반으로 하고 있으므로 실제 투자할 때 주의하시길 바랍니다. 일단 HTS에서 실시간계좌관리를 보면 예수금을 확인할 수 있는데요. 저는 이번 시간에 저기에 있는 정보를 어떻게 가져올 수 있을지 찾아봤습니다.

 

크레온을 통해서 확인한 모의투자 예수금

대신증권 API를 확인해보시면 [계좌별 잔고 평가현황] CpTrade.CpTd6033이란 항목이 있습니다. 저는 여기서 간단하게 예수금에 대한 정보를 가져올 수 있을 것이라고 생각했습니다. 저기서 총 평가금액이란 항목에서 확인하실 수 있습니다.

 

 

대신증권 API 중 [계좌별 잔고 평가현황] CpTrade.CpTd6033 내용

 

 

사이보스플러스 도움말 - 대신증권

 설명: 계좌별잔고및주문체결평가현황데이터를요청하고수신한다 (주)주식이외의상품(예: 펀드, RP 등)에대한평가금액과예수금변동은포함되어있지않음에유의하시기바랍니다. 통신종류: Request/

money2.daishin.com

 

저의 착각이었습니다.

HTS에서 확인할 수 있는 정보와 API를 통해서 가져온 정보가 동일하지 않았습니다.

 

 

어찌된 일일까...분명히 5억이란 돈이 있는데 가져오질 못하니...

분명히 HTS에서 확인할 수 있는 계좌번호와 API에서 가져온 계좌번호도 동일한데, 예수금은 자꾸 0원이라고 나옵니다.

제가 만들어둔 슬랙(SlackBot)인 '덕구'도 총 평가금액이 0원이라고 말하고 있었죠.

 

대신증권 API의 예제들을 가만히 보면

BlockRequest()라는 함수가 있습니다. BlockRequest() 함수를 호출하지 않고 데이터를 요청하게 되면 서버로부터 데이터를 가져올 수 없던 것이었습니다.

 

# 실제적인 6033 통신 처리
    def rq6033(self, retcode):
        self.objRq.BlockRequest()
 
        # 통신 및 통신 에러 처리
        rqStatus = self.objRq.GetDibStatus()
        rqRet = self.objRq.GetDibMsg1()
        print("통신상태", rqStatus, rqRet)
        if rqStatus != 0:
            return False
 
        cnt = self.objRq.GetHeaderValue(7)
        print(cnt)
 
        print("종목코드 종목명 신용구분 체결잔고수량 체결장부단가 평가금액 평가손익")
        for i in range(cnt):
            code = self.objRq.GetDataValue(12, i)  # 종목코드
            name = self.objRq.GetDataValue(0, i)  # 종목명
            retcode.append(code)
            if len(retcode) >=  200:       # 최대 200 종목만,
                break
            cashFlag = self.objRq.GetDataValue(1, i)  # 신용구분
            date = self.objRq.GetDataValue(2, i)  # 대출일
            amount = self.objRq.GetDataValue(7, i) # 체결잔고수량
            buyPrice = self.objRq.GetDataValue(17, i) # 체결장부단가
            evalValue = self.objRq.GetDataValue(9, i) # 평가금액(천원미만은 절사 됨)
            evalPerc = self.objRq.GetDataValue(11, i) # 평가손익
 
            print(code, name, cashFlag, amount, buyPrice, evalValue, evalPerc)

 

위의 예제를 응용하여 덕분에 성공적으로 데이터를 가져올 수 있었습니다.

 

덕구도 정확히 5억이 있다고 말해주고 있군요.

아마 다음 시간에는 BlockRequest() 함수에 대해서 조금 더 알아볼 것 같습니다.

 


참고자료

 

 

사이보스플러스자료실 - 대신증권

 

money2.daishin.com

 

mssung94/daishin-trading-system

대신증권API를 활용하여 간단하게 만들어보는 트레이딩 시스템. Contribute to mssung94/daishin-trading-system development by creating an account on GitHub.

github.com