파이참에서 주피터노트북 열기

 

이전 글 보기

 

01_시작

02_기본설정

03_pykiwoom vs. 직접코딩

04_키움 open api 로그인 하기

05_키움 OPEN API에 TR 요청하기(feat. 예수금과 계좌잔고 받아오기)

06_키움 KOA 설치하기

07_키움 KOA 이해하기

08_키움 KOA 이해하기_2

09_키움 OPEN API 계좌평가 잔고 가져오기

10_키움 OPEN API 일봉데이터 가져오기_1

11_키움 OPEN API 일봉데이터 가져오기_2

 

 

사실 난 파이참이나 vs code와 같은 IDE 환경에 익숙하지 않다. 파이썬도 주피터노트북으로 학습을 했기 때문에 대화형 코딩에 익숙하다.

 

그간 파이참에서 코딩하면서 한줄 한줄 결과를 보고 싶었는데, 그 부분이 좀 답답했었다. IDE에 익숙해질 수 있는 시간이었다 생각한다.

 

파이참에서 주피터 노트북을 열어볼 생각을 해보다가 실행에 옮겨보았다. 너무 한방에 돼버려서 좀 허무했다. 이제 오류가 안 나면 허전하다.

 

 

 

파이참에서 주피터 노트북을 사용하려면, 주피터 노트북이 사전에 설치되어 있어야 한다.

나는 아나콘다로 파이썬을 설치했으니, 주피터 노트북이 이미 설치되어 있다.

 

 

 

파이참에서 주피터노트북 열기

 

 

파이참에서 새로운 프로젝트를 만들고, 폴더명을 정해준다.

키움 API 구동을 위해 실행 중인 32비트 가상환경에서 구동되고 있음을 확인한다(py37_32). 주가 예측을 위한 모델링은 64비트 환경에서 진행할 예정이다.

 

 

 

파이참에서 주피터노트북 열기

 

파이참 하단에 "Terminal"을 눌러준다. 터미널은 윈도우의 CMD 창과 같은 창이다. 주피터 노트북을 실행할 폴더로 이동한 뒤, jypyter notebook를 입력하고 엔터를 눌러준다.

 

 

 

파이참에서 주피터노트북 열기

 

실행 과정이 나타나고, 위 빨간 상자와 같이 주소가 출력되면 끝이다. 그리고 자동으로 브라우저(크롬 등)가 열릴 것이다. 브라우저가 자동으로 열리지 않으면 위 빨간 상자의 주소 2줄 중 한 줄을 복사한 후, 브라우저 주소에 입력하고 엔터를 누르면 다음과 같이 마음이 편안해지는 주피터 노트북이 열린다.

 

 

 

파이참에서 주피터노트북 열기

 

 

반갑다.

 

 

 

파이썬을 학습하며 남기는 블로그입니다.
질문, 지적, 조언은 항상 환영합니다.

 

 

 

2021.01.18. 코리.

 

키움 OPEN API 주식 자동화

 

 

이전 글 보러 가기

 

01_시작

02_기본설정

03_pykiwoom vs. 직접코딩

04_키움 open api 로그인 하기

05_키움 OPEN API에 TR 요청하기(feat. 예수금과 계좌잔고 받아오기)

06_키움 KOA 설치하기

07_키움 KOA 이해하기

08_키움 KOA 이해하기_2

09_키움 OPEN API 계좌평가 잔고 가져오기

10_키움 OPEN API 일봉데이터 가져오기_1

 

 

 

이전 글에서 일봉데이터를 가져오기 위한 배경에 대해 학습했다. 이제 코드에 대해 알아보자. 코드 작성을 위한 전반적인 도움은 지난 글에서 설명한 유튜브 "프로그램 동산" 채널을 도움을 받았다.

 

 

먼저 조회할 종목 리스트를 만들어보자. 앞서 살펴본 바와 같이 키움 KOA에서 종목정보 관련 함수인 "GetCodeListByMarket()"를 활용할 수 있다.

 

 

키움 KOA 종목 리스트 만들기(GetCodeListByMarket)

 

GetCodeListByMarket()는 시장 구분 값만 파라미터로 보내주면, 해당 시장의 종목코드를 세미콜론(';)으로 구분하여 보내준다.

 

 

"0 장내"는 거래소에 상장되어 있는 주식과 채권 등을 모두 의미한다. 코스피(KOSPI), 코스닥(KOSDAQ) 등을 모두 포함한다.

 

"10 코스닥"은 미국의 벤처기업으로 구성된 시장인 나스닥을 본떠 만든 시장으로 벤처기업과 유망 중소기업을 위한 시장이다.

 

3 ELW, 8 ETF, 50, KONEX, 4 뮤추얼펀드, 5, 신주인수권, 6, 리츠, 9 하이얼펀드, 30 K-OTC 는 아직 별 관심이 없어서 PASS. 

 

 

from PyQt5.QtTest import *  # 일봉조회 타이머 걸기

# 종목 목록 가져오기
def get_code_list_by_market(self, market_code):
    code_list = self.dynamicCall("GetCodeListByMarket(QString)", market_code)
    code_list = code_list.split(";")[:-1]
    return code_list

# 종목 분석 실행용 함수
def calculator_fnc(self):
    code_list = self.get_code_list_by_market("10") # 10: 코스탁
    print("코스닥 갯수 %s" % len(code_list))

    for idx, code in enumerate(code_list):
        self.dynamicCall("DisconnectRealData(QString)", "4000")  # 스크린 연결 끊기
        print("%s / %s : KOSDAQ Stock Code : %s is updating..." % (idx+1, len(code_list), code))
        self.day_kiwoom_db(code=code)
        
# 일봉 가져오기
def day_kiwoom_db(self, code=None, date=None, sPrevNext="0"):
    QTest.qWait(3600) # 3.6초 delay
    self.dynamicCall("SetInputValue(QString, QString)", "종목코드", code)
    self.dynamicCall("SetInputValue(QString, QString)", "수정주가구분", "1")

# date 빈값은 오늘. None이 아니면 날짜를 입력하도록
    if date != None:
        self.dynamicCall("SetInputValue(QString, QString)", "기준일자", date)
    self.dynamicCall("CommRqData(QString, QString, int, QString)", "주식일봉차트조회", "opt10081", sPrevNext, self.screen_calculation_stock) #TR 서버로 전송
        self.calculator_event_loop.exec_()

 

종목 목록을 가져오기 위한 함수를 "get_code_list_by_market"로 만들고, market_code를 GetCodeListByMarket() 함수로 넘겨준다. 앞서 살펴본 바와 같이 GetCodeListByMarket() 함수는 종목코드를 세미콜론(;)으로 구분하여 넘겨주므로, 세미콜론을 지우기 위해 ".split(";")"을 사용한다. 끝에 [:-1]을 해준 이유는 끝자리에 남아있는 세미콜론을 지워주기 위함이다.

 

"get_code_list_by_market" 함수는 code_list를 return 해 준다.

 

 

calculator_fnc 라는 함수를 만들어서 

1. 위에서 만든 "get_code_list_by_market" 함수에 market_code를 "10"으로 넘겨주고

2. code_list 개수를 프린트하고

3. code_list에서 하나씩 빼와서

4. DisconnectRealData로 스크린 연결을 끊어주고 (이건 안 해도 됨)

5. 진행 상황을 프린트하고

6. 가지고 있는 code_list 하나를 "day_kiwoom_db"로 보내준다.

 

 

"day_kiwoom_db"라는 함수를 만들어서

1. code는 위에서 만든 "calculator_fnc"에서 넘겨받고

2. date는 빈 값으로 두고(빈 값은 오늘을 의미함)

3. sPrevNext는 일단 0으로 설정 (0은 "이전" 버튼을 누르지 않는 것임)

4. Qtest.qwait(3600)으로 이번 조회 후 다음 조회하기까지 3.6초를 기다려 준다. 기다림 없이 조회하면 키움 서버 과부하 방지를 위해 오류를 반환한다.

5. CommRqData로 데이터를 요청한다.

6. calculator_event_loop를 실행해준다.

 

 

 

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


    if sRQName == "주식일봉차트조회":
        code = self.dynamicCall("GetCommData(QString, QString, int, QString)", sTrCode, sRQName, 0, "종목코드")
        code = code.strip()
        print("%s 일봉데이터 요청" % code)

        # 조회된 row 출력
        cnt = self.dynamicCall("GetRepeatCnt(QString, QString)", sTrCode, sRQName)
        print(cnt)

        # 조회 자료 리스트 만들기
        # GetCommDataEx 매소드 사용 검토
        # data = self.dynamicCall("GetCommDataEx(QString, QString)", sTrCode, sRQName)
        # [['', '현재가', ...., '저가', ''] .... ['', '현재가', ...., '저가', '']]
        # [['', '현재가', '거래량', '거래대금', '날짜', '시기', '고가', '저가', '']]
        for i in range(cnt):
            data = []
            current_price = self.dynamicCall("GetCommData(QString, QString, int, QString)", sTrCode, sRQName, i, "현재가") # 종가
            volume = self.dynamicCall("GetCommData(QString, QString, int, QString)", sTrCode, sRQName, i, "거래량")
            trading_value = self.dynamicCall("GetCommData(QString, QString, int, QString)", sTrCode, sRQName, i, "거래대금")
            date = self.dynamicCall("GetCommData(QString, QString, int, QString)", sTrCode, sRQName, i, "일자")
            staring_price = self.dynamicCall("GetCommData(QString, QString, int, QString)", sTrCode, sRQName, i, "시가")
            high_price = self.dynamicCall("GetCommData(QString, QString, int, QString)", sTrCode, sRQName, i, "고가")
            low_price = self.dynamicCall("GetCommData(QString, QString, int, QString)", sTrCode, sRQName, i, "저가")

			data.append("")
            data.append(current_price.strip())
            data.append(volume.strip())
            data.append(trading_value.strip())
            data.append(date.strip())
            data.append(staring_price.strip())
            data.append(high_price.strip())
            data.append(low_price.strip())
            data.append("")

			self.calcul_data.append(data.copy())

		print(len(self.calcul_data))
        
        
        # 일봉 600일 이상치 가져오기(페이지 넘기기)
        if sPrevNext == "2":
            self.day_kiwoom_db(code=code, sPrevNext=sPrevNext)
        else:
            print("총 일수 %s" % len(self.calcul_data))
            pass_success = False
        
            self.calculator_event_loop.exit()

 

 

trdata_slot 함수로 준비된 데이터를 활용해서 요청한다.

중간중간에 print를 활용해서 진행상황을 출력하도록 해야 오류 생성 시 디버깅이 가능하다.

 

일봉데이터를 요청하면 다음과 같은 리스트 형태로 반환된다.

[['', '현재가', '거래량', '거래대금', '날짜', '시기', '고가', '저가', '']]

 

반환된 값을 하나씩 data 리스트에 담아준다.

 

 

 

일봉을 조회하는 opt10081 TR은 한번 조회 시 600일치의 데이터를 보내준다. 600일 이전의 데이터를 가져오기 위해서는 sPrevNext를 "2"로 넘겨줘야 한다.

 

 

600일 이전의 데이터를 모두 받아왔으면, "calculator_event_loop"를 끊어준다.

 

 

 

파이썬을 학습하며 남기는 블로그입니다.
질문, 지적, 조언은 항상 환영합니다.

 

 

 

2021.01.18. 코리.

 

 

 

키움 OPEN API 일봉데이터 가져오기

 

 

이전 글 보러 가기

 

01_시작

02_기본설정

03_pykiwoom vs. 직접코딩

04_키움 open api 로그인 하기

05_키움 OPEN API에 TR 요청하기(feat. 예수금과 계좌잔고 받아오기)

06_키움 KOA 설치하기

07_키움 KOA 이해하기

08_키움 KOA 이해하기_2

09_키움 OPEN API 계좌평가 잔고 가져오기

 

 

 

이전까지 키움 OPEN API에 대한 기본적인 조회와 기능을 알아봤다면, 이제 데이터를 가져오는 방법이다. 그 시작으로 일봉데이터를 가져오는 방법을 학습한다.

 

 

영웅문 삼성전자 일봉 조회

 

 

영웅문에서 일봉차트를 조회하면 위와 같은 결과를 볼 수 있다. 보기에는 복잡해 보이는 저 차트를 그리는 데이터는 생각보다 간단한다.

 

종목의 시가, 종가, 저가, 고가, 거래량. 5가지 데이터만 있으면 캔들 차트를 그릴 수 있다.

 

 

일봉차트

 

 

시가, 종가, 고가, 저가 데이터로 일봉차트를 그릴 수 있고, 이동평균선(보라색, 파란색, 노란색 선)은 과거 20일, 60일, 120일 등의 평균 가격으로 그릴 수 있다. 

 

즉, 일봉데이터를 가져온다는 말은, 하루의 시가, 종가, 고가, 저가, 거래량 데이터를 가지고 온다는 말이다.

 

 

 

영웅문 일봉 조회, 600일

 

일봉차트를 조회하면 600일치만 가지고 온다. 위 차트에서 마지막 날짜가 2018년이다. 데이터 분석을 위해서는 더 많은 날짜의 데이터가 필요하다.

 

 

영웅문 일봉 조회, 9541일

 

과거 차트 조회 버튼을 계속 눌러주면 600일씩 늘어난다. 삼성전자의 경우, 9541일까지인 1985년까지 조회된다.

코드에서도 과거 자료가 있는 경우, 과거 차트 조회 버튼을 계속 눌러줘야 한다.

 

 

삼성전자 일봉 과거 데이터

 

과거 조회 버튼을 누를수록 화면에 전체 일봉 수(9541)가 늘어나는 것을 확인할 수 있다.

 

그러므로 "09_계좌평가 잔고 가져오기"에서 살펴본 "sPrevNext"를 이번에도 사용해야 한다. 

 

 

 

 

다음으로 조회할 종목의 리스트는 만들어야 한다. 시장 구분별로 장내, 코스닥, ELW, ETF, KONEX 등으로 구분할 수 있으며, 시장 구분에 대한 파라미터와 함께 데이터를 요청할 수 있다.

 

키움 OPEN API - KOA 종목 목록 가져오기 

 

키움 KOA에서 종목정보 관련 함수인 "GetCodeListByMarket()"를 제공한다. 시장 구분 값을 마라메터로 함께 제공하면 된다. 학습에서는 코스닥 구분 값이 10번을 사용한다.

 

 

 

키움 KOA 주식일봉차트조회

 

키움 KOA의 TR목록에서 opt10081번으로 주식 일봉 차트조회 요청을 할 수 있다. 위에서 살펴본 바와 같이, 한 번에 600개 데이터가 조회된다는 안내가 있다.

 

넘겨야 할 파라미터는 "종목코드, 기준일자, 수정주가구분" 3가지이다.

  - 종목코드는 위에서 살펴본 "GetCodeListByMarket()" 함수로 확보한다.

  - 날짜는 오늘을 기준으로 하려면 공란으로 둔다. 

  - 수정주가구분은 0과 1로 구분되는데, 1번이 수정주가구분이다. 삼성전자 주가가 2018년에 약 250만원이었는데, 이를 약 50:1로 액면분할하며 주가가 53,000원이 되었다. 수정주가구분을 0으로 주면 2018년 주가는 250만원, 현재 주가는 9만원으로 조회된다. 액면분할 등을 바로잡아 놓은 주가가 수정주가이다.

 

 

3가지 파라미터를 넘기면 받을 수 있는 데이터는 다음의 15개이다.

 

0. 종목코드

1. 현재가

2. 거래량

3. 거래대금

4. 일자

5. 시가

6. 고가

7. 저가

8. 수정주가구분

9. 수정비율

10. 대업종구분

11. 소업종구분

12. 종목정보

13. 수정주가이벤트

14. 전일종가

 

0~7번까지의 8개 데이터는 제공되는데, 8~14번까지의 7개 데이터는 조회/제공되지 않는다.

 

 

 

일봉데이터 조회 코드를 짜기 위한 기본 내용은 여기까지 이고, 코드는 다음 글에서 소개한다.

 

 

 

파이썬을 학습하며 남기는 블로그입니다.
질문, 지적, 조언은 항상 환영합니다.

 

 

2021.01.14. 코리.

 

 

 

키움 OPEN API 계좌평가 잔고내역 가져오기

 

 

이전 글 보기

 

01_시작

02_기본설정

03_pykiwoom vs. 직접코딩

04_키움 open api 로그인 하기

05_키움 OPEN API에 TR 요청하기(feat. 예수금과 계좌잔고 받아오기)

06_키움 KOA 설치하기

07_키움 KOA 이해하기

08_키움 KOA 이해하기_2

 

 

 

지난 05번 글에서, 키움 OPEN API에서 TR(transaction) 요청으로 예수금과 계좌잔고를 받아왔다.

 

오늘 계좌평가 잔고내역을 가지고 오고자 한다.

 

계좌평가 잔고내역은 다음 영웅문에서와 같이 내 계좌에 가지고 있는 종목들의 현황과 계좌잔고, 수익률 등의 정보를 담고 있는 화면이다. 영웅문에서는 화면번호 0391번이다.

 

 

키움 계좌평가 잔고내역

 

 

나의 모의 투가 계좌에는 총 22개 종목이 있다. 모의투자 금액으로 22개 종목을 담았는데 벌써 수익률이 5.34%로 48만원을 벌고 있다. 왜 모의투자만 버냐고....

 

 

 

계좌평가 잔고내역 조회를 하기 전에 몇가지 개념을 잡아야 한다. 계좌평가 잔고내역에서는 상당히 많은 정보가 있다.

 

1. 내 계좌 전체 평가액, 수익률, 추정자산, 매입, 손익

2. 내 계좌에 담겨있는 종목명

3. 내 계좌에 담겨있는 종목별 평가손익, 수익률, 매입가, 보유수량, 가능수량, 현재가

4. 화면 우측 상단에 있는 "다음" 버튼

 

 

1~3번은 직관적이라 설명은 생략하고, 4번에 대한 설명이 필요하다.

영웅문에서 계좌평가 잔고내역을 조회하면 종목 20개만 우선 조회된다. 보유 종목이 20개가 넘는다면, 창 우측 상단의 "다음" 버튼을 눌러 20개를 초과하는 종목 정보를 불러올 수 있다.

 

위 그림에서 봐도 "하이트진로 ~ SK이노베이션"이 20개이다. 총 수익률이 6.48%를 보이고 있다. 이 수익률은 나의 보유 종목 22개 중 우선 조회된 20개 종목에 대한 수익률이다.

 

이 상태에서 화면 우측 상단의 "다음" 버튼을 눌러주면 그 뒤에 숨어있던 "카카오게임, 빅히트" 종목이 드러난다. 그리곤 수익률이 5.34%로 감소한다. 이는 22개 종목에 대한 수익률이다.

 

이러한 방식이 키움 OPEN API에서도 동일하게 작동한다. "다음" 버튼을 눌러줄 필요가 있다는 것이다.

 

 

 

이제 키움 KOA에서 내용을 확인해 보자

 

키움 KOA - opw00018

 

키움 KOA에서 계좌평가잔고내역요청의 TR번호는 opw00018이다. 넘겨줘야하는 파라메터들에 대한 정보가 나타나 있다.

 

 

 

이번에는 키움 KOA에서 "GetRepeatCnt"에 대해 알아보자.

 

키움 KOA - GetRepeatCnt

 

GetRepeatCnt() 함수는 조회수신한 멀티데이터의 갯수(반복)수를 얻을수 있다. 예를들어 차트조회는 한번에 최대 900개 데이터를 수신할 수 있는데 이렇게 수신한 데이터갯수를 얻을때 사용한다. 이 함수는 반드시 OnReceiveTRData()이벤트가 호출될때 그 안에서 사용해야 한다.

 

지금은 계좌평가 잔고내역을 조회하고 있으며, 한번에 조회가능한 최대 데이터는 20개이다.

 

 

 

이제 코드를 알아보자.

코드 작성을 위한 전반적인 도움은 지난 글에서 설명한 유튜브 "프로그램 동산" 채널을 도움을 받았다.

 

 

class Kiwoom(QAxWidget):
    def __init__(self):
        super().__init__()

        self.account_num = "81547491111"
        self.account_pw = "********"
        self.account_stock_dict = {}
        self.detail_account_mystock()


    def detail_account_mystock(self, sPrevNext="0"):
        # 계좌평가 잔고내역 요청
        # sPrevNext="0" : 종목 페이지(목록) 넘기지 않기
        print("계좌평가 잔고내역 요청하기 연속조회 %s" % sPrevNext)
        self.dynamicCall("SetInputValue(QString, QString)", "계좌번호", self.account_num)
        self.dynamicCall("SetInputValue(QString, QString)", "비밀번호", self.account_pw)
        self.dynamicCall("SetInputValue(QString, QString)", "비밀번호입력매체구분", "00")
        self.dynamicCall("SetInputValue(QString, QString)", "조회구분", "2")
        self.dynamicCall("CommRqData(QString, QString, int, QString)", "계좌평가잔고내역요청", "opw00018", sPrevNext, self.screen_my_info)

        self.detail_account_info_event_loop.exec_()


	def trdata_slot(self, sScrNo, sRQName, sTrCode, sRecordName, sPrevNext):
        if sRQName == "계좌평가잔고내역요청":
            total_buy_money = self.dynamicCall("GetCommData(QString, QString, int, QString)", sTrCode, sRQName, 0, "총매입금액")
            print("총매입금액 %s" % int(total_buy_money))

            total_profit_loss_rate = self.dynamicCall("GetCommData(QString, QString, int, QString)", sTrCode, sRQName, 0, "총수익률(%)")
            print("총수익률(%s) : %s" % ("%", float(total_profit_loss_rate)))

            # 계좌평가잔고 개별 종목 Count 조회, 멀티데이터 가져오기
            rows = self.dynamicCall("GetRepeatCnt(QString, QString)", sTrCode, sRQName)
            cnt = 0
            for i in range(rows):
                code = self.dynamicCall("GetCommData(QString, QString, int, QString)", sTrCode, sRQName, i, "종목번호")
                code_nm = self.dynamicCall("GetCommData(QString, QString, int, QString)", sTrCode, sRQName, i, "종목명")
                stock_quantity = self.dynamicCall("GetCommData(QString, QString, int, QString)", sTrCode, sRQName, i, "보유수량")
                buy_price = self.dynamicCall("GetCommData(QString, QString, int, QString)", sTrCode, sRQName, i, "매입가")
                learn_rate = self.dynamicCall("GetCommData(QString, QString, int, QString)", sTrCode, sRQName, i, "수익률(%)")
                current_price = self.dynamicCall("GetCommData(QString, QString, int, QString)", sTrCode, sRQName, i, "현재가")
                total_chegual_price = self.dynamicCall("GetCommData(QString, QString, int, QString)", sTrCode, sRQName, i, "매입금액")
                possible_quantity = self.dynamicCall("GetCommData(QString, QString, int, QString)", sTrCode, sRQName, i, "매매가능수량")

                if code in self.account_stock_dict:
                    pass
                else:
                    self.account_stock_dict.update({code:{}})

                #code = code.strip()[1:] # 공백지우고 종목코드 앞 알파벳 제외한 값 만들기(A:장내주식, J:ELW종목, Q:ETN종목)
                code_nm = code_nm.strip() # 공백지우기
                stock_quantity = int(stock_quantity.strip())
                buy_price = int(buy_price.strip())
                learn_rate = float(learn_rate.strip())
                current_price = int(current_price.strip())
                total_chegual_price = int(total_chegual_price.strip())
                possible_quantity = int(possible_quantity.strip())

                # account_stock_dict에 담기
                self.account_stock_dict[code].update({"종목명": code_nm})
                self.account_stock_dict[code].update({"보유수량": stock_quantity})
                self.account_stock_dict[code].update({"매입가": buy_price})
                self.account_stock_dict[code].update({"수익률(%)": learn_rate})
                self.account_stock_dict[code].update({"현재가": current_price})
                self.account_stock_dict[code].update({"매입금액": total_chegual_price})
                self.account_stock_dict[code].update({"매매가능수량": possible_quantity})

                cnt += 1

            print("계좌에 있는 종목 %s" % cnt)
            print("계좌에 있는 종목 %s" % self.account_stock_dict)

            # 종목이 20개 초과라 다음 페이지 클릭이 필요한 경우
            # 종목이 20개 초과인 경우, sPrevNext가 2로 반환됨
            if sPrevNext == "2" :
                self.detail_account_mystock(sPrevNext="2")
            else:
                self.detail_account_info_event_loop.exit()

 

"def detail_account_mystock(self, sPrevNext="0"):"에서 목록이 몇개인지 모르므로, sPrevNext는 우선 0으로 지정한다. 0은 "다음" 버튼을 누르지 않는 것을 의미한다.

 

SetInputValue함수로 넘길 파라메터(아이디, 비번 등)를 넘겨준다. 그것들을 모아 CommRqData 함수로 데이터를 넘긴다.

 

 

"def trdata_slot(self, sScrNo, sRQName, sTrCode, sRecordName, sPrevNext):" TR보내는 슬롯을 만들어 작업한다.

 

"total_buy_money"와 "total_profit_loss_rate"는 내 계좌의 총정보를 의미한다. 가장 위의 영웅문 그림에서 "총수익률, 총손익" 등을 의미한다.

 

 

"rows = self.dynamicCall("GetRepeatCnt(QString, QString)", sTrCode, sRQName)"로 행 수를 rows 변수에 담아 둔다. 그 아래 for문에서 종목 하나씩 관련 정보를 요청한다. code가 account_stock_dict에 있으면 넘어가고, 없으면 딕셔너리를 업데이트(자료 추가하기)를 실행한다. 

 

"self.account_stock_dict.update({code:{}})"는 다음으로 대체하여 사용할 수 있다.

"self.account_stock_dict[code] = {}"

 

수신한 데이트 전처리를 해주고, 만들어 놓은 account_stock_dict에 자료를 업데이트 한다.

 

"cnt+= 1" cnt 변수를 1 증가시켜 준다.

 

 

종목이 20개를 초과하여 sPrevNextrk "2"로 반환되는 경우, "sPrevNext="2" 로 넘겨 "다음버튼"을 누를 수 있도록 해준다.

 

 

 

 

파이썬을 학습하며 남기는 블로그입니다.
질문, 지적, 조언은 항상 환영합니다.

 

 

2021.01.13. 코리.

 

 

 

 

경산 남천 얼음 썰매

 

 

경산 남천이 얼었다.

먼지가 쌓인 썰매를 꺼내서 남천을 찾았다.(2021.01.09. 토)

 

 

요 며칠 동안 영하 15도에 달하는 북극한파로 인해 남천이 잘 얼었다.

이미 많은 아이들이 나와서 신나게 놀고 있었다.

 

올해는 무려 3년전과는 다르게 썰매를 빌려주고 판매하는 아저씨는 보이지 않았다.(벌써 3년 전이라니...)

 

2018/01/15 - 남천에서 썰매타기

 

 

 

 

썰매 대신 다라이(대야)

 

 

 

썰매 대신 돗자리??

 

 

 

썰매 빌려주고 파는 아저씨가 없다 보니 썰매 대신 다라이(대야)와 돗자리가 등장했다.

다라이는 그렇다 하더라도, 돗자리는;;;

 

 

난 3년 전에 과일 상자로 썰매를 만들었다!!!

 

 

 

 

이런 즐거운 얼음 썰매 타기에 단점이 있다.

 

아이들은 썰매를 타고 있고, 아빠나 엄마가 썰매를 끌다 보니

놀이가 끝나면 아이들은 아직 쌩쌩하고, 썰매를 끈 아빠나 엄마는 힘들다.

 

집으로 돌아오면 아이들은 체력이 넘치고 어른은 쓰러진다;;

 

 

 

 

 

얼지 않은 남천

 

 

많은 사람들이 썰매를 타도 될 정도로 얼음이 얼었지만

가장자리 부분은 이렇게 얼지 않은 부분도 있다. 조심히 타야 한다.

 

 

2020.01.10. 코리.

 

 

키움 KOA 이해하기_2

 

이전 글 보기

01_시작

02_기본설정

03_pykiwoom vs. 직접코딩

04_키움 open api 로그인 하기

05_키움 OPEN API에 TR 요청하기(feat. 예수금과 계좌잔고 받아오기)

06_키움 KOA 설치하기

07_키움 KOA 이해하기

 

 

 

 

키움 KOA의 개요는 다음과 같다.

 

OpenAPI(Application Programing Interface)는 
국내주식상품과 코스피200 지수선물/옵션, 주식선물을 거래할 수 있는 거래/분석프로그램을 개발 할 수 있는 일종의 프로그램이며 COM형태로 제공합니다. 

주요기능은 시세데이터 조회와 실시간 데이터제공, 주문기능, 조건검색기능(주식만 가능)을 제공하며 모두 로그인 이후 가능합니다.

 

여기서 COM은 OCX를 의미한다. OCX는 "07. 키움 KOA 이해하기"에서 다루었다.

 

주요기능은 "시세데이터 조회, 실시간 데이터제공, 주문기능, 조건검색기능(주식만 가능)"이다. 이 정도면 내가 만들고자 하는 것을 하기엔 문제가 없어 보인다.

 

 

 

키움 API의 통신동작은 다음과 같다.

 

[통신동작] OpenAPI함수호출과 이벤트는 모두 비동식 방식으로 서버에 시세조회나 주문등을 함수호출로 요청하면 처리 결과를 전용 이벤트를 호출해서 전달합니다.

여기서 수신데이터를 가져오려면 반드시 이벤트 리턴전에 적절한 데이터 획득함수를 사용해서 얻어와야 합니다. 이벤트가 호출하기 전에 데이터 획득함수를 사용하거나 이벤트 리턴후에 호출하게 되면 혹은 임의로 이벤트를 호출하면 정상적인 데이터를 얻을수 없습니다.

지금까지 설명을 조회요청을 예를들어 정리하면 다음과 같습니다. 이외 OpenAPI기능도 관련 함수와 이벤트 차이가 있을뿐 전체 동작은 동일합니다.

기능요청(조회함수 CommRqData, CommKwRqData 호출) --->
이벤트 호출(OnReceiveTRData ) --->
데이터 획득 (GetCommData함수) 

 

요청은 반드시 전용 이벤트를 호출해서 전달한다. 수신한 데이터는 이벤트 리턴 전에 얻어와야 한다. 이벤트를 리턴하면 정상적인 데이터를 얻을 수 없게 된다.

 

CommRqData, CommKwRqData, OnReceiveTRData, GetCommData...

유튜브 프로그램 동산 채널을 보면서 공부한 코드의 의미를 하나씩 깨우쳤다.

 

 

[화면번호] 화면번호는 서버에 조회나 주문등 필요한 기능을 요청할때 이를 구별하기 위한 키값으로 이해하시면 됩니다. 0000(혹은 0)을 제외한 임의의 숫자를 사용하시면 되는데 갯수가 200개로 한정되어 있기 때문에 이 갯수를 넘지 않도록 관리하셔야 합니다. 만약 사용하는 화면번호가 200개를 넘는 경우 조회결과나 주문결과에 다른 데이터가 섞이거나 원하지 않는 결과를 나타날 수 있습니다. 

 

화면번호(스크린번호)는 "05_키움 OPEN API에 TR 요청하기(feat. 예수금과 계좌잔고 받아오기)"에서 살펴본 내용이다.

 

 

 

[이벤트] 시세조회나 조건검색요청등 관련함수 호출로 요청하면 서버에서 이를 처리해서 결과를 OpenAPI의 특정함수를 호출해서 알려주는데 이 함수를 이벤트라고 합니다.

조회를 예로 들면 SetInputValue(), CommRqData()함수로 조회를 하면 조회결과를 만들어서 OpenAPI로 전달하고 조회한 사용자의 OnReceiveTRData를 호출하게 됩니다.

이벤트는 일반함수와 구별하기 위해 이름앞에 On~에 있으며 OnEventConnect, OnReceiveTRData, OnReceiveRealData등이 있습니다. 로그인, 조회, 주문, 조건검색등 기능별로 함수와 이벤트가 분류되어 있으니 용도에 맞는 함수와 이벤트를 사용해야 합니다.

 

SetInputValue(), CommRqData(), OnReceiveTRData, OnEventConnect, OnReceiveTRData, OnReceiveRealData 등 코딩하면서 봤던 함수와 이벤트 이름들이 다 여기에 기인한 것들이다.

 

사용 목적과 이유를 모르고 코딩할 때는 궁금한 게 많았는데, 작동 원리를 확인하니 마음이 편해진다.

 

 

 

 

이런 내용들이 "KOA-개발가이드-키움OPenAPI"에 다 있었는데, 안본게 후회된다. 이제라도 봐서 다행이다. 그때 봤다면,,,, 지금처럼 무슨 말인지 이해를 했을까??

 

 

 

참고한 내용

- 키움 KOA

- 키움 OpenAPI+ 개발가이드

 

 

 

2021.01.09. 코리.

 

 

 

 

나이를 한 살씩 더 먹어가면서 철학에 관심이 생기던 찰나에 조금씩 관심이 가던 철학자가 생겼다. 바로, 서강대 명예교수 최진석이다. 

 

좌파 우파, 진보 보수 등 진영논리에 대한 인터뷰한 기사를 보고 요약과 내 생각을 정리해본다.

 

 

기사 바로가기

naver.me/FMAil8lt

 

“진영에 갇혀 쪼개진 대한민국, 우린 생각해야 산다”

“지금 진영 간의 분열과 대립, 갈등은 우리 역사상 가장 심해졌어요. 나라가 가장 심하게 분열돼 있다는 거죠. 진영에 갇히는 건 생각하는 능력이 없기 때문이에요. 진영에 갇히면 생각할 필요

n.news.naver.com

 

 

“지금 진영 간의 분열과 대립, 갈등은 우리 역사상 가장 심해졌어요. 나라가 가장 심하게 분열돼 있다는 거죠. 진영에 갇히는 건 생각하는 능력이 없기 때문이에요. 진영에 갇히면 생각할 필요가 없어요. 진영에서 이미 만들어진 논리와 이념을 그대로 재생산하면 되거든요. 모두에게 물어보고 싶어요. 당신은 당신의 삶을 사느냐, 진영의 삶을 사느냐, 당신 자신은 어디 있는가.”

 

나는 지금 어디에 있는가....

내 생각은 어디에 있는가.....

 

답변하기 쉽지 않은 질문이다.

 

 

교수신문은 2020년 사자성어를 "아시타비(我是他非·나는 옳고 남은 틀렸다)"를 선정했다. 내로남불을 한자 사자성어로 만든 신조어다. 교수신문이 전국 대학교수 906명을 대상으로 진행한 설문조사에서 아시타비(我是他非)가 32.4%로 1위를, 후안무치’(厚颜無耻)가 21.6%로 2위를 차지했다. [1]

 

 

 

코로나 이후의 시대정신은 선도국가로 도약하는 것에 방향을 맞춰야 합니다. 과거에 가장 강력한 팬데믹이었던 페스트를 계기로 중세가 극복되고 르네상스가 시작됐잖아요.

 

 

우리나라는 한계에 갇힌 지 이미 오래됐어요. 한계에 갇혔다는 말은 익숙한 방식으로 가능한 가장 높은 곳에 이미 도달했다는 뜻도 되죠. 박근혜 대통령을 부정하면서 문재인 대통령이 등장했는데 박 대통령 때 있었던 많은 문제가 똑같은 형태로 다시 등장했어요. 우리는 수평적 왕복 운동만 하고 있어요. 수평적 왕복 운동을 멈추고 수직적 상승을 해야 합니다. 수직적 상승의 한 형태가 중진국을 벗어나서 선도국가로 도약하는 겁니다. 중진국까지는 생각하는 능력이나 창의성이 크게 요구되지 않아요. 생각의 결과, 탐험의 결과, 창의의 결과를 따라가기만 하면 되거든요. 선도국가는 자기가 스스로 생각을 해야 하죠. 창의성을 발휘해야 합니다. 쉽지 않은 변화예요.

 

"수평적 왕복운동"만 하고 있다는 점에 적극동의한다. 

요즘 즐겨보는 축구에도 상대방의 체력을 소진시키고 빈 공간을 만들어내기 위해서는 수평적 움직임이 아닌 수직적 움직임이 필요하다고 강조한다. 

 

 

역사에서 1820년대를 대분기(大分岐), Great Divergence 라고 합니다. 이때 만들어진 선진국과 후진국의 차이가 지금까지 쭉 이어지고 있어요. 당시의 선진국이 후진국으로 떨어진 예가 없고, 후진국이 선진국으로 올라선 예도 거의 없어요. 따라가는 삶을 사느냐 생각하는 삶을 사느냐 이 큰 차이 때문에 간격이 좁혀지지 않죠. 그런데 이 간격을 확 좁힌 나라가 있어요. 산업화와 민주화를 모두 이룬 대한민국이거든요. 세계에서 유일해요.

그런데 간격을 좁힌 것이지 아직 선진국으로 올라서지 못했어요. 양적으로 보면 선도국가라고 할 정도가 됐지만, 사유의 방식이 선도국가형으로 바뀌지 않았거든요. 그런데 우리나라에 기회가 왔어요. 과거의 패러다임이 깨지고 4차 산업혁명이라는 새로운 패러다임으로 바뀌는 이때에 마침 또 우리 국력이 제일 강해요. 선도국가로 올라서겠다는 의욕을 가진다면 지금이 기회죠. 지금밖에 없어요.

지금 이 기회를 잡지 않으면 앞으로 몇백년 동안은 기회가 없어요. 어떤 특정한 패러다임에서 상하가 결정되면 뒤집기가 쉽지 않거든요. 그러니까 저는 안타까운 게 민주화를 성공시키고 난 이후 너무 긴 시간 동안 민주화 다음으로 건너가지 못했다는 거예요. 이제는 건너가 볼 수 있는 때인데 어떻게 도약할 수 있는가를 궁리하지 않고 계속 극단적인 분열 속에서 국력을 낭비하고 있어요.

 

 

1820년 대분기 때 만들어진 선진국과 후진국의 차이가 지금까지 쭉 이어지고 있다는 것을 처음 알게 되었다. 1820년이면 우리나라는 조선시대 순조 20년이다. 순조 20년 전후로는 이런 일들이 있었다. [2]

 

1800년   7월 순조 조선 제 23대 임금으로 등극
1801년   공노비 해방
1801년   천주교 금지령
1802년   김조순의 여식 순원왕후 간택
1811년   홍경래의 난
1827년   효명세자 (익종) 대리청정
1834년   11월 헌종 조선 제 24대 임금 등극
1836년   남응용의 모반사건
1844년   민진용의 옥
1845년   영국 군함 불법 측량 후 퇴거
1846년   프랑스 세실제독 함대가 국서 전달
1849년   6월 철종 조선 제25대 임금으로 등극
1860년   동학 탄생
1862년   진주 민란
1863년 12월 고종 조선 제 26대 임금 등극

 

 

 

저는 김대중 대통령 이후로 국가 리더십이 반쪽의 역사 리더십, 진영의 리더십에 갇혀 있다고 생각해요. 

그런데 우리는 과거가 한 점 오점 없이 완벽하게 해결되어야 한다고 생각해요. 하지만 그것이 모든 사람을 과거에 묶어 놓고 말거든요. 과거의 문제를 과거의 시각으로 해결할 수 있다고 믿는 게 큰 오류예요. 과거는 미래로 해결하는 거예요. 미래를 어떻게 건설하느냐가 과거를 어떻게 해결하느냐와 같은 말이거든요. 역사에서는 적폐를 청산하다가 새로운 적폐가 돼버리는 경우가 많아요. 반동적 현상이죠. 과거 문제를 미래의 시선으로 해결하지 않으면 자기 스스로 적폐가 되는 모순을 범할 수 있죠.

 

과거의 문제는 미래의 시선으로 해결해야 한다. 

 

 

혁명은 명(命)이 바뀌는 거예요. 어젠다, 구조가 바뀌는 거예요. 저는 촛불혁명은 실패했다고 말했는데, 이유는 이런 거예요. 정권이 언론을 장악하는 게 적폐였어요. 그러면 언론장악이 사라져야 해요. 그래야 혁명이거든요. 정권의 검찰 장악이 적폐였어요. 그러면 검찰 장악이 사라져야 하거든요. 그래야 혁명이죠. 혁명의 대상들이 과거에 했던 일이 혁명 후에 안 일어나는 게 혁명이죠. 그런데 그런 일들이 그대로 다시 나타나고 있습니다. 또 무슨 일만 생기면 법을 만들어 제어하려고 해요. 

5·18 역사왜곡처벌법처럼요. 법을 남용하거나 임의로 적용하면서 법치를 흔들고, 법에 의한 통치가 아니라 법을 이용한 통치로 전락하고, 그러면서 표현의 자유가 침해되고 민주와 자유가 오히려 후퇴했어요. 그래서 우리는 지금 역사 퇴행을 겪고 있습니다.

저는 정치에 포획된 5·18을 정치로부터 해방시키고 싶은 거예요. 그래야 5‧18이 살거든요. 그런데 5‧18을 법에 가두는 일을 비판하면서 그분들의 아픔 그대로를 담을 수 없었던 거죠. 그래서 죄송하다고 한 거예요.

 

혁명은 명(命)이 바뀌는 것이다.... 혁명이라는 단어를 함부로 사용하면 안되겠다는 생각이 든다. 혁명을 한다는 것은 과거의 문제가 다시 나타나서는 안되는 것이다. 그리고 법으로 뭐든 통제하고 제어하려 하는 것은 나도 바람직하지 않다고 생각한다.

 

 

국가는 국방과 조세라는 두 기둥으로 서 있고, 정치와 교육이라는 두 톱니바퀴가 작동해서 움직입니다. 그래서 교육을 통해서 정치 역량이 형성되고, 정치는 교육에 굉장히 강력한 환경을 제공합니다.

분열과 갈등이 심하면 이것을 해결할 수 있는 환경을 정치에서 제공해야 해요. 그런데 지금 우리나라의 정치는 오히려 분열을 이용하고 있어요. 정치 환경이 변화되지 않고는 정치인들이 분열을 통해 얻는 기능적인 효과를 버리려고 하지 않을 거예요. 멀리 보면 공멸의 길이지만, 언뜻 보면 자기 진영을 더 공고히 하거나 단기적인 승리를 거두는 효과가 있는 것처럼 보이거든요. 정치공작만 남고 정치는 망가지는 것이죠.

우리나라는 한 나라 두 국민이 된 지 오래예요. 해방 때부터 진영들의 싸움이 있었죠. 김구와 이승만의 싸움이 아직도 안 끝난 것 아니에요? 지금은 대통령 비서실장이 반대세력을 향해 살인자라고 할 정도로 진영 간의 대립이 극단화됐어요. 적대감이 증오의 단계까지 갔고, 권력은 한쪽 진영에 갇혀 오히려 이 분열을 조장하고 이용하면서 행사되고 있다고 말할 수 있어요. 결국은 생각하는 능력, 반성 능력, 각성 능력이 훈련되지 않아서입니다.

교육이 사실은 고도의 정치 행위이기도 해요. 왜냐하면, 정치도 인재가 하는 거예요. 미래도 인재가 여는 거예요. 정치와 교육은 국가를 작동시키는 두 톱니바퀴여서 굉장히 가깝게 있어요. 지금 정치가 진영에 갇혀있는 건 교육에서 생각하는 인재를 공급하지 않았기 때문이에요. 그러니까 정치의 실패는 교육의 실패, 정치가 혼란스럽다는 건 교육이 혼란스럽다는 말을 반드시 함축하죠.

 

국가의 기둥과 톱니바퀴에 대해 생각해본다.

정치의 역할에 대해서도 곱씹어본다.

 

생각해보니 1945년 해방이후 우리나라는 계속 진영의 싸움이 지배하고 있다는 생각이 든다. 아니... 고려시대 무신정변, 조선시대 붕당정치(동인, 서인) 등 아주 오래전부터 지속된 싸움이다. 이 싸움이 멈췄던 적은, 강력한 왕권(태종 등)으로 통치를 하거나 전쟁 중이라고 생각한다. 

 

교육기관이 생각하는 인재를 공급하지 않는 것일까... 생각하는 사람이 공급되기를 바라지 않는 것일까...?

 

 

진영 싸움에서 벗어날 방법은, 생각하는 능력을 빨리 회복해야 해요. 생각이라는 것은 궁금증과 호기심을 기반으로 하거든요. 궁금증과 호기심은 항상 밖을 향해 열려 있어요. 그렇기 때문에 생각하는 사람은 개방적이에요. 생각하지 않는 사람은 폐쇄적이죠. 그런데 우리는 지금 폐쇄화가 극단화돼 있어요.

생각하는 능력이 있어야 나는 누구인지, 나는 무엇을 원하는지, 나는 어떤 사람이 되고 싶은지, 나는 어떻게 살다 가고 싶은지를 묻게 됩니다.

 

궁금증과 호기심. 개방적인 사고.

 

 

왕정에서 생각은 왕만 했어요. 다른 사람들은 왕의 생각을 집행만 하면 돼요.

민주정이라는 것은 생각을 구성원들이 한다는 거거든요. 유권자가 자신의 생각을 국회의원들한테 대행시키는 거예요. 구성원들이 생각하는 능력을 갖지 않으면 민주주의는 불가능해요. 지금 우리의 민주주의가 왜 후퇴하느냐, 사람들이 리더의 생각을 수행하려고 하지 자기 생각을 리더한테 대행시키려 하지 않거든요.

조지 오웰의 ‘동물농장’에도 나와요. 독재자 ‘나폴레옹은 언제나 옳다’고 하면서 나머지 구성원들은 생각을 포기하죠. 나폴레옹만 생각하고, 나머지는 이 생각을 수행만 합니다. 왕정 독재와 다를 바가 없게 됩니다. 생각을 포기하면, 바로 노예로 전락합니다.

 

민주는 구성원이 생각하고 그 생각을 선출자들에게 대행을 시키는 것이다. 구성원들이 생각하지 않고 리더의 생각을 따르기만 하면, 민주주의가 아니다. 생각을 포기하면, 노예로 전락한다.

 

 

저는 다른 사람이 좋아하는 제가 되고 싶은 마음은 하나도 없어요. 나는 내가 좋아하는 내가 되고 싶어요. 그래서 지금 내가 하는 일은 내가 좋아하는 내가 사는 방식이에요. 짧은 인생을 누구 좋으라고 살아요? 나 좋으라고 사는 거지.

저는 철학자로 살거나 철학자로 인정받고 싶은 마음도 없어요. 나는 나로 살다가 나한테 인정받으면 충분해요. 저는 그저 나를 향해서 걸을 뿐이에요.

 

내가 좋아하는 내가 되고, 나를 향해 걷는 내가 되려면, 제일 위에서 던진 질문에 대답을 해야 한다.

 

나는 지금 어디에 있는가....

내 생각은 어디에 있는가.....

 

 

 

애정 어린 비판이라고 감성적으로 표현하고 싶지는 않아요. 비판은 그냥 비판인 거죠. 저는 비판 대상들에게 애정은 없고, 대한민국에만 애정이 있어요.

우리가 해결해야 할 문제 중 하나는 편 가르기예요. 우리는 알게 모르게 진보니 보수니 하는 프레임에 가두는 일을 해요. 그러면 언어들이 발화되는 순간 정치화돼버려요. 그러면 어떤 치료 효과도 나지 않죠. 프레임을 공유하는 진영의 문제로 작아진 후 휘발돼버리죠.

말을 해야 할 때 아무 말도 안 했다는 것보다 했다는 기록 하나라도 남긴다는 게 내가 나를 스스로 증명하는 한 방식이거든요. 나한테 떳떳하고 싶으니까.

 

과연 나의 비판 대상 누구이며, 나의 애정은 어디에 있는지 생각해 볼 문제이다. 감정이 태도를 지배해서는 안된다.

 

 

새 시대 리더십은 기품과 생각하는 능력이 있어야 해요.

기품이라는 것은 절제할 수 있다는 겁니다. 절제할 수 있다는 것은 염치와 수치심을 안다는 거예요. 염치를 알고 수치심을 가지면 최소한 거짓말은 하지 않습니다.

우리 정치권에서는 거짓말이 너무 일상화됐어요. 염치를 알면 권력도 남용하지 않죠. 진영에서 벗어나 국가 레벨의 미래 어젠다를 설정하는 건 생각하는 능력을 갖고 있는 사람에게만 가능합니다.

 

기품과 생각하는 능력.

절제하고 염치와 수치심을 안다는 것.

거짓말을 하지 않는 것.

 

 

내가 리더는 아니지만, 나도 가져봐야겠다.

 

 

 

도움이 된 소중한 글들

[1] www.kyosu.net/news/articleView.html?idxno=59131

[2] ko.wikipedia.org/wiki/%EC%A1%B0%EC%84%A0_%EC%8B%9C%EB%8C%80_%EC%97%B0%ED%91%9C

 

 

 

많은 생각을 하게되는 글이다.

 

2021.01.07. 코리.

 

 

폭스바겐 제타 예열플러그 교체(엔진경고등, 돼지꼬리 경고등)

 

 

2015년 7월부터 폭스바겐 제타 차량을 타고 있다.

지난 12월 말에 폭스바겐 공식 서비스센터에 들러 배터리도 AMG 새 걸로 바꿔주고, 엔진오일은 사제로 교체해주었는데, 갑자기 엔진경고등이 점등되었다.

 

 

엔진경고등과 돼지꼬리등이 점등되어 있다. (출처 : [1])

 

 

엔진경고등이 점등되고 3~4일 정도 운행했는데, 출력이 떨어지거나 운행에 불편한 일이 일어나지는 않았다. 배터리랑 엔진오일을 새 걸로 갈아줬더니 흥분했나... 싶어서 며칠 둬봤는데, 점검을 받아봐야겠다는 마음을 먹었다.

 

 

폭스바겐 공식 서비스센터를 방문해보니, 진단 결과 "예열플러그"에 문제가 있다고 했다. 예열플러그는 디젤자동차에만 있으며, 엔진 점화 성능을 향상시켜주는 기능을 한다.

엔진 실린더의 온도가 낮을 경우, 압축이 되더라도 폭발이 발생하지 않을 수 있기 때문에 시동이 잘걸리도록 실린더 온도를 데워주는 역할을 한다. [2]

 

고장 발생 시 당장 차량을 운행하는데는 문제가 없지만, 고장이 지속되면 추운 날씨에 시동이 잘 걸리지 않을 수 있으며, 그로 인해 배터리의 수명이 단축될 수 있다. 엔진 실린더 당 1개씩 들어가 있으므로 몇 개나 고장 났는지도 중요하다.

 

 

디젤 자동차의 엔진 점화 성능을 향상 시켜주는 플러그로 배터리는 정상인데 시동이 걸리지 않거나 시동 시 매연이 많이 나온다면 점검이 필요합니다. 4개 혹은 6개의 플러그 중 1개라도 이상이 있다면 전체 예열이 되지 않으므로 세심한 관리가 필요합니다.  [네이버지식백과 : 예열플러그 쇼핑용어사전]

열 저항선으로 가솔린 엔진의 점화 플러그와 비슷한 모양을 갖추고 있다. 이것은 이 예열 플러그에 전류가 흐를 때 다른 도움이 없어도 자체 점화 온도에 도달할 때까지 압축 공기를 예열시키는 것이 목적이다. 
[네이버지식백과 : 예열 플러그 [glow plug] (자동차 용어사전, 2012. 5. 25., 자동차용어사전편찬회)]

 

 

센터의 어드바이저에게서 나의 차량에는 총 4개의 예열플러그가 있는데, 1, 2, 4번은 동일한 제품이고, 3번은 다른 기능까지 포함된(비싼) 플러그라는 설명을 들었다.

 

현재 2번 예열플러그가 고장 났는데, 다음의 옵션이 있다고 알려주었다.

A. 미수리 : 당장 운행에 문제 되지 않고 예열플러그 4개 중 3개가 작동하니 나중에 교환

B. 고장 난 2번만 교환 : 고장 난 2번만 교환하고, 나머지는 고장나면 교환

C. 1, 2, 4번 교환 : 예열플러그는 소모품이므로 고장난 2번과 동일한 제품 일괄 교환

D. 1, 2, 3, 4번 일괄 교환

 

고장난 2번만 교환하는 데는 약 9만원의 비용이 들고, 1, 2, 4번을 교환하는데는 20만원 정도의 비용이 든다.

3번은 단독으로 20만원 정도 소요된다 하였다.

 

폭스바겐 디젤 데이트의 여파로 받은 바우처가 아직 남아 있어서 1, 2, 4번 교환을 요청했다. 시간은 40분 정도 소요되었다.

 

 

폭스바겐 서비스센터 예열플러그 교체 & 동계 점검 서비스 내역

 

 

폭스바겐 서비스센터 예열플러그 교체 소요비용

 

예열플러그 3개 x 각 55,330원  = 165,990원(부가세포함)

공임 40분에 36,608원 (부가세포함)

총 202,598원

 

 

초록창에 검색해보니 보쉬 예열플러그 개당 2만원 정도 하던데.... 센터는 개당 55,330원이라니.....

 

검색하다 보니 예열플러그 DIY도 하던데, "배터리 교환하는 거보다 조금 더 어렵다"는 수준이라고 했다. [3]

난 이 정도 수준의 DIY는 자동차에 대한 기초 지식이 있더나 경험이 있어야 하지 않을까 생각한다. 

 

DIY 참고 : playweb.tistory.com/entry/TDI-%EC%98%88%EC%97%B4-%ED%94%8C%EB%9F%AC%EA%B7%B8-%EA%B5%90%ED%99%98%EB%94%94%EC%A0%A4

 

DIY 참고 : blog.naver.com/detailmania/222133239716

 

 

 

이제 경고등 뜨지 말자!

 

 

 

도움받은 감사한 글들

[1] blog.naver.com/emspro/221509096041

[2] blog.naver.com/detailmania/222133239716

[3] playweb.tistory.com/entry/TDI-%EC%98%88%EC%97%B4-%ED%94%8C%EB%9F%AC%EA%B7%B8-%EA%B5%90%ED%99%98%EB%94%94%EC%A0%A4

 

 

 

2021.01.07. 코리.

 

 

 

키움 KOA Studio 이해하기

 

 

이전 글 보기

 

01_시작

02_기본설정

03_pykiwoom vs. 직접코딩

04_키움 open api 로그인 하기

05_키움 OPEN API에 TR 요청하기(feat. 예수금과 계좌잔고 받아오기)

06_키움 KOA 설치하기

 

 

 

코드만 주구장창 치다 보니 뭔가 정리가 되지 않는 기분이 들었다. OPEN API 설명서 격인 키움 KOA에 대해 이해하는 시간이 필요했다.

 

대부분의 내용은 키움 홈페이지 OPEN API에 등재된 개발가이드와 KOA 설명 페이지에서 확인할 수 있다.

 

우선 키움 OPEN API는 프로그램 확장성을 고려하여 OCX 컨트롤러로 제작을 지원한다. OCX는 OLE Control Extensions을 의미하며, OLE는 Object Linking and Embedding(객체 연결 삽입)를 의미한다.

 

무슨 말인지 모르겠다. 네이버 지식백과는 OCX를 다음과 같이 정의한다.

OLE(object linking and embedding)에 의해 작성된 사용자 정의 컨트롤 기능으로 프로그램 확장자를 OCX에 대응한 애플리케이션에서 호출할 수 있다. OLE의 명칭이 ActiveX로 변경되면서 ActiveX 컨트롤이 정식 명칭이 되었다. 사용자 정의 컨트롤은 제3자 벤더와 사용자가 독자적으로 만든 윈도용 프로그램 부품의 총칭이다. 스크롤 바와 같은 단순한 것에서부터 스프레드시트와 철자 검사 프로그램, 웹 서버의 브라우저 등의 복잡한 기능을 갖춘 것까지 그 범위가 다양하다.
[네이버 지식백과] OCX (컴퓨터인터넷IT용어대사전, 2011. 1. 20., 전산용어사전편찬위원회)

 

 

 

키움 KOA

 

키움 KOA는 위와 같은 화면을 구성하고 있다.

 

1번 작업창은 다음의 기능을 수행한다.

   - 영웅문 HTS의 화면에 해당되는 서비스

   - 전체 TR 서비스 목록

   - TR의 IO

   - 실시간 타입과 FID

 

2번 정보창은 다음의 기능을 수행한다.

   - 선택된 TR에 대한 정보

   - TR의 input값 설명

   - 코딩 샘플(C++)

   - 실시간 필드 정보

 

3번 입력창은 다음의 기능을 수행한다.

   - 선택된 TR에 대한 input값 입력

   - input값 설명

 

4. 결과창은 다음의 기능을 수행한다.

   - TR 요청에 대한 결과

   - 실시간 수신 데이터

   - 조회 TR 히스토리

 

그리고 화면 하단에 "실시간 목록", "TR목록", "종목정보", "개발가이드", "화면목록"의 탭이 있다.

 

 

 

키움 KOA

 

함수를 선택하고자 할 때 함수 앞에 LONG, void, BSTR과 같은 구분자가 있다. 이들의 의미는 다음과 같다.

 

LONG : C 등의 언어에서 64비트 숫자를 데이터 타입을 말한다. 2**63개의 숫자를 표현할 수 있다.  [1]

void : C 등의 언어에서 호출자에게 결과값을 제공하지 않는 함수의 결과를 위한 타입이다. [2]

BSTR : Basic string or binary string을 의미하며, 문자열을 타입이다. [3]

 

즉, LONG는 숫자, BSTR은 문자 타입을 의미하며, void는 반환하는 값이 없다는 구분이다.

C언어 능숙자에겐 별거 아니겠지만, 나에겐 오랜 검색이 필요했다.

 

 

OPEN API 제어 및 편집을 위한 인터페이스 매소드는 다음과 같다. [4]

ID 타입 이름 설명
1 LONG CommConnect 로그인 윈도우를 실행한다
2 void CommTerminate  이상 지원하지 않는 함수
3 LONG CommRqData 통신 데이터를 송신한다
4 BSTR GetLoginInfo 로그인 정보를 반환한다
5 LONG SendOrder 주식주문 Tran 을 송신한다
6 LONG SendOrderCredit 주식 신용주문 Tran 을 송신한다
7 void SetInputValue  
8 LONG SetOutputFID  
9 BSTR CommGetData 이 함수대신 용도에 맞는 전용 함수를 사용할 것
  -조회 정보 요청 GetCommData()
  -실시간정보 요청 GetCommRealData()
  -체결정보 요청 GetChejanData()
10 void DisconnectRealData 리얼 시세를 끊는다
11 LONG GetRepeatCnt 수신 받은 데이터의 반복 개수를 반환한다
12 LONG CommKwRqData 관심종목을 조회 한다
13 BSTR GetAPIModulePath OpenApi 모듈이 설치되어 있는 디렉토리를 반환한다
14 BSTR GetCodeListByMarket 장구분별 종목코드 리스트를 반환한다
15 LONG GetConnectState 통신 접속 상태를 반환한다
16 BSTR GetMasterCodeName 종목코드의 종목명을 반환한다
17 LONG GetMasterListedStockCnt 종목코드의 상장주식수를 반환한다
18 BSTR GetMasterConstruction 종목코드의 감리구분을 반환한다
19 BSTR GetMasterListedStockDate 종목코드의 상장일을 반환한다
20 BSTR GetMasterLastPrice 종목코드의 전일가를 반환한다
21 BSTR GetMasterStockState 종목코드의 종목상태를 반환한다
22 LONG GetDataCount 레코드의 반복개수를 반환한다
23 BSTR GetOutputValue 수신 데이터를 반환한다
24 BSTR GetCommData 수신 데이터를 반환한다
25 BSTR GetCommRealData 실시간 데이터를 반환한다
26 BSTR GetChejanData 체결잔고 데이터를 반환한다
27 BSTR GetThemeGroupList 테마코드와 그룹의 리스트를 반환한다
28 BSTR GetThemeGroupCode 테마코드에 해당하는 종목코드를 반환한다
29 BSTR GetFutureList 지수선물 코드 리스트를 반환한다
30 BSTR GetFutureCodeByIndex 지수선물 코드를 반환한다
31 BSTR GetActPriceList 지수옵션 행사가 리스 트를 반환한다
32 BSTR GetMonthList 지수옵션 월물 리스트를 반환한다
33 BSTR GetOptionCode 지수옵션 종목코드를 반환한다
34 BSTR GetOptionCodeByMonth 같은 행사가 다른 월물의 종목코드를 반환한다
35 BSTR GetOptionCodeByActPrice 같은 월물 다른 행사가의 종목코드를 반환한다
36 BSTR GetSFutureList 주식선물 코드 리스트를 반환한다
37 BSTR GetSFutureCodeByIndex 주식선물 코드를 반환한다
38 BSTR GetSActPriceList 주식옵션 행사가를 반환한다
39 BSTR GetSMonthList 주식옵션 월물을 반환한다
40 BSTR GetSOptionCode 주식옵션 코드를 반환한다
41 BSTR GetSOptionCodeByMonth 주식옵션 월물만 변경된 코드를 반환한다
42 BSTR GetSOptionCodeByActPrice 주식옵션 행사가만 변 경된 코드를 반환한다
43 BSTR GetSFOBasisAssetList 주식선옵 기초자산코드와 이름을 반환한다
44 BSTR GetOptionATM 지수옵션 ATM 을 반환한다
45 BSTR GetSOptionATM 주식옵션 ATM 을 반환한다
46 BSTR GetBranchCodeName 회원사 코드와 이름을 반환한다
47 BSTR CommInvestRqData 지원하지 않는 함수
48 LONG SetInfoData 아이디별 자동로그 인이 접속이 필요할 때 사용한다
49 LONG SetRealReg 실시간 등록을 한다
50 void SetRealRemove 종목별 실시간 해제 (SetRealReg로 등록한 종목만 해제 가능)
51 LONG GetConditionLoad 서버에 저장된 사용자 조건식을 가져온다
52 BSTR GetConditionNameList 조건검색에 필요한 조건명 리스트를 받아온다
53 void SendCondition 조건검색 조회 TR 을 송신한다
54 void SendConditionStop 실시간 조건검색을 중지한다
55 Variant GetCommDataEx 차트 조회한 데이터 전부를 배열로 받아온다

 

 

OPEN API 컨트롤 이벤트를 목록은 다음과 같다. 이벤트 목록은 이름이 "On"으로 시작한다. [4]

 

ID 타입 이름 설명
1 void OnReceiveTrData Tran 수신시 이벤트
2 void OnReceiveRealData 실시간 시세 이벤트
3 void OnReceiveMsg 수신 메시지 이벤트
4 void OnReceiveChejanData 주문 접수 확인 수신시 이벤트
5 void OnEventConnect 통신 연결 상태 변경시 이벤트
6 void OnReceiveRealCondition 조건검색 실시간 편입 이탈종목 이벤트
7 void OnReceiveTrCondition 조건검색 조회응답 이벤트
8 void OnReceiveConditionVer 로컬에 사용자조건식 저장 성공여부 응답 이벤트

 

 

 

인터페이스 메소드와 이벤트 목록은 자주 보면서 눈에 익어야 코딩이 원활하겠다.

지금까지 별생각 없이 입력을 했는데, KOA에 대해 공부를 조금 하니 왜 그렇게 코딩을 해야 하는지, 하드 조각모음 하듯 조금씩 이해되고 있다. 

 

 

 

도움받은 고마운 글들

[1] techterms.com/definition/long

[2] ko.wikipedia.org/wiki/Void_%ED%83%80%EC%9E%85

[3] docs.microsoft.com/en-us/previous-versions/windows/desktop/automat/bstr

[4] 키움 OPEN API+ 개발 가이드(첨부 참고)

kiwoom_openapi_plus_devguide_ver_1.5.pdf
2.16MB

 

 

 

2021.01.06. 코리.

 

 

파이썬을 학습하며 남기는 블로그입니다.
질문, 지적, 조언은 항상 환영합니다.

 

 

 

키움 KOA 설치하기

 

 

이전글 보기

01_시작

02_기본설정

03_pykiwoom vs. 직접코딩

04_키움 open api 로그인 하기

05_키움 OPEN API에 TR 요청하기(feat. 예수금과 계좌잔고 받아오기)

 

 

지난 5번째 글을 작성하다가 깨우친게 있었다. KOA를 자주 사용해야 하는데 설치 방법에 대해 언급하지 않았다.

사실.... 설치랄 것도 없는데;;; 그래도 기본 설정을 위해 알아야 한다.

 

 

키움 KOA

 

 

KOA는 키움 API 사용설명서이다.

 

API에 요청할 수 있는 것이 무엇인지 알려주며,

시험삼아 요청할 수 있게 해주고

요청하기 위해 어떤 함수와 파라미터를 사용해야 하는지 

등등 많은 것을 알려준다.

 

KOA Studio에서 KOA가 무슨 약자인지는 모르겠지만, 추정하면.... Kiwoom Open Api Studio가 아닐까 한다.

 

 

위 사진에서 처럼 KOA를 다운로드 받는다. 압축파일이 하나 다운로드 되는데, 그 안에 파일이 2개 있다.

KOA 실행파일을 더블 클릭하면 KOA가 실행된다. 별도의 설치 과정없이 그냥 실행된다.

압축파일 속 파일 2개를 키움 API 설치 폴더로 옮겨 둔다.

 

 

나는 키움 OPEN API를 C 드라이브의 "Kiwoom" 폴더의 "OpenApi"에 설치했다. 그래서 다음의 폴더에 옮겨두었다.

 

키움 KOA 파일 위치

 

 

매번 저 폴더로 이동하기 귀찮으니깐, KOAStudioSA 파일을 우클릭하여 "시작화면에 고정"해서 사용 중이다.

 

 

2021.01.05. 코리.

 

파이썬을 학습하며 남기는 블로그입니다.
질문, 지적, 조언은 항상 환영합니다.

 

+ Recent posts