feat: 实现跟单订单跟踪和统计功能
- 添加订单跟踪实体和Repository(CopyOrderTracking, SellMatchRecord, SellMatchDetail) - 实现订单跟踪服务(CopyOrderTrackingService),支持买入/卖出订单的创建和匹配 - 实现跟单统计服务(CopyTradingStatisticsService),支持盈亏统计和订单列表查询 - 添加失败交易记录(FailedTrade)和已处理交易去重(ProcessedTrade) - 实现轮询服务(CopyTradingPollingService),使用Data API /activity接口轮询Leader交易 - 支持多元市场(使用outcomeIndex而不是YES/NO) - 重试时重新生成salt并重新签名 - 添加风险控制检查(每日订单数、每日亏损、单笔订单大小限制) - 支持价格容忍度和延迟跟单 - 添加数据库迁移文件(V8, V9, V10) - 前端:账户管理显示代理钱包地址,添加复制功能,移除默认账户逻辑 - 修复API响应字段映射问题(orderID, transactionsHashes) - 缩短轮询间隔到2秒
This commit is contained in:
@@ -47,6 +47,12 @@ position.push.polling-interval=${POSITION_PUSH_POLLING_INTERVAL:3000}
|
||||
# 心跳超时时间(毫秒),默认60秒,超过此时间未收到心跳则清理连接
|
||||
position.push.heartbeat-timeout=${POSITION_PUSH_HEARTBEAT_TIMEOUT:60000}
|
||||
|
||||
# 跟单轮询配置
|
||||
# 轮询间隔(毫秒),默认2秒
|
||||
copy.trading.polling.interval=${COPY_TRADING_POLLING_INTERVAL:2000}
|
||||
# 是否启用轮询,默认true
|
||||
copy.trading.polling.enabled=${COPY_TRADING_POLLING_ENABLED:true}
|
||||
|
||||
# WebSocket 配置
|
||||
websocket.heartbeat-timeout=${WEBSOCKET_HEARTBEAT_TIMEOUT:60000}
|
||||
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
-- 添加 outcome_index 字段到订单跟踪表和卖出匹配记录表
|
||||
-- 支持多元市场(不限于YES/NO)
|
||||
|
||||
-- 1. 添加 outcome_index 字段到 copy_order_tracking 表
|
||||
ALTER TABLE copy_order_tracking
|
||||
ADD COLUMN outcome_index INT NULL COMMENT '结果索引(0, 1, 2, ...),支持多元市场' AFTER side;
|
||||
|
||||
-- 2. 添加 outcome_index 字段到 sell_match_record 表
|
||||
ALTER TABLE sell_match_record
|
||||
ADD COLUMN outcome_index INT NULL COMMENT '结果索引(0, 1, 2, ...),支持多元市场' AFTER side;
|
||||
|
||||
-- 3. 添加索引以优化查询性能
|
||||
ALTER TABLE copy_order_tracking
|
||||
ADD INDEX idx_market_outcome (market_id, outcome_index);
|
||||
|
||||
ALTER TABLE sell_match_record
|
||||
ADD INDEX idx_market_outcome (market_id, outcome_index);
|
||||
|
||||
@@ -0,0 +1,76 @@
|
||||
-- 创建订单跟踪表
|
||||
CREATE TABLE IF NOT EXISTS copy_order_tracking (
|
||||
id BIGINT AUTO_INCREMENT PRIMARY KEY,
|
||||
copy_trading_id BIGINT NOT NULL COMMENT '跟单关系ID',
|
||||
account_id BIGINT NOT NULL COMMENT '账户ID',
|
||||
leader_id BIGINT NOT NULL COMMENT 'Leader ID',
|
||||
template_id BIGINT NOT NULL COMMENT '模板ID',
|
||||
market_id VARCHAR(100) NOT NULL COMMENT '市场地址',
|
||||
side VARCHAR(10) NOT NULL COMMENT '方向:YES/NO',
|
||||
buy_order_id VARCHAR(100) NOT NULL COMMENT '跟单买入订单ID',
|
||||
leader_buy_trade_id VARCHAR(100) NOT NULL COMMENT 'Leader 买入交易ID',
|
||||
quantity DECIMAL(20, 8) NOT NULL COMMENT '买入数量',
|
||||
price DECIMAL(20, 8) NOT NULL COMMENT '买入价格',
|
||||
matched_quantity DECIMAL(20, 8) NOT NULL DEFAULT 0 COMMENT '已匹配卖出数量',
|
||||
remaining_quantity DECIMAL(20, 8) NOT NULL COMMENT '剩余未匹配数量',
|
||||
status VARCHAR(20) NOT NULL COMMENT '状态:filled, fully_matched, partially_matched',
|
||||
created_at BIGINT NOT NULL COMMENT '创建时间(毫秒时间戳)',
|
||||
updated_at BIGINT NOT NULL COMMENT '更新时间(毫秒时间戳)',
|
||||
INDEX idx_copy_trading (copy_trading_id),
|
||||
INDEX idx_remaining (remaining_quantity, status),
|
||||
INDEX idx_market_side (market_id, side),
|
||||
INDEX idx_leader_trade (leader_id, leader_buy_trade_id),
|
||||
FOREIGN KEY (copy_trading_id) REFERENCES copy_trading(id) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单跟踪表';
|
||||
|
||||
-- 创建卖出匹配记录表
|
||||
CREATE TABLE IF NOT EXISTS sell_match_record (
|
||||
id BIGINT AUTO_INCREMENT PRIMARY KEY,
|
||||
copy_trading_id BIGINT NOT NULL COMMENT '跟单关系ID',
|
||||
sell_order_id VARCHAR(100) NOT NULL COMMENT '跟单卖出订单ID',
|
||||
leader_sell_trade_id VARCHAR(100) NOT NULL COMMENT 'Leader 卖出交易ID',
|
||||
market_id VARCHAR(100) NOT NULL COMMENT '市场地址',
|
||||
side VARCHAR(10) NOT NULL COMMENT '方向:YES/NO',
|
||||
total_matched_quantity DECIMAL(20, 8) NOT NULL COMMENT '总匹配数量',
|
||||
sell_price DECIMAL(20, 8) NOT NULL COMMENT '卖出价格',
|
||||
total_realized_pnl DECIMAL(20, 8) NOT NULL COMMENT '总已实现盈亏',
|
||||
created_at BIGINT NOT NULL COMMENT '创建时间(毫秒时间戳)',
|
||||
INDEX idx_copy_trading (copy_trading_id),
|
||||
INDEX idx_sell_order (sell_order_id),
|
||||
INDEX idx_leader_trade (leader_sell_trade_id),
|
||||
FOREIGN KEY (copy_trading_id) REFERENCES copy_trading(id) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='卖出匹配记录表';
|
||||
|
||||
-- 创建匹配明细表
|
||||
CREATE TABLE IF NOT EXISTS sell_match_detail (
|
||||
id BIGINT AUTO_INCREMENT PRIMARY KEY,
|
||||
match_record_id BIGINT NOT NULL COMMENT '关联 sell_match_record.id',
|
||||
tracking_id BIGINT NOT NULL COMMENT '关联 copy_order_tracking.id',
|
||||
buy_order_id VARCHAR(100) NOT NULL COMMENT '买入订单ID',
|
||||
matched_quantity DECIMAL(20, 8) NOT NULL COMMENT '匹配的数量',
|
||||
buy_price DECIMAL(20, 8) NOT NULL COMMENT '买入价格',
|
||||
sell_price DECIMAL(20, 8) NOT NULL COMMENT '卖出价格',
|
||||
realized_pnl DECIMAL(20, 8) NOT NULL COMMENT '盈亏 = (sell_price - buy_price) * matched_quantity',
|
||||
created_at BIGINT NOT NULL COMMENT '创建时间(毫秒时间戳)',
|
||||
INDEX idx_match_record (match_record_id),
|
||||
INDEX idx_tracking (tracking_id),
|
||||
INDEX idx_buy_order (buy_order_id),
|
||||
FOREIGN KEY (match_record_id) REFERENCES sell_match_record(id) ON DELETE CASCADE,
|
||||
FOREIGN KEY (tracking_id) REFERENCES copy_order_tracking(id) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='匹配明细表';
|
||||
|
||||
-- 创建已处理交易表(用于去重)
|
||||
CREATE TABLE IF NOT EXISTS processed_trade (
|
||||
id BIGINT AUTO_INCREMENT PRIMARY KEY,
|
||||
leader_id BIGINT NOT NULL COMMENT 'Leader ID',
|
||||
leader_trade_id VARCHAR(100) NOT NULL COMMENT 'Leader 的交易ID(trade.id,唯一标识)',
|
||||
trade_type VARCHAR(10) NOT NULL COMMENT '交易类型:BUY 或 SELL',
|
||||
source VARCHAR(20) NOT NULL COMMENT '数据来源:websocket 或 polling',
|
||||
processed_at BIGINT NOT NULL COMMENT '处理时间(毫秒时间戳)',
|
||||
created_at BIGINT NOT NULL COMMENT '创建时间(毫秒时间戳)',
|
||||
UNIQUE KEY uk_leader_trade (leader_id, leader_trade_id),
|
||||
INDEX idx_processed_at (processed_at),
|
||||
INDEX idx_leader_id (leader_id),
|
||||
FOREIGN KEY (leader_id) REFERENCES copy_trading_leaders(id) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='已处理交易表(用于去重)';
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
-- 修改已处理交易表,添加状态字段
|
||||
ALTER TABLE processed_trade
|
||||
ADD COLUMN status VARCHAR(20) NOT NULL DEFAULT 'SUCCESS' COMMENT '处理状态:SUCCESS(成功)、FAILED(失败)' AFTER source;
|
||||
|
||||
-- 创建失败交易记录表
|
||||
CREATE TABLE IF NOT EXISTS failed_trade (
|
||||
id BIGINT AUTO_INCREMENT PRIMARY KEY,
|
||||
leader_id BIGINT NOT NULL COMMENT 'Leader ID',
|
||||
leader_trade_id VARCHAR(100) NOT NULL COMMENT 'Leader 的交易ID',
|
||||
trade_type VARCHAR(10) NOT NULL COMMENT '交易类型:BUY 或 SELL',
|
||||
copy_trading_id BIGINT NOT NULL COMMENT '跟单关系ID',
|
||||
account_id BIGINT NOT NULL COMMENT '账户ID',
|
||||
market_id VARCHAR(100) NOT NULL COMMENT '市场地址',
|
||||
side VARCHAR(10) NOT NULL COMMENT '方向:YES/NO',
|
||||
price VARCHAR(50) NOT NULL COMMENT '价格',
|
||||
size VARCHAR(50) NOT NULL COMMENT '数量',
|
||||
error_message TEXT COMMENT '错误信息',
|
||||
retry_count INT NOT NULL DEFAULT 0 COMMENT '重试次数',
|
||||
failed_at BIGINT NOT NULL COMMENT '失败时间(毫秒时间戳)',
|
||||
created_at BIGINT NOT NULL COMMENT '创建时间(毫秒时间戳)',
|
||||
INDEX idx_leader_trade (leader_id, leader_trade_id),
|
||||
INDEX idx_copy_trading (copy_trading_id),
|
||||
INDEX idx_failed_at (failed_at),
|
||||
FOREIGN KEY (copy_trading_id) REFERENCES copy_trading(id) ON DELETE CASCADE,
|
||||
FOREIGN KEY (leader_id) REFERENCES copy_trading_leaders(id) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='失败交易记录表';
|
||||
|
||||
Reference in New Issue
Block a user