ksxt 1.0.4__py3-none-any.whl → 1.0.5__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. ksxt/__pycache__/__init__.cpython-312.pyc +0 -0
  2. ksxt/__pycache__/bithumb.cpython-312.pyc +0 -0
  3. ksxt/__pycache__/koreainvest.cpython-312.pyc +0 -0
  4. ksxt/__pycache__/upbit.cpython-312.pyc +0 -0
  5. ksxt/api/__pycache__/__init__.cpython-312.pyc +0 -0
  6. ksxt/api/__pycache__/bithumb.cpython-312.pyc +0 -0
  7. ksxt/api/__pycache__/koreainvest.cpython-312.pyc +0 -0
  8. ksxt/api/__pycache__/upbit.cpython-312.pyc +0 -0
  9. ksxt/api/auto/__pycache__/bithumb.cpython-312.pyc +0 -0
  10. ksxt/api/auto/__pycache__/koreainvest.cpython-312.pyc +0 -0
  11. ksxt/api/auto/__pycache__/upbit.cpython-312.pyc +0 -0
  12. ksxt/async_/__pycache__/__init__.cpython-312.pyc +0 -0
  13. ksxt/async_/__pycache__/bithumb.cpython-312.pyc +0 -0
  14. ksxt/async_/__pycache__/koreainvest.cpython-312.pyc +0 -0
  15. ksxt/async_/__pycache__/upbit.cpython-312.pyc +0 -0
  16. ksxt/async_/base/__pycache__/__init__.cpython-312.pyc +0 -0
  17. ksxt/async_/base/__pycache__/async_exchange.cpython-312.pyc +0 -0
  18. ksxt/async_/base/__pycache__/throttler.cpython-312.pyc +0 -0
  19. ksxt/async_/base/async_exchange.py +17 -17
  20. ksxt/async_/bithumb.py +37 -19
  21. ksxt/async_/koreainvest.py +74 -6
  22. ksxt/async_/upbit.py +52 -20
  23. ksxt/base/__pycache__/__init__.cpython-312.pyc +0 -0
  24. ksxt/base/__pycache__/errors.cpython-312.pyc +0 -0
  25. ksxt/base/__pycache__/exchange.cpython-312.pyc +0 -0
  26. ksxt/base/__pycache__/rate_limiter.cpython-312.pyc +0 -0
  27. ksxt/base/__pycache__/rest_exchange.cpython-312.pyc +0 -0
  28. ksxt/base/__pycache__/types.cpython-312.pyc +0 -0
  29. ksxt/base/exchange.py +31 -23
  30. ksxt/base/rest_exchange.py +26 -28
  31. ksxt/bithumb.py +29 -12
  32. ksxt/config/__pycache__/__init__.cpython-312.pyc +0 -0
  33. ksxt/config/token.toml +6 -6
  34. ksxt/koreainvest.py +24 -6
  35. ksxt/market/__pycache__/base.cpython-312.pyc +0 -0
  36. ksxt/market/__pycache__/db.cpython-312.pyc +0 -0
  37. ksxt/market/__pycache__/logging.cpython-312.pyc +0 -0
  38. ksxt/market/__pycache__/manager.cpython-312.pyc +0 -0
  39. ksxt/market/__pycache__/markets.cpython-312.pyc +0 -0
  40. ksxt/market/krx/__pycache__/kosdaq.cpython-312.pyc +0 -0
  41. ksxt/market/krx/__pycache__/kospi.cpython-312.pyc +0 -0
  42. ksxt/market/krx/__pycache__/stock.cpython-312.pyc +0 -0
  43. ksxt/market/us/__pycache__/amex.cpython-312.pyc +0 -0
  44. ksxt/market/us/__pycache__/nasdaq.cpython-312.pyc +0 -0
  45. ksxt/market/us/__pycache__/nyse.cpython-312.pyc +0 -0
  46. ksxt/market/us/__pycache__/stock.cpython-312.pyc +0 -0
  47. ksxt/models/__pycache__/__init__.cpython-312.pyc +0 -0
  48. ksxt/models/__pycache__/balance.cpython-312.pyc +0 -0
  49. ksxt/models/__pycache__/cash.cpython-312.pyc +0 -0
  50. ksxt/models/__pycache__/common.cpython-312.pyc +0 -0
  51. ksxt/models/__pycache__/error.cpython-312.pyc +0 -0
  52. ksxt/models/__pycache__/historical.cpython-312.pyc +0 -0
  53. ksxt/models/__pycache__/market.cpython-312.pyc +0 -0
  54. ksxt/models/__pycache__/order.cpython-312.pyc +0 -0
  55. ksxt/models/__pycache__/orderbook.cpython-312.pyc +0 -0
  56. ksxt/models/__pycache__/ticker.cpython-312.pyc +0 -0
  57. ksxt/models/__pycache__/token.cpython-312.pyc +0 -0
  58. ksxt/models/__pycache__/transaction.cpython-312.pyc +0 -0
  59. ksxt/models/transaction.py +2 -0
  60. ksxt/parser/__pycache__/bithumb.cpython-312.pyc +0 -0
  61. ksxt/parser/__pycache__/koreainvest.cpython-312.pyc +0 -0
  62. ksxt/parser/__pycache__/parser.cpython-312.pyc +0 -0
  63. ksxt/parser/__pycache__/upbit.cpython-312.pyc +0 -0
  64. ksxt/parser/bithumb.py +83 -6
  65. ksxt/parser/koreainvest.py +56 -8
  66. ksxt/parser/parser.py +21 -5
  67. ksxt/parser/upbit.py +87 -10
  68. ksxt/upbit.py +42 -16
  69. ksxt/utils/__pycache__/safer.cpython-312.pyc +0 -0
  70. ksxt/utils/__pycache__/sorter.cpython-312.pyc +0 -0
  71. ksxt/utils/__pycache__/timer.cpython-312.pyc +0 -0
  72. {ksxt-1.0.4.dist-info → ksxt-1.0.5.dist-info}/METADATA +1 -1
  73. ksxt-1.0.5.dist-info/RECORD +123 -0
  74. {ksxt-1.0.4.dist-info → ksxt-1.0.5.dist-info}/WHEEL +1 -1
  75. ksxt-1.0.4.dist-info/RECORD +0 -120
  76. {ksxt-1.0.4.dist-info → ksxt-1.0.5.dist-info}/LICENSE.txt +0 -0
  77. {ksxt-1.0.4.dist-info → ksxt-1.0.5.dist-info}/top_level.txt +0 -0
ksxt/base/exchange.py CHANGED
@@ -3,7 +3,7 @@ import json
3
3
  from datetime import datetime
4
4
  import time
5
5
  import pytz
6
- from typing import Dict, Optional
6
+ from typing import Dict
7
7
  import ast
8
8
 
9
9
  from requests import Session
@@ -85,8 +85,8 @@ class Exchange:
85
85
  self,
86
86
  symbol: str,
87
87
  time_frame: str,
88
- start: Optional[str] = None,
89
- end: Optional[str] = None,
88
+ start: datetime | None = None,
89
+ end: datetime | None = None,
90
90
  base_market: str = "KRW",
91
91
  ):
92
92
  """
@@ -95,8 +95,8 @@ class Exchange:
95
95
  Args:
96
96
  symbol (str): 종목코드
97
97
  time_frame (str): 봉조회기준
98
- start (Optional[str], optional): 조회 시작일. Defaults to None.
99
- end (Optional[str], optional): 조회 종료일. Defaults to None.
98
+ start (datetime | None, optional): 조회 시작일. Defaults to None.
99
+ end (datetime | None, optional): 조회 종료일. Defaults to None.
100
100
  base_market (str, optional): Market 구분 코드. Defaults to 'KRW'.
101
101
  """
102
102
  pass
@@ -139,14 +139,14 @@ class Exchange:
139
139
  """
140
140
  pass
141
141
 
142
- def fetch_balance(self, acc_num: str, base_market: str = "KRW", excluded_symbols: Optional[list[str]] = None):
142
+ def fetch_balance(self, acc_num: str, base_market: str = "KRW", excluded_symbols: list[str] | None = None):
143
143
  """
144
144
  보유 자산 조회
145
145
 
146
146
  Args:
147
147
  acc_num (str): 계좌 번호
148
148
  base_market (str, optional): Market 구분 코드. Defaults to 'KRW'.
149
- excluded_symbols (Optional[list[str]], optional): 제외할 종목 리스트. Defaults to None.
149
+ excluded_symbols (list[str] | None, optional): 제외할 종목 리스트. Defaults to None.
150
150
  """
151
151
  pass
152
152
 
@@ -179,22 +179,30 @@ class Exchange:
179
179
  """
180
180
  pass
181
181
 
182
- def fetch_deposit_history(self, acc_num: str, base_market: str = "KRW"):
182
+ def fetch_deposit_history(
183
+ self, acc_num: str, start: datetime | None = None, end: datetime | None = None, base_market: str = "KRW"
184
+ ):
183
185
  """
184
186
  입금 내역 조회
185
187
 
186
188
  Args:
187
189
  acc_num (str): 계좌 번호
190
+ start (datetime | None, optional): 조회 시작일. Defaults to None.
191
+ end (datetime | None, optional): 조회 종료일. Defaults to None.
188
192
  base_market (str, optional): Market 구분 코드. Defaults to 'KRW'.
189
193
  """
190
194
  pass
191
195
 
192
- def fetch_withdrawal_history(self, acc_num: str, base_market: str = "KRW"):
196
+ def fetch_withdrawal_history(
197
+ self, acc_num: str, start: datetime | None = None, end: datetime | None = None, base_market: str = "KRW"
198
+ ):
193
199
  """
194
200
  출금 내역 조회
195
201
 
196
202
  Args:
197
203
  acc_num (str): 계좌 번호
204
+ start (datetime | None, optional): 조회 시작일. Defaults to None.
205
+ end (datetime | None, optional): 조회 종료일. Defaults to None.
198
206
  base_market (str, optional): Market 구분 코드. Defaults to 'KRW'.
199
207
  """
200
208
  pass
@@ -229,7 +237,7 @@ class Exchange:
229
237
  pass
230
238
 
231
239
  def cancel_order(
232
- self, acc_num: str, order_id: str, symbol: Optional[str] = "", qty: float = 0, *args, base_market: str = "KRW"
240
+ self, acc_num: str, order_id: str, symbol: str | None = "", qty: float = 0, *args, base_market: str = "KRW"
233
241
  ):
234
242
  """
235
243
  미체결 주문 취소
@@ -237,7 +245,7 @@ class Exchange:
237
245
  Args:
238
246
  acc_num (str): 계좌정보(계좌번호, 지갑정보)
239
247
  order_id (str): 주문 정보(주문 id)
240
- symbol (str, optional): 종목정보(종목코드). Defaults to ''.
248
+ symbol (str | None, optional): 종목정보(종목코드). Defaults to ''.
241
249
  qty (float, optional): 수량. Defaults to 0..
242
250
  base_market (str, optional): Market 구분 코드. Defaults to 'KRW'.
243
251
  """
@@ -246,9 +254,9 @@ class Exchange:
246
254
  def fetch_open_order(
247
255
  self,
248
256
  acc_num: str,
249
- symbol: Optional[str] = "",
250
- start: Optional[str] = None,
251
- end: Optional[str] = None,
257
+ symbol: str | None = "",
258
+ start: datetime | None = None,
259
+ end: datetime | None = None,
252
260
  base_market: str = "KRW",
253
261
  ):
254
262
  """
@@ -256,9 +264,9 @@ class Exchange:
256
264
 
257
265
  Args:
258
266
  acc_num (str): 계좌정보(계좌번호, 지갑정보)
259
- symbol (str, optional): 종목정보(종목코드) Defaults to ''.
260
- start (str, optional): 조회 시작일자(YYYYMMDD). Defaults to None.
261
- end (str, optional): 조회 종료일자(YYYYMMDD). Defaults to None.
267
+ symbol (str | None, optional): 종목정보(종목코드) Defaults to ''.
268
+ start (datetime | None, optional): 조회 시작일자. Defaults to None.
269
+ end (datetime | None, optional): 조회 종료일자. Defaults to None.
262
270
  base_market (str, optional): Market 구분 코드. Defaults to 'KRW'.
263
271
  """
264
272
  pass
@@ -266,9 +274,9 @@ class Exchange:
266
274
  def fetch_closed_order(
267
275
  self,
268
276
  acc_num: str,
269
- symbol: Optional[str] = "",
270
- start: Optional[str] = None,
271
- end: Optional[str] = None,
277
+ symbol: str | None = "",
278
+ start: datetime | None = None,
279
+ end: datetime | None = None,
272
280
  base_market: str = "KRW",
273
281
  ):
274
282
  """
@@ -276,9 +284,9 @@ class Exchange:
276
284
 
277
285
  Args:
278
286
  acc_num (str): 계좌정보(계좌번호, 지갑정보)
279
- symbol (str, optional): 종목정보(종목코드) Defaults to ''.
280
- start (str, optional): 조회 시작일자(YYYYMMDD). Defaults to None.
281
- end (str, optional): 조회 종료일자(YYYYMMDD). Defaults to None.
287
+ symbol (str | None, optional): 종목정보(종목코드) Defaults to ''.
288
+ start (datetime | None, optional): 조회 시작일자. Defaults to None.
289
+ end (datetime | None, optional): 조회 종료일자. Defaults to None.
282
290
  base_market (str, optional): Market 구분 코드. Defaults to 'KRW'.
283
291
  """
284
292
  pass
@@ -5,7 +5,7 @@ import toml
5
5
  import os
6
6
  from pathlib import Path
7
7
 
8
- from typing import Any, Dict, List, Literal, Optional
8
+ from typing import Any, Dict, List, Literal
9
9
 
10
10
  from datetime import datetime, UTC
11
11
  import pytz
@@ -232,16 +232,14 @@ class RestExchange(Exchange):
232
232
  security_type,
233
233
  method_type,
234
234
  api_type: Any = "public",
235
- headers: Optional[Any] = None,
236
- body: Optional[Any] = None,
237
- params: Optional[Any] = None,
235
+ headers: Any | None = None,
236
+ body: Any | None = None,
237
+ params: Any | None = None,
238
238
  config={},
239
239
  ):
240
240
  pass
241
241
 
242
- def fetch2(
243
- self, path, security_type, params={}, headers: Optional[Any] = None, body: Optional[Any] = None, config={}
244
- ):
242
+ def fetch2(self, path, security_type, params={}, headers: Any | None = None, body: Any | None = None, config={}):
245
243
  is_activate = self.is_activate(path=path, security_type=security_type)
246
244
  if not is_activate:
247
245
  return {
@@ -266,9 +264,7 @@ class RestExchange(Exchange):
266
264
  request = self.sign(path, security_type, method_type, api_type, headers, body, params, config)
267
265
  return self.fetch(request["url"], request["method"], request["headers"], request["body"], request["params"])
268
266
 
269
- def request(
270
- self, path, security_type, params={}, headers: Optional[Any] = None, body: Optional[Any] = None, config={}
271
- ):
267
+ def request(self, path, security_type, params={}, headers: Any | None = None, body: Any | None = None, config={}):
272
268
  return self.fetch2(path, security_type, params, headers, body, config)
273
269
 
274
270
  # region base method
@@ -296,8 +292,8 @@ class RestExchange(Exchange):
296
292
  self,
297
293
  symbol: str,
298
294
  time_frame: str,
299
- start: Optional[str] = None,
300
- end: Optional[str] = None,
295
+ start: datetime | None = None,
296
+ end: datetime | None = None,
301
297
  base_market: str = "KRW",
302
298
  ) -> ksxt.models.KsxtHistoricalDataResponse:
303
299
  raise NotSupportedError(f"{self.id} {self.fetch_historical_data_index.__qualname__}() is not supported yet.")
@@ -307,8 +303,8 @@ class RestExchange(Exchange):
307
303
  self,
308
304
  symbol: str,
309
305
  time_frame: str,
310
- start: Optional[str] = None,
311
- end: Optional[str] = None,
306
+ start: datetime | None = None,
307
+ end: datetime | None = None,
312
308
  base_market: str = "KRW",
313
309
  ) -> ksxt.models.KsxtHistoricalDataResponse:
314
310
  raise NotSupportedError(f"{self.id} {self.fetch_historical_data.__qualname__}() is not supported yet.")
@@ -323,7 +319,7 @@ class RestExchange(Exchange):
323
319
 
324
320
  @check_token
325
321
  def fetch_balance(
326
- self, acc_num: str, base_market: str = "KRW", excluded_symbols: Optional[list[str]] = None
322
+ self, acc_num: str, base_market: str = "KRW", excluded_symbols: list[str] | None = None
327
323
  ) -> ksxt.models.KsxtBalanceResponse:
328
324
  raise NotSupportedError(f"{self.id} {self.fetch_balance.__qualname__}() is not supported yet.")
329
325
 
@@ -344,12 +340,14 @@ class RestExchange(Exchange):
344
340
  raise NotSupportedError(f"{self.id} {self.fetch_screener.__qualname__}() is not supported yet.")
345
341
 
346
342
  @check_token
347
- def fetch_deposit_history(self, acc_num: str, base_market: str = "KRW") -> ksxt.models.KsxtDepositHistoryResponse:
343
+ def fetch_deposit_history(
344
+ self, acc_num: str, start: datetime | None = None, end: datetime | None = None, base_market: str = "KRW"
345
+ ) -> ksxt.models.KsxtDepositHistoryResponse:
348
346
  raise NotSupportedError(f"{self.id} {self.fetch_deposit_history.__qualname__}() is not supported yet.")
349
347
 
350
348
  @check_token
351
349
  def fetch_withdrawal_history(
352
- self, acc_num: str, base_market: str = "KRW"
350
+ self, acc_num: str, start: datetime | None = None, end: datetime | None = None, base_market: str = "KRW"
353
351
  ) -> ksxt.models.KsxtWithdrawalHistoryResponse:
354
352
  raise NotSupportedError(f"{self.id} {self.fetch_withdrawal_history.__qualname__}() is not supported yet.")
355
353
 
@@ -360,16 +358,16 @@ class RestExchange(Exchange):
360
358
  symbol: str,
361
359
  ticket_type: Literal["EntryLong", "EntryShort", "ExitLong", "ExitShort"],
362
360
  otype: Literal["limit", "market"],
363
- price: Optional[float] = 0,
364
- qty: Optional[float] = 0,
365
- amount: Optional[float] = 0,
361
+ price: float | None = 0,
362
+ qty: float | None = 0,
363
+ amount: float | None = 0,
366
364
  base_market: str = "KRW",
367
365
  ) -> ksxt.models.KsxtCreateOrderResponse:
368
366
  raise NotSupportedError(f"{self.id} {self.create_order.__qualname__}() is not supported yet.")
369
367
 
370
368
  @check_token
371
369
  def cancel_order(
372
- self, acc_num: str, order_id: str, symbol: Optional[str] = "", qty: float = 0, *args, base_market: str = "KRW"
370
+ self, acc_num: str, order_id: str, symbol: str | None = "", qty: float = 0, *args, base_market: str = "KRW"
373
371
  ) -> ksxt.models.KsxtCancelOrderResponse:
374
372
  raise NotSupportedError(f"{self.id} {self.cancel_order.__qualname__}() is not supported yet.")
375
373
 
@@ -381,7 +379,7 @@ class RestExchange(Exchange):
381
379
  price: float,
382
380
  qty: float,
383
381
  *args,
384
- symbol: Optional[str] = "",
382
+ symbol: str | None = "",
385
383
  base_market: str = "KRW",
386
384
  ) -> ksxt.models.KsxtModifyOrderResponse:
387
385
  raise NotSupportedError(f"{self.id} {self.modify_order.__qualname__}() is not supported yet.")
@@ -390,9 +388,9 @@ class RestExchange(Exchange):
390
388
  def fetch_open_order(
391
389
  self,
392
390
  acc_num: str,
393
- symbol: Optional[str] = "",
394
- start: Optional[str] = None,
395
- end: Optional[str] = None,
391
+ symbol: str | None = "",
392
+ start: datetime | None = None,
393
+ end: datetime | None = None,
396
394
  base_market: str = "KRW",
397
395
  ) -> ksxt.models.KsxtOpenOrderResponse:
398
396
  raise NotSupportedError(f"{self.id} {self.fetch_open_order.__qualname__}() is not supported yet.")
@@ -401,9 +399,9 @@ class RestExchange(Exchange):
401
399
  def fetch_closed_order(
402
400
  self,
403
401
  acc_num: str,
404
- symbol: Optional[str] = "",
405
- start: Optional[str] = None,
406
- end: Optional[str] = None,
402
+ symbol: str | None = "",
403
+ start: datetime | None = None,
404
+ end: datetime | None = None,
407
405
  base_market: str = "KRW",
408
406
  ) -> ksxt.models.KsxtClosedOrderResponse:
409
407
  raise NotSupportedError(f"{self.id} {self.fetch_closed_order.__qualname__}() is not supported yet.")
ksxt/bithumb.py CHANGED
@@ -3,7 +3,7 @@ import hashlib
3
3
  import hmac
4
4
  import json
5
5
  import time
6
- from datetime import datetime
6
+ from datetime import datetime, timezone
7
7
  from typing import Any, Dict, List, Literal, Optional
8
8
  from urllib.parse import urlencode
9
9
  import uuid
@@ -119,6 +119,10 @@ class Bithumb(RestExchange, ImplicitAPI):
119
119
  ) -> ksxt.models.KsxtHistoricalDataResponse:
120
120
  params = {"market": self.safe_symbol(base_market=base_market, security=symbol), "count": 200}
121
121
 
122
+ if end:
123
+ end_utc = end.astimezone(timezone.utc)
124
+ params.update({"to": end_utc.strftime("%Y-%m-%d %H:%M:%S")})
125
+
122
126
  common_header = self.create_common_header(request_params=params)
123
127
 
124
128
  # TODO : time_frame 을 어떻게 고정시킬까? 우리는 분봉, 일봉, 주봉, 월봉 만 지원한다고 가정하면?
@@ -142,7 +146,10 @@ class Bithumb(RestExchange, ImplicitAPI):
142
146
  if common_response.success != "0":
143
147
  return ksxt.models.KsxtHistoricalDataResponse(header=common_header, response=common_response, info=None)
144
148
 
145
- parsed_response = self.parser.parse_historical_data(response=response, symbol=symbol, base_market=base_market)
149
+ parsed_response = self.parser.parse_historical_data(
150
+ response=response, symbol=symbol, start=start, end=end, base_market=base_market
151
+ )
152
+
146
153
  return ksxt.models.KsxtHistoricalDataResponse(
147
154
  header=common_header, response=common_response, info=parsed_response
148
155
  )
@@ -341,8 +348,8 @@ class Bithumb(RestExchange, ImplicitAPI):
341
348
  self,
342
349
  acc_num: str,
343
350
  symbol: str | None = "",
344
- start: str | None = None,
345
- end: str | None = None,
351
+ start: datetime | None = None,
352
+ end: datetime | None = None,
346
353
  base_market: str = "KRW",
347
354
  ) -> ksxt.models.KsxtOpenOrderResponse:
348
355
  params = {
@@ -362,7 +369,9 @@ class Bithumb(RestExchange, ImplicitAPI):
362
369
  return ksxt.models.KsxtOpenOrderResponse(header=common_header, response=common_response, info=None)
363
370
 
364
371
  # 데이터 파싱
365
- parsed_info = self.parser.parse_open_order_history(response, base_market)
372
+ parsed_info = self.parser.parse_open_order_history(
373
+ response=response, start=start, end=end, base_market=base_market
374
+ )
366
375
 
367
376
  return ksxt.models.KsxtOpenOrderResponse(header=common_header, response=common_response, info=parsed_info)
368
377
 
@@ -370,8 +379,8 @@ class Bithumb(RestExchange, ImplicitAPI):
370
379
  self,
371
380
  acc_num: str,
372
381
  symbol: Optional[str] = "",
373
- start: Optional[str] = None,
374
- end: Optional[str] = None,
382
+ start: datetime | None = None,
383
+ end: datetime | None = None,
375
384
  base_market: str = "KRW",
376
385
  ) -> ksxt.models.KsxtClosedOrderResponse:
377
386
  params = {"market": self.safe_symbol(base_market, symbol), "uuids": "", "state": "done"}
@@ -387,7 +396,9 @@ class Bithumb(RestExchange, ImplicitAPI):
387
396
  return ksxt.models.KsxtClosedOrderResponse(header=common_header, response=common_response, info=None)
388
397
 
389
398
  # 데이터 파싱
390
- parsed_info = self.parser.parse_closed_order_history(response, base_market)
399
+ parsed_info = self.parser.parse_closed_order_history(
400
+ response=response, start=start, end=end, base_market=base_market
401
+ )
391
402
 
392
403
  return ksxt.models.KsxtClosedOrderResponse(header=common_header, response=common_response, info=parsed_info)
393
404
 
@@ -464,7 +475,7 @@ class Bithumb(RestExchange, ImplicitAPI):
464
475
  return ksxt.models.KsxtCreateOrderResponse(header=common_header, response=common_response, info=parsed_info)
465
476
 
466
477
  def fetch_withdrawal_history(
467
- self, acc_num: str, base_market: str = "KRW"
478
+ self, acc_num: str, start: datetime | None = None, end: datetime | None = None, base_market: str = "KRW"
468
479
  ) -> ksxt.models.KsxtWithdrawalHistoryResponse:
469
480
  params = {"state": "done", "uuids": "", "txids": ""}
470
481
 
@@ -479,13 +490,17 @@ class Bithumb(RestExchange, ImplicitAPI):
479
490
  return ksxt.models.KsxtWithdrawalHistoryResponse(header=common_header, response=common_response, info=None)
480
491
 
481
492
  # 데이터 파싱
482
- parsed_info = self.parser.parse_withdrawal_history(response)
493
+ parsed_info = self.parser.parse_withdrawal_history(
494
+ response=response, start=start, end=end, base_market=base_market
495
+ )
483
496
 
484
497
  return ksxt.models.KsxtWithdrawalHistoryResponse(
485
498
  header=common_header, response=common_response, info=parsed_info
486
499
  )
487
500
 
488
- def fetch_deposit_history(self, acc_num: str, base_market: str = "KRW") -> ksxt.models.KsxtDepositHistoryResponse:
501
+ def fetch_deposit_history(
502
+ self, acc_num: str, start: datetime | None = None, end: datetime | None = None, base_market: str = "KRW"
503
+ ) -> ksxt.models.KsxtDepositHistoryResponse:
489
504
  params = {"state": "ACCEPTED", "uuids": "", "txids": ""}
490
505
 
491
506
  common_header = self.create_common_header(request_params=params)
@@ -499,7 +514,9 @@ class Bithumb(RestExchange, ImplicitAPI):
499
514
  return ksxt.models.KsxtWithdrawalHistoryResponse(header=common_header, response=common_response, info=None)
500
515
 
501
516
  # 데이터 파싱
502
- parsed_info = self.parser.parse_deposit_history(response)
517
+ parsed_info = self.parser.parse_deposit_history(
518
+ response=response, start=start, end=end, base_market=base_market
519
+ )
503
520
 
504
521
  return ksxt.models.KsxtWithdrawalHistoryResponse(
505
522
  header=common_header, response=common_response, info=parsed_info
ksxt/config/token.toml CHANGED
@@ -1,7 +1,7 @@
1
- [PS80UIBxOj1XGF1Dl9eRdJa8mVRtQqvnV2y1]
2
- token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJ0b2tlbiIsImF1ZCI6IjJkMWE4MjI0LTVlMjgtNGMwYy1hMTZmLWZmNTFhOGFmMDY2MiIsInByZHRfY2QiOiIiLCJpc3MiOiJ1bm9ndyIsImV4cCI6MTcxNzMxNDQ2MywiaWF0IjoxNzE3MjI4MDYzLCJqdGkiOiJQUzgwVUlCeE9qMVhHRjFEbDllUmRKYThtVlJ0UXF2blYyeTEifQ.8G5fotvUupZonIAsEEGEC0810sqGayj08-recM4smwdRA23-fE2HISzl4HY9wHlPtkYwVMr0svZlo9HIrR-mlw"
3
- expired = "2024-06-02 16:47:43"
1
+ [PSXkvBM1hQXJDRHg2rLvC7Tr8SoyPudlbx9o]
2
+ token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJ0b2tlbiIsImF1ZCI6ImQ0N2EzYjY4LTlkMjQtNGE3YS04YmU2LTNjOWI5MzVmZDZhZCIsInByZHRfY2QiOiIiLCJpc3MiOiJ1bm9ndyIsImV4cCI6MTcyMzAzOTYzOSwiaWF0IjoxNzIyOTUzMjM5LCJqdGkiOiJQU1hrdkJNMWhRWEpEUkhnMnJMdkM3VHI4U295UHVkbGJ4OW8ifQ.573I5Sdj6339IWT5gxhdTFFeWCJDu_ukVAu5QbH9X_SU_laTjhFPttlKBn3HJZzmhYBV89BBcwnYiCwGFU9PFg"
3
+ expired = 2024-08-07T23:07:19
4
4
 
5
- [PSCWKArP3T1L4qMgyZ4DXIDlqcaK48jJW1J5]
6
- token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJ0b2tlbiIsImF1ZCI6IjVjMWYzMWZhLTViYzEtNGM1OS04OGY1LTk5OTU5NmExMmMzMCIsInByZHRfY2QiOiIiLCJpc3MiOiJ1bm9ndyIsImV4cCI6MTcxODAwNDQ4NywiaWF0IjoxNzE3OTE4MDg3LCJqdGkiOiJQU0NXS0FyUDNUMUw0cU1neVo0RFhJRGxxY2FLNDhqSlcxSjUifQ.D6R4xlYKqZQykIyQUA5SgB6vxIEG33f_m_MzSrB9xGRdVKjcr0CyMleWeenyTZLAu6hQpu-3133uYachjI1zjw"
7
- expired = "2024-06-10 16:28:07"
5
+ [PSo9UuHWHtg1QzRkyu1WeXYERyUkpRK9LSii]
6
+ token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJ0b2tlbiIsImF1ZCI6ImNhY2NjNGZhLWMxMzktNGE5MC1hNjg2LTI2OTVmZmNiZmQ0NyIsInByZHRfY2QiOiIiLCJpc3MiOiJ1bm9ndyIsImV4cCI6MTcyMzM3ODExNSwiaWF0IjoxNzIzMjkxNzE1LCJqdGkiOiJQU285VXVIV0h0ZzFRelJreXUxV2VYWUVSeVVrcFJLOUxTaWkifQ.EnsBporS5hoD7Prx_fvXoklkxvx1u0Swp3jL9MXv3GnXtU_totbAtfDqsHWexQGJNqgEAPe6Bd2L2M0rCNUpCg"
7
+ expired = 2024-08-11T21:08:35
ksxt/koreainvest.py CHANGED
@@ -248,7 +248,12 @@ class KoreaInvest(RestExchange, ImplicitAPI):
248
248
 
249
249
  @RestExchange.check_token
250
250
  def fetch_historical_data_index(
251
- self, symbol: str, time_frame: str, start: str | None = None, end: str | None = None, base_market: str = "KRW"
251
+ self,
252
+ symbol: str,
253
+ time_frame: str,
254
+ start: datetime | None = None,
255
+ end: datetime | None = None,
256
+ base_market: str = "KRW",
252
257
  ) -> ksxt.models.KsxtHistoricalDataResponse:
253
258
  if time_frame.endswith("D"):
254
259
  param_code = "D"
@@ -285,13 +290,22 @@ class KoreaInvest(RestExchange, ImplicitAPI):
285
290
  if common_response.success != "0":
286
291
  return ksxt.models.KsxtHistoricalDataResponse(header=common_header, response=common_response, info=None)
287
292
 
288
- parsed_info = self.parser.parse_historical_index_data(response=response, symbol=symbol, base_market=base_market)
293
+ parsed_response = self.parser.parse_historical_index_data(
294
+ response=response, symbol=symbol, start=start, end=end, base_market=base_market
295
+ )
289
296
 
290
- return ksxt.models.KsxtHistoricalDataResponse(header=common_header, response=common_response, info=parsed_info)
297
+ return ksxt.models.KsxtHistoricalDataResponse(
298
+ header=common_header, response=common_response, info=parsed_response
299
+ )
291
300
 
292
301
  @RestExchange.check_token
293
302
  def fetch_historical_data(
294
- self, symbol: str, time_frame: str, start: str | None = None, end: str | None = None, base_market: str = "KRW"
303
+ self,
304
+ symbol: str,
305
+ time_frame: str,
306
+ start: datetime | None = None,
307
+ end: datetime | None = None,
308
+ base_market: str = "KRW",
295
309
  ) -> ksxt.models.KsxtHistoricalDataResponse:
296
310
  if time_frame.endswith("D"):
297
311
  param_code = "D"
@@ -341,9 +355,13 @@ class KoreaInvest(RestExchange, ImplicitAPI):
341
355
  if common_response.success != "0":
342
356
  return ksxt.models.KsxtHistoricalDataResponse(header=common_header, response=common_response, info=None)
343
357
 
344
- parsed_info = self.parser.parse_historical_data(response=response, symbol=symbol, base_market=base_market)
358
+ parsed_response = self.parser.parse_historical_data(
359
+ response=response, symbol=symbol, start=start, end=end, base_market=base_market
360
+ )
345
361
 
346
- return ksxt.models.KsxtHistoricalDataResponse(header=common_header, response=common_response, info=parsed_info)
362
+ return ksxt.models.KsxtHistoricalDataResponse(
363
+ header=common_header, response=common_response, info=parsed_response
364
+ )
347
365
 
348
366
  @RestExchange.check_token
349
367
  def modify_order(
Binary file
@@ -13,6 +13,8 @@ class TransactionInfo(BaseModel):
13
13
 
14
14
  # 금액
15
15
  amount: float
16
+ # 세금
17
+ tax: Optional[float] = 0
16
18
  # 수수료
17
19
  fee: Optional[float] = 0
18
20