2. 해외선물/2-4. 해외선물 API (사용)

(키움증권 해외선물 OpenAPI-W) 주문가능금액 조회 (opw30009, 예수금및증거금현황조회)

봄이오네 2023. 1. 22. 08:08
반응형
1. 들어가며
2. 사전설명
   1) WKOA Studio 사용시 참고사항
   2) WKOA Studio에서 확인
3. 코드설명
4. 전체 코드
5. 마치며

 

1. 들어가며

지난 글에서는 "opc10002 TR요청"으로 1분봉 데이터를 활용하여 파이썬과 엑셀에서 1분봉 패턴을 만들어보았다.

패턴별 수익/손실의 시뮬레이션은 향후 알아보도록 하자

 

이번 글에서는 opw30009 (예탁금및증거금요청)을 활용하여 주문가능금액을 조회하는 방법을 알아보자.

아래 < 그림1-1 >은 모의계좌에 있는 주문가능금액이다.

 

그림1-1. 모의계좌에 있는 주문가능금액을 확인해보자

 

영웅문G에서 화면번호는 4553(해외선옵 예탁금 및 증거금)의 화면이다.

 

더보기
그림1-3. 영웅문G에서 확인가능한 청산손익 및 주문가능금액 현황

 


2. 사전설명

1) WKOA Studio 사용시 참고사항

요청(input)에 "계좌번호"가 들어가는 TR요청이면, 아이디의 비밀번호와 오른쪽 하단의 "비밀번호등록"에서 계좌비밀번호를 입력해 주어야 WKOA Studio에서 데이터를 받아온다.

WKOA Studio 로그인 후 각 내용(계좌번호, 비번, 비번입력매채)을 조회하면 아무것도 받아오지 않는다.

(필자는 비밀번호등록에서 "계좌번호"를 입력하였다)

 

2) WKOA Studio에서 확인

opw30009 TR로 "예수금및증거금현황조회"를 통해 주문가능금액을 받아올 수 있다.

 

< 그림1-1 >에서 주문가능금액은 29,552.25달러이다.

< 그림1-2 >에서 주문가능금액은 문자형 00000002955225로 나타난다.

 

문자형 00000002955225 앞의 000이 붙은 것은 strip() 함수를 활용하여 없앨 수 있다.

(소수점이 나타나지 않는 부분은 100으로 나누어주어야 한다.)

 

그림1-2. WKOA Studio에서 opw30009를 활용하여 주문가능금액은 확인가능하다.


3. 코드설명

앞의 내용과 중복되므로 모듈 및 로그인 관련 내용은 간략히 설명한다.

그림2-1. 필요 모듈 및 로그인을 진행한다.

 

 

1줄~5줄 : 코드 진행을 위해 필요한 모듈을 임포트한다.

9줄 : 키움 레지스트리를 self.kiwoom에 담는다.

12줄~13줄 : 데이터를 요청하면 키움서버에서 이벤트가 발생하는데, 이벤트와 결과값을 연결

15줄 : 로그인 창을 띄운다.

19줄 : 비밀번호등록 창을 띄워서, 계좌번호 4자리(모의계좌의 비번은 0000)를 입력한다.

20줄 : 본인의 계좌번호 10자리를 입력한다.

23줄~28줄 : 로그인을 위한 함수

 

그림2-2. 주문가능금액 및 선물청산손익 등을 받아올 수 있다.

 

30줄~37줄 : SetInputValue 함수와 CommRqData 함수를 이용하여 데이터를 입력하고, 키움서버에 요청한다.

39줄~53줄 : GetCommData 함수를 이용하여 데이터를 수신받는다.

45즐~51즐 : float형인 주문가능금액, 선물청산손익, 선물평가손익을 100으로 나눈 후, 출력한다.

 


4. 전체 코드

전체코드는 아래와 같다.

반드시 20줄에 본인의 계좌 10자리를 입력한다.

 

더보기
import sys
from PyQt5.QAxContainer import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import time

class btl_system():
    def __init__(self):
        self.kiwoom = QAxWidget("KFOPENAPI.KFOpenAPICtrl.1")
        print("로그인 시작!")

        self.kiwoom.OnEventConnect.connect(self.login_Connect)
        self.kiwoom.OnReceiveTrData.connect(self.trdata_get)

        self.kiwoom.dynamicCall("CommConnect(1)")
        self.login_event_loop = QEventLoop()
        self.login_event_loop.exec_()

        self.kiwoom.dynamicCall("GetCommonFunc(QString, QString)", "ShowAccountWindow", "")
        self.deposit_num = "계좌번호 10자리를 입력한다"

    ########## 로그인 관련 함수 ##########
    def login_Connect(self, err_code):
        if err_code == 0:
            print('로그인 성공했습니다!')
            self.login_event_loop.exit()
        else:
            print('로그인 실패했습니다!')

    def rq_data_opw30009(self, deposit_num1, password_2, password_enter3):  # 주문가능금액, 실현손익, 미실현손익
        self.kiwoom.dynamicCall("SetInputValue(QString,QString)", "계좌번호", deposit_num1)
        self.kiwoom.dynamicCall("SetInputValue(QString,QString)", "비밀번호", password_2)
        self.kiwoom.dynamicCall("SetInputValue(QString,QString)", "비밀번호입력매체", password_enter3)
        self.kiwoom.dynamicCall("CommRqData(QString, QString, QString, QString)", "opw_30009", "opw30009", "", "3009")
        time.sleep(0.5)
        self.tr_event_loop = QEventLoop()
        self.tr_event_loop.exec_()

    def trdata_get(self, scrno, rqname, trcode, recordname, prenext):
        if rqname == "opw_30009":
            orderable_money = float(self.kiwoom.dynamicCall("GetCommData(QString,QString,int,QString)", "opw_30012", "opw30012", 0, "주문가능금액").strip())  # 단위 : 달러 (화면번호 4553)
            realized_pl = float(self.kiwoom.dynamicCall("GetCommData(QString,QString,int,QString)", "opw_30012", "opw30012", 0, "선물청산손익").strip())
            unrealized_pl = float( self.kiwoom.dynamicCall("GetCommData(QString,QString,int,QString)", "opw_30012", "opw30012", 0, "선물평가손익").strip())

            self.orderable_money = orderable_money / 100
            self.realized_pl = realized_pl / 100
            self.unrealized_pl = unrealized_pl / 100

            print(self.orderable_money)
            print(self.realized_pl)
            print(self.unrealized_pl)

            self.tr_event_loop.exit()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    btl = btl_system()

    btl.rq_data_opw30009(btl.deposit_num, "0000", "00")

    app.exec_()

 


5. 마치며

주문가능금액, 선물실현손익 등 계좌에서 얻을 수 있는 데이터를 알아보았다.

다만, 국내주식의 매매와 약간 다르게 활용할 예정이다.

 

  • 국내주식 : 주문수량 = 주문가능금액 ÷ 현재가로 구했다면
  • 해외선물 : 주문가능수량(opw30011)을 통해 구할 수 있다.

 

그렇다면 주문가능금액(opw30009)은 어디에서 활용할 것인가?

  • 주문가능금액이 일정금액보다 크면 "진입"을 하고
  • 주문가능금액이 일정금액보다 작으면, "청산"을 하려고 한다.

 

위 방법에 대해서는 향후 설명할 예정이고,

다음글에서는 주문가능수량(opw30011)을 알아보자.

반응형