175 lines
5.4 KiB
Python
175 lines
5.4 KiB
Python
#!/usr/bin/env python3
|
||
# -*- coding: utf-8 -*-
|
||
"""
|
||
待确认订单服务模块
|
||
"""
|
||
|
||
from typing import List, Dict, Optional, Callable
|
||
from datetime import datetime
|
||
import threading
|
||
|
||
from ..models import PendingOrder
|
||
from ..store import PendingOrderStore
|
||
|
||
|
||
class PendingOrderService:
|
||
"""待确认订单服务(处理业务逻辑)"""
|
||
|
||
def __init__(self, pending_order_store: PendingOrderStore = None):
|
||
self.store = pending_order_store or PendingOrderStore()
|
||
|
||
# 订单确认回调(确认后将指令加入交易队列)
|
||
self._confirm_callback: Optional[Callable] = None
|
||
|
||
# 启动超时清理线程
|
||
self._start_cleanup_thread()
|
||
|
||
print("[PendingOrderService] 待确认订单服务已初始化")
|
||
|
||
def set_confirm_callback(self, callback: Callable):
|
||
"""
|
||
设置订单确认回调函数
|
||
|
||
回调签名: callback(order: PendingOrder) -> None
|
||
"""
|
||
self._confirm_callback = callback
|
||
|
||
def _start_cleanup_thread(self):
|
||
"""启动超时清理线程"""
|
||
def cleanup_loop():
|
||
while True:
|
||
try:
|
||
expired = self.store.cleanup_expired()
|
||
for order in expired:
|
||
print(f"[PendingOrderService] 订单超时自动移除: {order.order_id}")
|
||
except Exception as e:
|
||
print(f"[PendingOrderService] 清理线程异常: {e}")
|
||
threading.Event().wait(10) # 每10秒检查一次
|
||
|
||
thread = threading.Thread(target=cleanup_loop, daemon=True)
|
||
thread.start()
|
||
|
||
# ==================== 创建订单 ====================
|
||
|
||
def create_order(self, symbol: str, action: str, price: float,
|
||
mount: float, sl: float, tp: float,
|
||
reason: str = "", description: str = "",
|
||
source: str = "", **kwargs) -> str:
|
||
"""
|
||
创建待确认订单
|
||
|
||
Args:
|
||
symbol: 品种
|
||
action: 方向 (b/s)
|
||
price: 入场价
|
||
mount: 手数
|
||
sl: 止损
|
||
tp: 止盈
|
||
reason: 原因
|
||
description: 描述
|
||
source: 来源
|
||
**kwargs: 其他字段(pivot_price, key_level, ai_period等)
|
||
|
||
Returns:
|
||
订单ID
|
||
"""
|
||
order = PendingOrder(
|
||
symbol=symbol,
|
||
action=action,
|
||
price=price,
|
||
mount=mount,
|
||
sl=sl,
|
||
tp=tp,
|
||
reason=reason,
|
||
description=description,
|
||
source=source,
|
||
**kwargs
|
||
)
|
||
return self.store.add_order(order)
|
||
|
||
def create_order_from_dict(self, data: Dict) -> str:
|
||
"""从字典创建订单"""
|
||
return self.store.add_order_from_dict(data)
|
||
|
||
# ==================== 查询订单 ====================
|
||
|
||
def get_order(self, order_id: str) -> Optional[PendingOrder]:
|
||
"""获取订单"""
|
||
return self.store.get_order_by_id(order_id)
|
||
|
||
def get_orders(self, symbol: str = None) -> List[PendingOrder]:
|
||
"""获取订单列表"""
|
||
return self.store.get_pending_orders(symbol)
|
||
|
||
def get_orders_dict(self, symbol: str = None) -> List[Dict]:
|
||
"""获取订单字典列表"""
|
||
return self.store.get_pending_orders_dict(symbol)
|
||
|
||
# 兼容旧方法名
|
||
def get_pending_orders_dict(self, symbol: str = None) -> List[Dict]:
|
||
"""获取订单字典列表(兼容旧方法名)"""
|
||
return self.get_orders_dict(symbol)
|
||
|
||
def get_pending_count(self, symbol: str = None) -> int:
|
||
"""获取待确认订单数量"""
|
||
return self.store.get_pending_count(symbol)
|
||
|
||
# ==================== 确认/拒绝订单 ====================
|
||
|
||
def confirm_order(self, order_id: str, updates: Dict = None) -> Optional[PendingOrder]:
|
||
"""
|
||
确认订单
|
||
|
||
Args:
|
||
order_id: 订单ID
|
||
updates: 更新字段(如 mount, sl, tp)
|
||
|
||
Returns:
|
||
确认后的订单
|
||
"""
|
||
# 先获取订单
|
||
order = self.store.get_order_by_id(order_id)
|
||
if not order:
|
||
return None
|
||
|
||
# 应用更新
|
||
if updates:
|
||
if 'mount' in updates:
|
||
order.mount = updates['mount']
|
||
if 'sl' in updates:
|
||
order.sl = updates['sl']
|
||
if 'tp' in updates:
|
||
order.tp = updates['tp']
|
||
|
||
# 确认订单(从存储中移除)
|
||
confirmed_order = self.store.confirm_order(order_id)
|
||
if not confirmed_order:
|
||
return None
|
||
|
||
# 调用确认回调
|
||
if self._confirm_callback:
|
||
try:
|
||
self._confirm_callback(confirmed_order)
|
||
except Exception as e:
|
||
print(f"[PendingOrderService] 确认回调执行失败: {e}")
|
||
|
||
return confirmed_order
|
||
|
||
def reject_order(self, order_id: str) -> Optional[PendingOrder]:
|
||
"""拒绝订单"""
|
||
return self.store.reject_order(order_id)
|
||
|
||
# ==================== 清理 ====================
|
||
|
||
def clear_all(self) -> int:
|
||
"""清空所有待确认订单"""
|
||
return self.store.clear_all()
|
||
|
||
# ==================== 状态 ====================
|
||
|
||
def get_status(self) -> Dict:
|
||
"""获取服务状态"""
|
||
return {
|
||
"store": self.store.get_status(),
|
||
"callback_set": self._confirm_callback is not None,
|
||
} |