목 차
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에 접속하여, 종목명 / 현재가를 받아오는 화면이다.
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함수를 통해 종목명/현재가를 받아온다.
OpenAPI-W에 로그인 관련하여서는 앞글에서 설명하였다.
여기서는 간략히 설명한다.
1줄~7줄 : 파이썬 코드 진행을 위해 sys, PyQt5.QAxContainer 모듈 등을 임포트한다.
11줄 : 키움증권의 레지스트리에 접속하는 내용을 self.kiwoom에 인스턴스화 시킨다.
14줄 : 17줄(CommConnect)와 27줄(login_Connect 함수)을 연결한다.
15줄 : 로그인 윈도우 창을 호출한다.
18줄 : 34줄의 로그인 윈도우 창에 비밀번호를 입력한다.
22줄 : 비밀번호등록 창을 호출한다.
24줄 : 4종목을 선언한다.
27줄 ~ 32줄 : 로그인 관련 함수를 선언/정의한다.
34줄~47줄 : 로그인 창에 비밀번호를 입력한다.
50줄~54줄 : OpenAPI-W에 입력(SetInputValue 함수) 및 데이터에 요청(CommRqData)
56줄~66줄 : GetCommData 함수를 이용하여 데이터를 수신받고, 출력(print)한다.
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 함수 등을 활용하여
데이터를 받아오는 방법에 익숙해지자.
'2. 해외선물 > 2-4. 해외선물 API (사용)' 카테고리의 다른 글
(키움증권 해외선물 OpenAPI-W) 패턴 만들기 (4) 패턴 개념 이해하기 (0) | 2023.01.17 |
---|---|
(키움증권 해외선물 OpenAPI-W) 패턴 만들기 (3) 패턴 만들기 필요성 (0) | 2023.01.16 |
(키움증권 해외선물 OpenAPI-W) 패턴 만들기 (2) 부동소수점 문제 회피하기 (0) | 2023.01.15 |
(키움증권 해외선물 OpenAPI-W) 패턴 만들기 (1) 해외선물 종목의 시가, 고가, 저가, 종가 받아오기 (0) | 2023.01.14 |
(키움증권 해외선물 OpenAPI-W) 로그인 설정하기 (5) 파이썬 코드 활용 (2) | 2023.01.07 |
(키움증권 해외선물 OpenAPI-W) 로그인 설정하기 (4) GetCommFunc 함수 (0) | 2023.01.06 |
(키움증권 해외선물 OpenAPI-W) 로그인 설정하기 (3) with ~ as 구문 (0) | 2023.01.05 |
(키움증권 해외선물 OpenAPI-W) 로그인 설정하기 (2) pyautogui 모듈 (16) | 2023.01.04 |