pyqqq 0.12.182__py3-none-any.whl → 0.12.183__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.
@@ -1,15 +1,18 @@
1
+ import asyncio
2
+ import datetime as dtm
1
3
  from decimal import Decimal
4
+ from typing import AsyncGenerator, Dict, List, Optional
5
+
6
+ import pandas as pd
7
+
2
8
  from pyqqq.brokerage.kis.domestic_stock import KISDomesticStock
3
9
  from pyqqq.brokerage.kis.oauth import KISAuth
4
10
  from pyqqq.data.realtime import get_all_last_trades
5
11
  from pyqqq.datatypes import *
12
+ from pyqqq.utils.limiter import CallLimiter
6
13
  from pyqqq.utils.logger import get_logger
7
14
  from pyqqq.utils.market_schedule import get_market_schedule, is_full_day_closed
8
15
  from pyqqq.utils.mock_api import with_mock
9
- from typing import AsyncGenerator, Dict, List, Optional
10
- import asyncio
11
- import datetime as dtm
12
- import pandas as pd
13
16
 
14
17
 
15
18
  class KISStockPosition(StockPosition):
@@ -336,6 +339,8 @@ class KISSimpleDomesticStock:
336
339
  request_time = request_datetime.replace(hour=schedule.close_time.hour, minute=schedule.close_time.minute)
337
340
 
338
341
  while True:
342
+ CallLimiter().wait_limit_rate(20, scope="kis/inquire_time_itemchartprice")
343
+
339
344
  r = self.stock_api.inquire_time_itemchartprice(
340
345
  asset_code,
341
346
  request_time.time(),
pyqqq/utils/limiter.py CHANGED
@@ -3,7 +3,7 @@ import time
3
3
 
4
4
  _MAX_CALLS = 5
5
5
  _PERIOD = 1
6
- _SCOPE = 'default'
6
+ _SCOPE = "default"
7
7
 
8
8
 
9
9
  class CallLimiter:
@@ -13,12 +13,13 @@ class CallLimiter:
13
13
  이 클래스는 API 호출 빈도를 제한하여 너무 많은 요청으로 인해 서비스 제한을 받는 것을 방지합니다.
14
14
  이 클래스의 인스턴스는 전역에서 단 하나만 존재하며, 다양한 'scope'에 대한 호출 제한 윈도우를 관리합니다.
15
15
  """
16
+
16
17
  _instance = None
17
18
 
18
19
  def __new__(cls):
19
20
  if cls._instance is None:
20
21
  cls._instance = super(CallLimiter, cls).__new__(cls)
21
- cls._instance.windows = {'default': []}
22
+ cls._instance.windows = {"default": []}
22
23
 
23
24
  return cls._instance
24
25
 
@@ -63,6 +64,7 @@ def limit_calls(max_calls: int = _MAX_CALLS, period: float = _PERIOD, scope: str
63
64
  period (float): 기간(초) 동안의 호출 횟수를 제한합니다.
64
65
  scope (str): 호출 제한을 적용할 스코프 이름입니다.
65
66
  """
67
+
66
68
  def decorator(func):
67
69
  def wrapper(*args, **kwargs):
68
70
  CallLimiter().wait_limit_rate(max_calls=max_calls, period=period, scope=scope)
@@ -144,7 +144,14 @@ def is_trading_time(
144
144
  if exchange == Exchange.NXT and now.date() < datetime.date(2025, 3, 4):
145
145
  raise ValueError("NXT 거래소는 2025년 3월 4일 부터 운영되었습니다. 이전 날짜는 지원하지 않습니다.")
146
146
 
147
- return not (is_full_day_closed(now, exchange) or is_before_opening(now, exchange) or is_after_closing(now, exchange))
147
+ schedule = get_market_schedule(now.date(), exchange)
148
+ if schedule.full_day_closed:
149
+ return False
150
+
151
+ if now.time() < schedule.open_time or now.time() > schedule.close_time:
152
+ return False
153
+
154
+ return True
148
155
 
149
156
 
150
157
  def get_market_schedule(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pyqqq
3
- Version: 0.12.182
3
+ Version: 0.12.183
4
4
  Summary: Package for quantitative strategy development on the PyQQQ platform
5
5
  License: MIT
6
6
  Author: PyQQQ team
@@ -23,7 +23,7 @@ pyqqq/brokerage/kis/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSu
23
23
  pyqqq/brokerage/kis/domestic_stock.py,sha256=0mEC5B0HXlIMck4BmOw0Ke5utnWeWnRPngbDKW_jqRs,226778
24
24
  pyqqq/brokerage/kis/oauth.py,sha256=jA7QydFEe5NN8t0QSwEhFoFtQiwTP4fr2segcibOXVU,7805
25
25
  pyqqq/brokerage/kis/overseas_stock.py,sha256=9QUkEX13Lev5BcXMfK2GLve4xwFptOd1vXh4lDbrpYw,90096
26
- pyqqq/brokerage/kis/simple.py,sha256=XmQInqd_kRUnf7zaiaKOmPpZmvTBasSZqhEaIeVXE0E,41806
26
+ pyqqq/brokerage/kis/simple.py,sha256=luQtJfuISgtNheV-9UntzUSyrl5ORAo1FjR2LUwIIBI,41940
27
27
  pyqqq/brokerage/kis/simple_overseas.py,sha256=1DuQBuJosg0mJQV7Ey2N3UOY8F3uOhzPDay4ncothuc,50360
28
28
  pyqqq/brokerage/kis/tr_client.py,sha256=9fTok0d8FmfXw4YxZSdn6T8UTHIG2aN1yMSkiMJUB3c,5530
29
29
  pyqqq/brokerage/multiprocess_tracker.py,sha256=Xx0hSpRZYITBGWjxclOEtNZdHV5agX94s34q1A8EE-Y,7283
@@ -50,14 +50,14 @@ pyqqq/utils/copycat.py,sha256=1cMuQKteOuzBbH3aAdsDCH7ZTxTyM6OyJ5Wii7gmBpk,10837
50
50
  pyqqq/utils/daily_tickers.py,sha256=hVYhfNjGNAFHJTr8bjPmd4Cd6KxCMqD8ctd4E3kBDQA,4623
51
51
  pyqqq/utils/display.py,sha256=kFoXw52ODDgbR-ufAKRJdY5NEA7UTikrosZRukEIWFc,1177
52
52
  pyqqq/utils/kvstore.py,sha256=aAWQrs2IugHBPTRUkbYNxCKF9NZe2MCMD5nSj_lVbVw,4586
53
- pyqqq/utils/limiter.py,sha256=M4ApMyWNtibTmLEOLsMViKFs-HZewYf2MsLygH4AFcs,2641
53
+ pyqqq/utils/limiter.py,sha256=0zTJitT-14Ve5aeT0zcNEWQGPyY_3FENorF3HS7WPyQ,2643
54
54
  pyqqq/utils/local_cache.py,sha256=HvCyD1whixQWdVMxny5EPZwxKWQm-_Q34fKLXRvc3eU,2312
55
55
  pyqqq/utils/logger.py,sha256=neP2Cn9hKNoRd_PuyNwIca8WyhrYdcjgDZqzeGqWpOk,3770
56
- pyqqq/utils/market_schedule.py,sha256=Xg1cVapXIMTsYRxcShAWpX5-Ow3F4zF6sk1SutyVpaQ,12795
56
+ pyqqq/utils/market_schedule.py,sha256=NAzRmAc1Bnj5M99Ho7UN8JlVDW-16kgvPGrMNmydaBY,12899
57
57
  pyqqq/utils/mock_api.py,sha256=7EsaVQ9mOVZQAqtQW24isPnk9QTbJII7x3guhFyEMAE,10569
58
58
  pyqqq/utils/position_classifier.py,sha256=tIbZMm_baru0F0qv6QDc5b2-oJYNvmn9HyrRr3xaAXU,14975
59
59
  pyqqq/utils/retry.py,sha256=4mw9MQvgSBC8bTLvDauaCEI5N9tL8upHCk8rSfaVRG8,2066
60
60
  pyqqq/utils/singleton.py,sha256=m6NZ8fwVDpI6U-gUUihMPgVK_NkDh-Z1NSAtjisrpjY,810
61
- pyqqq-0.12.182.dist-info/METADATA,sha256=2-KVpEWPwrEXbcwEKg8fdy84gRpAx7M7L7lrc4nlKzE,1664
62
- pyqqq-0.12.182.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
63
- pyqqq-0.12.182.dist-info/RECORD,,
61
+ pyqqq-0.12.183.dist-info/METADATA,sha256=r6KbKnwJpGx1EkM-XM7fKWW4w4FB_LVT0_a4LI2OMRU,1664
62
+ pyqqq-0.12.183.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
63
+ pyqqq-0.12.183.dist-info/RECORD,,