feat: 해외주식 미체결 주문 감지 및 처리 (#229)
Some checks failed
CI / test (pull_request) Has been cancelled
Some checks failed
CI / test (pull_request) Has been cancelled
- OverseasBroker에 get_overseas_pending_orders (TTTS3018R, 실전전용) 및 cancel_overseas_order (거래소별 TR_ID, hashkey 필수) 추가 - TelegramClient에 notify_unfilled_order 추가 (BUY취소=MEDIUM, SELL미체결=HIGH 우선순위) - handle_overseas_pending_orders 함수 추가: · BUY 미체결 → 취소 + 쿨다운 설정 · SELL 미체결 → 취소 후 -0.4% 재주문 (최대 1회) · 미국 거래소(NASD/NYSE/AMEX) 중복 조회 방지 - daily/realtime 두 모드 모두 market 루프 시작 전 호출 - 테스트 13개 추가 (test_overseas_broker.py 8개, test_main.py 5개) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -473,6 +473,48 @@ class TelegramClient:
|
||||
NotificationMessage(priority=priority, message=message)
|
||||
)
|
||||
|
||||
async def notify_unfilled_order(
|
||||
self,
|
||||
stock_code: str,
|
||||
market: str,
|
||||
action: str,
|
||||
quantity: int,
|
||||
outcome: str,
|
||||
new_price: float | None = None,
|
||||
) -> None:
|
||||
"""Notify about an unfilled overseas order that was cancelled or resubmitted.
|
||||
|
||||
Args:
|
||||
stock_code: Stock ticker symbol.
|
||||
market: Exchange/market code (e.g., "NASD", "SEHK").
|
||||
action: "BUY" or "SELL".
|
||||
quantity: Unfilled quantity.
|
||||
outcome: "cancelled" or "resubmitted".
|
||||
new_price: New order price if resubmitted (None if only cancelled).
|
||||
"""
|
||||
if not self._filter.trades:
|
||||
return
|
||||
# SELL resubmit is high priority — position liquidation at risk.
|
||||
# BUY cancel is medium priority — only cash is freed.
|
||||
priority = (
|
||||
NotificationPriority.HIGH
|
||||
if action == "SELL"
|
||||
else NotificationPriority.MEDIUM
|
||||
)
|
||||
outcome_emoji = "🔄" if outcome == "resubmitted" else "❌"
|
||||
outcome_label = "재주문" if outcome == "resubmitted" else "취소됨"
|
||||
action_emoji = "🔴" if action == "SELL" else "🟢"
|
||||
lines = [
|
||||
f"<b>{outcome_emoji} 미체결 주문 {outcome_label}</b>",
|
||||
f"Symbol: <code>{stock_code}</code> ({market})",
|
||||
f"Action: {action_emoji} {action}",
|
||||
f"Quantity: {quantity:,} shares",
|
||||
]
|
||||
if new_price is not None:
|
||||
lines.append(f"New Price: {new_price:.4f}")
|
||||
message = "\n".join(lines)
|
||||
await self._send_notification(NotificationMessage(priority=priority, message=message))
|
||||
|
||||
async def notify_error(
|
||||
self, error_type: str, error_msg: str, context: str
|
||||
) -> None:
|
||||
|
||||
Reference in New Issue
Block a user