Skip to content

Commit

Permalink
build: update python version to 3.12
Browse files Browse the repository at this point in the history
  • Loading branch information
zeroam committed Oct 30, 2024
1 parent fde4112 commit c46b187
Show file tree
Hide file tree
Showing 4 changed files with 510 additions and 327 deletions.
8 changes: 4 additions & 4 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# See https://pre-commit.com for more information
# See https://pre-commit.com/hooks.html for more hooks
default_language_version:
python: python3.11
python: python3.12
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.6.0
Expand All @@ -13,16 +13,16 @@ repos:
- --unsafe
- id: trailing-whitespace
- repo: https://github.com/charliermarsh/ruff-pre-commit
rev: v0.4.5
rev: v0.5.6
hooks:
- id: ruff
args:
- --fix
- id: ruff-format
- repo: https://github.com/pre-commit/mirrors-mypy
rev: v1.10.0
rev: v1.13.0
hooks:
- id: mypy
additional_dependencies: [types-all]
additional_dependencies: [types-requests]
args: [--config-file=mypy.ini]
exclude: ^tests/
151 changes: 124 additions & 27 deletions kispy/overseas_stock/order.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,22 @@ def _request(self, method: str, url: str, **kwargs) -> BaseResponse:
custom_resp.raise_for_status()
return custom_resp

def buy(self, symbol: str, exchange: str, quantity: int, price: float) -> dict:
def buy(self, symbol: str, exchange_code: str, quantity: int, price: float) -> dict:
"""해외주식주문[v1_해외주식-001] - 매수
Args:
symbol (str): 종목코드
exchange_code (str): 거래소 코드 (
NASD : 나스닥, NYSE : 뉴욕, AMEX : 아멕스,
SEHK : 홍콩, SHAA : 중국상해, SZAA : 중국심천,
TKSE : 일본, HASE : 베트남 하노이, VNSE : 베트남 호치민
)
quantity (int): 주문수량
price (float): 주문단가
Returns:
dict: 주문 결과
해외주식 주문 API입니다.
* 모의투자의 경우, 모든 해외 종목 매매가 지원되지 않습니다. 일부 종목만 매매 가능한 점 유의 부탁드립니다.
Expand All @@ -47,15 +60,12 @@ def buy(self, symbol: str, exchange: str, quantity: int, price: float) -> dict:
※ 종목코드 마스터파일 파이썬 정제코드는 한국투자증권 Github 참고 부탁드립니다.
https://github.com/koreainvestment/open-trading-api/tree/main/stocks_info
- 주문단가와 체결 단가는 다를 수 있음
"""
# 현재는 미국 매수만 가능
path = "uapi/overseas-stock/v1/trading/order"
url = f"{self._url}/{path}"

tr_id = _get_buy_tr_id(exchange, self._auth.is_real)
tr_id = _get_buy_tr_id(exchange_code, self._auth.is_real)

headers = self._auth.get_header()
headers["tr_id"] = tr_id
Expand All @@ -75,12 +85,38 @@ def buy(self, symbol: str, exchange: str, quantity: int, price: float) -> dict:
# TODO: resp 타입 정의하기
return resp.json["output"] # type: ignore[no-any-return]

def buy_market(self, symbol: str, exchange: str, quantity: int) -> dict:
return self.buy(symbol, exchange, quantity, 0)
def buy_market(self, symbol: str, exchange_code: str, quantity: int) -> dict:
"""시장가 매수
Args:
symbol (str): 종목코드
exchange_code (str): 거래소 코드 (
NASD : 나스닥, NYSE : 뉴욕, AMEX : 아멕스,
SEHK : 홍콩, SHAA : 중국상해, SZAA : 중국심천,
TKSE : 일본, HASE : 베트남 하노이, VNSE : 베트남 호치민
)
quantity (int): 주문수량
Returns:
dict: 주문 결과
"""
return self.buy(symbol, exchange_code, quantity, 0)

def sell(self, symbol: str, exchange: str, quantity: int, price: float) -> dict:
def sell(self, symbol: str, exchange_code: str, quantity: int, price: float) -> dict:
"""해외주식주문[v1_해외주식-001] - 매도
Args:
symbol (str): 종목코드
exchange_code (str): 거래소 코드 (
NASD : 나스닥, NYSE : 뉴욕, AMEX : 아멕스,
SEHK : 홍콩, SHAA : 중국상해, SZAA : 중국심천,
TKSE : 일본, HASE : 베트남 하노이, VNSE : 베트남 호치민
)
quantity (int): 주문수량
price (float): 주문단가
Returns:
dict: 주문 결과
해외주식 주문 API입니다.
* 모의투자의 경우, 모든 해외 종목 매매가 지원되지 않습니다. 일부 종목만 매매 가능한 점 유의 부탁드립니다.
Expand All @@ -106,7 +142,7 @@ def sell(self, symbol: str, exchange: str, quantity: int, price: float) -> dict:
url = f"{self._url}/{path}"

headers = self._auth.get_header()
headers["tr_id"] = _get_sell_tr_id(exchange, self._auth.is_real)
headers["tr_id"] = _get_sell_tr_id(exchange_code, self._auth.is_real)
body = {
"CANO": self._auth.cano,
"ACNT_PRDT_CD": self._auth.acnt_prdt_cd,
Expand All @@ -122,35 +158,58 @@ def sell(self, symbol: str, exchange: str, quantity: int, price: float) -> dict:
resp = self._request(method="post", url=url, headers=headers, json=body)
return resp.json["output"] # type: ignore[no-any-return]

def sell_market(self, symbol: str, exchange: str, quantity: int) -> dict:
return self.sell(symbol, exchange, quantity, 0)
def sell_market(self, symbol: str, exchange_code: str, quantity: int) -> dict:
"""시장가 매도
Args:
symbol (str): 종목코드
exchange_code (str): 거래소 코드 (
NASD : 나스닥, NYSE : 뉴욕, AMEX : 아멕스,
SEHK : 홍콩, SHAA : 중국상해, SZAA : 중국심천,
TKSE : 일본, HASE : 베트남 하노이, VNSE : 베트남 호치민
)
quantity (int): 주문수량
Returns:
dict: 주문 결과
"""
return self.sell(symbol, exchange_code, quantity, 0)

def update(
self,
symbol: str,
exchange_code: str,
order_number: str,
quantity: str,
price: float,
) -> dict:
"""
해외주식 정정취소주문[v1_해외주식-003] - 정정
Args:
symbol (str): 종목코드
exchange_code (str): 거래소 코드 (
NASD : 나스닥, NYSE : 뉴욕, AMEX : 아멕스,
SEHK : 홍콩, SHAA : 중국상해, SZAA : 중국심천,
TKSE : 일본, HASE : 베트남 하노이, VNSE : 베트남 호치민
)
order_number (str): 주문번호
quantity (str): 주문수량
price (float): 주문단가
Returns:
dict: 주문 결과
- 2개 주문하고 1개만 수정하면? 수량 불일치 에러, 수량을 맞춰야 함
"""
path = "uapi/overseas-stock/v1/trading/order-rvsecncl"
url = f"{self._url}/{path}"

if self._auth.is_real:
tr_id = "TTTT1004U"
else:
tr_id = "VTTT1004U"

headers = self._auth.get_header()
headers["tr_id"] = tr_id
headers["tr_id"] = _get_cancel_tr_id(exchange_code, self._auth.is_real)
body = {
"CANO": self._auth.cano,
"ACNT_PRDT_CD": self._auth.acnt_prdt_cd,
"OVRS_EXCG_CD": "NASD", # 나스닥
"OVRS_EXCG_CD": exchange_code,
"PDNO": symbol,
"ORGN_ODNO": order_number,
"RVSE_CNCL_DVSN_CD": "01", # 정정
Expand All @@ -161,26 +220,33 @@ def update(
resp = self._request(method="post", url=url, headers=headers, json=body)
return resp.json["output"] # type: ignore[no-any-return]

def cancel(self, symbol: str, order_number: str) -> dict:
def cancel(self, symbol: str, exchange_code: str, order_number: str) -> dict:
"""
해외주식 정정취소주문[v1_해외주식-003] - 취소
Args:
symbol (str): 종목코드
exchange_code (str): 거래소 코드 (
NASD : 나스닥, NYSE : 뉴욕, AMEX : 아멕스,
SEHK : 홍콩, SHAA : 중국상해, SZAA : 중국심천,
TKSE : 일본, HASE : 베트남 하노이, VNSE : 베트남 호치민
)
order_number (str): 주문번호
Returns:
dict: 주문 결과
# 2개 주문하고 1개만 취소하면? 취소는 수량 관계없이 가능
"""
path = "uapi/overseas-stock/v1/trading/order-rvsecncl"
url = f"{self._url}/{path}"

if self._auth.is_real:
tr_id = "TTTT1004U"
else:
tr_id = "VTTT1004U"

headers = self._auth.get_header()
headers["tr_id"] = tr_id
headers["tr_id"] = _get_cancel_tr_id(exchange_code, self._auth.is_real)
body = {
"CANO": self._auth.cano,
"ACNT_PRDT_CD": self._auth.acnt_prdt_cd,
"OVRS_EXCG_CD": "NASD", # 나스닥
"OVRS_EXCG_CD": exchange_code,
"PDNO": symbol,
"ORGN_ODNO": order_number,
"RVSE_CNCL_DVSN_CD": "02", # 취소
Expand Down Expand Up @@ -253,7 +319,7 @@ def inquire_executed_orders(self, start_date: str, end_date: str) -> dict:
"ORD_END_DT": end_date, # 조회종료일자
"SLL_BUY_DVSN": "00", # 매도매수구분: 00-전체, 01-매도, 02-매수
"CCLD_NCCS_DVSN": "00", # 체결미체결구분: 00-전체, 01-체결, 02-미체결
"OVRS_EXCG_CD": "NASD", # 거래소코드: NASD-나스닥, NYSE-뉴욕증권거래소, ...
"OVRS_EXCG_CD": "%", # 거래소코드, 전종목일 경우 % 입력
"SORT_SQN": "DS", # 정렬순서: DS-내림차순, AS-오름차순
"ORD_DT": "",
"ORD_GNO_BRNO": "",
Expand Down Expand Up @@ -326,3 +392,34 @@ def _get_sell_tr_id(exchange: str, is_real: bool) -> str:
return real_tr_id[exchange]
else:
return mock_tr_id[exchange]


def _get_cancel_tr_id(exchange: str, is_real: bool) -> str:
real_tr_id = {
"NASD": "TTTT1004U",
"NYSE": "TTTT1004U",
"AMEX": "TTTT1004U",
"SEHK": "TTTS1003U",
"SHAA": "TTTS0302U",
"SZAA": "TTTS0306U",
"TKSE": "TTTS0309U",
"HASE": "TTTS0312U",
"VNSE": "TTTS0312U",
}

mock_tr_id = {
"NASD": "VTTT1004U",
"NYSE": "VTTT1004U",
"AMEX": "VTTT1004U",
"SEHK": "VTTS1003U",
"SHAA": "VTTS0302U",
"SZAA": "VTTS0306U",
"TKSE": "VTTS0309U",
"HASE": "VTTS0312U",
"VNSE": "VTTS0312U",
}

if is_real:
return real_tr_id[exchange]
else:
return mock_tr_id[exchange]
Loading

0 comments on commit c46b187

Please sign in to comment.