Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion pykis/api/websocket/order_execution.py
Original file line number Diff line number Diff line change
Expand Up @@ -394,7 +394,7 @@ class KisForeignRealtimeOrderExecution(KisRealtimeExecutionBase):
None, # 14 BRNC_NO 지점번호
KisDecimal[
"quantity", Decimal(-1)
], # 15 ODER_QTY 주문수량 ,주문통보인 경우 해당 위치 미출력 (주문통보의 주문수량은 CNTG_QTY 위치에 출력). 체결통보인 경우 해당 위치에 주문수량이 출력
], # 15 ODER_QTY 주문수량, 주문통보인 경우 해당 위치 미출력 (주문통보의 주문수량은 CNTG_QTY 위치에 출력). 체결통보인 경우 해당 위치에 주문수량이 출력
None, # 16 ACNT_NAME 계좌명
None, # 17 CNTG_ISNM 체결종목명
KisAny(FOREIGN_MARKET_CODE_MAP.__getitem__)[
Expand Down
13 changes: 10 additions & 3 deletions pykis/event/filters/product.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,9 +44,7 @@ def __init__(self, symbol: str, market: MARKET_TYPE):
self.market = market


class KisProductEventFilter(
KisEventFilterBase["KisWebsocketClient", KisSubscriptionEventArgs[TWebsocketResponse]]
):
class KisProductEventFilter(KisEventFilterBase["KisWebsocketClient", KisSubscriptionEventArgs[TWebsocketResponse]]):

_product: KisSimpleProductProtocol

Expand Down Expand Up @@ -93,3 +91,12 @@ def __filter__(
and e.response.symbol == self._product.symbol
and e.response.market == self._product.market
)

def __hash__(self) -> int:
return hash((self.__class__, self._product))

def __repr__(self) -> str:
return f"{self.__class__.__name__}(symbol={self._product.symbol!r}, market={self._product.market!r})"

def __str__(self) -> str:
return repr(self)
10 changes: 7 additions & 3 deletions pykis/event/filters/subscription.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,7 @@
]


class KisSubscriptionEventFilter(
KisEventFilterBase["KisWebsocketClient", KisSubscriptionEventArgs[TWebsocketResponse]]
):
class KisSubscriptionEventFilter(KisEventFilterBase["KisWebsocketClient", KisSubscriptionEventArgs[TWebsocketResponse]]):
"""TR 구독 이벤트 필터"""

__slots__ = ("id", "key")
Expand All @@ -34,3 +32,9 @@ def __filter__(

def __hash__(self) -> int:
return hash((self.__class__, self.id, self.key))

def __repr__(self) -> str:
return f"{self.__class__.__name__}(id={self.id!r}, key={self.key!r})"

def __str__(self) -> str:
return repr(self)
30 changes: 28 additions & 2 deletions pykis/event/handler.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import warnings
from abc import ABCMeta, abstractmethod
from typing import (
Callable,
Expand Down Expand Up @@ -88,6 +89,12 @@ def __filter__(self, handler: "KisEventHandler", sender: TSender, e: TEventArgs)
def __hash__(self) -> int:
return hash(self.filter)

def __repr__(self) -> str:
return f"{self.__class__.__name__}({self.filter!r})"

def __str__(self) -> str:
return repr(self)


class KisMultiEventFilter(KisEventFilterBase[TSender, TEventArgs]):
"""다중 이벤트 필터"""
Expand Down Expand Up @@ -118,6 +125,12 @@ def __filter__(self, handler: "KisEventHandler", sender: TSender, e: TEventArgs)
def __hash__(self) -> int:
return hash((self.filters, self.gate))

def __repr__(self) -> str:
return f"{self.__class__.__name__}({", ".join(repr(filter) for filter in self.filters)}, gate={self.gate!r})"

def __str__(self) -> str:
return repr(self)


class KisEventCallback(KisEventFilterBase[TSender, TEventArgs], metaclass=ABCMeta):
"""이벤트 콜백"""
Expand Down Expand Up @@ -176,6 +189,12 @@ def __hash__(self) -> int:
def __del__(self):
release_method(self.callback)

def __repr__(self) -> str:
return f"{self.__class__.__name__}({self.callback!r}, where={self.where!r}, once={self.once!r})"

def __str__(self) -> str:
return repr(self)


EventCallback = Callable[[TSender, TEventArgs], None] | KisEventCallback[TSender, TEventArgs]

Expand Down Expand Up @@ -242,10 +261,17 @@ def __exit__(self, exc_type, exc_value, traceback):

def __del__(self):
if not self._suppress_del:
# 2.1.1 버전 이후부터는 티켓을 명시적으로 해지하지 않으면 경고 메시지를 출력합니다.
if self.registered:
warnings.warn(
f"Event ticket {self} was not explicitly unsubscribed, but was unsubscribed due to a resource release.",
UserWarning,
)

self.unsubscribe()

def __repr__(self):
return f"<EventTicket {self.callback}>"
return f"<{self.__class__.__name__} callback={self.callback}>"

def __str__(self):
return repr(self)
Expand Down Expand Up @@ -370,7 +396,7 @@ def __bool__(self):
return bool(self.handlers)

def __repr__(self):
return f"<EventHandler {len(self.handlers)} handlers>"
return f"<{self.__class__.__name__} {len(self.handlers)} handlers>"

def __str__(self):
return repr(self)
Expand Down