[주식자동매매] 분할 매수/매도 코딩하기(9), 키움서버로 매수/매도 종목의 현재가/거래량/호가 등의 정보 요청하기
본문 바로가기

주식 자동매매 강의/중급반(시황 및 차트 구현)

[주식자동매매] 분할 매수/매도 코딩하기(9), 키움서버로 매수/매도 종목의 현재가/거래량/호가 등의 정보 요청하기

반응형

 앞서 GUI 구성, 종목 선정, 선정 종목 DB 구축 등을 알아보았습니다. 드디어 키움 서버로 매수/매도 종목의 현재가/거래량/호가 등의 정보를 요청하겠습니다. 역시 생각보다 강의가 오래 걸렸습니다. 다들 조금만 더 힘 내시죠.

 

 마지막에 코드 위치와 기초반 링크가 있습니다. 이해가 되지 않으시면 기초반 링크를 참조하세요. 

 

 1. 자동매매 시작 버튼 생성 및 클릭 시 자동매매 시작 코딩

 GUI를 통해 Pushbutton을 생성해 주시고 ObjectName은 Start_Auto로 설정합니다.

반응형

자동매매 시작 GUI
자동매매 시작 GUI

  GUI와 자동매매 시작 함수간 연결하기 : connect

자동매매 시작하기 버튼 클릭 코딩
자동매매 시작하기 버튼 클릭 코딩

 (1) 메인 코딩화면에 Start_Auto가 클릭되면 실시간 자동매매를 수행하는 sefl.start_real_auto() 함수가 실행되게 합니다. 

 (2) 함수가 실행되면 setText를 사용하여, 텍스트 문구를 자동매매 중이라 바꿔주고 setStyleSheet를 사용해 빨간색으로 변경해 줍니다. 그리고 Thread43을 실행하게 되는데 Thread43이 자동매매를 위한 스레드입니다. 아래부터는 Thread43 코딩만 할 것입니다. 그전에 혹시 노파심에 아래와 같이 적어드리는데 관련 Thread를 실행하기 위해서는 기능을 갖와야 되는 거 아시죠? form과 improt를 사용해 해당 스크립트의 클래스를 가져옵니다.

Thread 가져오기
Thread 가져오기

 2. DB종목의 실시간 데이터 키움서버에 요청하기

 우리가 선정했던 종목의 다양한 데이터가 있어야 매수/매도 판단을 하실 수 있겠지요? 따라서, 선택 종목을 키움 서버에 등록하여 다양한 데이터를 받아오겠습니다.

QThread43 스크립트 생성 및 기본 셋팅
QThread43 스크립트 생성 및 기본 셋팅

  (1) 코딩을 편하기하기 위해 간련 스크립트 및 클래스 또는 함수를 가져옵니다. 이 부분은 계속 설명드렸기에 생략하겠습니다. 기초반에서 공부하시면 손쉽게 이해하실 수 있을 것입니다.

  (2) Thread43 클래스를 생성하고 스레드에서 GUI를 사용할 수 있게 parent를 가져오고 그 기능을 self.parent = parent를 이용해 인스턴스화 합니다.

 또한 키움서버로 다양한 명령을 보내고 공용 언어(메타 클래스 기반 싱글턴)를 사용하기 위해 self.k에 Kiwoom 클래스를 인스턴스 합니다. Kiwoom은 스레드 사용이 없어서는 안 될 마법의 언어라고 말씀드렸었죠.

 이제  계좌번호를 가져와야 하는데 앞서 우리는 계좌 번호를 이미 가져왔었습니다. 기초반 프로그램이 Main이라면 지금 분할/매수 매도는 sub입니다. 따라서, Main에서 이미 계좌를 가져왔었고 Main에서 가져온 계좌번호를 self.k.acc_number에 저장해 두었기 때문에 이것을 그대로 self.account_num으로 가져오기만 하면 됩니다. 굳이 self.k.acc_number에서 계속 사용하지 않고 sefl.acount_num으로 가져오는 이유는 실시간 네트워크 환경에서 별도의 클래스(Kiwoom)로 계속 접속하는 것은 상당히 위험한 행동입니다. 실시간 처리 시 네트워크 지연 등을 반드시 생각해야 되기 때문이죠. 본인 머릿속에 기억하지 않고 계속 남에게 물어보는 것은 좋지 않은 행동이겠죠?

 

  참고사항으로 QThread_1에서 계좌 번호를 가져올 때 아래와 같이 sefl.k.acc_number에 account를 저장합니다.

sefl.k.acc_number
sefl.k.acc_number

  

 다음으로 자동 매수/매도할 DB 데이터를 불러와야 합니다.

 

매수/매도할 DB 데이터를 불러오기
매수/매도할 DB 데이터를 불러오기

 (1) self.Getanal_code에는 우리가 매수할 종목의 코드 번호를 입력할 것입니다.

 (2) self.Load_code() 함수를 실행하면 DB에 저장된 값을 불러옵니다. 정확하게는 앞서 강의 드렸던 buylast 표에서 관련 값을 다 들고 오는 것이죠.

DB에 저장된 값을 불러오기
DB에 저장된 값을 불러오기

 * 1-1 : 차 후 매수/매도 주문을 넣을 때 사용할 스크린번호를 할당 하는 것입니다. 종목이 10개라면 1-2와 같이 +1씩 해줘 스크립 번호를 증가시킵니다.

 * 2 : for문을 사용해 buylast에 들어 있는 종목의 행 개수를 받아옵니다. 행에 10 종목이 있다면 range 함수를 사용했기 땜누에 0부터 9까지 입력되겠죠?

 * 3 : 이 부분은 계속 반복되는 것입니다. 우선 item 함수를 상용해 x행 0열에 저장된 코드 번호를 가져와 self.Getnal_code에 update 함수를 사용해 저장합니다. 그리고 메타 클래스 기반 싱글턴에 저장된 self.k.portfolio_stouck_dict에도 update 함수를 상용해 코드 번호를 저장하는데 딕셔너리로 저장했기 때문에 이 코드번호 옆에 우리가 매수/매도하려는 정보를 입력하겠습니다. buylast에는 3열부터 18열까지 매수 매도 정보가 있는 거 기억하지 죠. 이전 강의에서 저희는 저렇게 저장하였습니다. self.k.portfolio_stouck_dict에 update 함수를 상용해 코드 번호를 저장했기 때문에 self.k.portfolio_stouck_dict[code_n]에 update함수를 사용하여 3열부터 18열까지 정보를 모조리 입력시킵니다. 뿐만 아니라 종목명과 주문용 스크린 번호도 입력시킵니다. 이제 portfolio_stouck_dict에는

 {종목 코드 1 : [1차 가격, 2차 가격.... 8차수량], 종목 코드 2 : [1차가격, 2차가격.... 8차 수량]} 까지 전부 입력되어 있습니다.

 

 (3) self.orderitemlist_1~10을 리스트 형태로 만들어 중목 매수가 되지 않게 막을 용도로 구성하였습니다. 예를 들어 1 종목이 매수되었는데 다음에 매수되면 안 되겠죠? 한번 매수되면 self.orderitemlist에 집어넣어 다음에 매수되지 않게 막을 것입니다.

 

 다음은 우리가 선정한 종목에 대한 현재가/호 가등의 모든 정보를 신청합니다.

키움서버에 정보 신청
키움서버에 정보 신청

 (1) 신청할 때 스크린 너무 필요한 스크린 넘버입니다. 앞서 설정한 4000번 때 스크린 넘버는 매수/매도를 위한 것이죠.

 (2) for문을 이용해 portfolio_stock_diek에 있는 코드 번호를 모조리 가져와 code에 하나씩 넘겨줍니다. 그리고 SetRealReg 함수를 사용해 우리가 원하는 정보를 요청합니다. 이때 우리가 원하는 정보는 fids에 입력되어 있는데 기초반 강의에서 REALTYPE 구성했던 거 기억하실 겁니다.

 

REALTYPE
REALTYPE 구성

 3. 결론 및 코드

 DB에 저장된 또는 표에 저장된 값을 불러와 SetRealReg 함수를 사용하여 우리가 원하는 종목의 실시간 정보를 키움 서버에 요청하였습니다. 이때 주 용한 것이 fids 번호인데 이미 우리가 다 정의해 두었기 때문에 그대로 가져와 사용하였습니다.

 코드는 기초반에 강의드린 거와 98% 동일하기 때문에 아래 링크를 걸어 두겠으니 참고하시기 바랍니다. 아래 링크의 39강을 보시면 되겠습니다.

[무료 주식 자동매매 만들기 54강]

반응형

.link_tit