ksxt 1.0.3__py3-none-any.whl → 1.0.4__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 (76) 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/async_/__pycache__/__init__.cpython-312.pyc +0 -0
  10. ksxt/async_/__pycache__/bithumb.cpython-312.pyc +0 -0
  11. ksxt/async_/__pycache__/koreainvest.cpython-312.pyc +0 -0
  12. ksxt/async_/__pycache__/upbit.cpython-312.pyc +0 -0
  13. ksxt/async_/base/__pycache__/__init__.cpython-312.pyc +0 -0
  14. ksxt/async_/base/__pycache__/async_exchange.cpython-312.pyc +0 -0
  15. ksxt/async_/base/__pycache__/throttler.cpython-312.pyc +0 -0
  16. ksxt/async_/base/async_exchange.py +3 -1
  17. ksxt/async_/bithumb.py +4 -2
  18. ksxt/async_/koreainvest.py +6 -2
  19. ksxt/async_/upbit.py +6 -2
  20. ksxt/base/__pycache__/__init__.cpython-312.pyc +0 -0
  21. ksxt/base/__pycache__/errors.cpython-312.pyc +0 -0
  22. ksxt/base/__pycache__/exchange.cpython-312.pyc +0 -0
  23. ksxt/base/__pycache__/rate_limiter.cpython-312.pyc +0 -0
  24. ksxt/base/__pycache__/rest_exchange.cpython-312.pyc +0 -0
  25. ksxt/base/__pycache__/types.cpython-312.pyc +0 -0
  26. ksxt/base/exchange.py +4 -45
  27. ksxt/base/rest_exchange.py +3 -2
  28. ksxt/bithumb.py +4 -2
  29. ksxt/config/__pycache__/__init__.cpython-312.pyc +0 -0
  30. ksxt/config/token.toml +6 -6
  31. ksxt/koreainvest.py +6 -2
  32. ksxt/market/__pycache__/base.cpython-312.pyc +0 -0
  33. ksxt/market/__pycache__/db.cpython-312.pyc +0 -0
  34. ksxt/market/__pycache__/logging.cpython-312.pyc +0 -0
  35. ksxt/market/__pycache__/manager.cpython-312.pyc +0 -0
  36. ksxt/market/__pycache__/markets.cpython-312.pyc +0 -0
  37. ksxt/market/krx/__pycache__/kosdaq.cpython-312.pyc +0 -0
  38. ksxt/market/krx/__pycache__/kospi.cpython-312.pyc +0 -0
  39. ksxt/market/krx/__pycache__/stock.cpython-312.pyc +0 -0
  40. ksxt/market/us/__pycache__/amex.cpython-312.pyc +0 -0
  41. ksxt/market/us/__pycache__/nasdaq.cpython-312.pyc +0 -0
  42. ksxt/market/us/__pycache__/nyse.cpython-312.pyc +0 -0
  43. ksxt/market/us/__pycache__/stock.cpython-312.pyc +0 -0
  44. ksxt/models/__pycache__/__init__.cpython-312.pyc +0 -0
  45. ksxt/models/__pycache__/balance.cpython-312.pyc +0 -0
  46. ksxt/models/__pycache__/cash.cpython-312.pyc +0 -0
  47. ksxt/models/__pycache__/common.cpython-312.pyc +0 -0
  48. ksxt/models/__pycache__/error.cpython-312.pyc +0 -0
  49. ksxt/models/__pycache__/historical.cpython-312.pyc +0 -0
  50. ksxt/models/__pycache__/market.cpython-312.pyc +0 -0
  51. ksxt/models/__pycache__/order.cpython-312.pyc +0 -0
  52. ksxt/models/__pycache__/orderbook.cpython-312.pyc +0 -0
  53. ksxt/models/__pycache__/ticker.cpython-312.pyc +0 -0
  54. ksxt/models/__pycache__/token.cpython-312.pyc +0 -0
  55. ksxt/models/__pycache__/transaction.cpython-312.pyc +0 -0
  56. ksxt/parser/__pycache__/bithumb.cpython-312.pyc +0 -0
  57. ksxt/parser/__pycache__/koreainvest.cpython-312.pyc +0 -0
  58. ksxt/parser/__pycache__/parser.cpython-312.pyc +0 -0
  59. ksxt/parser/__pycache__/upbit.cpython-312.pyc +0 -0
  60. ksxt/parser/bithumb.py +19 -6
  61. ksxt/parser/koreainvest.py +10 -4
  62. ksxt/parser/parser.py +4 -2
  63. ksxt/parser/upbit.py +19 -6
  64. ksxt/upbit.py +6 -2
  65. ksxt/utils/__pycache__/safer.cpython-312.pyc +0 -0
  66. ksxt/utils/__pycache__/sorter.cpython-312.pyc +0 -0
  67. ksxt/utils/__pycache__/timer.cpython-312.pyc +0 -0
  68. {ksxt-1.0.3.dist-info → ksxt-1.0.4.dist-info}/METADATA +1 -1
  69. ksxt-1.0.4.dist-info/RECORD +120 -0
  70. {ksxt-1.0.3.dist-info → ksxt-1.0.4.dist-info}/WHEEL +1 -1
  71. ksxt/api/auto/__pycache__/bithumb.cpython-312.pyc +0 -0
  72. ksxt/api/auto/__pycache__/koreainvest.cpython-312.pyc +0 -0
  73. ksxt/api/auto/__pycache__/upbit.cpython-312.pyc +0 -0
  74. ksxt-1.0.3.dist-info/RECORD +0 -123
  75. {ksxt-1.0.3.dist-info → ksxt-1.0.4.dist-info}/LICENSE.txt +0 -0
  76. {ksxt-1.0.3.dist-info → ksxt-1.0.4.dist-info}/top_level.txt +0 -0
Binary file
Binary file
Binary file
Binary file
@@ -142,7 +142,9 @@ class AsyncExchange(RestExchange):
142
142
  async def fetch_user_info(self, base_market: str = "KRW"):
143
143
  raise NotSupportedError(f"{self.id} {self.fetch_user_info.__qualname__}() is not supported yet.")
144
144
 
145
- async def fetch_balance(self, acc_num: str, base_market: str = "KRW") -> ksxt.models.KsxtBalanceResponse:
145
+ async def fetch_balance(
146
+ self, acc_num: str, base_market: str = "KRW", excluded_symbols: Optional[list[str]] = None
147
+ ) -> ksxt.models.KsxtBalanceResponse:
146
148
  raise NotSupportedError(f"{self.id} {self.fetch_balance.__qualname__}() is not supported yet.")
147
149
 
148
150
  async def fetch_cash(self, acc_num: str, base_market: str = "KRW") -> ksxt.models.KsxtCashResponse:
ksxt/async_/bithumb.py CHANGED
@@ -219,7 +219,9 @@ class Bithumb(AsyncExchange, ImplicitAPI):
219
219
 
220
220
  return ksxt.models.KsxtMultiOrderBookResponse(header=common_header, response=common_response, info=parsed_info)
221
221
 
222
- async def fetch_balance(self, acc_num: str, base_market: str = "KRW") -> ksxt.models.KsxtBalanceResponse:
222
+ async def fetch_balance(
223
+ self, acc_num: str, base_market: str = "KRW", excluded_symbols: Optional[list[str]] = None
224
+ ) -> ksxt.models.KsxtBalanceResponse:
223
225
  params = {}
224
226
 
225
227
  common_header = self.create_common_header(request_params=params)
@@ -233,7 +235,7 @@ class Bithumb(AsyncExchange, ImplicitAPI):
233
235
  return ksxt.models.KsxtBalanceResponse(header=common_header, response=common_response, info=None)
234
236
 
235
237
  # 데이터 파싱
236
- parsed_info = self.parser.parse_balance(response, base_market)
238
+ parsed_info = self.parser.parse_balance(response, base_market, excluded_symbols=excluded_symbols)
237
239
 
238
240
  return ksxt.models.KsxtBalanceResponse(header=common_header, response=common_response, info=parsed_info)
239
241
 
@@ -124,7 +124,9 @@ class KoreaInvest(AsyncExchange, ImplicitAPI):
124
124
  )
125
125
 
126
126
  @AsyncExchange.check_token
127
- async def fetch_balance(self, acc_num: str, base_market: str = "KRW") -> ksxt.models.KsxtBalanceResponse:
127
+ async def fetch_balance(
128
+ self, acc_num: str, base_market: str = "KRW", excluded_symbols: Optional[list[str]] = None
129
+ ) -> ksxt.models.KsxtBalanceResponse:
128
130
  if base_market == "KRW":
129
131
  params = {
130
132
  "CANO": acc_num[:8],
@@ -150,7 +152,9 @@ class KoreaInvest(AsyncExchange, ImplicitAPI):
150
152
  if common_response.success != "0":
151
153
  return ksxt.models.KsxtBalanceResponse(header=common_header, response=common_response, info=None)
152
154
 
153
- parsed_info = self.parser.parse_balance(response=response, base_market=base_market)
155
+ parsed_info = self.parser.parse_balance(
156
+ response=response, base_market=base_market, excluded_symbols=excluded_symbols
157
+ )
154
158
 
155
159
  return ksxt.models.KsxtBalanceResponse(header=common_header, response=common_response, info=parsed_info)
156
160
 
ksxt/async_/upbit.py CHANGED
@@ -209,7 +209,9 @@ class Upbit(AsyncExchange, ImplicitAPI):
209
209
 
210
210
  return ksxt.models.KsxtMultiOrderBookResponse(header=common_header, response=common_response, info=parsed_info)
211
211
 
212
- async def fetch_balance(self, acc_num: str, base_market: str = "KRW") -> ksxt.models.KsxtBalanceResponse:
212
+ async def fetch_balance(
213
+ self, acc_num: str, base_market: str = "KRW", excluded_symbols: Optional[list[str]] = None
214
+ ) -> ksxt.models.KsxtBalanceResponse:
213
215
  params = {}
214
216
 
215
217
  common_header = self.create_common_header(request_params=params)
@@ -220,7 +222,9 @@ class Upbit(AsyncExchange, ImplicitAPI):
220
222
  if common_response.success != "0":
221
223
  return ksxt.models.KsxtBalanceResponse(header=common_header, response=common_response, info=None)
222
224
 
223
- parsed_info = self.parser.parse_balance(response=response, base_market=base_market)
225
+ parsed_info = self.parser.parse_balance(
226
+ response=response, base_market=base_market, excluded_symbols=excluded_symbols
227
+ )
224
228
 
225
229
  return ksxt.models.KsxtBalanceResponse(header=common_header, response=common_response, info=parsed_info)
226
230
 
Binary file
ksxt/base/exchange.py CHANGED
@@ -24,7 +24,7 @@ class Exchange:
24
24
  session_lifetime = 10
25
25
  # 세션의 마지막 사용 시간
26
26
  session_last_used: time = None
27
-
27
+
28
28
  timeout = 10000 # milliseconds = seconds * 1000
29
29
  synchronous = True
30
30
 
@@ -139,13 +139,14 @@ class Exchange:
139
139
  """
140
140
  pass
141
141
 
142
- def fetch_balance(self, acc_num: str, base_market: str = "KRW"):
142
+ def fetch_balance(self, acc_num: str, base_market: str = "KRW", excluded_symbols: Optional[list[str]] = 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
150
  """
150
151
  pass
151
152
 
@@ -300,48 +301,6 @@ class Exchange:
300
301
 
301
302
  # endregion broker
302
303
 
303
- # TODO : @abstractmethod로 제약을 하는게 나을까?는 고민 필요.
304
- def get_success_response(self, result):
305
- pass
306
-
307
- def get_success_response(self, response_code, msg_code, msg, org_data):
308
- return {
309
- "response": {
310
- # 성공 실패 여부
311
- "success": response_code,
312
- # 응답코드
313
- "code": msg_code,
314
- # 응답메세지
315
- "message": msg,
316
- # 원본 데이터
317
- "info": org_data,
318
- },
319
- "header": {},
320
- }
321
-
322
- def get_error_response(self, error_code, error_message, org_data=None):
323
- return {
324
- "response": {
325
- # 성공 실패 여부
326
- "success": "-1",
327
- # 응답코드
328
- "code": error_code,
329
- # 응답메세지
330
- "message": error_message,
331
- # 원본 데이터
332
- "info": org_data,
333
- },
334
- "header": {},
335
- }
336
-
337
- def update_success_response_header(self, response: dict, header: dict):
338
- response["header"].update(header)
339
- return response
340
-
341
- def update_success_response_body(self, response: dict, body: dict):
342
- response.update(body)
343
- return response
344
-
345
304
  def create_common_response(self, success: str, msg_code: str, msg: str, info: dict) -> CommonResponse:
346
305
  return CommonResponse(success=success, msg_code=msg_code, msg=msg, info=info)
347
306
 
@@ -370,7 +329,7 @@ class Exchange:
370
329
  def set_attr(self, attrs):
371
330
  for key in attrs:
372
331
  if hasattr(self, key) and isinstance(getattr(self, key), dict):
373
- setattr(self, key, self.deep_extend(getattr(self, key), attrs[key]))
332
+ setattr(self, key, Exchange.deep_extend(getattr(self, key), attrs[key]))
374
333
  else:
375
334
  setattr(self, key, attrs[key])
376
335
 
@@ -44,7 +44,6 @@ class RestExchange(Exchange):
44
44
  def __init__(self, config: Dict = None, filename: str = None) -> None:
45
45
  super().__init__()
46
46
 
47
-
48
47
  self.rate_limiters: Dict[str, RateLimiterContext] = {}
49
48
 
50
49
  self.headers = dict() if self.headers is None else self.headers
@@ -323,7 +322,9 @@ class RestExchange(Exchange):
323
322
  raise NotSupportedError(f"{self.id} {self.fetch_user_info.__qualname__}() is not supported yet.")
324
323
 
325
324
  @check_token
326
- def fetch_balance(self, acc_num: str, base_market: str = "KRW") -> ksxt.models.KsxtBalanceResponse:
325
+ def fetch_balance(
326
+ self, acc_num: str, base_market: str = "KRW", excluded_symbols: Optional[list[str]] = None
327
+ ) -> ksxt.models.KsxtBalanceResponse:
327
328
  raise NotSupportedError(f"{self.id} {self.fetch_balance.__qualname__}() is not supported yet.")
328
329
 
329
330
  @check_token
ksxt/bithumb.py CHANGED
@@ -221,7 +221,9 @@ class Bithumb(RestExchange, ImplicitAPI):
221
221
 
222
222
  return ksxt.models.KsxtMultiOrderBookResponse(header=common_header, response=common_response, info=parsed_info)
223
223
 
224
- def fetch_balance(self, acc_num: str, base_market: str = "KRW") -> ksxt.models.KsxtBalanceResponse:
224
+ def fetch_balance(
225
+ self, acc_num: str, base_market: str = "KRW", excluded_symbols: Optional[list[str]] = None
226
+ ) -> ksxt.models.KsxtBalanceResponse:
225
227
  params = {}
226
228
 
227
229
  common_header = self.create_common_header(request_params=params)
@@ -235,7 +237,7 @@ class Bithumb(RestExchange, ImplicitAPI):
235
237
  return ksxt.models.KsxtBalanceResponse(header=common_header, response=common_response, info=None)
236
238
 
237
239
  # 데이터 파싱
238
- parsed_info = self.parser.parse_balance(response, base_market)
240
+ parsed_info = self.parser.parse_balance(response, base_market, excluded_symbols=excluded_symbols)
239
241
 
240
242
  return ksxt.models.KsxtBalanceResponse(header=common_header, response=common_response, info=parsed_info)
241
243
 
ksxt/config/token.toml CHANGED
@@ -1,7 +1,7 @@
1
- [PSXkvBM1hQXJDRHg2rLvC7Tr8SoyPudlbx9o]
2
- token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJ0b2tlbiIsImF1ZCI6ImQ0N2EzYjY4LTlkMjQtNGE3YS04YmU2LTNjOWI5MzVmZDZhZCIsInByZHRfY2QiOiIiLCJpc3MiOiJ1bm9ndyIsImV4cCI6MTcyMzAzOTYzOSwiaWF0IjoxNzIyOTUzMjM5LCJqdGkiOiJQU1hrdkJNMWhRWEpEUkhnMnJMdkM3VHI4U295UHVkbGJ4OW8ifQ.573I5Sdj6339IWT5gxhdTFFeWCJDu_ukVAu5QbH9X_SU_laTjhFPttlKBn3HJZzmhYBV89BBcwnYiCwGFU9PFg"
3
- expired = 2024-08-07T23:07:19
1
+ [PS80UIBxOj1XGF1Dl9eRdJa8mVRtQqvnV2y1]
2
+ token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJ0b2tlbiIsImF1ZCI6IjJkMWE4MjI0LTVlMjgtNGMwYy1hMTZmLWZmNTFhOGFmMDY2MiIsInByZHRfY2QiOiIiLCJpc3MiOiJ1bm9ndyIsImV4cCI6MTcxNzMxNDQ2MywiaWF0IjoxNzE3MjI4MDYzLCJqdGkiOiJQUzgwVUlCeE9qMVhHRjFEbDllUmRKYThtVlJ0UXF2blYyeTEifQ.8G5fotvUupZonIAsEEGEC0810sqGayj08-recM4smwdRA23-fE2HISzl4HY9wHlPtkYwVMr0svZlo9HIrR-mlw"
3
+ expired = "2024-06-02 16:47:43"
4
4
 
5
- [PSo9UuHWHtg1QzRkyu1WeXYERyUkpRK9LSii]
6
- token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJ0b2tlbiIsImF1ZCI6ImNhY2NjNGZhLWMxMzktNGE5MC1hNjg2LTI2OTVmZmNiZmQ0NyIsInByZHRfY2QiOiIiLCJpc3MiOiJ1bm9ndyIsImV4cCI6MTcyMzM3ODExNSwiaWF0IjoxNzIzMjkxNzE1LCJqdGkiOiJQU285VXVIV0h0ZzFRelJreXUxV2VYWUVSeVVrcFJLOUxTaWkifQ.EnsBporS5hoD7Prx_fvXoklkxvx1u0Swp3jL9MXv3GnXtU_totbAtfDqsHWexQGJNqgEAPe6Bd2L2M0rCNUpCg"
7
- expired = 2024-08-11T21:08:35
5
+ [PSCWKArP3T1L4qMgyZ4DXIDlqcaK48jJW1J5]
6
+ token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJ0b2tlbiIsImF1ZCI6IjVjMWYzMWZhLTViYzEtNGM1OS04OGY1LTk5OTU5NmExMmMzMCIsInByZHRfY2QiOiIiLCJpc3MiOiJ1bm9ndyIsImV4cCI6MTcxODAwNDQ4NywiaWF0IjoxNzE3OTE4MDg3LCJqdGkiOiJQU0NXS0FyUDNUMUw0cU1neVo0RFhJRGxxY2FLNDhqSlcxSjUifQ.D6R4xlYKqZQykIyQUA5SgB6vxIEG33f_m_MzSrB9xGRdVKjcr0CyMleWeenyTZLAu6hQpu-3133uYachjI1zjw"
7
+ expired = "2024-06-10 16:28:07"
ksxt/koreainvest.py CHANGED
@@ -124,7 +124,9 @@ class KoreaInvest(RestExchange, ImplicitAPI):
124
124
  )
125
125
 
126
126
  @RestExchange.check_token
127
- def fetch_balance(self, acc_num: str, base_market: str = "KRW") -> ksxt.models.KsxtBalanceResponse:
127
+ def fetch_balance(
128
+ self, acc_num: str, base_market: str = "KRW", excluded_symbols: Optional[list[str]] = None
129
+ ) -> ksxt.models.KsxtBalanceResponse:
128
130
  if base_market == "KRW":
129
131
  params = {
130
132
  "CANO": acc_num[:8],
@@ -150,7 +152,9 @@ class KoreaInvest(RestExchange, ImplicitAPI):
150
152
  if common_response.success != "0":
151
153
  return ksxt.models.KsxtBalanceResponse(header=common_header, response=common_response, info=None)
152
154
 
153
- parsed_info = self.parser.parse_balance(response=response, base_market=base_market)
155
+ parsed_info = self.parser.parse_balance(
156
+ response=response, base_market=base_market, excluded_symbols=excluded_symbols
157
+ )
154
158
 
155
159
  return ksxt.models.KsxtBalanceResponse(header=common_header, response=common_response, info=parsed_info)
156
160
 
Binary file
ksxt/parser/bithumb.py CHANGED
@@ -1,6 +1,6 @@
1
1
  from datetime import datetime
2
2
  from operator import attrgetter
3
- from typing import Dict, List
3
+ from typing import Dict, List, Optional
4
4
 
5
5
  from ksxt.models.transaction import (
6
6
  ClosedOrderHistory,
@@ -160,9 +160,19 @@ class BithumbParser(BaseParser):
160
160
 
161
161
  return ask_data, bid_data
162
162
 
163
- def parse_balance(self, response: List[Dict], base_market: str = "KRW") -> BalanceInfo:
164
- # currency가 'KRW'가 아닌 항목만 필터링
165
- filtered_data = [data for data in response if data["currency"] != base_market]
163
+ def parse_balance(
164
+ self, response: List[Dict], base_market: str = "KRW", excluded_symbols: Optional[list[str]] = None
165
+ ) -> BalanceInfo:
166
+ # 1. Filter out entries where 'currency' is not the base_market
167
+ # 2. Ensure 'unit_currency' is the base_market
168
+ # 3. Exclude entries where 'currency' is in excluded_symbols
169
+ filtered_data = [
170
+ data
171
+ for data in response
172
+ if data["currency"] != base_market
173
+ and data["unit_currency"] == base_market
174
+ and (excluded_symbols is None or data["currency"] not in excluded_symbols)
175
+ ]
166
176
 
167
177
  # Initialize balance list
168
178
  balances = [self._parse_balance(data, base_market) for data in filtered_data]
@@ -196,8 +206,11 @@ class BithumbParser(BaseParser):
196
206
  )
197
207
 
198
208
  def parse_cash(self, response: List[Dict], base_market: str = "KRW") -> CashInfo:
199
- # currency가 'KRW' 항목만 필터링
200
- filtered_data = [data for data in response if data["currency"] == base_market]
209
+ # 1. Filter entries where 'currency' is equal to 'base_market'
210
+ # 2. Ensure 'unit_currency' is also equal to 'base_market'
211
+ filtered_data = [
212
+ data for data in response if data["currency"] == base_market and data["unit_currency"] == base_market
213
+ ]
201
214
 
202
215
  # 필터링된 데이터가 없으면 기본값으로 CashInfo 반환
203
216
  if not filtered_data:
@@ -1,5 +1,5 @@
1
1
  from datetime import datetime
2
- from typing import Dict, List
2
+ from typing import Dict, List, Optional
3
3
 
4
4
  from ksxt.models.balance import BalanceData, BalanceInfo
5
5
  from ksxt.models.cash import CashInfo
@@ -153,11 +153,17 @@ class KoreaInvestParser(BaseParser):
153
153
 
154
154
  return ask_data, bid_data
155
155
 
156
- def parse_balance(self, response: List[Dict], base_market: str = "KRW") -> BalanceInfo:
156
+ def parse_balance(
157
+ self, response: List[Dict], base_market: str = "KRW", excluded_symbols: Optional[list[str]] = None
158
+ ) -> BalanceInfo:
157
159
  safe_response = safer.safe_value(response, "output1")
158
160
 
159
- # Initialize balance list
160
- balances = [self._parse_balance(_, base_market) for _ in safe_response]
161
+ # Initialize balance list with filtering
162
+ balances = [
163
+ self._parse_balance(_, base_market)
164
+ for _ in safe_response
165
+ if excluded_symbols is None or safer.safe_string(_, "pdno") not in excluded_symbols
166
+ ]
161
167
 
162
168
  # 총 매입금액
163
169
  total_amount = sum(bal.price * bal.qty for bal in balances)
ksxt/parser/parser.py CHANGED
@@ -1,4 +1,4 @@
1
- from typing import Dict, List
1
+ from typing import Dict, List, Optional
2
2
  import inspect
3
3
 
4
4
  from ksxt.models.balance import BalanceData, BalanceInfo
@@ -62,7 +62,9 @@ class BaseParser:
62
62
  ) -> tuple[OrderBookData, OrderBookData]:
63
63
  self._raise_not_implemented_error()
64
64
 
65
- def parse_balance(self, response: List[Dict], base_market: str = "KRW") -> BalanceInfo:
65
+ def parse_balance(
66
+ self, response: List[Dict], base_market: str = "KRW", excluded_symbols: Optional[list[str]] = None
67
+ ) -> BalanceInfo:
66
68
  self._raise_not_implemented_error()
67
69
 
68
70
  def _parse_balance(self, data: Dict, base_market: str = "KRW") -> BalanceData:
ksxt/parser/upbit.py CHANGED
@@ -1,6 +1,6 @@
1
1
  from datetime import datetime
2
2
  from operator import attrgetter
3
- from typing import Dict, List
3
+ from typing import Dict, List, Optional
4
4
 
5
5
  from ksxt.models.balance import BalanceData, BalanceInfo
6
6
  from ksxt.models.cash import CashInfo
@@ -166,9 +166,19 @@ class UpbitParser(BaseParser):
166
166
 
167
167
  return ask_data, bid_data
168
168
 
169
- def parse_balance(self, response: List[Dict], base_market: str = "KRW") -> BalanceInfo:
170
- # currency가 'KRW'가 아닌 항목만 필터링
171
- filtered_data = [data for data in response if data["currency"] != base_market]
169
+ def parse_balance(
170
+ self, response: List[Dict], base_market: str = "KRW", excluded_symbols: Optional[list[str]] = None
171
+ ) -> BalanceInfo:
172
+ # 1. Filter out entries where 'currency' is not the base_market
173
+ # 2. Ensure 'unit_currency' is the base_market
174
+ # 3. Exclude entries where 'currency' is in excluded_symbols
175
+ filtered_data = [
176
+ data
177
+ for data in response
178
+ if data["currency"] != base_market
179
+ and data["unit_currency"] == base_market
180
+ and (excluded_symbols is None or data["currency"] not in excluded_symbols)
181
+ ]
172
182
 
173
183
  # Initialize balance list
174
184
  balances = [self._parse_balance(data, base_market) for data in filtered_data]
@@ -202,8 +212,11 @@ class UpbitParser(BaseParser):
202
212
  )
203
213
 
204
214
  def parse_cash(self, response: List[Dict], base_market: str = "KRW") -> CashInfo:
205
- # currency가 'KRW' 항목만 필터링
206
- filtered_data = [data for data in response if data["currency"] == base_market]
215
+ # 1. Filter entries where 'currency' is equal to 'base_market'
216
+ # 2. Ensure 'unit_currency' is also equal to 'base_market'
217
+ filtered_data = [
218
+ data for data in response if data["currency"] == base_market and data["unit_currency"] == base_market
219
+ ]
207
220
 
208
221
  # 필터링된 데이터가 없으면 기본값으로 CashInfo 반환
209
222
  if not filtered_data:
ksxt/upbit.py CHANGED
@@ -224,7 +224,9 @@ class Upbit(RestExchange, ImplicitAPI):
224
224
 
225
225
  return ksxt.models.KsxtMultiOrderBookResponse(header=common_header, response=common_response, info=parsed_info)
226
226
 
227
- def fetch_balance(self, acc_num: str, base_market: str = "KRW") -> ksxt.models.KsxtBalanceResponse:
227
+ def fetch_balance(
228
+ self, acc_num: str, base_market: str = "KRW", excluded_symbols: Optional[list[str]] = None
229
+ ) -> ksxt.models.KsxtBalanceResponse:
228
230
  params = {}
229
231
 
230
232
  common_header = self.create_common_header(request_params=params)
@@ -235,7 +237,9 @@ class Upbit(RestExchange, ImplicitAPI):
235
237
  if common_response.success != "0":
236
238
  return ksxt.models.KsxtBalanceResponse(header=common_header, response=common_response, info=None)
237
239
 
238
- parsed_info = self.parser.parse_balance(response=response, base_market=base_market)
240
+ parsed_info = self.parser.parse_balance(
241
+ response=response, base_market=base_market, excluded_symbols=excluded_symbols
242
+ )
239
243
 
240
244
  return ksxt.models.KsxtBalanceResponse(header=common_header, response=common_response, info=parsed_info)
241
245
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ksxt
3
- Version: 1.0.3
3
+ Version: 1.0.4
4
4
  License: MIT License
5
5
 
6
6
  Copyright © 2023 AMOSA
@@ -0,0 +1,120 @@
1
+ ksxt/__init__.py,sha256=Q4kbXuxaCcQg5Z1T2z31lrUc5Cr95RIyv-y6hNf3R0E,131
2
+ ksxt/bithumb.py,sha256=Qx-y7E87z5ZsO6uzZ6dS1Qq5Fk2AX-jlTS2CJss_JkE,21502
3
+ ksxt/koreainvest.py,sha256=rvLGd_q_lNv7V0PeCuqYHP8eHoiUObqwoWl3bB8l3IQ,20232
4
+ ksxt/upbit.py,sha256=Umg6TOoUccF4z3c1iP4eWXl7kXEM5XJ9o0DfF9ewHRs,21820
5
+ ksxt/__pycache__/__init__.cpython-312.pyc,sha256=wOfyuexJUbv8R-aktGSuw5cGx_Nz9O0ReqF9npfS50Q,311
6
+ ksxt/__pycache__/bithumb.cpython-312.pyc,sha256=WTuSamfMxMo4VHrEiIlQS03JavwyzDMnRga37TwcEd8,24877
7
+ ksxt/__pycache__/koreainvest.cpython-312.pyc,sha256=oRhvDNMaZ1ZYcT3dZFD7wo2TFZpW1dBSOI2fqZ6HmLA,22187
8
+ ksxt/__pycache__/upbit.cpython-312.pyc,sha256=Vzq0OZTx_L8LDSHOqBSxnhswbeqSS0HFVEcBVupv9z4,25284
9
+ ksxt/api/__init__.py,sha256=CZ8AedRG8O9vEdSqTaot5sV3nwpxPZoVOYwrFCLUo6M,736
10
+ ksxt/api/bithumb.py,sha256=6apoSNoiEOIkR6xQu4rtCSz7sdNdx3BHeu8-m8omh6E,2177
11
+ ksxt/api/koreainvest.py,sha256=93BASTUUsw39APRFxVqlaOu-keEFuIO3MvHX_6g-AAs,2159
12
+ ksxt/api/upbit.py,sha256=CQN-A0gVoeNoHTZhH8kCaGk1svaOvo5HDyVFfXou_6A,2704
13
+ ksxt/api/__pycache__/__init__.cpython-312.pyc,sha256=iXy-NxFPT7ut0S54NSloMaKSBgLheTZ4eASLBnswIf8,1375
14
+ ksxt/api/__pycache__/bithumb.cpython-312.pyc,sha256=EqVVkh51N1nvdZxSExExdCFpId9yFxBfd8GyTrdVf8w,2560
15
+ ksxt/api/__pycache__/koreainvest.cpython-312.pyc,sha256=833_xjY1AgWs9FGtxN-5E1bIeMQs19Ez1XRpftmZNYg,2088
16
+ ksxt/api/__pycache__/upbit.cpython-312.pyc,sha256=ev6YXi1HICMe3pT68SP1CVF81fUs6gWanbZO1tmJvBM,3015
17
+ ksxt/api/auto/api_generator.py,sha256=R8Q7uFN1wDr_0CUsJJ1nmZhoDBwzjPlKUXrNCsY9QKU,2540
18
+ ksxt/api/auto/bithumb.py,sha256=n6ctGefq28i5CMiItLF1xOZgeDP9F9em4HXfoPUcmqw,1261
19
+ ksxt/api/auto/koreainvest.py,sha256=z4Bf3C7g2W-eQP99oBeM_J0mq2D3PkbQaulrDwxJB04,1582
20
+ ksxt/api/auto/upbit.py,sha256=CtSG0jziqJR4FInHvwDisJfMWCUrUIQQcNPuCGGR7Do,1467
21
+ ksxt/async_/__init__.py,sha256=ztfV65aN2mXamQSfVm3GLYB6cszkvsCSlUyhfe2H_2M,186
22
+ ksxt/async_/bithumb.py,sha256=7bCbNfQeI7qOFng0AtaR1-jpAM7fZ-NcFqAtEy8oYzA,19382
23
+ ksxt/async_/koreainvest.py,sha256=4GWi9e9jQnlpiglGAUdsQH2Ictj1-6TgRtgGBjXq-Kk,20399
24
+ ksxt/async_/upbit.py,sha256=GCfkhTTIXWRAUX4dfXW80X8TwTNt_CppTJGImKsEuoU,21368
25
+ ksxt/async_/__pycache__/__init__.cpython-312.pyc,sha256=iIsmwj1LPoOUx4ad9K2yCdmVi5vXv23kOTUX7I5NGx4,380
26
+ ksxt/async_/__pycache__/bithumb.cpython-312.pyc,sha256=6jOxYF1WfEIgYO6gCLnuVCZmk-5l20rzGGjwVExQ0K0,23574
27
+ ksxt/async_/__pycache__/koreainvest.cpython-312.pyc,sha256=hMgizmU9ltLWkXFdhEab13xyH9PrPus3lq1WZNt50BU,23042
28
+ ksxt/async_/__pycache__/upbit.cpython-312.pyc,sha256=_0HMOPvsAbLhe1GSRcCZ6ATl1vabBvRBnp0YCZzK3so,26462
29
+ ksxt/async_/base/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
+ ksxt/async_/base/async_exchange.py,sha256=TTcUMT4dwp6ZdTisnqIe7HEpsEdLP32xbXnTf_NOcLU,9468
31
+ ksxt/async_/base/__pycache__/__init__.cpython-312.pyc,sha256=jREIi8ul1C01r_-NcGb44P6KWeLzw0qVRsaHaegOf_0,153
32
+ ksxt/async_/base/__pycache__/async_exchange.cpython-312.pyc,sha256=NWkCjxTjcAW874O9UG8N_VwXYgvo9pgbtr_iTPzmi1E,15527
33
+ ksxt/async_/base/__pycache__/throttler.cpython-312.pyc,sha256=wNDfiAHgLIXbSPtK4BOYjnnsWcZSO-Cq4NQXhzrJQpM,3192
34
+ ksxt/base/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
+ ksxt/base/com_exchange.py,sha256=q7C3Bc5q4ENvNGoghnQCN7YLttgwmFoNj9WsH5qxXNQ,287
36
+ ksxt/base/errors.py,sha256=msGHmm9YGUOXOaK_VhOUEt5LvIDMMm6G-io8nQbNgA0,141
37
+ ksxt/base/exchange.py,sha256=9_uEy-l8PQyqgXdHmiD2O1R2RddrMeE_xWQEmMqSo1I,15594
38
+ ksxt/base/rate_limiter.py,sha256=9iF6OB-2u0q4nqtng8Tafn-fM3CVQ-DvdNRJ1aSCS3w,3005
39
+ ksxt/base/rest_exchange.py,sha256=ikiYypTr5ud7vOlYHoK46CXmYZ-Tf2FfF2LucT9deEE,15887
40
+ ksxt/base/types.py,sha256=3bd3obJhhX1njy_o4LW8hSAHX2MThOI-mZm6iifwno4,59
41
+ ksxt/base/__pycache__/__init__.cpython-312.pyc,sha256=WnqBpy7gGuw6RNmEVSFdxy4sOZJgZD-fZCJRUbhOHmU,146
42
+ ksxt/base/__pycache__/errors.cpython-312.pyc,sha256=rAZ-JEC6Ga8eAk4FbYv1foQvMiwK2qj8yVSOzPmKAKo,622
43
+ ksxt/base/__pycache__/exchange.cpython-312.pyc,sha256=vPPu--t1CQZrLiDMtuNYgaGCDo-eooKqlz0DhVF5Snw,20784
44
+ ksxt/base/__pycache__/rate_limiter.cpython-312.pyc,sha256=fWueaBMHMPK7Z3_YLJV9bPNPQBax_MF_sEIoqorqwx8,5418
45
+ ksxt/base/__pycache__/rest_exchange.cpython-312.pyc,sha256=VTZ9teukzqZ9zgzQ-0OMQDOkH8dITDVurPQEjxwZ14M,22942
46
+ ksxt/base/__pycache__/types.cpython-312.pyc,sha256=iF742YNlqCX4ZSIJP4FDPd-3765zIr1VWr-XWXisCsA,232
47
+ ksxt/config/__init__.py,sha256=hkQx56FVJD8Gq1A_KzfOqO8BoqJRTX5TnUmqIignnlc,148
48
+ ksxt/config/bithumb.toml,sha256=JgKgHQVATsLcbxKYvekSRonJ4PjJ5x2ejp1eZHHusrQ,11693
49
+ ksxt/config/koreainvest.toml,sha256=XQRSdEgkWlhbfS6AvJRqQJ_8210i__nfFSI9n3GcgqY,11526
50
+ ksxt/config/token.toml,sha256=d2apbR6t929w6gLUg-tJ1JT8q6RKPTdYkghxdF9ZDeY,864
51
+ ksxt/config/upbit.toml,sha256=1aGKZ3HAV28rrTVGZQ418I9NJwhoRh70Vx03oKacIfY,13439
52
+ ksxt/config/__pycache__/__init__.cpython-312.pyc,sha256=R1JKzJvTBlmRvs65EiYpcn8PmiWHfpV0pERid4xZ2hI,425
53
+ ksxt/market/base.py,sha256=SzNPJECU2iWaQEUesI_REW_A0by_Tv4hs4Hv8p_sr0I,6856
54
+ ksxt/market/db.py,sha256=ZPr2WlQRUOjhJm1fwFBrdwWG7UJkEpy5Pr0oEQ3Nqb0,386
55
+ ksxt/market/logging.py,sha256=hkyAhzA72-KCGcVavSOHFSz2FU5QJq_gn6WA6kXs_Pw,698
56
+ ksxt/market/manager.py,sha256=kgXrsjFw4O_BPVM2VxQJbm5ryWPG3L-NX1Pm-pN68jE,7301
57
+ ksxt/market/markets.py,sha256=pExEvlLhoLvs2Ipkp-p8_yG3tFgz3U3yB5VAVqD8qdM,545
58
+ ksxt/market/__pycache__/base.cpython-312.pyc,sha256=IKWXgDHpco0eXRYt8h8XbEF6rlyIXxWwnCGQm-N3yyA,11239
59
+ ksxt/market/__pycache__/db.cpython-312.pyc,sha256=kqPBwumXrs41OHmteoTCACqyV6Y-S_nTf5eCVe3VMi4,692
60
+ ksxt/market/__pycache__/logging.cpython-312.pyc,sha256=lPsvc_7cwrlBniESyf4kk5djKEyCV2NOn_aEtbzE_Ko,1402
61
+ ksxt/market/__pycache__/manager.cpython-312.pyc,sha256=7KBhnZBaej8ncRHPpJ9MjCJKIDbBrSa89gZ_mvlguoE,11784
62
+ ksxt/market/__pycache__/markets.cpython-312.pyc,sha256=PZeLsVyRdEhUkkhdxxkZQZFZTtLMWqLt_G50dojY5yk,745
63
+ ksxt/market/krx/kosdaq.py,sha256=CJDKMPp3utH-bmPrrEAzmFx5GSXk_KVhLDdGCAaxaBQ,18626
64
+ ksxt/market/krx/kospi.py,sha256=lRyA-xCjqdyuB87eHFGooIHtpbjy7WcrQ0Rk2ZnCt40,20466
65
+ ksxt/market/krx/stock.py,sha256=IXx4xNYsQgKhuLz1_S0Bd9Scqd6fip75gafRePAFW7U,8111
66
+ ksxt/market/krx/__pycache__/kosdaq.cpython-312.pyc,sha256=rFQcJnZZvYAg1Yzdr1_RzIpfSRNowTf_UXggn_hqhmY,7517
67
+ ksxt/market/krx/__pycache__/kospi.cpython-312.pyc,sha256=6GIXejbXD7EYKE2tYpE-RfugGn4elXkYkPSaLf4xwtk,8609
68
+ ksxt/market/krx/__pycache__/stock.cpython-312.pyc,sha256=Z1iLzEQHTC5lPPWNxU9UFZHBcPx9iGY3lG6e7X2ReUo,9013
69
+ ksxt/market/us/amex.py,sha256=ZYlfh1x2eiA8P3DfO2PKj6nIE-O4WQNgDM-CsLqFUVs,5510
70
+ ksxt/market/us/nasdaq.py,sha256=OIBJn16veH36Um-Bhr14K0qBu3ZZwPSWi5sj6zxmkVA,5524
71
+ ksxt/market/us/nyse.py,sha256=eCAcz0saj1RFuyfmJc8cjecwGEDIhvkYVkUp941ZOIw,5507
72
+ ksxt/market/us/stock.py,sha256=hRb4RH2kf-1RaNcWLvE5tg2uCcu6LoPZ0Nc1u6Wpzbc,3675
73
+ ksxt/market/us/__pycache__/amex.cpython-312.pyc,sha256=SHkV_qMY-q2VCS_JE_Fg8-hjx2KB5pAO4qIxoPYM1PI,3381
74
+ ksxt/market/us/__pycache__/nasdaq.cpython-312.pyc,sha256=fIBINbfUs3Lz3sC0yTq6b5qJOsj79jE2fOGvT0NxT7k,3395
75
+ ksxt/market/us/__pycache__/nyse.cpython-312.pyc,sha256=3H-9y24xyfB5EoAW4a2WegmtSEcP-9MprVZh-cPtjUo,3378
76
+ ksxt/market/us/__pycache__/stock.cpython-312.pyc,sha256=H4N9d5Xk1jm5Tozq_RqXe-0mNX7KYgEgQvApWi2kkf4,4976
77
+ ksxt/models/__init__.py,sha256=V7Nr0RHOOXithVTQW12hveavnapS8nGhWQ3JIMwDFTc,706
78
+ ksxt/models/balance.py,sha256=zOYclyZA0A-DU8ZIsTDOxXZw3VUYQhfp1u3sTrzXWuE,651
79
+ ksxt/models/cash.py,sha256=sNexdR6Ek-YZ6cVAmre-zf3K30R-6hreHuBQKYzMsPU,303
80
+ ksxt/models/common.py,sha256=HvsNa2wlTeLdnB67untL0UzOQ5r6f2s6Gkfxeh7LTpM,827
81
+ ksxt/models/error.py,sha256=yzpTweHMB-bi7hzD8ATKsK2klJAsbfPEBBa1A5tY6tw,291
82
+ ksxt/models/historical.py,sha256=fWcst4WPimI2Avb4b1kOswfyf3nB4XSMgpTSmm7uTpY,655
83
+ ksxt/models/market.py,sha256=kkH-P1m1HQjJOPT1k4bk9ZgW-_kwIBO_fXHcrRlWlVE,2013
84
+ ksxt/models/order.py,sha256=LJJd-licLirI5WrAM1MItViOX_u5U_fmpBFPpDSdHxE,867
85
+ ksxt/models/orderbook.py,sha256=S1c03QBu1hupN87CMWLgEsh8u2GrZ_Z_BcTUuiKGnR0,773
86
+ ksxt/models/ticker.py,sha256=pPc7GqUOJchLg7qOpKfxhTVpXygF1Otc_M9_KfHFEgY,544
87
+ ksxt/models/token.py,sha256=eUBoX7O0ffC63BN12-1aUjcfE_R1Ylyxr6_U79FLDv0,319
88
+ ksxt/models/transaction.py,sha256=dLPXoWcMzfVf8FAJT69BIDzOboRpqYxvUMcrZeuvICQ,1599
89
+ ksxt/models/__pycache__/__init__.cpython-312.pyc,sha256=LzMo37nDp7HTIZXkLhrB4Xg_SRSrPrLrRMHwZMfnyMY,1033
90
+ ksxt/models/__pycache__/balance.cpython-312.pyc,sha256=1lzLExKkMLOPevF2A8IrGxIiqcrsDTJsQSfrBvrGkpE,1281
91
+ ksxt/models/__pycache__/cash.cpython-312.pyc,sha256=zHfJRVx-50RgXuUvCK1aLRgJaPlOPkH4bbLpdqly8Qw,722
92
+ ksxt/models/__pycache__/common.cpython-312.pyc,sha256=G8yzihcEFUbqS5xm38_tLQahaO509Iq2iiXHdOffbWs,1363
93
+ ksxt/models/__pycache__/error.cpython-312.pyc,sha256=nnbF5rIw8e6kr_fcn-uwD_41Ge0Du2f2vUZpK4zzRFI,774
94
+ ksxt/models/__pycache__/historical.cpython-312.pyc,sha256=TocUsW2T7yOOU29YzSEVAKSLtDwQ77AgGGPJDJTWhlc,1291
95
+ ksxt/models/__pycache__/market.cpython-312.pyc,sha256=uGDE-2ms5RJMJv54egSQ4NiEMh-flMBYijOb46fnsgg,3078
96
+ ksxt/models/__pycache__/order.cpython-312.pyc,sha256=jvesPAK8EDrWCsE8H7UywkNyPdMmwKDWpoHO-BHKEd8,1791
97
+ ksxt/models/__pycache__/orderbook.cpython-312.pyc,sha256=wzEg5vuh78UOhnUvMd_K7SjfIdgPQ9lZpHlHJ4ekqs8,1517
98
+ ksxt/models/__pycache__/ticker.cpython-312.pyc,sha256=k6_mEv_fTMtZOd6BwWUW8du_udB8LnmZqOWbZpjE1lE,1165
99
+ ksxt/models/__pycache__/token.cpython-312.pyc,sha256=DFNk5vUNLM-McE9US441Zfmo7yyCv_Gpxxp350PmNrw,795
100
+ ksxt/models/__pycache__/transaction.cpython-312.pyc,sha256=lSEJNLWcsivMp_DeEv2-zw75EDqKiY3YCN5hQh4fvHY,2779
101
+ ksxt/parser/bithumb.py,sha256=JgPm0psYaBQ5kQy0HJU4tm0Vkd3pUUS-zZ95VA8SGhE,14675
102
+ ksxt/parser/koreainvest.py,sha256=U4Ix-KZtBLEI1FJMapoD7hnNkxj4jiPIBb6nfvPNqSg,15302
103
+ ksxt/parser/parser.py,sha256=3Z8jsYakf0-DgY2iXPpLZGTVnEckllLUH6A1Hc6cY8c,5219
104
+ ksxt/parser/upbit.py,sha256=NnGq-TIJLOrzfee7_miFnClrlNwhzNViEXySokux4_s,15100
105
+ ksxt/parser/__pycache__/bithumb.cpython-312.pyc,sha256=5wmBcLKjdMzDUxIIqxtE8UjDveKlmtEhoDeAViu43Io,18222
106
+ ksxt/parser/__pycache__/koreainvest.cpython-312.pyc,sha256=bnzkel-yjaISbeMjFhIutPuIaRpyQ_yY1lrN8Ic12fc,18716
107
+ ksxt/parser/__pycache__/parser.cpython-312.pyc,sha256=viNLZwr_wqLGBolWwfsizO6bIK2f2O23x2JZbkrYWX8,8451
108
+ ksxt/parser/__pycache__/upbit.cpython-312.pyc,sha256=nKxPpqADKV-k5zwgoSHjC5Jk36tYwCmvhF75vZ0lx98,19015
109
+ ksxt/sample/symbol_sync.ipynb,sha256=dnUOgEKdUuEkDo_6LZjmDtVuNh4PPmCN4Ht7Pz-0L9Y,640081
110
+ ksxt/utils/safer.py,sha256=tlXDU9KDxrrM0HT2bv45hkblIgbEYr02NygdYS0jj6c,1289
111
+ ksxt/utils/sorter.py,sha256=j7eN1Qy7Wx3cXcWyRWyO1fVq-M24TrXvcfewPR5axF4,227
112
+ ksxt/utils/timer.py,sha256=4_rhXdQDFkKshS5utWrgTteIe71tVSTL1zNW-IjOngM,1228
113
+ ksxt/utils/__pycache__/safer.cpython-312.pyc,sha256=UhwkADGcSzG-ZYboesTzUHMGgn5C27UvslVZLp_SsF4,1991
114
+ ksxt/utils/__pycache__/sorter.cpython-312.pyc,sha256=7VUIekH9h5SDsz4L5bjCdSQln-fLgQZII46URitryHI,626
115
+ ksxt/utils/__pycache__/timer.cpython-312.pyc,sha256=8coj4_LWUtYOdFVhaEHyDbDwkt3JKtmQ1pXPtnsROyY,2005
116
+ ksxt-1.0.4.dist-info/LICENSE.txt,sha256=vyuXQcPOZ9BriMQz3h1k3jQTrKGsAjohf8WQHHf6xqo,1080
117
+ ksxt-1.0.4.dist-info/METADATA,sha256=O_D2vj_F9BIpaq26YOA00nda616sWxnFV32w3wOKnnA,1649
118
+ ksxt-1.0.4.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
119
+ ksxt-1.0.4.dist-info/top_level.txt,sha256=XLUhkZCur5Pe0BPUV3J0syngIPz7jBb2YlQR4epo5kI,5
120
+ ksxt-1.0.4.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (74.1.2)
2
+ Generator: setuptools (75.3.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,123 +0,0 @@
1
- ksxt/__init__.py,sha256=Q4kbXuxaCcQg5Z1T2z31lrUc5Cr95RIyv-y6hNf3R0E,131
2
- ksxt/bithumb.py,sha256=0pRy8XamlHZ2ypSeJkqiLbkqos5_l3vLKGmqL_EplS8,21405
3
- ksxt/koreainvest.py,sha256=vBsAtTSq7n2y_2VxADeb4ByuggoS2fw5f4G80dJMBbw,20111
4
- ksxt/upbit.py,sha256=ploO4Q4iX9wUfa6UagY2S5cvZvMHVDXsXF4fbu8723g,21699
5
- ksxt/__pycache__/__init__.cpython-312.pyc,sha256=aBHVFPn-w8foaTpyyvHjFAb4fVLkO3orauFpozqpvv8,309
6
- ksxt/__pycache__/bithumb.cpython-312.pyc,sha256=-LMMeJeyFVIwZIRrcrhI1Eu2NW7YshgeKj5W7WNIN2U,24714
7
- ksxt/__pycache__/koreainvest.cpython-312.pyc,sha256=LlTRWhLISNtaHeK6UcF7r1N8HL1bhDj7Ag4pvNx2dqs,21942
8
- ksxt/__pycache__/upbit.cpython-312.pyc,sha256=ZXauE6uNC1PUjV9y8_2zr9jla8MSCBhL1z4mZ9VPGv4,25109
9
- ksxt/api/__init__.py,sha256=CZ8AedRG8O9vEdSqTaot5sV3nwpxPZoVOYwrFCLUo6M,736
10
- ksxt/api/bithumb.py,sha256=6apoSNoiEOIkR6xQu4rtCSz7sdNdx3BHeu8-m8omh6E,2177
11
- ksxt/api/koreainvest.py,sha256=93BASTUUsw39APRFxVqlaOu-keEFuIO3MvHX_6g-AAs,2159
12
- ksxt/api/upbit.py,sha256=CQN-A0gVoeNoHTZhH8kCaGk1svaOvo5HDyVFfXou_6A,2704
13
- ksxt/api/__pycache__/__init__.cpython-312.pyc,sha256=ADtdUmNtVvjoBuPDCkQpCcl62eIdev63nkOnSu8FRjo,1373
14
- ksxt/api/__pycache__/bithumb.cpython-312.pyc,sha256=emlP-zEVsgcn2M6e7pPMzXM-J2QWGkG-wLmjtNuX04M,2558
15
- ksxt/api/__pycache__/koreainvest.cpython-312.pyc,sha256=fBlvoJBAUl0LC6oSfcqqPZ77zx3dU7puGb8TG3N0UzY,2086
16
- ksxt/api/__pycache__/upbit.cpython-312.pyc,sha256=qAmdXnYMuerUq72es3weWcHykLxCxjO03aHPWW0MDVs,3013
17
- ksxt/api/auto/api_generator.py,sha256=R8Q7uFN1wDr_0CUsJJ1nmZhoDBwzjPlKUXrNCsY9QKU,2540
18
- ksxt/api/auto/bithumb.py,sha256=n6ctGefq28i5CMiItLF1xOZgeDP9F9em4HXfoPUcmqw,1261
19
- ksxt/api/auto/koreainvest.py,sha256=z4Bf3C7g2W-eQP99oBeM_J0mq2D3PkbQaulrDwxJB04,1582
20
- ksxt/api/auto/upbit.py,sha256=CtSG0jziqJR4FInHvwDisJfMWCUrUIQQcNPuCGGR7Do,1467
21
- ksxt/api/auto/__pycache__/bithumb.cpython-312.pyc,sha256=s-R5UHnDxV2DxOugrUdHyu2OWyGpKmf8YoUK3gVKw_8,834
22
- ksxt/api/auto/__pycache__/koreainvest.cpython-312.pyc,sha256=kz6DHIlhPARI_GfYsZzwVz7NoQ6We_yCFrMWLpW0JTQ,968
23
- ksxt/api/auto/__pycache__/upbit.cpython-312.pyc,sha256=LVxuy6pD2QGXmM1kYou2-xWhb4075o9lkPFDpv2z004,965
24
- ksxt/async_/__init__.py,sha256=ztfV65aN2mXamQSfVm3GLYB6cszkvsCSlUyhfe2H_2M,186
25
- ksxt/async_/bithumb.py,sha256=8u87o6HBqU1Ga0-MUBnygrkx6IjwzonImlPV3qZ_zug,19285
26
- ksxt/async_/koreainvest.py,sha256=Mc6nsYPQkmc-kRs-pSNNWzKgqPbw65RCGAvmOQLHFw0,20278
27
- ksxt/async_/upbit.py,sha256=99IC-czWOV6SsKN645BdbM7Rg_oDo8_iwaIzfGxI_i0,21247
28
- ksxt/async_/__pycache__/__init__.cpython-312.pyc,sha256=0kYmKTHaRVZMai7hLh6lRtbRBJYn-b7m8NpMgJ7NmHg,378
29
- ksxt/async_/__pycache__/bithumb.cpython-312.pyc,sha256=hfxlcmX1b-ChXBKk07bw97rKJuGFf1MsnZwP2zNrUYc,23395
30
- ksxt/async_/__pycache__/koreainvest.cpython-312.pyc,sha256=DRiz8LYQLChqH4FVymdKP4q50WnmMLr5sMY5bys1SH8,22778
31
- ksxt/async_/__pycache__/upbit.cpython-312.pyc,sha256=VxXEAIzEuEldKakKwxZioCsyP0fdamR6xWMlmJgMQw4,26271
32
- ksxt/async_/base/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
- ksxt/async_/base/async_exchange.py,sha256=wsX-GCcd5PgdVyJVskcKxF-fECw69uFWdtNnj0MGieU,9406
34
- ksxt/async_/base/__pycache__/__init__.cpython-312.pyc,sha256=6FPlac0sgVrNi5Ln3bOjRTq9zF2XysE9qQXl4j3nKok,151
35
- ksxt/async_/base/__pycache__/async_exchange.cpython-312.pyc,sha256=-PICgJ523CIDJBBOX5VpIXXKKj3rsF8HpyfATJtvpuY,15426
36
- ksxt/async_/base/__pycache__/throttler.cpython-312.pyc,sha256=R-LT5NWQWnX74cdMJYKM1rjSpCGCdN7t1m8V5QUOwK8,3190
37
- ksxt/base/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
38
- ksxt/base/com_exchange.py,sha256=q7C3Bc5q4ENvNGoghnQCN7YLttgwmFoNj9WsH5qxXNQ,287
39
- ksxt/base/errors.py,sha256=msGHmm9YGUOXOaK_VhOUEt5LvIDMMm6G-io8nQbNgA0,141
40
- ksxt/base/exchange.py,sha256=rJ-cXfhZ00nBxgDUlwP_-kVhPI3Si5YC1f0zXok9kXM,16797
41
- ksxt/base/rate_limiter.py,sha256=9iF6OB-2u0q4nqtng8Tafn-fM3CVQ-DvdNRJ1aSCS3w,3005
42
- ksxt/base/rest_exchange.py,sha256=4DpSpLYVPZ-WGGV0oBQIDEUDjAAmj7DrsaI1_7GjGUo,15835
43
- ksxt/base/types.py,sha256=3bd3obJhhX1njy_o4LW8hSAHX2MThOI-mZm6iifwno4,59
44
- ksxt/base/__pycache__/__init__.cpython-312.pyc,sha256=bNBz2l_g_6uoMfpg84oTHcjKkwBVVRavk1RlYg6N-to,144
45
- ksxt/base/__pycache__/errors.cpython-312.pyc,sha256=Cqv1BFN_hzWP_5aJyEUUQqpG8eDiGmKROqaRmg9CCU8,620
46
- ksxt/base/__pycache__/exchange.cpython-312.pyc,sha256=xyp2s_ZQ5JkJfbXjJObXSPfo4sErQaH9slnNalKdRCw,21751
47
- ksxt/base/__pycache__/rate_limiter.cpython-312.pyc,sha256=h1UefCyC3UBW2izVXNt6OXLLXrAcP3ZubJEzdLaoSL4,5416
48
- ksxt/base/__pycache__/rest_exchange.cpython-312.pyc,sha256=RyXa_vKJ43DK0Ya7bjiuXPLSKvClN-WuxBLzmx_cg-k,22847
49
- ksxt/base/__pycache__/types.cpython-312.pyc,sha256=7bugAIz0poOTdpogxGqmiFcjhrgCfMDlu1gZ2l3Qo0c,230
50
- ksxt/config/__init__.py,sha256=hkQx56FVJD8Gq1A_KzfOqO8BoqJRTX5TnUmqIignnlc,148
51
- ksxt/config/bithumb.toml,sha256=JgKgHQVATsLcbxKYvekSRonJ4PjJ5x2ejp1eZHHusrQ,11693
52
- ksxt/config/koreainvest.toml,sha256=XQRSdEgkWlhbfS6AvJRqQJ_8210i__nfFSI9n3GcgqY,11526
53
- ksxt/config/token.toml,sha256=F3RnfRe8ArAtriXQsDF3k5attyJ4gGbH9rcHRrgFU2E,860
54
- ksxt/config/upbit.toml,sha256=1aGKZ3HAV28rrTVGZQ418I9NJwhoRh70Vx03oKacIfY,13439
55
- ksxt/config/__pycache__/__init__.cpython-312.pyc,sha256=mHDOgIn3JKvJ85BM8nn459aRhoUmWJzlnrVYyGRDbZg,423
56
- ksxt/market/base.py,sha256=SzNPJECU2iWaQEUesI_REW_A0by_Tv4hs4Hv8p_sr0I,6856
57
- ksxt/market/db.py,sha256=ZPr2WlQRUOjhJm1fwFBrdwWG7UJkEpy5Pr0oEQ3Nqb0,386
58
- ksxt/market/logging.py,sha256=hkyAhzA72-KCGcVavSOHFSz2FU5QJq_gn6WA6kXs_Pw,698
59
- ksxt/market/manager.py,sha256=kgXrsjFw4O_BPVM2VxQJbm5ryWPG3L-NX1Pm-pN68jE,7301
60
- ksxt/market/markets.py,sha256=pExEvlLhoLvs2Ipkp-p8_yG3tFgz3U3yB5VAVqD8qdM,545
61
- ksxt/market/__pycache__/base.cpython-312.pyc,sha256=ljzyywdEdu8zKN38eWh6r6D4NYL96W_Zm1xFcXMwSZI,11237
62
- ksxt/market/__pycache__/db.cpython-312.pyc,sha256=Ej-HqAnaNQKWQHndwkbm4nNeVGR8ERbvC4vLs_vZ2j0,690
63
- ksxt/market/__pycache__/logging.cpython-312.pyc,sha256=lj3L123QmJeAjP0p_YTlY-ZuYS3Ujusy3swOeUMDCls,1400
64
- ksxt/market/__pycache__/manager.cpython-312.pyc,sha256=i4bOmK_AtgcoHl4uwx-SqrbiKg0e3RcLQB4Q_Uz0uCk,11782
65
- ksxt/market/__pycache__/markets.cpython-312.pyc,sha256=hDMXIz5i38AOJv0MIuJiUO19_7iEn5c5GXFfBeNE5V8,743
66
- ksxt/market/krx/kosdaq.py,sha256=CJDKMPp3utH-bmPrrEAzmFx5GSXk_KVhLDdGCAaxaBQ,18626
67
- ksxt/market/krx/kospi.py,sha256=lRyA-xCjqdyuB87eHFGooIHtpbjy7WcrQ0Rk2ZnCt40,20466
68
- ksxt/market/krx/stock.py,sha256=IXx4xNYsQgKhuLz1_S0Bd9Scqd6fip75gafRePAFW7U,8111
69
- ksxt/market/krx/__pycache__/kosdaq.cpython-312.pyc,sha256=JLFNvSwg9vko59DBhOwM1g9T5yM3XzrKVjCsvYCg6mo,7515
70
- ksxt/market/krx/__pycache__/kospi.cpython-312.pyc,sha256=TuUo2YVL-V-5TmlEEAQl-2Bb5fcCVSOgWDuj0joTARw,8607
71
- ksxt/market/krx/__pycache__/stock.cpython-312.pyc,sha256=vE6kr-bP9_qtj3oA7YQnV7zbJ9ofIlPYnN1iGtyp3wU,9011
72
- ksxt/market/us/amex.py,sha256=ZYlfh1x2eiA8P3DfO2PKj6nIE-O4WQNgDM-CsLqFUVs,5510
73
- ksxt/market/us/nasdaq.py,sha256=OIBJn16veH36Um-Bhr14K0qBu3ZZwPSWi5sj6zxmkVA,5524
74
- ksxt/market/us/nyse.py,sha256=eCAcz0saj1RFuyfmJc8cjecwGEDIhvkYVkUp941ZOIw,5507
75
- ksxt/market/us/stock.py,sha256=hRb4RH2kf-1RaNcWLvE5tg2uCcu6LoPZ0Nc1u6Wpzbc,3675
76
- ksxt/market/us/__pycache__/amex.cpython-312.pyc,sha256=FtW2C1PoQdPoO6OG91baKWkeA-e9G4P8NbMSpImXQVw,3379
77
- ksxt/market/us/__pycache__/nasdaq.cpython-312.pyc,sha256=1BqqOszEL9GGXbBqdKC2C7iswlf5VX1YMwi4Wi5FoOI,3393
78
- ksxt/market/us/__pycache__/nyse.cpython-312.pyc,sha256=S7Pngjx_aPoTC_h6x43BXNvqGWV3PmEXr1tJvXe-wlQ,3376
79
- ksxt/market/us/__pycache__/stock.cpython-312.pyc,sha256=Gh7sugnsiHbTlJST-Tuqu24vNdKz7Pw_2NOusiaKduI,4974
80
- ksxt/models/__init__.py,sha256=V7Nr0RHOOXithVTQW12hveavnapS8nGhWQ3JIMwDFTc,706
81
- ksxt/models/balance.py,sha256=zOYclyZA0A-DU8ZIsTDOxXZw3VUYQhfp1u3sTrzXWuE,651
82
- ksxt/models/cash.py,sha256=sNexdR6Ek-YZ6cVAmre-zf3K30R-6hreHuBQKYzMsPU,303
83
- ksxt/models/common.py,sha256=HvsNa2wlTeLdnB67untL0UzOQ5r6f2s6Gkfxeh7LTpM,827
84
- ksxt/models/error.py,sha256=yzpTweHMB-bi7hzD8ATKsK2klJAsbfPEBBa1A5tY6tw,291
85
- ksxt/models/historical.py,sha256=fWcst4WPimI2Avb4b1kOswfyf3nB4XSMgpTSmm7uTpY,655
86
- ksxt/models/market.py,sha256=kkH-P1m1HQjJOPT1k4bk9ZgW-_kwIBO_fXHcrRlWlVE,2013
87
- ksxt/models/order.py,sha256=LJJd-licLirI5WrAM1MItViOX_u5U_fmpBFPpDSdHxE,867
88
- ksxt/models/orderbook.py,sha256=S1c03QBu1hupN87CMWLgEsh8u2GrZ_Z_BcTUuiKGnR0,773
89
- ksxt/models/ticker.py,sha256=pPc7GqUOJchLg7qOpKfxhTVpXygF1Otc_M9_KfHFEgY,544
90
- ksxt/models/token.py,sha256=eUBoX7O0ffC63BN12-1aUjcfE_R1Ylyxr6_U79FLDv0,319
91
- ksxt/models/transaction.py,sha256=dLPXoWcMzfVf8FAJT69BIDzOboRpqYxvUMcrZeuvICQ,1599
92
- ksxt/models/__pycache__/__init__.cpython-312.pyc,sha256=uln0kH0-sy3WsBbbAjvV-E-D6L3Dtb6ph0oQki4yxjQ,1031
93
- ksxt/models/__pycache__/balance.cpython-312.pyc,sha256=_r64PniIdeptVO7zbVxYeh6nTH2UCnmnK8EzOr2jPzo,1279
94
- ksxt/models/__pycache__/cash.cpython-312.pyc,sha256=XXk7d17aZCvNf0_-pszEHqp0iBVNmT6PGANun6TUUBo,720
95
- ksxt/models/__pycache__/common.cpython-312.pyc,sha256=WcB1khTiUQPMLU_JuNJJq0zG7iv72X-WVTg91Xeklyk,1361
96
- ksxt/models/__pycache__/error.cpython-312.pyc,sha256=3674NIk6nnWW5sJh8xesC7c2ky7Id0dowXDn8axOJ1w,772
97
- ksxt/models/__pycache__/historical.cpython-312.pyc,sha256=CrFkLdryZRyVBCnqii-t7AEOWq-9JqafuUSoM__KoCk,1289
98
- ksxt/models/__pycache__/market.cpython-312.pyc,sha256=uZzrbwpf5QFtTKM5QaoDrkiRBEuEir8liuCgZxRT7sg,3076
99
- ksxt/models/__pycache__/order.cpython-312.pyc,sha256=j5LVaexWVroh3TC3Mrf11dH2prGEoqKETWDAdYDeHwQ,1789
100
- ksxt/models/__pycache__/orderbook.cpython-312.pyc,sha256=Yzm2_c3BjdgWgTMWKPCfwXj4dVxJV-GFG8May6ahfFg,1515
101
- ksxt/models/__pycache__/ticker.cpython-312.pyc,sha256=9kKIXZ1a6S_0Fpb3kjccZmrxcD1jYhChIRLvYpgnB6I,1163
102
- ksxt/models/__pycache__/token.cpython-312.pyc,sha256=HETJcEemd8gsaz4dLneFM2cqlaFHiXRixzt34_Ejzik,793
103
- ksxt/models/__pycache__/transaction.cpython-312.pyc,sha256=Vnsihu0tHAO9zJ1DZtHaDMATWHNxPRpMHf_ZBGnYCHk,2777
104
- ksxt/parser/bithumb.py,sha256=K5LR9n_Sdrvh4RjVUZ0XtfSPRI-OsNlcXGynj_Er09s,14118
105
- ksxt/parser/koreainvest.py,sha256=TfKmaRVc1Tns_kYnhJa2lUjtcO88oNdBWJKLMzC3ZHo,15081
106
- ksxt/parser/parser.py,sha256=8H6RmI6XUBhwp3r7pFcdtUuf-7bZ5RvnObXKrcOMfyI,5147
107
- ksxt/parser/upbit.py,sha256=eD-JJ5hV894G8ju8y52WyZIenkmPZxngZ9uzD1kolW8,14543
108
- ksxt/parser/__pycache__/bithumb.cpython-312.pyc,sha256=OPQmu1c0o6T-Wqbu2NbLWN_wSEm-YctHNQkYecsC1JU,17970
109
- ksxt/parser/__pycache__/koreainvest.cpython-312.pyc,sha256=oea74-Wd6kMhH99ZykmaDnewrYzNIQ4Z-USOet3Q2f4,18503
110
- ksxt/parser/__pycache__/parser.cpython-312.pyc,sha256=vzwmHXDwTBpzayrpPXOAYQNRqXVpAgn3hov2LUOdKBg,8324
111
- ksxt/parser/__pycache__/upbit.cpython-312.pyc,sha256=9sfHPV49vaCdIigxHiy4Gpe2y-7TW-CK2ldUZWN9DFw,18763
112
- ksxt/sample/symbol_sync.ipynb,sha256=dnUOgEKdUuEkDo_6LZjmDtVuNh4PPmCN4Ht7Pz-0L9Y,640081
113
- ksxt/utils/safer.py,sha256=tlXDU9KDxrrM0HT2bv45hkblIgbEYr02NygdYS0jj6c,1289
114
- ksxt/utils/sorter.py,sha256=j7eN1Qy7Wx3cXcWyRWyO1fVq-M24TrXvcfewPR5axF4,227
115
- ksxt/utils/timer.py,sha256=4_rhXdQDFkKshS5utWrgTteIe71tVSTL1zNW-IjOngM,1228
116
- ksxt/utils/__pycache__/safer.cpython-312.pyc,sha256=oPbGln-szGLBGYR0JVFxjE5v3jbzsSvGhqbmFSIcJQE,1989
117
- ksxt/utils/__pycache__/sorter.cpython-312.pyc,sha256=4vNlq0bWtItRlsRjXANLnBuThidmM6m_0YY_-PLA2Go,624
118
- ksxt/utils/__pycache__/timer.cpython-312.pyc,sha256=IXsQV8yPC92ExFaWgvwn-MgEfiLZxSP5pjU6xqYx8Sw,2003
119
- ksxt-1.0.3.dist-info/LICENSE.txt,sha256=vyuXQcPOZ9BriMQz3h1k3jQTrKGsAjohf8WQHHf6xqo,1080
120
- ksxt-1.0.3.dist-info/METADATA,sha256=vuUbna48h7AldwQbqwVx4hGJGz3M3OrEIFM1fLwK1nY,1649
121
- ksxt-1.0.3.dist-info/WHEEL,sha256=cVxcB9AmuTcXqmwrtPhNK88dr7IR_b6qagTj0UvIEbY,91
122
- ksxt-1.0.3.dist-info/top_level.txt,sha256=XLUhkZCur5Pe0BPUV3J0syngIPz7jBb2YlQR4epo5kI,5
123
- ksxt-1.0.3.dist-info/RECORD,,