update
This commit is contained in:
parent
2ebb38c843
commit
7cdb24bf47
@ -129,6 +129,35 @@ async def close_order(order_id: str, request: CloseOrderRequest):
|
|||||||
raise HTTPException(status_code=500, detail=str(e))
|
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")
|
@router.get("/statistics")
|
||||||
async def get_statistics(
|
async def get_statistics(
|
||||||
symbol: Optional[str] = Query(None, description="交易对筛选"),
|
symbol: Optional[str] = Query(None, description="交易对筛选"),
|
||||||
|
|||||||
@ -880,6 +880,55 @@ class PaperTradingService:
|
|||||||
|
|
||||||
return self._close_order(order, OrderStatus.CLOSED_MANUAL, exit_price)
|
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]:
|
def _cancel_pending_order(self, order: PaperOrder) -> Dict[str, Any]:
|
||||||
"""取消挂单"""
|
"""取消挂单"""
|
||||||
db = db_service.get_session()
|
db = db_service.get_session()
|
||||||
|
|||||||
@ -592,6 +592,10 @@
|
|||||||
color: #ff4444;
|
color: #ff4444;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.action-btn + .action-btn {
|
||||||
|
margin-left: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
/* 持仓汇总 */
|
/* 持仓汇总 */
|
||||||
.position-summary {
|
.position-summary {
|
||||||
display: flex;
|
display: flex;
|
||||||
@ -1319,6 +1323,9 @@
|
|||||||
<button class="action-btn danger" @click="closeOrder(order)">
|
<button class="action-btn danger" @click="closeOrder(order)">
|
||||||
{{ order.status === 'pending' ? '取消' : '平仓' }}
|
{{ order.status === 'pending' ? '取消' : '平仓' }}
|
||||||
</button>
|
</button>
|
||||||
|
<button class="action-btn" @click="deleteOrder(order)" title="删除订单(不影响收益率)">
|
||||||
|
删除
|
||||||
|
</button>
|
||||||
<span v-if="order.status === 'open'" class="share-link" @click="shareOrder(order)" title="分享">
|
<span v-if="order.status === 'open'" class="share-link" @click="shareOrder(order)" title="分享">
|
||||||
分享
|
分享
|
||||||
</span>
|
</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) {
|
formatTime(timeStr) {
|
||||||
if (!timeStr) return '-';
|
if (!timeStr) return '-';
|
||||||
const date = new Date(timeStr);
|
const date = new Date(timeStr);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user