pyqqq 0.12.171__py3-none-any.whl → 0.12.173__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.

Potentially problematic release.


This version of pyqqq might be problematic. Click here for more details.

pyqqq/backtest/broker.py CHANGED
@@ -121,9 +121,13 @@ class BaseBroker(ABC):
121
121
  raise NotImplementedError
122
122
 
123
123
  @abstractmethod
124
- def get_pending_orders(self) -> List[StockOrder]:
124
+ def get_pending_orders(
125
+ self,
126
+ exchanges: List[OrderExchange] = [OrderExchange.KRX]
127
+ ) -> List[StockOrder]:
125
128
  """미체결된 모든 주문을 조회합니다.
126
-
129
+ Args:
130
+ exchanges (List[OrderExchange], optional): 조회할 거래소 리스트 (기본값: [OrderExchange.KRX])
127
131
  Returns:
128
132
  List[StockOrder]: 미체결 주문 객체 리스트
129
133
 
@@ -326,11 +330,15 @@ class TradingBroker(BaseBroker):
326
330
  result = self.data_api.get_orderbook(code, data_exchange=DataExchange.KRX)
327
331
  return result
328
332
 
329
- def get_pending_orders(self):
330
- return self.trading_api.get_pending_orders()
333
+ def get_pending_orders(self, exchanges: List[OrderExchange] = [OrderExchange.KRX]):
334
+ return self.trading_api.get_pending_orders(exchanges)
331
335
 
332
- def _get_pending_order(self, order_no: str) -> StockOrder | None:
333
- orders = self.get_pending_orders()
336
+ def _get_pending_order(
337
+ self,
338
+ order_no: str,
339
+ exchanges: List[OrderExchange] = [OrderExchange.KRX],
340
+ ) -> StockOrder | None:
341
+ orders = self.get_pending_orders(exchanges=exchanges)
334
342
  return next((o for o in orders if o["order_no"] == order_no), None)
335
343
 
336
344
  def get_positions(self):
@@ -765,7 +773,8 @@ class MockBroker(BaseBroker):
765
773
  df = _exclude_today(df)
766
774
  return df
767
775
 
768
- def get_pending_orders(self):
776
+ def get_pending_orders(self, exchanges: List[OrderExchange] = [OrderExchange.KRX]):
777
+ # MockBroker 에서는 SOR, NXT 주문을 현재 구분하지 않음.
769
778
  return self.pending_orders
770
779
 
771
780
  def get_positions(self):
@@ -311,6 +311,10 @@ class TradingTracker:
311
311
  def _find_pending_order(self, order_no) -> StockOrder:
312
312
  return find(lambda x: x.order_no == order_no, self.pending_orders)
313
313
 
314
+ def _find_order_in_today_orders(self, order_no) -> StockOrder:
315
+ today_orders = self.simple_api.get_today_order_history(order_no=order_no, exchanges=[OrderExchange.KRX, OrderExchange.NXT, OrderExchange.SOR])
316
+ return find(lambda x: x.order_no == order_no, today_orders)
317
+
314
318
  def _find_position(self, asset_code) -> StockPosition:
315
319
  return find(lambda x: x.asset_code == asset_code, self.positions)
316
320
 
@@ -458,6 +462,11 @@ class TradingTracker:
458
462
  event.filled_time,
459
463
  partial,
460
464
  )
465
+
466
+ if order is None:
467
+ self.logger.warn(f"Order not found for order_no: {order_no}")
468
+ order = self._find_order_in_today_orders(order_no)
469
+ self.logger.warn(f"Order found in today's orders: {order}")
461
470
  self._notify_pending_order_update("partial" if partial else "completed", order)
462
471
  self._notify_position_update(position_event_type, position)
463
472
 
pyqqq/data/realtime.py CHANGED
@@ -1,4 +1,5 @@
1
- from typing import List
1
+ from typing import List, Union
2
+ from pyqqq.datatypes import DataExchange
2
3
  from pyqqq.utils.api_client import raise_for_status, send_request
3
4
  from pyqqq.utils.logger import get_logger
4
5
  from pyqqq.utils.singleton import singleton
@@ -14,12 +15,13 @@ import datetime as dtm
14
15
  logger = get_logger(__name__)
15
16
 
16
17
 
17
- def get_all_last_trades(codes: List[str] = None):
18
+ def get_all_last_trades(codes: List[str] = None, exchange: str = "KRX"):
18
19
  """
19
20
  모든 종목의 최근 체결 정보를 반환합니다.
20
21
 
21
22
  Args:
22
23
  codes (List[str], optional): 종목 코드 리스트. 모든 종목의 체결 정보를 반환하려면 None을 전달합니다.
24
+ exchange (str, optional): 거래소. 기본값은 "KRX"입니다. 지원하는 거래소는 "KRX", "UN" 입니다.
23
25
 
24
26
  Returns:
25
27
  list:
@@ -54,7 +56,7 @@ def get_all_last_trades(codes: List[str] = None):
54
56
 
55
57
  params = None
56
58
  if codes:
57
- params = {"codes": ",".join(codes) if isinstance(codes, list) else codes}
59
+ params = {"codes": ",".join(codes) if isinstance(codes, list) else codes, "exchange": exchange}
58
60
 
59
61
  r = send_request("GET", f"{c.PYQQQ_API_URL}/domestic-stock/trades", params=params)
60
62
  raise_for_status(r)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pyqqq
3
- Version: 0.12.171
3
+ Version: 0.12.173
4
4
  Summary: Package for quantitative strategy development on the PyQQQ platform
5
5
  License: MIT
6
6
  Author: PyQQQ team
@@ -5,7 +5,7 @@ pyqqq/ai/domestic.py,sha256=FiJNInRlhcnxG7Jxmz2hDvaLhS8_jn-JFpQMze8Ch9s,1888
5
5
  pyqqq/ai/market_schedule.py,sha256=8HiivwC-xI2EKr8lXS_g4mTj2LYpCQ2QfZsJmIq61O0,818
6
6
  pyqqq/ai/minute.py,sha256=C0sTVkBY4-Vuj8Q9VZ7d9kZYAv963FUX4k3vIvhetng,1754
7
7
  pyqqq/backtest/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
- pyqqq/backtest/broker.py,sha256=ynb0hxGk89BGg0xsNGcK6vw2tYc7hchiR5H8gA4GcVQ,66556
8
+ pyqqq/backtest/broker.py,sha256=TO4WASbYCbNyUNfwPz_9lS7FcECrUf_trO26hg7hGmM,67062
9
9
  pyqqq/backtest/environment.py,sha256=bkdlwG9MynuNL1u7f0cQ1L271cnPqJ7gX89EYwl8oOg,9313
10
10
  pyqqq/backtest/logger.py,sha256=BmoEMjUU76z8rZtMCYCwbspD3AVaHJrdbbT1EAFgrAE,3294
11
11
  pyqqq/backtest/positionprovider.py,sha256=wrR7Bntg28Q5_vGQV6XNzxe-SYoO9_GLcV9gDVEDAN4,4164
@@ -27,7 +27,7 @@ pyqqq/brokerage/kis/simple.py,sha256=t9vCnyeiVSHra2oYe8Gb3qFzxe2wWwrnJVCPNm6N-_0
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
30
- pyqqq/brokerage/tracker.py,sha256=z_bZ3O-G0oaEE7OBJawd2GbQwvPh-lKOLdWXOV1m1mw,23981
30
+ pyqqq/brokerage/tracker.py,sha256=p26APsjzjM_qO3zrsre3GBqUx4G4hBYcc5TLvzfoKg8,24504
31
31
  pyqqq/config.py,sha256=55Vqc_pGkdbrBdCV1aLgoH_n5IFxmMC59sbPHId3LoI,498
32
32
  pyqqq/data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
33
  pyqqq/data/daily.py,sha256=k4dSiXNnT_J3mo0j_6VDjkGezBieVpIaZT3W_M7EU1Y,8019
@@ -35,7 +35,7 @@ pyqqq/data/domestic.py,sha256=2FOYxDGw2W7DGwY61p3uGFb4IWqWUKiNdR3RlewjkCU,30352
35
35
  pyqqq/data/index.py,sha256=d5b-8a7IXu7yNJWt1tIe1Mj83NW0ZnQq8nsj2Sl3Gx8,6988
36
36
  pyqqq/data/minutes.py,sha256=b-bqThP39t7V5io5dzI953bi1oWrUH3uie8GsFS7HUY,14727
37
37
  pyqqq/data/overseas.py,sha256=yx7tCZHW8AvjIbtrP4dqIeC6wseRSzbg5ag3dm6H0LY,1234
38
- pyqqq/data/realtime.py,sha256=y48JQSr54LkeCD9oIQcBqmK0wV1r2Hf42Va6PCkp1WU,14889
38
+ pyqqq/data/realtime.py,sha256=Kjb0fK2mtQgluS165quAdGcxtdxfiEmBLp2B0i-5f44,15105
39
39
  pyqqq/data/ticks.py,sha256=DXioiKBsGTzwXyvEH0lpm8t5g-1nHIOLKMXoSrE1Rko,4127
40
40
  pyqqq/data/us_stocks.py,sha256=jXR9dQEVigrwTLEpX1aX1_AQvOlBopW265gwx8Nq8OA,12959
41
41
  pyqqq/datatypes.py,sha256=KnanWzat6w5w0vNvKHsWt9VOBwf9gh0njdt36PJBgXc,8370
@@ -58,6 +58,6 @@ pyqqq/utils/mock_api.py,sha256=7EsaVQ9mOVZQAqtQW24isPnk9QTbJII7x3guhFyEMAE,10569
58
58
  pyqqq/utils/position_classifier.py,sha256=EaomByAWM2lVuYow5OFdJNrN64Fpukhj-lhFkjYpjeo,14908
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.171.dist-info/METADATA,sha256=kuPz-J61xk7kylfFJqtiOCree9WhQsSJ6kCO1mD8hWQ,1664
62
- pyqqq-0.12.171.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
63
- pyqqq-0.12.171.dist-info/RECORD,,
61
+ pyqqq-0.12.173.dist-info/METADATA,sha256=LeaA19UDC4pO_liu2r0QdaXzWT3NimetvYgIdefVilk,1664
62
+ pyqqq-0.12.173.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
63
+ pyqqq-0.12.173.dist-info/RECORD,,