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

(키움증권 해외선물 OpenAPI-W) CME 4종목의 현재가 조회(opt10001)

봄이오네 2023. 1. 10. 08:01
반응형
목 차
1. 들어가며
2. 사전설명
   1) 해외선물 4종목의 현재가 가져오는 방법
   2) 국내주식 4종목의 현재가 가져오는 방법
3. 코드 설명
4. 전체 코드 및 결과
5. 마치며

1. 들어가며

지난 글에서는 키움증권 해외선물의 OpenAPI-W에 접속/로그인 하는 방법을 알아보았다.

국내주식 OpenAPI에 비해 상당히 길게 설명하였다.

CommConnect(1), pyautogui, with~as 구문 등

자동로그인에 대한 생각이 컸던거 같다.

 

이번 글에서는 로그인 후 4종목의 현재가를 조회하는 방법을 알아볼 예정이다.

CME 시장에서 4종목은 아래와 같다.

 * 4종목 : Nasdaq, E&P, 엔화, 브리티시 파운드

 ** 골드는 COMEX거래소이며, 크루드 오일 및 천연가스는 NYMEX 거래소이다.

    (키움증권에서 골드, 오일, 천연가스는 CME거래소의 종목에 해당하지 않는다)

 

 

(키움증권 해외선물) 해외선물 종목코드 알아보기

목 차 1. 들어가며 2. 사전 설명 3. 해외선물 종목코드 만들어진 원리 4. 키움증권에서 분류한 거래소 현황 1) 키움증권 OpenAPI-W에서 거래되는 종목 2) 키움증권의 거래소 분류 현황 5. 마치며 1. 들어

springcoming.tistory.com


2. 사전설명

1) 해외선물 4종목의 현재가 가져오는 방법

< 그림1 >에서 현재가(시장가)를 가져오는 TR은 opt10001(종목정보조회)이다.

SetInputValue, CommRqData를 활용하여 종목코드를

OpenAPI-W에 접속하여, 종목명 / 현재가를 받아오는 화면이다.

 

그림1. TR목록에서 opt10001을 이용하여 종목명, 현재가를 받아온다.

 

2) 국내주식 4종목의 현재가 가져오는 방법

국내주식 4종목은 for 문을 활용하여 현재가를 받아왔다.

 * 4종목 : 삼성전자, 경동나비엔, 아프리카TV, 토니모리

 

 

 

(주식 자동 매매) 키움증권 OpenAPI 4종목 현재가 조회(opt10001)

1. 들어가며 지난 번에는 삼성전자(005930)의 현재가를 받아보았다. 이번에는 4종목의 현재가를 pandas모듈의 데이터프레임에 담아보자 * 4종목 : 삼성전자(005930), 경동나비엔(009450), 아프리카TV(067160)

springcoming.tistory.com


3. 코드 설명

SetInputValue, CommRqData 함수를 활용하여 데이터 입력/요청하고

 GetCommData함수를 통해 종목명/현재가를 받아온다.

그림2-1. OpenAPI-W에 로그인하는 화면

 

OpenAPI-W에 로그인 관련하여서는 앞글에서 설명하였다.

여기서는 간략히 설명한다.

 

1줄~7줄 : 파이썬 코드 진행을 위해 sys, PyQt5.QAxContainer 모듈 등을 임포트한다.

11줄 : 키움증권의 레지스트리에 접속하는 내용을 self.kiwoom에 인스턴스화 시킨다.

14줄 : 17줄(CommConnect)와 27줄(login_Connect 함수)을 연결한다.

15줄 : 로그인 윈도우 창을 호출한다.

18줄 : 34줄의 로그인 윈도우 창에 비밀번호를 입력한다.

 

22줄 : 비밀번호등록 창을 호출한다.

24줄 : 4종목을 선언한다.

27줄 ~ 32줄 : 로그인 관련 함수를 선언/정의한다.

 

그림2-2. 로그인 비밀번호를 입력하고 SetInputValue 함수 등을 활용한다.

 

34줄~47줄 : 로그인 창에 비밀번호를 입력한다.

50줄~54줄 : OpenAPI-W에 입력(SetInputValue 함수) 및 데이터에 요청(CommRqData)

56줄~66줄 : GetCommData 함수를 이용하여 데이터를 수신받고, 출력(print)한다.

 

그림2-3. 실행 결과

 

72줄 : < 그림2-3 >에서 for문을 돌려서, 24줄의 4종목을 하나씩 불러온다.

73줄 : btl.rq_data_opt10001를 통해 50줄의 함수(rq_data_opt10001)를 통해

           72줄의 4종목을 for문을 통해 1종목씩 종목명/현재가를 받아온다.


4. 전체 코드 및 결과

import sys
from PyQt5.QAxContainer import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import pyautogui
import time
import threading

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.password_login()
        self.login_event_loop = QEventLoop()
        self.login_event_loop.exec_()

        self.kiwoom.dynamicCall("GetCommonFunc(QString, QString)", "ShowAccountWindow", "")

        self.interesting_codes = ["NQH23", "ESH23", "6JH23", "6BH23"]

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

    def password_login(self):
        with open(r'C:\Users\User\Desktop\btlg_password.txt') as f:
            lines = f.readlines()
            self.password = lines[0].strip()
            self.cetification_password = lines[1].strip()
            self.deposit_password = lines[2].strip()

        pyautogui.moveTo(1010, 485)  # 비밀번호: Point(x=1010, y=490)
        pyautogui.click()     # 실행 안될 때는 파이참을 "관리자 권한 실행"으로 실행
        time.sleep(1)
        pyautogui.write(self.password, interval=0.1)
        # time.sleep(3)
        # pyautogui.write(self.cetification_password, interval=0.1)  # 실투시 비번 활성화
        pyautogui.press('enter')

    ########## 키움서버에 TR 요청하는 함수 모음 (키움 OPENApi-w에서 제공) ##########
    def rq_data_opt10001(self, stock_code_num):     # 현재가(시장)
        self.kiwoom.dynamicCall("SetInputValue(QString,QString)", "종목코드", stock_code_num)
        self.kiwoom.dynamicCall("CommRqData(QString, QString, QString, QString)", "opt_10001", "opt10001", "", "1001")
        self.tr_event_loop = QEventLoop()
        self.tr_event_loop.exec_()

    def trdata_get(self, scrno, rqname, trcode, recordname, prenext):
        if rqname == "opt_10001":        # 현재가(시장)
            stock_name = self.kiwoom.dynamicCall("GetCommData(QString,QString,int,QString)", "opw_30012", "opw30012", 0, "종목명").strip()
            current_price_m = abs(float(self.kiwoom.dynamicCall("GetCommData(QString,QString,int,QString)", "opw_30012", "opw30012", 0, "현재가").strip()))

            self.stock_name = stock_name
            self.current_price_m = current_price_m

            print(f"{self.stock_name}의 현재가는 {self.current_price_m}입니다")

            self.tr_event_loop.exit()

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

    for i in btl.interesting_codes:
        btl.rq_data_opt10001(i)

    app.exec_()
    
   
# (expected result)
# Mini NASDAQ 100(23.03)의 현재가는 11022.25입니다
# Mini S&P 500(23.03)의 현재가는 3861.0입니다
# Japanese Yen(23.03)의 현재가는 7707.0입니다
# British Pound(23.03)의 현재가는 1.2084입니다

5. 마치며

opt10001(종목정보조회) 및 for문을 통해 해선의 4종목의 현재가를 받아왔다.

손익 계산을 위한 비교 대상으로서의 현재가 받아오는 방법을 알 필요가 있다.

 

기본적으로 TR 요청 패턴에 따라,

SetInputValue, CommRqData 및 GetCommData 함수 등을 활용하여

데이터를 받아오는 방법에 익숙해지자.

반응형