一个基于 Go 的 CTP 期货分钟线采集与历史导入工具,提供 Web 控制台。
- CTP 实时行情采集,聚合为 1 分钟 K 线并写入 MySQL 8.4
- 主力加权指数(L9)异步计算
- 通达信历史数据导入(含冲突决策)
- 交易日历导入、刷新与启动自动维护
- K 线检索与图表展示(前端)
- 运行状态实时推送(HTTP + WebSocket)
- Python HTTP 策略服务、策略实例管理、模拟执行与回测入口
main.go: 程序入口internal/quotes: CTP 连接、行情聚合、L9 计算、状态管理internal/strategy: Python 策略服务管理、HTTP 调用、策略实例、模拟执行与审计internal/web: HTTP API、WebSocket、静态资源服务internal/importer: 通达信历史数据导入internal/klinequery: K 线查询与指标计算internal/calendar: 交易日历维护internal/searchindex: 查询索引管理web: Vue3 + Vite 前端工程
- Go
1.25.7+ - Node.js
18+(前端构建) - Python
3.10+(启用策略服务时) - Windows 运行 CTP 需确保以下 DLL 可访问:
wrap.dllthosttraderapi_se.dllthostmduserapi_se.dll
go mod tidy
cd web
npm install
npm run build
cd ..go run . -config ./config/config.json可选参数:
go run . -config ./config/config.json -no-open-no-open: 不自动打开浏览器
默认访问地址:http://127.0.0.1:8080
配置结构包含 5 部分:ctp、db、web、calendar、strategy。
{
"ctp": {
"flow_path": "./flow",
"trader_front_addr": "tcp://180.166.37.142:43205",
"md_front_addr": "tcp://180.166.37.142:43213",
"broker_id": "8030",
"app_id": "client_qhtrade_1.0.0",
"auth_code": "your_auth_code",
"user_product_info": "",
"user_id": "your_user_id",
"password": "your_password",
"subscribe_instruments": ["rb"],
"enable_l9_async": true,
"connect_wait_seconds": 5,
"authenticate_wait_seconds": 5,
"login_wait_seconds": 5,
"md_connect_wait_seconds": 5,
"md_login_wait_seconds": 5,
"md_receive_seconds": 30,
"md_reconnect_enabled": true,
"md_reconnect_initial_backoff_ms": 1000,
"md_reconnect_max_backoff_ms": 30000,
"md_reconnect_jitter_ratio": 0.2,
"md_relogin_wait_seconds": 3,
"tick_dedup_window_seconds": 2,
"drift_threshold_seconds": 5,
"drift_resume_consecutive_ticks": 3,
"no_tick_warn_seconds": 60
},
"web": {
"listen_addr": "127.0.0.1:8080",
"auto_open_browser": true,
"market_open_stale_seconds": 60,
"draw_debug_default": 0,
"browser_log_default": 0
},
"db": {
"driver": "mysql",
"host": "localhost",
"port": 3306,
"user": "root",
"password": "your_mysql_password",
"database": "future_kline",
"params": "parseTime=true&loc=Local&multiStatements=false"
},
"calendar": {
"auto_update_on_start": true,
"min_future_open_days": 60,
"source_url": "",
"source_csv_path": "",
"check_interval_hours": 24,
"browser_fallback": true,
"browser_path": "",
"browser_headless": true
},
"strategy": {
"enabled": false,
"http_addr": "127.0.0.1:50051",
"auto_start": true,
"python_executable": "D:\\ProgramData\\anaconda3\\envs\\pydev3.14\\python.exe",
"python_conda_env_path": "D:\\ProgramData\\anaconda3\\envs\\pydev3.14",
"python_entry": "python/strategy_service.py",
"python_workdir": ".",
"healthcheck_interval_ms": 2000,
"request_timeout_ms": 3000,
"backtest_output_dir": "flow/strategy_backtests"
}
}md_reconnect_enabled默认truemd_reconnect_initial_backoff_ms默认1000,必须> 0md_reconnect_max_backoff_ms默认30000,必须> 0且>= initialmd_reconnect_jitter_ratio默认0.2,范围[0,1]md_relogin_wait_seconds默认3,必须> 0tick_dedup_window_seconds默认2,必须> 0drift_threshold_seconds默认5,必须> 0drift_resume_consecutive_ticks默认3,必须>= 1no_tick_warn_seconds默认回退到web.market_open_stale_seconds,且最小30
当前实现(按代码行为):
- 断线:MD 前置断开后进入自动重连流程
- 退避:指数退避 + 抖动(jitter)
- 补订阅:重连登录成功后对订阅目标全量补订阅
- 去重:
- 实时层:按 tick 指纹做短窗口去重
- 存储层:分钟线
upsert幂等兜底
- 断网疑似:连接看似在线但长时间无 tick,仅标记
network_suspect并告警,不强制重连 - 漂移:检测本机时间与调整后行情时间漂移
- 超阈值:暂停写入
- 恢复:连续 N 条正常 tick 后自动恢复
- 数据库:MySQL(
db.database,默认future_kline) - 合约 1 分钟线表:
future_kline_instrument_1m_<variety> - 合约多周期(非 1 分钟)表:
future_kline_instrument_mm_<variety> - L9 1 分钟线表:
future_kline_l9_1m_<variety> - L9 多周期(非 1 分钟)表:
future_kline_l9_mm_<variety> - 图表布局表:
chart_layouts - 绘图对象表:
chart_drawings
GET /api/chart/layout?symbol=&type=&variety=&timeframe=- 获取图表布局与绘图对象快照
PUT /api/chart/layout- 全量保存布局(含 drawings)
POST /api/chart/drawings- 新增或更新单个绘图对象
DELETE /api/chart/drawings/:id?symbol=&type=&variety=&timeframe=- 删除单个绘图对象
go run ./cmd/migrate_sqlite_to_mysql \
--sqlite-path flow/future_kline.db \
--mysql-host localhost \
--mysql-port 3306 \
--mysql-user root \
--mysql-password your_mysql_password \
--mysql-db future_kline \
--truncate将历史命名 future_kline_instrument_1m_mm_<variety> 重命名为新命名 future_kline_instrument_mm_<variety>:
# 先预览
go run ./cmd/rename_mm_tables \
--mysql-host localhost \
--mysql-port 3306 \
--mysql-user root \
--mysql-password your_mysql_password \
--mysql-db future_kline
# 确认后执行
go run ./cmd/rename_mm_tables \
--mysql-host localhost \
--mysql-port 3306 \
--mysql-user root \
--mysql-password your_mysql_password \
--mysql-db future_kline \
--executeGET /api/status- 返回运行状态快照
POST /api/server/start- 启动 CTP 运行流程
POST /api/import/session- 创建通达信导入会话(
multipart/form-data)
- 创建通达信导入会话(
POST /api/import/session/{id}/decision- 提交导入冲突决策
GET /api/kline/search- K 线检索
GET /api/kline/bars- 拉取图表数据(bars + macd)
GET /api/instruments- 合约列表分页
GET /api/calendar/status- 交易日历状态
POST /api/calendar/import- 上传 CSV 导入交易日历
POST /api/calendar/import/tdx-daily- 上传通达信日线文件导入交易日
POST /api/calendar/refresh- 按配置刷新交易日历
GET /api/strategy/statusGET /api/strategy/definitionsGET /api/strategy/instancesPOST /api/strategy/instancesPOST /api/strategy/instances/{id}/startPOST /api/strategy/instances/{id}/stopGET /api/strategy/signalsPOST /api/strategy/backtestsGET /api/strategy/backtestsGET /api/orders/statusGET /api/orders/audit
GET /ws- 事件类型:
status_updatestrategy_status_updatestrategy_signalstrategy_backtest_doneorder_audit_updateimport_progressimport_conflictimport_doneimport_error
- Go 主进程会按
strategy.python_entry托管拉起 Python HTTP 策略服务 - 如需固定使用 conda 环境,可在
strategy.python_executable与strategy.python_conda_env_path中指定解释器和环境目录;启动子进程时会自动注入CONDA_PREFIX、CONDA_DEFAULT_ENV与该环境的PATH - Python 只输出目标仓位,不直接下单
- Go 侧当前提供的是模拟执行骨架与审计日志,回放模式默认阻断真实执行
- 示例 Python 服务见 python/strategy_service.py
- 运行示例服务前需安装
falcon与uvicorn
/api/status 与 status_update 中 status 包含(节选):
- 基础连接:
state、query_front、query_login、md_front、md_login、md_subscribed - 订阅与时间:
subscribe_count、server_time、trading_day、last_tick_time - 市场活跃:
is_market_open - 错误:
last_error - 可靠性新增:
md_front_disconnectedmd_disconnect_reasonmd_reconnect_attemptmd_next_retry_atnetwork_suspecttick_dedup_droppeddrift_secondsdrift_pauseddrift_pause_count
cd web
npm run dev代理配置见 web/vite.config.js:
/api->http://127.0.0.1:8080/ws->ws://127.0.0.1:8080
建议命令:
go test ./tests/internal/config ./tests/internal/importer ./tests/internal/searchindex ./tests/internal/klinequery说明:internal/quotes 与 tests/internal/quotes 在部分环境下运行测试可能依赖本机 CTP DLL。
- CTP SDK:
github.com/kkqy/ctp-go - MySQL 驱动:
github.com/go-sql-driver/mysql - SQLite 迁移工具读取:
modernc.org/sqlite - WebSocket:
github.com/gorilla/websocket - 编码处理:
golang.org/x/text - 图表库:
lightweight-charts