stock-ai-agent/backend/check_abnormal_orders.sql
2026-02-21 19:39:19 +08:00

92 lines
2.4 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- ============================================================
-- 异常订单检查 SQL
-- 可以直接在 SQLite 命令行或数据库管理工具中执行
-- ============================================================
-- 1. 检查 OPEN 状态但成交价无效的订单(最可能的问题来源)
SELECT
order_id,
symbol,
side,
status,
entry_price,
filled_price,
created_at,
'OPEN状态但成交价无效' as issue
FROM paper_orders
WHERE status = 'OPEN'
AND (filled_price IS NULL OR filled_price = 0);
-- 2. 检查 PENDING 状态但有成交价的订单(状态不一致)
SELECT
order_id,
symbol,
side,
status,
entry_price,
filled_price,
created_at,
'PENDING状态但有成交价' as issue
FROM paper_orders
WHERE status = 'PENDING'
AND filled_price IS NOT NULL
AND filled_price > 0;
-- 3. 检查最近平仓订单中价格异常的记录
SELECT
order_id,
symbol,
side,
status,
entry_price,
filled_price,
exit_price,
closed_at,
'平仓订单价格异常' as issue
FROM paper_orders
WHERE status IN ('CLOSED', 'CLOSED_TP', 'CLOSED_SL', 'CLOSED_BE')
AND closed_at >= datetime('now', '-1 hour')
AND (
filled_price IS NULL OR filled_price = 0 OR
exit_price IS NULL OR exit_price = 0
);
-- 4. 活跃订单状态统计
SELECT
status,
COUNT(*) as total,
SUM(CASE WHEN filled_price IS NULL OR filled_price = 0 THEN 1 ELSE 0 END) as invalid_count
FROM paper_orders
WHERE status IN ('PENDING', 'OPEN')
GROUP BY status;
-- 5. 检查可能重复的订单(同一交易对+方向,最近创建)
SELECT
symbol,
side,
COUNT(*) as count,
MIN(created_at) as first_created,
MAX(created_at) as last_created
FROM paper_orders
WHERE status IN ('PENDING', 'OPEN')
AND created_at >= datetime('now', '-1 hour')
GROUP BY symbol, side
HAVING COUNT(*) > 1;
-- ============================================================
-- 清理异常订单的 SQL谨慎执行
-- ============================================================
-- 删除 OPEN 状态但成交价无效的订单
-- WARNING: 执行前请先确认上面的查询结果!
-- DELETE FROM paper_orders
-- WHERE status = 'OPEN'
-- AND (filled_price IS NULL OR filled_price = 0);
-- 修复 PENDING 状态但有成交价的订单
-- UPDATE paper_orders
-- SET status = 'OPEN'
-- WHERE status = 'PENDING'
-- AND filled_price IS NOT NULL
-- AND filled_price > 0;