This commit is contained in:
aaron 2026-02-25 21:29:39 +08:00
parent 2ebb38c843
commit 7cdb24bf47
3 changed files with 106 additions and 0 deletions

View File

@ -129,6 +129,35 @@ async def close_order(order_id: str, request: CloseOrderRequest):
raise HTTPException(status_code=500, detail=str(e))
@router.delete("/orders/{order_id}")
async def delete_order(order_id: str):
"""
删除订单不产生盈亏仅删除记录
注意此操作会直接删除订单记录不会产生任何盈亏计算
也不会影响收益率等统计指标主要用于删除错误订单或测试数据
- order_id: 订单ID
"""
try:
service = get_paper_trading_service()
result = service.delete_order(order_id)
if not result:
raise HTTPException(status_code=404, detail="订单不存在")
return {
"success": True,
"message": "订单已删除",
"result": result
}
except HTTPException:
raise
except Exception as e:
logger.error(f"删除订单失败: {e}")
raise HTTPException(status_code=500, detail=str(e))
@router.get("/statistics")
async def get_statistics(
symbol: Optional[str] = Query(None, description="交易对筛选"),

View File

@ -880,6 +880,55 @@ class PaperTradingService:
return self._close_order(order, OrderStatus.CLOSED_MANUAL, exit_price)
def delete_order(self, order_id: str) -> Optional[Dict[str, Any]]:
"""
删除订单不产生盈亏仅删除记录
注意此操作会直接从数据库中删除订单记录不会产生任何盈亏计算
也不会影响收益率等统计指标主要用于删除错误订单或测试数据
Args:
order_id: 订单ID
Returns:
删除结果字典
"""
if order_id not in self.active_orders:
logger.warning(f"订单不存在或已删除: {order_id}")
return None
order = self.active_orders[order_id]
symbol = order.symbol
side = order.side.value
status = order.status.value
db = db_service.get_session()
try:
# 从数据库中彻底删除订单
db_order = db.query(PaperOrder).filter(PaperOrder.order_id == order_id).first()
if db_order:
db.delete(db_order)
db.commit()
logger.info(f"订单已从数据库删除: {order_id} | {symbol} {side} | 原状态: {status}")
# 从活跃订单缓存中移除
if order_id in self.active_orders:
del self.active_orders[order_id]
return {
'order_id': order_id,
'symbol': symbol,
'side': side,
'status': status,
'message': '订单已删除(不影响收益率)'
}
except Exception as e:
logger.error(f"删除订单失败: {e}")
db.rollback()
return None
finally:
db.close()
def _cancel_pending_order(self, order: PaperOrder) -> Dict[str, Any]:
"""取消挂单"""
db = db_service.get_session()

View File

@ -592,6 +592,10 @@
color: #ff4444;
}
.action-btn + .action-btn {
margin-left: 6px;
}
/* 持仓汇总 */
.position-summary {
display: flex;
@ -1319,6 +1323,9 @@
<button class="action-btn danger" @click="closeOrder(order)">
{{ order.status === 'pending' ? '取消' : '平仓' }}
</button>
<button class="action-btn" @click="deleteOrder(order)" title="删除订单(不影响收益率)">
删除
</button>
<span v-if="order.status === 'open'" class="share-link" @click="shareOrder(order)" title="分享">
分享
</span>
@ -1958,6 +1965,27 @@
}
},
async deleteOrder(order) {
if (!confirm(`确定要删除订单 ${order.order_id.slice(-12)} 吗?\n\n此操作会直接删除订单记录不会产生任何盈亏计算也不会影响收益率等统计指标。`)) {
return;
}
try {
const response = await fetch(`/api/paper-trading/orders/${order.order_id}`, {
method: 'DELETE'
});
const data = await response.json();
if (data.success) {
alert('订单已删除');
this.refreshData();
} else {
alert('删除失败: ' + (data.detail || '未知错误'));
}
} catch (e) {
alert('删除失败: ' + e.message);
}
},
formatTime(timeStr) {
if (!timeStr) return '-';
const date = new Date(timeStr);