From ba48acb4f53e097148aef7586e19d85b38619694 Mon Sep 17 00:00:00 2001 From: Soju06 <34199905+Soju06@users.noreply.github.com> Date: Sun, 13 Aug 2023 20:16:13 +0900 Subject: [PATCH 1/4] =?UTF-8?q?=ED=95=B4=EC=99=B8=20=EB=AA=A8=EC=9D=98=20?= =?UTF-8?q?=ED=88=AC=EC=9E=90=20TR=5FID=20=EC=88=98=EC=A0=95=20(#15)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pykis/scope/account/api/overseas_order.py | 113 +++++++++--------- .../account/api/response/overseas_order.py | 59 +++++---- 2 files changed, 91 insertions(+), 81 deletions(-) diff --git a/pykis/scope/account/api/overseas_order.py b/pykis/scope/account/api/overseas_order.py index 60c7a250..174acc33 100644 --- a/pykis/scope/account/api/overseas_order.py +++ b/pykis/scope/account/api/overseas_order.py @@ -3,27 +3,29 @@ TR_ID_CODE_MAP: list[dict[str, tuple[str, str]]] = [ # [실전투자] { - 'NASD': ('JTTT1002U', 'JTTT1006U'), # 미국 - 'NYSE': ('JTTT1002U', 'JTTT1006U'), # 미국 - 'AMEX': ('JTTT1002U', 'JTTT1006U'), # 미국 - 'SEHK': ('TTTS1002U', 'TTTS1001U'), # 홍콩 - 'SHAA': ('TTTS0202U', 'TTTS1005U'), # 상해 - 'SZAA': ('TTTS0305U', 'TTTS0304U'), # 심천 - 'TKSE': ('TTTS0308U', 'TTTS0307U'), # 일본 - 'HASE': ('TTTS0311U', 'TTTS0310U'), # 베트남 하노이 - 'VNSE': ('TTTS0311U', 'TTTS0310U'), # 베트남 호치민 + # '거래소명': ('매수 TR_ID', '매도 TR_ID') + "NASD": ("TTTT1002U", "TTTT1006U"), # 미국 + "NYSE": ("TTTT1002U", "TTTT1006U"), # 미국 + "AMEX": ("TTTT1002U", "TTTT1006U"), # 미국 + "TKSE": ("TTTS0308U", "TTTS0307U"), # 일본 + "SHAA": ("TTTS0202U", "TTTS1005U"), # 상해 + "SEHK": ("TTTS1002U", "TTTS1001U"), # 홍콩 + "SZAA": ("TTTS0305U", "TTTS0304U"), # 심천 + "HASE": ("TTTS0311U", "TTTS0310U"), # 베트남 하노이 + "VNSE": ("TTTS0311U", "TTTS0310U"), # 베트남 호치민 }, # [모의투자] { - 'NASD': ('VTTT1002U', 'VTTT1006U'), # 미국 - 'NYSE': ('VTTT1002U', 'VTTT1006U'), # 미국 - 'AMEX': ('VTTT1002U', 'VTTT1006U'), # 미국 - 'SEHK': ('VTTS1002U', 'VTTS1001U'), # 홍콩 - 'SHAA': ('VTTS0202U', 'VTTS1005U'), # 상해 - 'SZAA': ('VTTS0305U', 'VTTS0304U'), # 심천 - 'HASE': ('VTTS0311U', 'VTTS0310U'), # 베트남 하노이 - 'VNSE': ('VTTS0311U', 'VTTS0310U'), # 베트남 호치민 - } + "NASD": ("VTTT1002U", "VTTT1001U"), # 미국 + "NYSE": ("VTTT1002U", "VTTT1001U"), # 미국 + "AMEX": ("VTTT1002U", "VTTT1001U"), # 미국 + "TKSE": ("VTTS0308U", "VTTS0307U"), # 일본 + "SHAA": ("VTTS0202U", "VTTS1005U"), # 상해 + "SEHK": ("VTTS1002U", "VTTS1001U"), # 홍콩 + "SZAA": ("VTTS0305U", "VTTS0304U"), # 심천 + "HASE": ("VTTS0311U", "VTTS0310U"), # 베트남 하노이 + "VNSE": ("VTTS0311U", "VTTS0310U"), # 베트남 호치민 + }, ] # * 해외 거래소 운영시간 외 API 호출 시 애러가 발생하오니 운영시간을 확인해주세요. @@ -35,15 +37,15 @@ def overseas_order( - self: 'KisAccountScope', + self: "KisAccountScope", market: OVERSEAS_OVRS_EXCG_CD, code: str, qty: int, unpr: int, - type: Literal['매도', '매수'], - dvsn: OVERSEAS_ORD_DVSN_TYPE = '지정가' -) -> 'KisStockOrder': - '''해외주식 주문 + type: Literal["매도", "매수"], + dvsn: OVERSEAS_ORD_DVSN_TYPE = "지정가", +) -> "KisStockOrder": + """해외주식 주문 Args: market (US_OVRS_EXCG_CD): 해외 시장 구분 @@ -53,52 +55,53 @@ def overseas_order( type (Literal['매도', '매수']): 주문 타입 dvsn (US_ORD_DVSN_TYPE, optional): 주문 구분. Defaults to '지정가'. 미국 홍콩 외 일부 시장에서는 주문 구분을 None으로 설정해야 합니다. - ''' + """ if len(code) > 12: - raise ValueError('종목코드는 12자리 이하입니다.') + raise ValueError("종목코드는 12자리 이하입니다.") if market not in OVERSEAS_OVRS_EXCGS: market = OVERSEAS_R_OVRS_EXCGS.get(market, None) # type: ignore if market is None: raise ValueError( - f'해외 시장 구분은 ({", ".join(f"{k}, {v}" for k, v in OVERSEAS_R_OVRS_EXCGS.items())}) 중 하나여야 합니다.') + f'해외 시장 구분은 ({", ".join(f"{k}, {v}" for k, v in OVERSEAS_R_OVRS_EXCGS.items())}) 중 하나여야 합니다.' + ) - tr_id = TR_ID_CODE_MAP[1 if self.key.virtual_account else 0][market][0 if type == '매수' else 1] - supported_dvsn = OVERSEAS_ORD_DVSN_MAP.get( - tr_id, OVERSEAS_ORD_DVSN_MAP[None]) + tr_id = TR_ID_CODE_MAP[1 if self.key.virtual_account else 0][market][0 if type == "매수" else 1] + supported_dvsn = OVERSEAS_ORD_DVSN_MAP.get(tr_id, OVERSEAS_ORD_DVSN_MAP[None]) if dvsn not in supported_dvsn: - raise ValueError( - f'주문 구분은 ({", ".join(i if i else "None" for i in supported_dvsn)}) 중 하나여야 합니다.') + raise ValueError(f'주문 구분은 ({", ".join(i if i else "None" for i in supported_dvsn)}) 중 하나여야 합니다.') dvsn = OVERSEAS_R_ORD_DVSNS.get(dvsn, dvsn) # type: ignore return self.client.request( - 'post', - '/uapi/overseas-stock/v1/trading/order', + "post", + "/uapi/overseas-stock/v1/trading/order", headers={ - 'tr_id': tr_id, + "tr_id": tr_id, }, - body=self.account.build_body({ - 'OVRS_EXCG_CD': market, - 'PDNO': code, - 'ORD_QTY': qty, - 'ORD_DVSN': dvsn, - 'OVRS_ORD_UNPR': unpr, - 'ORD_SVR_DVSN_CD': '0' - }), - response=KisStockOrder + body=self.account.build_body( + { + "OVRS_EXCG_CD": market, + "PDNO": code, + "ORD_QTY": qty, + "ORD_DVSN": dvsn, + "OVRS_ORD_UNPR": unpr, + "ORD_SVR_DVSN_CD": "0", + } + ), + response=KisStockOrder, ) def overseas_buy( - self: 'KisAccountScope', + self: "KisAccountScope", market: OVERSEAS_OVRS_EXCG_CD, code: str, qty: int, unpr: int, - dvsn: OVERSEAS_ORD_DVSN_TYPE = '지정가' -) -> 'KisStockOrder': - '''해외주식 매수 + dvsn: OVERSEAS_ORD_DVSN_TYPE = "지정가", +) -> "KisStockOrder": + """해외주식 매수 Args: market (US_OVRS_EXCG_CD): 해외 시장 구분 @@ -107,19 +110,19 @@ def overseas_buy( unpr (int): 주문 단가 (시장가 주문 시 0) dvsn (US_ORD_DVSN_TYPE, optional): 주문 구분. Defaults to '지정가'. 미국 홍콩 외 일부 시장에서는 주문 구분을 None으로 설정해야 합니다. - ''' - return self.overseas_order(market, code, qty, unpr, '매수', dvsn) + """ + return self.overseas_order(market, code, qty, unpr, "매수", dvsn) def overseas_sell( - self: 'KisAccountScope', + self: "KisAccountScope", market: OVERSEAS_OVRS_EXCG_CD, code: str, qty: int, unpr: int, - dvsn: OVERSEAS_ORD_DVSN_TYPE = '지정가' -) -> 'KisStockOrder': - '''해외주식 매도 + dvsn: OVERSEAS_ORD_DVSN_TYPE = "지정가", +) -> "KisStockOrder": + """해외주식 매도 Args: market (US_OVRS_EXCG_CD): 해외 시장 구분 @@ -128,5 +131,5 @@ def overseas_sell( unpr (int): 주문 단가 (시장가 주문 시 0) dvsn (US_ORD_DVSN_TYPE, optional): 주문 구분. Defaults to '지정가'. 미국 홍콩 외 일부 시장에서는 주문 구분을 None으로 설정해야 합니다. - ''' - return self.overseas_order(market, code, qty, unpr, '매도', dvsn) + """ + return self.overseas_order(market, code, qty, unpr, "매도", dvsn) diff --git a/pykis/scope/account/api/response/overseas_order.py b/pykis/scope/account/api/response/overseas_order.py index 2c8768d1..e5e4d36a 100644 --- a/pykis/scope/account/api/response/overseas_order.py +++ b/pykis/scope/account/api/response/overseas_order.py @@ -1,31 +1,12 @@ from ...._import import * -# [Header tr_id JTTT1002U(미국 매수 주문)] -# 00 : 지정가 -# 32 : LOO(장개시지정가) -# 34 : LOC(장마감지정가) -# * 모의투자 VTTT1002U(미국 매수 주문)로는 00:지정가만 가능 - -# [Header tr_id JTTT1006U(미국 매도 주문)] -# 00 : 지정가 -# 31 : MOO(장개시시장가) -# 32 : LOO(장개시지정가) -# 33 : MOC(장마감시장가) -# 34 : LOC(장마감지정가) -# * 모의투자 VTTT1006U(미국 매도 주문)로는 00:지정가만 가능 - -# [Header tr_id TTTS1001U(홍콩 매도 주문)] -# 00 : 지정가 -# 05 : 단주지정가 셋팅 -# * 모의투자 VTTS1001U(홍콩 매도 주문)로는 00:지정가만 가능 - OVERSEAS_ORD_DVSNS = { '00': '지정가', '31': '장개시시장가', '32': '장개시지정가', '33': '장마감시장가', '34': '장마감지정가', - '05': '단주지정가 셋팅' + '05': '단주지정가' } OVERSEAS_R_ORD_DVSNS = { @@ -34,22 +15,48 @@ '장개시지정가': '32', '장마감시장가': '33', '장마감지정가': '34', - '단주지정가 셋팅': '05' + '단주지정가': '05' } OVERSEAS_ORD_DVSN_TYPE = Literal[ '00', '31', '32', '33', '34', '지정가', '장개시시장가', '장개시지정가', '장마감시장가', '장마감지정가', - '05', '단주지정가 셋팅' + '05', '단주지정가' ] | None +# [Header tr_id TTTT1002U(미국 매수 주문)] +# 00 : 지정가 +# 32 : LOO(장개시지정가) +# 34 : LOC(장마감지정가) +# * 모의투자 VTTT1002U(미국 매수 주문)로는 00:지정가만 가능 + +# [Header tr_id TTTT1006U(미국 매도 주문)] +# 00 : 지정가 +# 31 : MOO(장개시시장가) +# 32 : LOO(장개시지정가) +# 33 : MOC(장마감시장가) +# 34 : LOC(장마감지정가) +# * 모의투자 VTTT1006U(미국 매도 주문)로는 00:지정가만 가능 + +# [Header tr_id TTTS1001U(홍콩 매도 주문)] +# 00 : 지정가 +# 50 : 단주지정가 +# * 모의투자 VTTS1001U(홍콩 매도 주문)로는 00:지정가만 가능 + +# [그외 tr_id] +# 제거 OVERSEAS_ORD_DVSN_MAP: dict[str | None, set[str | None]] = { - 'JTTT1002U': {'00', '32', '34', '지정가', '장개시지정가', '장마감지정가'}, + # 미국 매수 주문 + 'TTTT1002U': {'00', '32', '34', '지정가', '장개시지정가', '장마감지정가'}, 'VTTT1002U': {'00', '지정가'}, - 'JTTT1006U': {'00', '31', '32', '33', '34', '지정가', '장개시시장가', '장개시지정가', '장마감시장가', '장마감지정가'}, - 'VTTT1006U': {'00', '지정가'}, - 'TTTS1001U': {'00', '05', '지정가', '단주지정가 셋팅'}, + # 미국 매도 주문 + 'TTTT1006U': {'00', '31', '32', '33', '34', '지정가', '장개시시장가', '장개시지정가', '장마감시장가', '장마감지정가'}, + # Issue #15: 미국 모의투자 매도 주문 Id는 VTTT1006U이 아닌 VTTT1001U + # Docs도 매우 난해하다. + 'VTTT1001U': {'00', '지정가'}, + # 홍콩 매도 주문 + 'TTTS1001U': {'00', '50', '지정가', '단주지정가'}, 'VTTS1001U': {'00', '지정가'}, None: {None} } From dcf59e633c480a39892682a2795a4469aa9e77bf Mon Sep 17 00:00:00 2001 From: Soju06 <34199905+Soju06@users.noreply.github.com> Date: Mon, 28 Aug 2023 21:19:40 +0900 Subject: [PATCH 2/4] =?UTF-8?q?=ED=95=B4=EC=99=B8=EC=A3=BC=EC=8B=9D=20?= =?UTF-8?q?=EC=A0=95=EC=A0=95=EC=B7=A8=EC=86=8C=EC=A3=BC=EB=AC=B8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../account/api/overseas_order_revise.py | 127 ++++++++---------- tests/order_us2.py | 73 ++++++++++ 2 files changed, 131 insertions(+), 69 deletions(-) create mode 100644 tests/order_us2.py diff --git a/pykis/scope/account/api/overseas_order_revise.py b/pykis/scope/account/api/overseas_order_revise.py index 474a0921..39585a42 100644 --- a/pykis/scope/account/api/overseas_order_revise.py +++ b/pykis/scope/account/api/overseas_order_revise.py @@ -4,42 +4,41 @@ TR_ID_CODE_MAP: list[dict[str, str]] = [ # [실전투자] { - 'NASD': 'JTTT1004U', # 미국 - 'NYSE': 'JTTT1004U', # 미국 - 'AMEX': 'JTTT1004U', # 미국 - 'SEHK': 'TTTS1003U', # 홍콩 - 'SHAA': 'TTTS0302U', # 상해 - 'SZAA': 'TTTS0306U', # 심천 - 'TKSE': 'TTTS0309U', # 일본 - 'HASE': 'TTTS0312U', # 베트남 하노이 - 'VNSE': 'TTTS0312U', # 베트남 호치민 + "NASD": "TTTT1004U", # 미국 + "NYSE": "JTTT1004U", # 미국 + "AMEX": "JTTT1004U", # 미국 + "SEHK": "TTTS1003U", # 홍콩 + "SHAA": "TTTS0302U", # 상해 + "SZAA": "TTTS0306U", # 심천 + "TKSE": "TTTS0309U", # 일본 + "HASE": "TTTS0312U", # 베트남 하노이 + "VNSE": "TTTS0312U", # 베트남 호치민 }, # [모의투자] { - 'NASD': 'VTTT1004U', # 미국 - 'NYSE': 'VTTT1004U', # 미국 - 'AMEX': 'VTTT1004U', # 미국 - 'SEHK': 'VTTS1003U', # 홍콩 - 'SHAA': 'VTTS0302U', # 상해 - 'SZAA': 'VTTS0306U', # 심천 - 'TKSE': 'VTTS0309U', # 일본 - 'HASE': 'VTTS0312U', # 베트남 하노이 - 'VNSE': 'VTTS0312U', # 베트남 호치민 - } + "NASD": "VTTT1004U", # 미국 + "NYSE": "VTTT1004U", # 미국 + "AMEX": "VTTT1004U", # 미국 + "SEHK": "VTTS1003U", # 홍콩 + "SHAA": "VTTS0302U", # 상해 + "SZAA": "VTTS0306U", # 심천 + "TKSE": "VTTS0309U", # 일본 + "HASE": "VTTS0312U", # 베트남 하노이 + "VNSE": "VTTS0312U", # 베트남 호치민 + }, ] def overseas_order_revise( - self: 'KisAccountScope', + self: "KisAccountScope", market: OVERSEAS_OVRS_EXCG_CD, order: KisStockOrderBase, - type: Literal['01', '02', '정정', '취소'], + type: Literal["01", "02", "정정", "취소"], code: str, qty: int | None, unpr: int, - dvsn: OVERSEAS_ORD_DVSN_TYPE = '지정가' -) -> 'KisStockOrder': - '''주식 주문 정정/취소 +) -> "KisStockOrder": + """주식 주문 정정/취소 Args: market (US_OVRS_EXCG_CD): 해외 시장 구분 @@ -47,60 +46,53 @@ def overseas_order_revise( type (Literal['01', '02', '취소', '정정']): 정정/취소 구분 code (str): 종목코드 qty (int | None): 주문 수량 (None일 경우 전량 정정) - dvsn (US_ORD_DVSN_TYPE, optional): 주문 구분. Defaults to '지정가'. - 미국 홍콩 외 일부 시장에서는 주문 구분을 None으로 설정해야 합니다. unpr (int, optional): 주문 단가. 주문 취소시 0 Returns: KisStockOrder: 주식 주문 응답 - ''' + """ if len(code) > 12: - raise ValueError('종목코드는 12자리 이하입니다.') + raise ValueError("종목코드는 12자리 이하입니다.") if market not in OVERSEAS_OVRS_EXCGS: market = OVERSEAS_R_OVRS_EXCGS.get(market, None) # type: ignore if market is None: raise ValueError( - f'해외 시장 구분은 ({", ".join(f"{k}, {v}" for k, v in OVERSEAS_R_OVRS_EXCGS.items())}) 중 하나여야 합니다.') - - if type[0] != '0': - type = '01' if type == '정정' else '02' + f'해외 시장 구분은 ({", ".join(f"{k}, {v}" for k, v in OVERSEAS_R_OVRS_EXCGS.items())}) 중 하나여야 합니다.' + ) - if dvsn not in OVERSEAS_ORD_DVSNS: - dvsn = OVERSEAS_R_ORD_DVSNS.get(dvsn, None) # type: ignore - if not dvsn: - raise ValueError( - f'주문 구분은 ({", ".join(i if i else "None" for i in OVERSEAS_R_ORD_DVSNS)}) 중 하나여야 합니다.') + if type[0] != "0": + type = "01" if type == "정정" else "02" return self.client.request( - 'post', - '/uapi/overseas-stock/v1/trading/order-rvsecncl', + "post", + "/uapi/overseas-stock/v1/trading/order-rvsecncl", headers={ - 'tr_id': TR_ID_CODE_MAP[1 if self.key.virtual_account else 0][market], + "tr_id": TR_ID_CODE_MAP[1 if self.key.virtual_account else 0][market], }, - body=self.account.build_body({ - 'KRX_FWDG_ORD_ORGNO': order.krx_fwdg_ord_orgno, - 'ORGN_ODNO': order.odno, - 'PDNO': code, - 'ORD_DVSN': dvsn, - 'RVSE_CNCL_DVSN_CD': type, - 'ORD_QTY': qty or 0, - 'OVRS_ORD_UNPR': unpr, - 'OVRS_EXCG_CD': market, - 'ORD_SVR_DVSN_CD': '0' - }), - response=KisStockOrder + body=self.account.build_body( + { + "ORGN_ODNO": order.odno, + "PDNO": code, + "RVSE_CNCL_DVSN_CD": type, + "ORD_QTY": qty or 0, + "OVRS_ORD_UNPR": unpr, + "OVRS_EXCG_CD": market, + "ORD_SVR_DVSN_CD": "0", + } + ), + response=KisStockOrder, ) def overseas_cancel( - self: 'KisAccountScope', - market: OVERSEAS_OVRS_EXCG_CD, - code: str, - order: KisStockOrderBase, - qty: int | None = None -) -> 'KisStockOrder': - ''' + self: "KisAccountScope", + market: OVERSEAS_OVRS_EXCG_CD, + code: str, + order: KisStockOrderBase, + qty: int | None = None, +) -> "KisStockOrder": + """ 주식 주문 취소 Args: @@ -108,11 +100,11 @@ def overseas_cancel( code (str): 종목코드 order (KisStockOrderBase): 주문 qty (int): 취소 수량 - ''' + """ return self.overseas_order_revise( market, order, - '취소', + "취소", code, qty, 0, @@ -120,15 +112,14 @@ def overseas_cancel( def overseas_revise( - self: 'KisAccountScope', + self: "KisAccountScope", market: OVERSEAS_OVRS_EXCG_CD, code: str, order: KisStockOrderBase, qty: int | None, unpr: int, - dvsn: OVERSEAS_ORD_DVSN_TYPE = '지정가' -) -> 'KisStockOrder': - ''' +) -> "KisStockOrder": + """ 주식 주문 정정 Args: @@ -137,14 +128,12 @@ def overseas_revise( order (KisStockOrderBase): 주문 qty (int): 정정 수량 unpr (int): 정정 단가 - dvsn (US_ORD_DVSN_TYPE): 주문 구분 - ''' + """ return self.overseas_order_revise( market, order, - '정정', + "정정", code, qty, unpr, - dvsn, ) diff --git a/tests/order_us2.py b/tests/order_us2.py new file mode 100644 index 00000000..e9a749dc --- /dev/null +++ b/tests/order_us2.py @@ -0,0 +1,73 @@ +from pykis import * + +with open("B:\\vack.txt", "r") as f: + APPKEY = f.readline().strip() + APPSECRET = f.readline().strip() + +with open("B:\\vacco.txt", "r") as f: + ACCOUNT_NO = f.readline().strip() + +kis = PyKis( + # 앱 키 예) Pa0knAM6JLAjIa93Miajz7ykJIXXXXXXXXXX + appkey=APPKEY, + # 앱 시크릿 예) V9J3YGPE5q2ZRG5EgqnLHn7XqbJjzwXcNpvY . . . + appsecret=APPSECRET, + # 가상 계좌 여부 + virtual_account=True, + # 실시간 조회 비활성화 + realtime=False, +) + +# 잔고 +account = kis.account(ACCOUNT_NO) # 계좌번호 ex) 50071022-01 또는 5007102201 +print(f"예수금총액: {account.balance_all().dnca_tot_amt}") + +# 미국주식 매수 주문 +order1 = account.overseas_buy( + market="나스닥", + # 종목 코드 ex) TSLA + code="TSLA", + # 주문 수량 + qty=1, + # 주문 단가 + unpr=0, +) + +print(order1.message) + +# 미체결 조회 +while True: + nottraded = account.overseas_revisable_order_all("나스닥") + + for stock in nottraded.orders: + print( + f"주문일시: {stock.order_date:%Y-%m-%d %H:%M:%S} 종목코드: {stock.pdno} 종목명: {stock.prdt_name} {stock.sll_buy_dvsn_cd_name} 미체결수량: {stock.nccs_qty} 주문단가: {stock.ft_ord_unpr3}" + ) + + if not nottraded.orders: + break + + +# 매도 주문 +order2 = account.overseas_sell( + market="나스닥", + # 종목 코드 ex) TSLA + code="TSLA", + # 주문 수량 + qty=1, + # 주문 단가 + unpr=0, +) + +print(order2.message) + +orders = account.overseas_revisable_order_all("나스닥") + +for my_order in orders.orders: + print( + f"주문일시: {my_order.order_date:%Y-%m-%d %H:%M:%S} 종목코드: {my_order.pdno} 종목명: {my_order.prdt_name} {my_order.sll_buy_dvsn_cd_name} 미체결수량: {my_order.nccs_qty} 주문단가: {my_order.ft_ord_unpr3}" + ) + +# FM 대로 사용 다한 임시 토큰은 삭제함. +if kis.client.token: + kis.client.token.discard() From bbb7b31df31cdd72e86aa8e7e3055e71bfb24042 Mon Sep 17 00:00:00 2001 From: Soju06 <34199905+Soju06@users.noreply.github.com> Date: Mon, 28 Aug 2023 22:53:49 +0900 Subject: [PATCH 3/4] =?UTF-8?q?=ED=95=B4=EC=99=B8=20=EC=A3=BC=EB=AC=B8=20?= =?UTF-8?q?=ED=95=84=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pykis/scope/account/api/overseas_order.py | 14 +++++------ .../account/api/overseas_order_revise.py | 10 ++++---- .../account/api/response/overseas_order.py | 24 +++++++++---------- tests/order_us2.py | 4 ++-- 4 files changed, 26 insertions(+), 26 deletions(-) diff --git a/pykis/scope/account/api/overseas_order.py b/pykis/scope/account/api/overseas_order.py index 174acc33..697cb326 100644 --- a/pykis/scope/account/api/overseas_order.py +++ b/pykis/scope/account/api/overseas_order.py @@ -41,7 +41,7 @@ def overseas_order( market: OVERSEAS_OVRS_EXCG_CD, code: str, qty: int, - unpr: int, + unpr: float, type: Literal["매도", "매수"], dvsn: OVERSEAS_ORD_DVSN_TYPE = "지정가", ) -> "KisStockOrder": @@ -51,7 +51,7 @@ def overseas_order( market (US_OVRS_EXCG_CD): 해외 시장 구분 code (str): 종목코드 qty (int): 주문 수량 - unpr (int): 주문 단가 (시장가 주문 시 0) + unpr (int): 주문 단가 type (Literal['매도', '매수']): 주문 타입 dvsn (US_ORD_DVSN_TYPE, optional): 주문 구분. Defaults to '지정가'. 미국 홍콩 외 일부 시장에서는 주문 구분을 None으로 설정해야 합니다. @@ -85,7 +85,7 @@ def overseas_order( "PDNO": code, "ORD_QTY": qty, "ORD_DVSN": dvsn, - "OVRS_ORD_UNPR": unpr, + "OVRS_ORD_UNPR": str(unpr), "ORD_SVR_DVSN_CD": "0", } ), @@ -98,7 +98,7 @@ def overseas_buy( market: OVERSEAS_OVRS_EXCG_CD, code: str, qty: int, - unpr: int, + unpr: float, dvsn: OVERSEAS_ORD_DVSN_TYPE = "지정가", ) -> "KisStockOrder": """해외주식 매수 @@ -107,7 +107,7 @@ def overseas_buy( market (US_OVRS_EXCG_CD): 해외 시장 구분 code (str): 종목코드 qty (int): 주문 수량 - unpr (int): 주문 단가 (시장가 주문 시 0) + unpr (float): 주문 단가 dvsn (US_ORD_DVSN_TYPE, optional): 주문 구분. Defaults to '지정가'. 미국 홍콩 외 일부 시장에서는 주문 구분을 None으로 설정해야 합니다. """ @@ -119,7 +119,7 @@ def overseas_sell( market: OVERSEAS_OVRS_EXCG_CD, code: str, qty: int, - unpr: int, + unpr: float, dvsn: OVERSEAS_ORD_DVSN_TYPE = "지정가", ) -> "KisStockOrder": """해외주식 매도 @@ -128,7 +128,7 @@ def overseas_sell( market (US_OVRS_EXCG_CD): 해외 시장 구분 code (str): 종목코드 qty (int): 주문 수량 - unpr (int): 주문 단가 (시장가 주문 시 0) + unpr (float): 주문 단가 dvsn (US_ORD_DVSN_TYPE, optional): 주문 구분. Defaults to '지정가'. 미국 홍콩 외 일부 시장에서는 주문 구분을 None으로 설정해야 합니다. """ diff --git a/pykis/scope/account/api/overseas_order_revise.py b/pykis/scope/account/api/overseas_order_revise.py index 39585a42..8fc76ec0 100644 --- a/pykis/scope/account/api/overseas_order_revise.py +++ b/pykis/scope/account/api/overseas_order_revise.py @@ -36,7 +36,7 @@ def overseas_order_revise( type: Literal["01", "02", "정정", "취소"], code: str, qty: int | None, - unpr: int, + unpr: float, ) -> "KisStockOrder": """주식 주문 정정/취소 @@ -46,7 +46,7 @@ def overseas_order_revise( type (Literal['01', '02', '취소', '정정']): 정정/취소 구분 code (str): 종목코드 qty (int | None): 주문 수량 (None일 경우 전량 정정) - unpr (int, optional): 주문 단가. 주문 취소시 0 + unpr (float, optional): 주문 단가. 주문 취소시 0 Returns: KisStockOrder: 주식 주문 응답 @@ -76,7 +76,7 @@ def overseas_order_revise( "PDNO": code, "RVSE_CNCL_DVSN_CD": type, "ORD_QTY": qty or 0, - "OVRS_ORD_UNPR": unpr, + "OVRS_ORD_UNPR": str(unpr), "OVRS_EXCG_CD": market, "ORD_SVR_DVSN_CD": "0", } @@ -117,7 +117,7 @@ def overseas_revise( code: str, order: KisStockOrderBase, qty: int | None, - unpr: int, + unpr: float, ) -> "KisStockOrder": """ 주식 주문 정정 @@ -127,7 +127,7 @@ def overseas_revise( code (str): 종목코드 order (KisStockOrderBase): 주문 qty (int): 정정 수량 - unpr (int): 정정 단가 + unpr (float): 정정 단가 """ return self.overseas_order_revise( market, diff --git a/pykis/scope/account/api/response/overseas_order.py b/pykis/scope/account/api/response/overseas_order.py index e5e4d36a..b05dd97d 100644 --- a/pykis/scope/account/api/response/overseas_order.py +++ b/pykis/scope/account/api/response/overseas_order.py @@ -66,11 +66,11 @@ 'NYSE': '뉴욕', 'AMEX': '아멕스', 'SEHK': '홍콩', - 'SHAA': '중국상해', - 'SZAA': '중국심천', + 'SHAA': '상해', + 'SZAA': '심천', 'TKSE': '일본', - 'HASE': '베트남 하노이', - 'VNSE': '베트남 호치민', + 'HASE': '하노이', + 'VNSE': '호치민', } OVERSEAS_R_OVRS_EXCGS = { @@ -78,11 +78,11 @@ '뉴욕': 'NYSE', '아멕스': 'AMEX', '홍콩': 'SEHK', - '중국상해': 'SHAA', - '중국심천': 'SZAA', + '상해': 'SHAA', + '심천': 'SZAA', '일본': 'TKSE', - '베트남 하노이': 'HASE', - '베트남 호치민': 'VNSE', + '하노이': 'HASE', + '호치민': 'VNSE', } OVERSEAS_OVRS_EXCG_CD = Literal[ @@ -90,9 +90,9 @@ 'NYSE', '뉴욕', 'AMEX', '아멕스', 'SEHK', '홍콩', - 'SHAA', '중국상해', - 'SZAA', '중국심천', + 'SHAA', '상해', + 'SZAA', '심천', 'TKSE', '일본', - 'HASE', '베트남 하노이', - 'VNSE', '베트남 호치민', + 'HASE', '하노이', + 'VNSE', '호치민', ] diff --git a/tests/order_us2.py b/tests/order_us2.py index e9a749dc..e7499516 100644 --- a/tests/order_us2.py +++ b/tests/order_us2.py @@ -30,7 +30,7 @@ # 주문 수량 qty=1, # 주문 단가 - unpr=0, + unpr=240, ) print(order1.message) @@ -56,7 +56,7 @@ # 주문 수량 qty=1, # 주문 단가 - unpr=0, + unpr=230, ) print(order2.message) From e2eba6d49cf14b0ef6410c47442e85f5ead32459 Mon Sep 17 00:00:00 2001 From: Soju06 <34199905+Soju06@users.noreply.github.com> Date: Mon, 28 Aug 2023 22:54:29 +0900 Subject: [PATCH 4/4] =?UTF-8?q?=ED=95=B4=EC=99=B8=20=EC=8B=9C=EC=9E=A5=20?= =?UTF-8?q?=EB=AA=85=EC=B9=AD=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pykis/scope/market/api/response/info.py | 28 ++++++++++++------------- tests/order_us2.py | 6 ------ 2 files changed, 14 insertions(+), 20 deletions(-) diff --git a/pykis/scope/market/api/response/info.py b/pykis/scope/market/api/response/info.py index 142c2fbc..2c2d0655 100644 --- a/pykis/scope/market/api/response/info.py +++ b/pykis/scope/market/api/response/info.py @@ -27,34 +27,34 @@ "주식", "선물옵션", "채권", - "미국 나스닥", - "미국 뉴욕", - "미국 아멕스", + "나스닥", + "뉴욕", + "아멕스", "일본", "홍콩", "홍콩CNY", "홍콩USD", - "베트남 하노이", - "베트남 호치민", - "중국 상해A", - "중국 심천A", + "하노이", + "호치민", + "상해", + "심천", ] PRDT_TYPES = { "300": "주식", "301": "선물옵션", "302": "채권", - "512": "미국 나스닥", - "513": "미국 뉴욕", - "529": "미국 아멕스", + "512": "나스닥", + "513": "뉴욕", + "529": "아멕스", "515": "일본", "501": "홍콩", "543": "홍콩CNY", "558": "홍콩USD", - "507": "베트남 하노이", - "508": "베트남 호치민", - "551": "중국 상해A", - "552": "중국 심천A", + "507": "하노이", + "508": "호치민", + "551": "상해", + "552": "심천", } # -pdno 상품번호 String Y 12 diff --git a/tests/order_us2.py b/tests/order_us2.py index e7499516..5896817f 100644 --- a/tests/order_us2.py +++ b/tests/order_us2.py @@ -61,12 +61,6 @@ print(order2.message) -orders = account.overseas_revisable_order_all("나스닥") - -for my_order in orders.orders: - print( - f"주문일시: {my_order.order_date:%Y-%m-%d %H:%M:%S} 종목코드: {my_order.pdno} 종목명: {my_order.prdt_name} {my_order.sll_buy_dvsn_cd_name} 미체결수량: {my_order.nccs_qty} 주문단가: {my_order.ft_ord_unpr3}" - ) # FM 대로 사용 다한 임시 토큰은 삭제함. if kis.client.token: