kiwoom


Namekiwoom JSON
Version 1.3.4 PyPI version JSON
download
home_pagehttps://github.com/breadum/kiwoom
SummarySimple Python Wrapper for Kiwoom Open API+
upload_time2023-12-19 07:07:28
maintainer
docs_urlNone
authorBreadum
requires_python>=3.6
licenseMIT License
keywords kiwoom heroes open api+ 키움 영웅문 system trading algorithmic trading
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Kiwoom Open API+
Simple Python Wrapper for Kiwoom Open API+ (Stable)

## What is it?

- 키움증권에서 제공하는 Open API+ 인터페이스 사용을 위한 간단한 Python Wrapper 모듈

- PyQt5를 이용해 직접 개발하고자 하는 사람을 위한 모듈로 부가적인 기능은 최대한 배제

## Main Features

#### 1. Open API+ 함수 호출 간소화

- 함수명과 변수명을 깔끔하게 Python 방식으로 통일

> ```python
> # Before
> OnReceiveTrCondition(BSTR sScrNo, BSTR strCodeList, BSTR strConditionName, int nIndex, int nNext)
> 
> # After
> on_receive_tr_condition(scr_no, code_list, condition_name, index, next)
> ```

- 반복되는 dynamicCall 제거 

> ```python
> # Before
> self.dynamicCall("CommRqData(QString, QString, Int, QString)", rq_name, tr_code, prev_next, scr_no)
> 
> # After
> self.comm_rq_data(rq_name, tr_code, prev_next, scr_no)
> ```

#### 2. 간단한 기능 지원

- 로그인 기능

> ```python
> from kiwoom import *
> api = Kiwoom()
> api.login()
> ```

- loop / unloop 함수를 통해 간단히 코드 실행 / 대기 제어

> ```python
> from kiwoom import *
>
> # QEventLoop 활용
> api = Kiwoom()
> api.loop()
> api.unloop()
> ```

- 요청 후 처리 결과를 반환하는 함수에 한해 에러 발생 시 메세지 자동 발생

> ```python
> # 구현되어있는 메인 클래스
> class Kiwoom(API):
>     ...
>     # 만일 send_order() 실행 후 정상처리 되지 않았다면 @catch_error 에서 에러 메세지 자동 발생
>     # ex) An error occured from send_order,  "-308 : OP_ERR_ORD_OVERFLOW (주문전송과부하)"
>     @catch_error
>     def send_order(self, rq_name, scr_no, acc_no, ord_type, code, qty, price, hoga_gb, org_order_no):
>         return super().send_order(rq_name, scr_no, acc_no, ord_type, code, qty, price, hoga_gb, org_order_no)
>     ...

- [주가 & 지수 Historical Market Data 24시간 다운로더][tut3]

> ```python
> from kiwoom import *
>
> # 지정번호 확인
> print(config.MARKETS)  # {'0': 'KOSPI', '3': 'ELW', ... }
> print(config.SECTORS)  # {'001': '종합(KOSPI)', '002': '대형주', ... }
> 
> # 다운로드
> api = Kiwoom()
> api.histories(market='0', period='tick', start='20201001', merge=True)  # KOSPI Stocks
> api.histories(sector='2', period='tick', start='20201001', merge=True)  # KOSPI200 Index
> ```

- 순수한 API 기능만을 사용해 직접 개발하고 싶은 경우

> ```python
> from kiwoom import API
>
> # API 파이썬 래핑 
> class Kiwoom(API):
>     # Overriding Here
>     def __init__(self):
>         super().__init__()
> ```

#### 3. 통신을 위한 체계적인 코드 작성 지원

- 데이터를 요청하는 함수와 데이터를 받는 함수를 분리해서 작성 

- Signal에 해당하는 'Bot' 클래스와 Slot에 해당하는 'Server' 클래스

- 작성 후 Kiwoom.connect() 함수로 서로 연결시켜 서버에서 응답 시 자동 호출 지원

- 자세한 내용 및 코드는 [튜토리얼][tutorial] 중 [5. TR 데이터][tut5] 항목을 통해 확인 가능

> ```python
> from kiwoom import Bot
>
> # 서버에 데이터를 요청하는 클래스 (사용자 작성)
> class MyBot(Bot):
>     def __init__(self, server):
>         super().__init__(server)
>
>         # 1) Kiwoom.set_connect_hook(event, param)
>         # 이벤트 OnReceiveTrData 발생 시 주어진 rq_name 인자값에 따라 slot을 호출하도록 설정
>         # 만일 설정하지 않는다면, 하나의 이벤트에는 하나의 slot만 연결가능
>         self.api.set_connect_hook('on_receive_tr_data', 'rq_name')
>
>         # 2) Kiwoom.connect(event, signal, slot, key=None)
>         # OnReceiveTrData 이벤트에 대하여 1)에 의해 특정 rq_name 값에 따라 signal과 slot을 연결
>         # key 값이 주어지지 않을 시, rq_name은 signal과 slot의 함수 이름 'balance'로 자동 설정
>         self.api.connect(
>             event='on_receive_tr_data',
>             signal=self.balance, 
>             slot=self.server.balance,
>         )
> 
>         # 1)과 2) 연결 설정 후에는 다음과 같이 활용할 수 있다.
>         # on_receive_tr_data(..., rq_name='balance', ...) 이벤트 수신 시 server.balance 자동 호출됨
>         # self.api.signal('on_receive_tr_event', 'balance') 호출 시 bot.balance 함수 핸들 반환
>         # self.api.slot('on_receive_tr_event', 'balance') 호출 시 server.balance 함수 핸들 반환 
>
>         # 참고 가이드          
>         # 1) print(config.events)  # 이벤트 목록
>         # 2) print(Kiwoom.api_arg_spec('on_receive_tr_data'))  # 함수인자 목록
>         # 3) help(Kiwoom.connect) and help(Kiwoom.set_connect_hook)  # Doc String
>         # 4) Github 튜토리얼 (https://github.com/breadum/kiwoom/tree/main/tutorials)
>     
>     def balance(self, prev_next='0'):
>         ...
>         # '계좌평가잔고내역'을 받기 위해 서버로 rq_name='balance'로 요청 전송
>         self.api.comm_rq_data(rq_name='balance', tr_code='opw00018', prev_next='0', scr_no='0000')
>         self.api.loop()  # 이벤트가 호출 될 때까지 대기
>         ...
>
>     def run(self):
>         # 버전처리 및 로그인 
>         self.login()
>
>         # 계좌평가잔고내역 요청
>         self.balance()
>
>         # 전송된 데이터 확인
>         print(self.share['balance']['예탁금'])
> ```
> ```python
> from kiwoom import Server
> 
> # 서버에서 데이터를 받아 처리하는 클래스 (사용자 작성)
> class MyServer(Server):
>     def __init__(self):
>         super().__init__()
>         self.downloading = False
>
>     def balance(self, scr_no, rq_name, tr_code, record_name, prev_next):
>         ...
>         # 만일 데이터가 더 있을 경우 연결했던 Signal 함수 다시 호출
>         if prev_next == '2':
>             fn = self.api.signal('on_receive_tr_data', rq_name)  # rq_name='balance'
>             fn(prev_next)  # Bot.balance(prev_next='2')
>
>         # 데이터를 다 받았다면 unloop을 통해 대기중인 코드 실행
>         else:
>             ...
>             self.downloading = False
>             self.api.unloop()
> ```
> ```python
> # 구현되어있는 메인 클래스
> class Kiwoom(API):
>     ...
>     # rq_name = 'balance'라면, @map 데코레이터가 매핑된 함수를 자동 호출
>     # >> slot.balance(scr_no, rq_name, tr_code, record_name, prev_next, *args)
>     @map
>     def on_receive_tr_data(self, scr_no, rq_name, tr_code, record_name, prev_next, *args):
>         pass
> ```

- 간단한 실행 스크립트 예시 (여러가지 방식 가능)

> ```python 
> from PyQt5.QtWidgets import QApplication
> from kiwoom import *
> import sys
>
>     
> if __name__ == '__main__':
>
>     # 통신을 위해 QApplication 활용
>     app = QApplication(sys.argv)
>
>     # 인스턴스 생성
>     bot = MyBot(MyServer())
>    
>     # 봇 작동시작
>     bot.run() 
>
>     # 데이터 통신을 위해 스크립트 종료 방지
>     app.exec()
> ```

#### 4. 디버깅을 위한 에러 출력

- PyQt5 모듈을 사용하는 경우 Pycharm과 같은 IDE 사용 시 에러 메세지가 발생하지 않는 문제 해결

## Tutorial

- [튜토리얼 및 모듈구조][tutorial]

   [1. 뼈대코드][tut1]
   
   [2. 로그인][tut2]
   
   [3. 시장데이터][tut3]
   
   [4. 계좌확인][tut4]
   
   [5. TR 데이터][tut5]
   
   [6. 트레이딩][tut6]
    

## Installation

#### Prerequisite

##### 1. 키움 Open API+ 사용 신청 (Step1), 모듈 다운로드 (Step2), KOA Studio 다운로드 (Step3)

- 키움 웹사이트 (https://www1.kiwoom.com/nkw.templateFrameSet.do?m=m1408000000)

##### 2. 32-bit Python 3.7 이상 Windows 환경 세팅

- 키움 Open API+ 활용 시 필수조건

- Anaconda 64-bit 에서 32-bit 가상환경 생성 시 유의사항

     네이버 블로그 참고 페이지 (https://m.blog.naver.com/haanoon/221814660104)

> ```bash
> # 실제로 잘 작동하지 않는 방식
> set CONDA_FORCE_32BIT=1  
>
> # 권장하는 방식 
> conda create -n 32bit  # 가상환경 생성
> conda activate 32bit  # 가상환경 실행
> conda config --env --set subdir win-32  # 현위치에서 32bit 설정
> conda install python=3.10  # Python 3.7/3.8/3.9/3.10 설치
> conda install pandas<2.0  # 32bit Pandas 별도 설치
> ```

- 아래 코드로 '32Bit'인지 반드시 확인 후 설치

> ```python
> import platform; print(platform.architecture())
> ```

##### 3. KOA Studio를 활용해 간단한 데이터 조회로 정상작동 여부 확인 필수

- 키움에서 Open API+ 모듈을 받아도 처음 실행 시 여러가지 오류 발생

     키움 OpenAPI 등록, 타인계좌 사용불가, AhnLab Safe Transaction 설치 등등  

- 먼저 KOA Studio를 통해 오류 확인 및 해결 후 파이썬 모듈 설치

- 키움 OpenAPI 등록, 모의투자 신청, 버전처리, 계좌비밀번호 저장(AUTO) 등을 확인

#### Install from pip

> ```bash
> pip install kiwoom
> ```

#### Install from source

> ```bash
> # After git clone and cd into the dir
> git clone https://github.com/breadum/kiwoom.git && cd kiwoom
> python3 setup.py install
> ```

## License

- [MIT License][mit]

## Finally

- 본 프로젝트의 개발자는 키움증권과 아무런 관련이 없습니다.

- 엉망인 키움 Open API를 활용하여 시스템을 직접 개발할 때 도움이 되고자 개발했습니다.

- 발생한 어떠한 손실에 대하여 어떻게 발생하였든지 개발자는 이에 대해 아무런 책임이 없음을 알립니다.

- 버그, 기능요청, 문의사항 등은 [Github 이슈 게시판][issue]을 통해 남겨주세요.

[mit]: https://github.com/breadum/kiwoom/blob/main/LICENSE
[issue]: https://github.com/breadum/kiwoom/issues
[tutorial]: https://github.com/breadum/kiwoom/tree/main/tutorials
[tut1]: https://github.com/breadum/kiwoom/blob/main/tutorials/1.%20Basic%20Structure.py
[tut2]: https://github.com/breadum/kiwoom/blob/main/tutorials/2.%20Login.py
[tut3]: https://github.com/breadum/kiwoom/blob/main/tutorials/3.%20Historical%20Data.py
[tut4]: https://github.com/breadum/kiwoom/blob/main/tutorials/4.%20Account.py
[tut5]: https://github.com/breadum/kiwoom/blob/main/tutorials/5.%20TR%20Data.py
[tut6]: https://github.com/breadum/kiwoom/blob/main/tutorials/6.%20Trading.py


            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/breadum/kiwoom",
    "name": "kiwoom",
    "maintainer": "",
    "docs_url": null,
    "requires_python": ">=3.6",
    "maintainer_email": "",
    "keywords": "Kiwoom,Heroes,Open API+,\ud0a4\uc6c0,\uc601\uc6c5\ubb38,System Trading,Algorithmic Trading",
    "author": "Breadum",
    "author_email": "breadum.kr@gmail.com",
    "download_url": "https://files.pythonhosted.org/packages/b6/fe/57c81758ba79806041ccaba5a9b066c3e09e34a448ccab0e32cbc9752611/kiwoom-1.3.4.tar.gz",
    "platform": null,
    "description": "# Kiwoom Open API+\nSimple Python Wrapper for Kiwoom Open API+ (Stable)\n\n## What is it?\n\n- \ud0a4\uc6c0\uc99d\uad8c\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 Open API+ \uc778\ud130\ud398\uc774\uc2a4 \uc0ac\uc6a9\uc744 \uc704\ud55c \uac04\ub2e8\ud55c Python Wrapper \ubaa8\ub4c8\n\n- PyQt5\ub97c \uc774\uc6a9\ud574 \uc9c1\uc811 \uac1c\ubc1c\ud558\uace0\uc790 \ud558\ub294 \uc0ac\ub78c\uc744 \uc704\ud55c \ubaa8\ub4c8\ub85c \ubd80\uac00\uc801\uc778 \uae30\ub2a5\uc740 \ucd5c\ub300\ud55c \ubc30\uc81c\n\n## Main Features\n\n#### 1. Open API+ \ud568\uc218 \ud638\ucd9c \uac04\uc18c\ud654\n\n- \ud568\uc218\uba85\uacfc \ubcc0\uc218\uba85\uc744 \uae54\ub054\ud558\uac8c Python \ubc29\uc2dd\uc73c\ub85c \ud1b5\uc77c\n\n> ```python\n> # Before\n> OnReceiveTrCondition(BSTR sScrNo, BSTR strCodeList, BSTR strConditionName, int nIndex, int nNext)\n> \n> # After\n> on_receive_tr_condition(scr_no, code_list, condition_name, index, next)\n> ```\n\n- \ubc18\ubcf5\ub418\ub294 dynamicCall \uc81c\uac70 \n\n> ```python\n> # Before\n> self.dynamicCall(\"CommRqData(QString, QString, Int, QString)\", rq_name, tr_code, prev_next, scr_no)\n> \n> # After\n> self.comm_rq_data(rq_name, tr_code, prev_next, scr_no)\n> ```\n\n#### 2. \uac04\ub2e8\ud55c \uae30\ub2a5 \uc9c0\uc6d0\n\n- \ub85c\uadf8\uc778 \uae30\ub2a5\n\n> ```python\n> from kiwoom import *\n> api = Kiwoom()\n> api.login()\n> ```\n\n- loop / unloop \ud568\uc218\ub97c \ud1b5\ud574 \uac04\ub2e8\ud788 \ucf54\ub4dc \uc2e4\ud589 / \ub300\uae30 \uc81c\uc5b4\n\n> ```python\n> from kiwoom import *\n>\n> # QEventLoop \ud65c\uc6a9\n> api = Kiwoom()\n> api.loop()\n> api.unloop()\n> ```\n\n- \uc694\uccad \ud6c4 \ucc98\ub9ac \uacb0\uacfc\ub97c \ubc18\ud658\ud558\ub294 \ud568\uc218\uc5d0 \ud55c\ud574 \uc5d0\ub7ec \ubc1c\uc0dd \uc2dc \uba54\uc138\uc9c0 \uc790\ub3d9 \ubc1c\uc0dd\n\n> ```python\n> # \uad6c\ud604\ub418\uc5b4\uc788\ub294 \uba54\uc778 \ud074\ub798\uc2a4\n> class Kiwoom(API):\n>     ...\n>     # \ub9cc\uc77c send_order() \uc2e4\ud589 \ud6c4 \uc815\uc0c1\ucc98\ub9ac \ub418\uc9c0 \uc54a\uc558\ub2e4\uba74 @catch_error \uc5d0\uc11c \uc5d0\ub7ec \uba54\uc138\uc9c0 \uc790\ub3d9 \ubc1c\uc0dd\n>     # ex) An error occured from send_order,  \"-308 : OP_ERR_ORD_OVERFLOW (\uc8fc\ubb38\uc804\uc1a1\uacfc\ubd80\ud558)\"\n>     @catch_error\n>     def send_order(self, rq_name, scr_no, acc_no, ord_type, code, qty, price, hoga_gb, org_order_no):\n>         return super().send_order(rq_name, scr_no, acc_no, ord_type, code, qty, price, hoga_gb, org_order_no)\n>     ...\n\n- [\uc8fc\uac00 & \uc9c0\uc218 Historical Market Data 24\uc2dc\uac04 \ub2e4\uc6b4\ub85c\ub354][tut3]\n\n> ```python\n> from kiwoom import *\n>\n> # \uc9c0\uc815\ubc88\ud638 \ud655\uc778\n> print(config.MARKETS)  # {'0': 'KOSPI', '3': 'ELW', ... }\n> print(config.SECTORS)  # {'001': '\uc885\ud569(KOSPI)', '002': '\ub300\ud615\uc8fc', ... }\n> \n> # \ub2e4\uc6b4\ub85c\ub4dc\n> api = Kiwoom()\n> api.histories(market='0', period='tick', start='20201001', merge=True)  # KOSPI Stocks\n> api.histories(sector='2', period='tick', start='20201001', merge=True)  # KOSPI200 Index\n> ```\n\n- \uc21c\uc218\ud55c API \uae30\ub2a5\ub9cc\uc744 \uc0ac\uc6a9\ud574 \uc9c1\uc811 \uac1c\ubc1c\ud558\uace0 \uc2f6\uc740 \uacbd\uc6b0\n\n> ```python\n> from kiwoom import API\n>\n> # API \ud30c\uc774\uc36c \ub798\ud551 \n> class Kiwoom(API):\n>     # Overriding Here\n>     def __init__(self):\n>         super().__init__()\n> ```\n\n#### 3. \ud1b5\uc2e0\uc744 \uc704\ud55c \uccb4\uacc4\uc801\uc778 \ucf54\ub4dc \uc791\uc131 \uc9c0\uc6d0\n\n- \ub370\uc774\ud130\ub97c \uc694\uccad\ud558\ub294 \ud568\uc218\uc640 \ub370\uc774\ud130\ub97c \ubc1b\ub294 \ud568\uc218\ub97c \ubd84\ub9ac\ud574\uc11c \uc791\uc131 \n\n- Signal\uc5d0 \ud574\ub2f9\ud558\ub294 'Bot' \ud074\ub798\uc2a4\uc640 Slot\uc5d0 \ud574\ub2f9\ud558\ub294 'Server' \ud074\ub798\uc2a4\n\n- \uc791\uc131 \ud6c4 Kiwoom.connect() \ud568\uc218\ub85c \uc11c\ub85c \uc5f0\uacb0\uc2dc\ucf1c \uc11c\ubc84\uc5d0\uc11c \uc751\ub2f5 \uc2dc \uc790\ub3d9 \ud638\ucd9c \uc9c0\uc6d0\n\n- \uc790\uc138\ud55c \ub0b4\uc6a9 \ubc0f \ucf54\ub4dc\ub294 [\ud29c\ud1a0\ub9ac\uc5bc][tutorial] \uc911 [5. TR \ub370\uc774\ud130][tut5] \ud56d\ubaa9\uc744 \ud1b5\ud574 \ud655\uc778 \uac00\ub2a5\n\n> ```python\n> from kiwoom import Bot\n>\n> # \uc11c\ubc84\uc5d0 \ub370\uc774\ud130\ub97c \uc694\uccad\ud558\ub294 \ud074\ub798\uc2a4 (\uc0ac\uc6a9\uc790 \uc791\uc131)\n> class MyBot(Bot):\n>     def __init__(self, server):\n>         super().__init__(server)\n>\n>         # 1) Kiwoom.set_connect_hook(event, param)\n>         # \uc774\ubca4\ud2b8 OnReceiveTrData \ubc1c\uc0dd \uc2dc \uc8fc\uc5b4\uc9c4 rq_name \uc778\uc790\uac12\uc5d0 \ub530\ub77c slot\uc744 \ud638\ucd9c\ud558\ub3c4\ub85d \uc124\uc815\n>         # \ub9cc\uc77c \uc124\uc815\ud558\uc9c0 \uc54a\ub294\ub2e4\uba74, \ud558\ub098\uc758 \uc774\ubca4\ud2b8\uc5d0\ub294 \ud558\ub098\uc758 slot\ub9cc \uc5f0\uacb0\uac00\ub2a5\n>         self.api.set_connect_hook('on_receive_tr_data', 'rq_name')\n>\n>         # 2) Kiwoom.connect(event, signal, slot, key=None)\n>         # OnReceiveTrData \uc774\ubca4\ud2b8\uc5d0 \ub300\ud558\uc5ec 1)\uc5d0 \uc758\ud574 \ud2b9\uc815 rq_name \uac12\uc5d0 \ub530\ub77c signal\uacfc slot\uc744 \uc5f0\uacb0\n>         # key \uac12\uc774 \uc8fc\uc5b4\uc9c0\uc9c0 \uc54a\uc744 \uc2dc, rq_name\uc740 signal\uacfc slot\uc758 \ud568\uc218 \uc774\ub984 'balance'\ub85c \uc790\ub3d9 \uc124\uc815\n>         self.api.connect(\n>             event='on_receive_tr_data',\n>             signal=self.balance, \n>             slot=self.server.balance,\n>         )\n> \n>         # 1)\uacfc 2) \uc5f0\uacb0 \uc124\uc815 \ud6c4\uc5d0\ub294 \ub2e4\uc74c\uacfc \uac19\uc774 \ud65c\uc6a9\ud560 \uc218 \uc788\ub2e4.\n>         # on_receive_tr_data(..., rq_name='balance', ...) \uc774\ubca4\ud2b8 \uc218\uc2e0 \uc2dc server.balance \uc790\ub3d9 \ud638\ucd9c\ub428\n>         # self.api.signal('on_receive_tr_event', 'balance') \ud638\ucd9c \uc2dc bot.balance \ud568\uc218 \ud578\ub4e4 \ubc18\ud658\n>         # self.api.slot('on_receive_tr_event', 'balance') \ud638\ucd9c \uc2dc server.balance \ud568\uc218 \ud578\ub4e4 \ubc18\ud658 \n>\n>         # \ucc38\uace0 \uac00\uc774\ub4dc          \n>         # 1) print(config.events)  # \uc774\ubca4\ud2b8 \ubaa9\ub85d\n>         # 2) print(Kiwoom.api_arg_spec('on_receive_tr_data'))  # \ud568\uc218\uc778\uc790 \ubaa9\ub85d\n>         # 3) help(Kiwoom.connect) and help(Kiwoom.set_connect_hook)  # Doc String\n>         # 4) Github \ud29c\ud1a0\ub9ac\uc5bc (https://github.com/breadum/kiwoom/tree/main/tutorials)\n>     \n>     def balance(self, prev_next='0'):\n>         ...\n>         # '\uacc4\uc88c\ud3c9\uac00\uc794\uace0\ub0b4\uc5ed'\uc744 \ubc1b\uae30 \uc704\ud574 \uc11c\ubc84\ub85c rq_name='balance'\ub85c \uc694\uccad \uc804\uc1a1\n>         self.api.comm_rq_data(rq_name='balance', tr_code='opw00018', prev_next='0', scr_no='0000')\n>         self.api.loop()  # \uc774\ubca4\ud2b8\uac00 \ud638\ucd9c \ub420 \ub54c\uae4c\uc9c0 \ub300\uae30\n>         ...\n>\n>     def run(self):\n>         # \ubc84\uc804\ucc98\ub9ac \ubc0f \ub85c\uadf8\uc778 \n>         self.login()\n>\n>         # \uacc4\uc88c\ud3c9\uac00\uc794\uace0\ub0b4\uc5ed \uc694\uccad\n>         self.balance()\n>\n>         # \uc804\uc1a1\ub41c \ub370\uc774\ud130 \ud655\uc778\n>         print(self.share['balance']['\uc608\ud0c1\uae08'])\n> ```\n> ```python\n> from kiwoom import Server\n> \n> # \uc11c\ubc84\uc5d0\uc11c \ub370\uc774\ud130\ub97c \ubc1b\uc544 \ucc98\ub9ac\ud558\ub294 \ud074\ub798\uc2a4 (\uc0ac\uc6a9\uc790 \uc791\uc131)\n> class MyServer(Server):\n>     def __init__(self):\n>         super().__init__()\n>         self.downloading = False\n>\n>     def balance(self, scr_no, rq_name, tr_code, record_name, prev_next):\n>         ...\n>         # \ub9cc\uc77c \ub370\uc774\ud130\uac00 \ub354 \uc788\uc744 \uacbd\uc6b0 \uc5f0\uacb0\ud588\ub358 Signal \ud568\uc218 \ub2e4\uc2dc \ud638\ucd9c\n>         if prev_next == '2':\n>             fn = self.api.signal('on_receive_tr_data', rq_name)  # rq_name='balance'\n>             fn(prev_next)  # Bot.balance(prev_next='2')\n>\n>         # \ub370\uc774\ud130\ub97c \ub2e4 \ubc1b\uc558\ub2e4\uba74 unloop\uc744 \ud1b5\ud574 \ub300\uae30\uc911\uc778 \ucf54\ub4dc \uc2e4\ud589\n>         else:\n>             ...\n>             self.downloading = False\n>             self.api.unloop()\n> ```\n> ```python\n> # \uad6c\ud604\ub418\uc5b4\uc788\ub294 \uba54\uc778 \ud074\ub798\uc2a4\n> class Kiwoom(API):\n>     ...\n>     # rq_name = 'balance'\ub77c\uba74, @map \ub370\ucf54\ub808\uc774\ud130\uac00 \ub9e4\ud551\ub41c \ud568\uc218\ub97c \uc790\ub3d9 \ud638\ucd9c\n>     # >> slot.balance(scr_no, rq_name, tr_code, record_name, prev_next, *args)\n>     @map\n>     def on_receive_tr_data(self, scr_no, rq_name, tr_code, record_name, prev_next, *args):\n>         pass\n> ```\n\n- \uac04\ub2e8\ud55c \uc2e4\ud589 \uc2a4\ud06c\ub9bd\ud2b8 \uc608\uc2dc (\uc5ec\ub7ec\uac00\uc9c0 \ubc29\uc2dd \uac00\ub2a5)\n\n> ```python \n> from PyQt5.QtWidgets import QApplication\n> from kiwoom import *\n> import sys\n>\n>     \n> if __name__ == '__main__':\n>\n>     # \ud1b5\uc2e0\uc744 \uc704\ud574 QApplication \ud65c\uc6a9\n>     app = QApplication(sys.argv)\n>\n>     # \uc778\uc2a4\ud134\uc2a4 \uc0dd\uc131\n>     bot = MyBot(MyServer())\n>    \n>     # \ubd07 \uc791\ub3d9\uc2dc\uc791\n>     bot.run() \n>\n>     # \ub370\uc774\ud130 \ud1b5\uc2e0\uc744 \uc704\ud574 \uc2a4\ud06c\ub9bd\ud2b8 \uc885\ub8cc \ubc29\uc9c0\n>     app.exec()\n> ```\n\n#### 4. \ub514\ubc84\uae45\uc744 \uc704\ud55c \uc5d0\ub7ec \ucd9c\ub825\n\n- PyQt5 \ubaa8\ub4c8\uc744 \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 Pycharm\uacfc \uac19\uc740 IDE \uc0ac\uc6a9 \uc2dc \uc5d0\ub7ec \uba54\uc138\uc9c0\uac00 \ubc1c\uc0dd\ud558\uc9c0 \uc54a\ub294 \ubb38\uc81c \ud574\uacb0\n\n## Tutorial\n\n- [\ud29c\ud1a0\ub9ac\uc5bc \ubc0f \ubaa8\ub4c8\uad6c\uc870][tutorial]\n\n   [1. \ubf08\ub300\ucf54\ub4dc][tut1]\n   \n   [2. \ub85c\uadf8\uc778][tut2]\n   \n   [3. \uc2dc\uc7a5\ub370\uc774\ud130][tut3]\n   \n   [4. \uacc4\uc88c\ud655\uc778][tut4]\n   \n   [5. TR \ub370\uc774\ud130][tut5]\n   \n   [6. \ud2b8\ub808\uc774\ub529][tut6]\n    \n\n## Installation\n\n#### Prerequisite\n\n##### 1. \ud0a4\uc6c0 Open API+ \uc0ac\uc6a9 \uc2e0\uccad (Step1), \ubaa8\ub4c8 \ub2e4\uc6b4\ub85c\ub4dc (Step2), KOA Studio \ub2e4\uc6b4\ub85c\ub4dc (Step3)\n\n- \ud0a4\uc6c0 \uc6f9\uc0ac\uc774\ud2b8 (https://www1.kiwoom.com/nkw.templateFrameSet.do?m=m1408000000)\n\n##### 2. 32-bit Python 3.7 \uc774\uc0c1 Windows \ud658\uacbd \uc138\ud305\n\n- \ud0a4\uc6c0 Open API+ \ud65c\uc6a9 \uc2dc \ud544\uc218\uc870\uac74\n\n- Anaconda 64-bit \uc5d0\uc11c 32-bit \uac00\uc0c1\ud658\uacbd \uc0dd\uc131 \uc2dc \uc720\uc758\uc0ac\ud56d\n\n     \ub124\uc774\ubc84 \ube14\ub85c\uadf8 \ucc38\uace0 \ud398\uc774\uc9c0 (https://m.blog.naver.com/haanoon/221814660104)\n\n> ```bash\n> # \uc2e4\uc81c\ub85c \uc798 \uc791\ub3d9\ud558\uc9c0 \uc54a\ub294 \ubc29\uc2dd\n> set CONDA_FORCE_32BIT=1  \n>\n> # \uad8c\uc7a5\ud558\ub294 \ubc29\uc2dd \n> conda create -n 32bit  # \uac00\uc0c1\ud658\uacbd \uc0dd\uc131\n> conda activate 32bit  # \uac00\uc0c1\ud658\uacbd \uc2e4\ud589\n> conda config --env --set subdir win-32  # \ud604\uc704\uce58\uc5d0\uc11c 32bit \uc124\uc815\n> conda install python=3.10  # Python 3.7/3.8/3.9/3.10 \uc124\uce58\n> conda install pandas<2.0  # 32bit Pandas \ubcc4\ub3c4 \uc124\uce58\n> ```\n\n- \uc544\ub798 \ucf54\ub4dc\ub85c '32Bit'\uc778\uc9c0 \ubc18\ub4dc\uc2dc \ud655\uc778 \ud6c4 \uc124\uce58\n\n> ```python\n> import platform; print(platform.architecture())\n> ```\n\n##### 3. KOA Studio\ub97c \ud65c\uc6a9\ud574 \uac04\ub2e8\ud55c \ub370\uc774\ud130 \uc870\ud68c\ub85c \uc815\uc0c1\uc791\ub3d9 \uc5ec\ubd80 \ud655\uc778 \ud544\uc218\n\n- \ud0a4\uc6c0\uc5d0\uc11c Open API+ \ubaa8\ub4c8\uc744 \ubc1b\uc544\ub3c4 \ucc98\uc74c \uc2e4\ud589 \uc2dc \uc5ec\ub7ec\uac00\uc9c0 \uc624\ub958 \ubc1c\uc0dd\n\n     \ud0a4\uc6c0 OpenAPI \ub4f1\ub85d, \ud0c0\uc778\uacc4\uc88c \uc0ac\uc6a9\ubd88\uac00, AhnLab Safe Transaction \uc124\uce58 \ub4f1\ub4f1  \n\n- \uba3c\uc800 KOA Studio\ub97c \ud1b5\ud574 \uc624\ub958 \ud655\uc778 \ubc0f \ud574\uacb0 \ud6c4 \ud30c\uc774\uc36c \ubaa8\ub4c8 \uc124\uce58\n\n- \ud0a4\uc6c0 OpenAPI \ub4f1\ub85d, \ubaa8\uc758\ud22c\uc790 \uc2e0\uccad, \ubc84\uc804\ucc98\ub9ac, \uacc4\uc88c\ube44\ubc00\ubc88\ud638 \uc800\uc7a5(AUTO) \ub4f1\uc744 \ud655\uc778\n\n#### Install from pip\n\n> ```bash\n> pip install kiwoom\n> ```\n\n#### Install from source\n\n> ```bash\n> # After git clone and cd into the dir\n> git clone https://github.com/breadum/kiwoom.git && cd kiwoom\n> python3 setup.py install\n> ```\n\n## License\n\n- [MIT License][mit]\n\n## Finally\n\n- \ubcf8 \ud504\ub85c\uc81d\ud2b8\uc758 \uac1c\ubc1c\uc790\ub294 \ud0a4\uc6c0\uc99d\uad8c\uacfc \uc544\ubb34\ub7f0 \uad00\ub828\uc774 \uc5c6\uc2b5\ub2c8\ub2e4.\n\n- \uc5c9\ub9dd\uc778 \ud0a4\uc6c0 Open API\ub97c \ud65c\uc6a9\ud558\uc5ec \uc2dc\uc2a4\ud15c\uc744 \uc9c1\uc811 \uac1c\ubc1c\ud560 \ub54c \ub3c4\uc6c0\uc774 \ub418\uace0\uc790 \uac1c\ubc1c\ud588\uc2b5\ub2c8\ub2e4.\n\n- \ubc1c\uc0dd\ud55c \uc5b4\ub5a0\ud55c \uc190\uc2e4\uc5d0 \ub300\ud558\uc5ec \uc5b4\ub5bb\uac8c \ubc1c\uc0dd\ud558\uc600\ub4e0\uc9c0 \uac1c\ubc1c\uc790\ub294 \uc774\uc5d0 \ub300\ud574 \uc544\ubb34\ub7f0 \ucc45\uc784\uc774 \uc5c6\uc74c\uc744 \uc54c\ub9bd\ub2c8\ub2e4.\n\n- \ubc84\uadf8, \uae30\ub2a5\uc694\uccad, \ubb38\uc758\uc0ac\ud56d \ub4f1\uc740 [Github \uc774\uc288 \uac8c\uc2dc\ud310][issue]\uc744 \ud1b5\ud574 \ub0a8\uaca8\uc8fc\uc138\uc694.\n\n[mit]: https://github.com/breadum/kiwoom/blob/main/LICENSE\n[issue]: https://github.com/breadum/kiwoom/issues\n[tutorial]: https://github.com/breadum/kiwoom/tree/main/tutorials\n[tut1]: https://github.com/breadum/kiwoom/blob/main/tutorials/1.%20Basic%20Structure.py\n[tut2]: https://github.com/breadum/kiwoom/blob/main/tutorials/2.%20Login.py\n[tut3]: https://github.com/breadum/kiwoom/blob/main/tutorials/3.%20Historical%20Data.py\n[tut4]: https://github.com/breadum/kiwoom/blob/main/tutorials/4.%20Account.py\n[tut5]: https://github.com/breadum/kiwoom/blob/main/tutorials/5.%20TR%20Data.py\n[tut6]: https://github.com/breadum/kiwoom/blob/main/tutorials/6.%20Trading.py\n\n",
    "bugtrack_url": null,
    "license": "MIT License",
    "summary": "Simple Python Wrapper for Kiwoom Open API+",
    "version": "1.3.4",
    "project_urls": {
        "Download": "https://pypi.org/project/kiwoom",
        "Git": "https://github.com/breadum/kiwoom",
        "Homepage": "https://github.com/breadum/kiwoom",
        "Tutorials": "https://github.com/breadum/kiwoom/tree/main/tutorials"
    },
    "split_keywords": [
        "kiwoom",
        "heroes",
        "open api+",
        "\ud0a4\uc6c0",
        "\uc601\uc6c5\ubb38",
        "system trading",
        "algorithmic trading"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "dab24509d1b212bb540c167f2eb81de1f3f2e133182c50a27e7f994839d0645e",
                "md5": "2e0c81fddaea24376a1233fe44170982",
                "sha256": "1e5b495dc969fb618d60ae5c3403935dd461029e0880b6aeea1fc70349874615"
            },
            "downloads": -1,
            "filename": "kiwoom-1.3.4-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "2e0c81fddaea24376a1233fe44170982",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.6",
            "size": 49213,
            "upload_time": "2023-12-19T07:07:25",
            "upload_time_iso_8601": "2023-12-19T07:07:25.763397Z",
            "url": "https://files.pythonhosted.org/packages/da/b2/4509d1b212bb540c167f2eb81de1f3f2e133182c50a27e7f994839d0645e/kiwoom-1.3.4-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "b6fe57c81758ba79806041ccaba5a9b066c3e09e34a448ccab0e32cbc9752611",
                "md5": "9e16f19e1b8f65cbf6c089e53453f9b0",
                "sha256": "ae1e8377ec879b6ce63b02d4fbc4fb7c4f7584c0c31eff43e272110e071a52e6"
            },
            "downloads": -1,
            "filename": "kiwoom-1.3.4.tar.gz",
            "has_sig": false,
            "md5_digest": "9e16f19e1b8f65cbf6c089e53453f9b0",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.6",
            "size": 47253,
            "upload_time": "2023-12-19T07:07:28",
            "upload_time_iso_8601": "2023-12-19T07:07:28.100283Z",
            "url": "https://files.pythonhosted.org/packages/b6/fe/57c81758ba79806041ccaba5a9b066c3e09e34a448ccab0e32cbc9752611/kiwoom-1.3.4.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2023-12-19 07:07:28",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "breadum",
    "github_project": "kiwoom",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "requirements": [],
    "lcname": "kiwoom"
}
        
Elapsed time: 0.15534s