ksxt 1.0.2__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.
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
 
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/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
 
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:
@@ -222,10 +235,10 @@ class BithumbParser(BaseParser):
222
235
  type="crypto",
223
236
  bid_qty_unit=safer.safe_number(market_info["bid"], "price_unit"),
224
237
  ask_qty_unit=safer.safe_number(market_info["ask"], "price_unit"),
225
- bid_min_qty=safer.safe_number(market_info["bid"], "min_total"),
226
- ask_min_qty=safer.safe_number(market_info["ask"], "min_total"),
227
- bid_max_qty=safer.safe_number(market_info, "max_total"),
228
- ask_max_qty=safer.safe_number(market_info, "max_total"),
238
+ bid_min_qty=0,
239
+ ask_min_qty=0,
240
+ bid_max_qty=0,
241
+ ask_max_qty=0,
229
242
  bid_amount_unit=1,
230
243
  ask_amount_unit=1,
231
244
  bid_min_amount=safer.safe_number(market_info["bid"], "min_total"),
@@ -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:
@@ -228,10 +241,10 @@ class UpbitParser(BaseParser):
228
241
  type="crypto",
229
242
  bid_qty_unit=safer.safe_number(market_info.get("bid", {}), "price_unit"),
230
243
  ask_qty_unit=safer.safe_number(market_info.get("ask", {}), "price_unit"),
231
- bid_min_qty=safer.safe_number(market_info.get("bid", {}), "min_total"),
232
- ask_min_qty=safer.safe_number(market_info.get("ask", {}), "min_total"),
233
- bid_max_qty=safer.safe_number(market_info, "max_total"),
234
- ask_max_qty=safer.safe_number(market_info, "max_total"),
244
+ bid_min_qty=0,
245
+ ask_min_qty=0,
246
+ bid_max_qty=0,
247
+ ask_max_qty=0,
235
248
  bid_amount_unit=1,
236
249
  ask_amount_unit=1,
237
250
  bid_min_amount=safer.safe_number(market_info.get("bid", {}), "min_total"),
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.2
3
+ Version: 1.0.4
4
4
  License: MIT License
5
5
 
6
6
  Copyright © 2023 AMOSA
@@ -1,11 +1,11 @@
1
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
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
5
  ksxt/__pycache__/__init__.cpython-312.pyc,sha256=wOfyuexJUbv8R-aktGSuw5cGx_Nz9O0ReqF9npfS50Q,311
6
- ksxt/__pycache__/bithumb.cpython-312.pyc,sha256=EtcBPN5niXbkjMK_PUmfOLANsdRpUqI3GW0EIAWpqVA,24716
7
- ksxt/__pycache__/koreainvest.cpython-312.pyc,sha256=NItGfTFI1TamcIVjF8v1ce1X6RrFHa2iE0umedQgqUs,21977
8
- ksxt/__pycache__/upbit.cpython-312.pyc,sha256=FciYM5KvlGO3-lhbeTP6E-ZWs2KiaWJkvrLTGfBmbcg,25111
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
9
  ksxt/api/__init__.py,sha256=CZ8AedRG8O9vEdSqTaot5sV3nwpxPZoVOYwrFCLUo6M,736
10
10
  ksxt/api/bithumb.py,sha256=6apoSNoiEOIkR6xQu4rtCSz7sdNdx3BHeu8-m8omh6E,2177
11
11
  ksxt/api/koreainvest.py,sha256=93BASTUUsw39APRFxVqlaOu-keEFuIO3MvHX_6g-AAs,2159
@@ -19,30 +19,30 @@ ksxt/api/auto/bithumb.py,sha256=n6ctGefq28i5CMiItLF1xOZgeDP9F9em4HXfoPUcmqw,1261
19
19
  ksxt/api/auto/koreainvest.py,sha256=z4Bf3C7g2W-eQP99oBeM_J0mq2D3PkbQaulrDwxJB04,1582
20
20
  ksxt/api/auto/upbit.py,sha256=CtSG0jziqJR4FInHvwDisJfMWCUrUIQQcNPuCGGR7Do,1467
21
21
  ksxt/async_/__init__.py,sha256=ztfV65aN2mXamQSfVm3GLYB6cszkvsCSlUyhfe2H_2M,186
22
- ksxt/async_/bithumb.py,sha256=8u87o6HBqU1Ga0-MUBnygrkx6IjwzonImlPV3qZ_zug,19285
23
- ksxt/async_/koreainvest.py,sha256=Mc6nsYPQkmc-kRs-pSNNWzKgqPbw65RCGAvmOQLHFw0,20278
24
- ksxt/async_/upbit.py,sha256=99IC-czWOV6SsKN645BdbM7Rg_oDo8_iwaIzfGxI_i0,21247
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
25
  ksxt/async_/__pycache__/__init__.cpython-312.pyc,sha256=iIsmwj1LPoOUx4ad9K2yCdmVi5vXv23kOTUX7I5NGx4,380
26
- ksxt/async_/__pycache__/bithumb.cpython-312.pyc,sha256=r8oTmvbamu7cGJZYc2YieeFo7IhZf1Rcrh6pIvYHlw8,23397
27
- ksxt/async_/__pycache__/koreainvest.cpython-312.pyc,sha256=LNkF2wjNfB1tlqm9f3ck5409o4_k8SOQWm9IS7cpk9w,22813
28
- ksxt/async_/__pycache__/upbit.cpython-312.pyc,sha256=4f1hx8Na-P01MlYdgsU1CvPD8iT9z4t02OyVOVQkfa8,26273
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
29
  ksxt/async_/base/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
- ksxt/async_/base/async_exchange.py,sha256=wsX-GCcd5PgdVyJVskcKxF-fECw69uFWdtNnj0MGieU,9406
30
+ ksxt/async_/base/async_exchange.py,sha256=TTcUMT4dwp6ZdTisnqIe7HEpsEdLP32xbXnTf_NOcLU,9468
31
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=jsTiwPq-M2pmbqi57MyXJqzSSa1z-F9TYrc5Fp3IczQ,15428
32
+ ksxt/async_/base/__pycache__/async_exchange.cpython-312.pyc,sha256=NWkCjxTjcAW874O9UG8N_VwXYgvo9pgbtr_iTPzmi1E,15527
33
33
  ksxt/async_/base/__pycache__/throttler.cpython-312.pyc,sha256=wNDfiAHgLIXbSPtK4BOYjnnsWcZSO-Cq4NQXhzrJQpM,3192
34
34
  ksxt/base/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
35
  ksxt/base/com_exchange.py,sha256=q7C3Bc5q4ENvNGoghnQCN7YLttgwmFoNj9WsH5qxXNQ,287
36
36
  ksxt/base/errors.py,sha256=msGHmm9YGUOXOaK_VhOUEt5LvIDMMm6G-io8nQbNgA0,141
37
- ksxt/base/exchange.py,sha256=rJ-cXfhZ00nBxgDUlwP_-kVhPI3Si5YC1f0zXok9kXM,16797
37
+ ksxt/base/exchange.py,sha256=9_uEy-l8PQyqgXdHmiD2O1R2RddrMeE_xWQEmMqSo1I,15594
38
38
  ksxt/base/rate_limiter.py,sha256=9iF6OB-2u0q4nqtng8Tafn-fM3CVQ-DvdNRJ1aSCS3w,3005
39
- ksxt/base/rest_exchange.py,sha256=4DpSpLYVPZ-WGGV0oBQIDEUDjAAmj7DrsaI1_7GjGUo,15835
39
+ ksxt/base/rest_exchange.py,sha256=ikiYypTr5ud7vOlYHoK46CXmYZ-Tf2FfF2LucT9deEE,15887
40
40
  ksxt/base/types.py,sha256=3bd3obJhhX1njy_o4LW8hSAHX2MThOI-mZm6iifwno4,59
41
41
  ksxt/base/__pycache__/__init__.cpython-312.pyc,sha256=WnqBpy7gGuw6RNmEVSFdxy4sOZJgZD-fZCJRUbhOHmU,146
42
42
  ksxt/base/__pycache__/errors.cpython-312.pyc,sha256=rAZ-JEC6Ga8eAk4FbYv1foQvMiwK2qj8yVSOzPmKAKo,622
43
- ksxt/base/__pycache__/exchange.cpython-312.pyc,sha256=DmLd_GSYliWt4lAIuaO6zCwCQwJtYX0b6Rl2e3WtU2Q,21753
43
+ ksxt/base/__pycache__/exchange.cpython-312.pyc,sha256=vPPu--t1CQZrLiDMtuNYgaGCDo-eooKqlz0DhVF5Snw,20784
44
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=yL-rNG758IYojfx-y39L-cPWuPrZQ1RRKEFetOI7hBk,22849
45
+ ksxt/base/__pycache__/rest_exchange.cpython-312.pyc,sha256=VTZ9teukzqZ9zgzQ-0OMQDOkH8dITDVurPQEjxwZ14M,22942
46
46
  ksxt/base/__pycache__/types.cpython-312.pyc,sha256=iF742YNlqCX4ZSIJP4FDPd-3765zIr1VWr-XWXisCsA,232
47
47
  ksxt/config/__init__.py,sha256=hkQx56FVJD8Gq1A_KzfOqO8BoqJRTX5TnUmqIignnlc,148
48
48
  ksxt/config/bithumb.toml,sha256=JgKgHQVATsLcbxKYvekSRonJ4PjJ5x2ejp1eZHHusrQ,11693
@@ -98,14 +98,14 @@ ksxt/models/__pycache__/orderbook.cpython-312.pyc,sha256=wzEg5vuh78UOhnUvMd_K7Sj
98
98
  ksxt/models/__pycache__/ticker.cpython-312.pyc,sha256=k6_mEv_fTMtZOd6BwWUW8du_udB8LnmZqOWbZpjE1lE,1165
99
99
  ksxt/models/__pycache__/token.cpython-312.pyc,sha256=DFNk5vUNLM-McE9US441Zfmo7yyCv_Gpxxp350PmNrw,795
100
100
  ksxt/models/__pycache__/transaction.cpython-312.pyc,sha256=lSEJNLWcsivMp_DeEv2-zw75EDqKiY3YCN5hQh4fvHY,2779
101
- ksxt/parser/bithumb.py,sha256=v6enIUbxIf5EKdKaw8Gwu1G6EgyaE96H8x3UC6Kw0g0,14300
102
- ksxt/parser/koreainvest.py,sha256=TfKmaRVc1Tns_kYnhJa2lUjtcO88oNdBWJKLMzC3ZHo,15081
103
- ksxt/parser/parser.py,sha256=8H6RmI6XUBhwp3r7pFcdtUuf-7bZ5RvnObXKrcOMfyI,5147
104
- ksxt/parser/upbit.py,sha256=13Gmnj15YV9G5C53efj4uZ-nQSaMFcPkmCuHTZ44bh4,14741
105
- ksxt/parser/__pycache__/bithumb.cpython-312.pyc,sha256=GA6CCsqGAogCxtV0A_4TLbdEn0PT56AAwHasvA4K4Pw,18201
106
- ksxt/parser/__pycache__/koreainvest.cpython-312.pyc,sha256=I0rSJMRPuOF1GFRDKeX-LT05psYc3sTLJd9DO0_cv1c,18505
107
- ksxt/parser/__pycache__/parser.cpython-312.pyc,sha256=D6qWG4dfxiRPUv6L_XAUPSnne4N_FWh1HV5URSUWo3Q,8326
108
- ksxt/parser/__pycache__/upbit.cpython-312.pyc,sha256=gANx4wRq38GlsXrZCEH7TPWbPkOZS0LKHpMiQiKSqqI,19058
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
109
  ksxt/sample/symbol_sync.ipynb,sha256=dnUOgEKdUuEkDo_6LZjmDtVuNh4PPmCN4Ht7Pz-0L9Y,640081
110
110
  ksxt/utils/safer.py,sha256=tlXDU9KDxrrM0HT2bv45hkblIgbEYr02NygdYS0jj6c,1289
111
111
  ksxt/utils/sorter.py,sha256=j7eN1Qy7Wx3cXcWyRWyO1fVq-M24TrXvcfewPR5axF4,227
@@ -113,8 +113,8 @@ ksxt/utils/timer.py,sha256=4_rhXdQDFkKshS5utWrgTteIe71tVSTL1zNW-IjOngM,1228
113
113
  ksxt/utils/__pycache__/safer.cpython-312.pyc,sha256=UhwkADGcSzG-ZYboesTzUHMGgn5C27UvslVZLp_SsF4,1991
114
114
  ksxt/utils/__pycache__/sorter.cpython-312.pyc,sha256=7VUIekH9h5SDsz4L5bjCdSQln-fLgQZII46URitryHI,626
115
115
  ksxt/utils/__pycache__/timer.cpython-312.pyc,sha256=8coj4_LWUtYOdFVhaEHyDbDwkt3JKtmQ1pXPtnsROyY,2005
116
- ksxt-1.0.2.dist-info/LICENSE.txt,sha256=vyuXQcPOZ9BriMQz3h1k3jQTrKGsAjohf8WQHHf6xqo,1080
117
- ksxt-1.0.2.dist-info/METADATA,sha256=44Se9OMQUCPOs0Ol4b3183PpFOrFQx7h0xUoz0fI2BY,1649
118
- ksxt-1.0.2.dist-info/WHEEL,sha256=cVxcB9AmuTcXqmwrtPhNK88dr7IR_b6qagTj0UvIEbY,91
119
- ksxt-1.0.2.dist-info/top_level.txt,sha256=XLUhkZCur5Pe0BPUV3J0syngIPz7jBb2YlQR4epo5kI,5
120
- ksxt-1.0.2.dist-info/RECORD,,
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