update
This commit is contained in:
parent
7b99f0a9d9
commit
eeecc51379
@ -84,6 +84,31 @@ class PaperTradingService:
|
|||||||
if action not in ['buy', 'sell']:
|
if action not in ['buy', 'sell']:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
symbol = signal.get('symbol', 'UNKNOWN')
|
||||||
|
side = OrderSide.LONG if action == 'buy' else OrderSide.SHORT
|
||||||
|
entry_price = signal.get('entry_price') or signal.get('price', 0)
|
||||||
|
|
||||||
|
# === 限制检查 ===
|
||||||
|
# 1. 同一交易对同一方向最多 3 个订单
|
||||||
|
same_direction_orders = [
|
||||||
|
order for order in self.active_orders.values()
|
||||||
|
if order.symbol == symbol and order.side == side
|
||||||
|
]
|
||||||
|
if len(same_direction_orders) >= 3:
|
||||||
|
logger.info(f"订单限制: {symbol} {side.value} 方向已有 {len(same_direction_orders)} 个订单,跳过")
|
||||||
|
return None
|
||||||
|
|
||||||
|
# 2. 检查是否有接近的挂单(价格差距 < 1%)
|
||||||
|
pending_orders = [
|
||||||
|
order for order in same_direction_orders
|
||||||
|
if order.status == OrderStatus.PENDING
|
||||||
|
]
|
||||||
|
for pending in pending_orders:
|
||||||
|
price_diff = abs(pending.entry_price - entry_price) / pending.entry_price
|
||||||
|
if price_diff < 0.01: # 价格差距小于 1%
|
||||||
|
logger.info(f"订单限制: {symbol} 已有接近的挂单 @ ${pending.entry_price:,.2f},新信号 @ ${entry_price:,.2f},跳过")
|
||||||
|
return None
|
||||||
|
|
||||||
# 获取信号等级
|
# 获取信号等级
|
||||||
grade = signal.get('signal_grade') or signal.get('grade', 'D')
|
grade = signal.get('signal_grade') or signal.get('grade', 'D')
|
||||||
if grade == 'D':
|
if grade == 'D':
|
||||||
@ -95,18 +120,11 @@ class PaperTradingService:
|
|||||||
if quantity == 0:
|
if quantity == 0:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
# 确定订单方向
|
|
||||||
side = OrderSide.LONG if action == 'buy' else OrderSide.SHORT
|
|
||||||
|
|
||||||
# 确定入场类型
|
# 确定入场类型
|
||||||
entry_type_str = signal.get('entry_type', 'market')
|
entry_type_str = signal.get('entry_type', 'market')
|
||||||
entry_type = EntryType.LIMIT if entry_type_str == 'limit' else EntryType.MARKET
|
entry_type = EntryType.LIMIT if entry_type_str == 'limit' else EntryType.MARKET
|
||||||
|
|
||||||
# 获取入场价
|
|
||||||
entry_price = signal.get('entry_price') or signal.get('price', 0)
|
|
||||||
|
|
||||||
# 生成订单ID
|
# 生成订单ID
|
||||||
symbol = signal.get('symbol', 'UNKNOWN')
|
|
||||||
order_id = f"PT-{symbol}-{datetime.now().strftime('%Y%m%d%H%M%S')}-{uuid.uuid4().hex[:6]}"
|
order_id = f"PT-{symbol}-{datetime.now().strftime('%Y%m%d%H%M%S')}-{uuid.uuid4().hex[:6]}"
|
||||||
|
|
||||||
# 确定订单状态和成交价
|
# 确定订单状态和成交价
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user