주식자동매매 28강. 계좌관리하기 (5), opt10045 전송 주문 결과 받아오기
본문 바로가기

주식 자동매매 강의/기초반(모든 코딩의 뿌리)

주식자동매매 28강. 계좌관리하기 (5), opt10045 전송 주문 결과 받아오기

반응형

27강에서 opt10045 주문을 키움서버로 전송하였으며, 이번 강의에서는 결과를 받아오는 코딩을 하도록 하겠습니다. KOA Studio의 싱글데이터 및 멀티데이터를 받아올 것입니다.

 

[유튜브 강의, 링크]와 같이 보시면 많은 도움이 되실 겁니다.

1. KOA Studio 확인

 결과 수신시 싱글과 멀티데이터 및 싱글데이터를 가져와 계좌관리 시 사용할 것입니다.

opt10045 주문 결과 데이터
opt10045 주문 결과 데이터

2. Tr slot 선언

 아래 그림의 빨간줄과 같이 키움 서버로 부터 전달되는 결과 데이터는 trdata_slot에 받습니다.

Tr slot 선언
Tr slot 선언

 - self.k.kiwoom을 이용해 키움 서버로 명령을 전송할 수 있는 기능을 kiwoom 메타클레스로부터 할당 받습니다.

 - OnReceiveTrdata를 이용해 키움 서버로 부터 수신된 데이터를 받을 준비를 합니다.

 - connect() 함수를 이용하여 수신된 데이터를 받을 수 있는 함수를 정하는데 self.trdata_slot이라 정의 하였습니다.

3. Tr slot 구성

 trdata_slot으로 전달되는 데이터 값의 이름이 "종목별기관매매추이요청2"일 경우 아래 명령이 수행되게 정의하였습니다. 우선 코드를 하나씩 살펴보도록 하시죠.

Tr slot 구성
Tr slot 구성

 - 반복된 함수도 계속 설명은 드리지만 간소화 하도록 하겠습니다.

 - 시작일과 마감일의 범위 안에서 구성된 일별 데이터의 개수를 확인하기 위해 GetRepeatCnt(Qstring, Qstring) 함수를 사용합니다. 예로 5월 1일부터 5월 10일까지의 데이터는 10개 이므로 GetRepeatCnt(Qstring, Qstring) 함수 사용 시 10을 반환합니다. 이때도 역시 self.k.kiwoom을 이용하고 dynamicCall을 사용합니다.

 - self.calcul2_data = [] .... 다양한 데이터를 저장할 수 잇는 객체를 리스트 형태로 구성합니다.

 - for i in range(cnt2) : 만약 개좌의 종목 개수가 4개라면 1~4까지 하나씩 i에 입력 됩니다.

 - 싱글데이터로 특정기간내의 기관추정평균가/외인추정평균가를 받아옵니다.

 - 함수는 self.k.kiwoom.dynamicCall을 이용해 키움서버로 주문을 전송하며, GetCommData()를 이요하여 데이터를 받아옵니다.

 - 멀티데이터로 기관일별순매매수량/외인일별순매매수량/등락률 종가를 가져옵니다. 이때, 각 일별로 데이터를 가져오므로 i 값이 들어 간 것이 보이시죠?, 10일 치면 10개의 데이터가 들어오개 됩니다.

 - self.calcul2_data~data4까지 기관일별순매매수량~종가 데이터를 입력시킵니다. 저번에도 말씀 드렸지만 리스트형테에 데이터 입력을 위해서는 append 함수를 사용합니다.

 

4. 요약 및 코드 공유

 종목 마다의 기관매매동향 정보를 얻기 위해 opt10045 함수를 사용하여 키움 서버로 명령을 전송하였으며, 결과치를 tr slot에 받아왔습니다. 싱글데이터는 10일치(예제 입니다. 기간은 선택하기 나름 입니다.)의 평균데이터 이므로 바로 사용가능하나 멀티데이터는 10일치의 1일씩 데이터를 다 가져오게 됩니다. 따라서, 각 1일치에 대한 데이터 가공이 반드시 필요합니다.

 다음 강의에서는 저의 아이디어를 일정 부분 공개해 계좌관리를 위한 멀티데이터를 가공하는 법을 알려 드릴테니 참고하셔서, 저보다 더욱 뛰어난 아이디어로 계좌 관리 하시기 바랍니다. 다음 강의 주제는 받아온 기관매매동향 데이터를 가공하고 가공된 데이터를 GUI에 전시하도록 하겠습니다. 코드는 아래와 같습니다.

반응형
    def trdata_slot(self, sScrNo, sRQName, sTrCode, sRecordName, sPrevNext):

        if sRQName == "종목별기관매매추이요청2":

            cnt2 = self.k.kiwoom.dynamicCall("GetRepeatCnt(QString, QString)", sTrCode, sRQName)  # 10일치 이상을 하려면 이부분에 10일치 이상데이터 필요

            self.calcul2_data = []
            self.calcul2_data2 = []
            self.calcul2_data3 = []
            self.calcul2_data4 = []

            for i in range(cnt2):  #

                Kigwan_meme = (self.k.kiwoom.dynamicCall("GetCommData(String, String, int, String)", sTrCode, sRQName, i, "기관일별순매매수량"))
                Kigwan_meme_ave = (self.k.kiwoom.dynamicCall("GetCommData(String, String, int, String)", sTrCode, sRQName, 0, "기관추정평균가"))
                Forgin_meme = (self.k.kiwoom.dynamicCall("GetCommData(String, String, int, String)", sTrCode, sRQName, i, "외인일별순매매수량"))
                Forgin_meme_ave = (self.k.kiwoom.dynamicCall("GetCommData(String, String, int, String)", sTrCode, sRQName, 0, "외인추정평균가"))
                percentage = (self.k.kiwoom.dynamicCall("GetCommData(String, String, int, String)", sTrCode, sRQName, i, "등락율"))
                Jongga = (self.k.kiwoom.dynamicCall("GetCommData(String, String, int, String)", sTrCode, sRQName, i, "종가"))

                self.calcul2_data.append(int(Kigwan_meme.strip()))
                self.calcul2_data2.append(abs(int(Jongga.strip())))
                self.calcul2_data2.append(abs(int(Kigwan_meme_ave.strip())))
                self.calcul2_data2.append(abs(int(Forgin_meme_ave.strip())))
                self.calcul2_data3.append(int(Forgin_meme.strip()))
                self.calcul2_data4.append(float(percentage.strip()))

 

 

반응형

.link_tit