一、项目概览
项目名称: TH8 - 量化交易系统
技术栈: C# + .NET Framework 4.7.2 + Windows Forms
语言版本:C# 7.3
UI框架: SunnyUI(Windows Forms美化库)
第三方依赖:Newtonsoft.Json, HQChart(策略脚本引擎DLL)
二、项目架构
2.1 整体架构图
┌─────────────────────────────────────────────────────────────────┐
│ 服务器端 │
├─────────────────────────────────────────────────────────────────┤
│ 行情服务器 交易服务器 数据接口 │
└───────────────────────┬───────────────────────┬───────────────┘
│ │
▼ ▼
┌─────────────────────────────────────────────────────────────────┐
│ 网络通信层 │
├─────────────────────────────────────────────────────────────────┤
│ HQSocket ────────── TradeSocket ────────── SocketGetData │
│ (14字节头) (13字节头) (18字节头) │
└───────────────────────┬───────────────────────┬───────────────┘
│ │
▼ ▼
┌─────────────────────────────────────────────────────────────────┐
│ 数据处理层 │
├─────────────────────────────────────────────────────────────────┤
│ KlineManage ────────── KlineHistoryManage ────────── KlineHistory│
│ (实时K线生成) (多合约管理) (单合约存储) │
└───────────────────────┬────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ 策略执行层 │
├─────────────────────────────────────────────────────────────────┤
│ TCeLueObjManage ────────── TCeLueObj ────────── HQChart DLL │
│ │ │ │
│ └────────── CeLueMACDDuoGongZhen (纯C#策略实现) │
└───────────────────────┬────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ 交易执行层 │
├─────────────────────────────────────────────────────────────────┤
│ FrmTrade (下单/持仓/委托/成交管理) │
│ TfrmTrade_Load → InitInfo → GetMoneyInfo/GetStorageList/... │
└─────────────────────────────────────────────────────────────────┘
2.2 核心模块清单
| 模块 | 文件 | 职责 |
|------|------|------|
| **网络通信** | `HQSocket.cs` | 行情数据接收,TCP连接,心跳检测 |
| | `TradeSocket.cs` | 交易指令执行,登录认证,下单 |
| | `SocketGetData.cs` | 备用数据获取通道 |
| **K线管理** | `KlineManage.cs` | 实时K线生成(12种周期) |
| | `KlineHistoryManage.cs` | 多合约K线数据管理 |
| | `KlineHistory.cs` | 单合约K线持久化(.DAT文件) |
| **策略系统** | `TCeLueObjManage.cs` | 策略管理器 |
| | `TCeLueObj.cs` | HQChart脚本策略引擎封装 |
| | `CeLueMACDDuoGongZhen.cs` | 纯C#实现的MACD多周期共振策略 |
| **交易界面** | `FrmTrade.cs` | 交易面板,下单,持仓管理 |
| **数据定义** | `Global.cs` | 全局数据结构和消息定义 |
| **全局状态** | `Common.cs` | 全局实例管理,初始化,工具方法 |
三、网络通信层深度分析
3.1 三套Socket协议对比
| 特性 | HQSocket(行情) | TradeSocket(交易) | SocketGetData(备用) |
|------|-----------------|-------------------|---------------------|
| **协议头格式** | `aaaaaaaaaa` + 4位长度 | `aaaaaaaaaa` + 3位长度 | `aaaaaaaaaa` + 8位长度 |
| **协议头长度** | 14字节 | 13字节 | 18字节 |
| **心跳命令** | `"1;"` | `"50;"` | `"50;"` |
| **心跳间隔** | 8秒 | 8秒 | 8秒 |
| **超时时间** | 15秒无数据断开 | 15秒无数据断开 | 15秒无数据断开 |
| **重连间隔** | 8秒 | 5秒 | 5秒 |
| **接收缓冲区** | 2MB | 1MB | 1MB |
| **消息队列限制** | 1000条/批 | 20条/批 | 20条/批 |
3.2 行情协议消息格式
命令码定义:
| 命令码 | 含义 | 数据格式 |
|--------|------|----------|
| `2` | 心跳返回 | `2;` |
| `10` | 实时行情 | `10;合约代码;时间戳;卖1-5价;卖1-5量;买1-5价;买1-5量;最新价;开盘价;收盘价;最高价;最低价;成交额;成交量;涨停;跌停;昨收;昨持仓;昨结算;市场代码;小数位;主力标志;内外盘;` |
| `11` | K线推送 | 已禁用 |
| `103` | K线历史数据 | `103;合约代码;时间戳;周期;开盘;收盘;最高;最低;成交量;成交额;昨收;` |
| `104` | 历史数据下载完成 | `104;错误码;消息;` |
| `105` | 补充数据 | 同103格式 |
| `106` | 补充数据完成 | `106;错误码;消息;合约代码;周期;开始时间;结束时间;` |
3.3 线程架构
每个Socket类包含三个独立线程:
-
接收线程(`RecvMsgThread`):负责从TCP Socket读取原始字节数据
-
分发线程(`DispatchDataThread`):负责协议解析和消息分发
-
检测线程(`CheckThread`):负责心跳检测和断线重连
四、K线数据处理链路
4.1 实时K线生成流程
1. HQSocket接收实时行情(命令码10)
↓
2. DispatchDataThread解析数据,更新Common.gDictHeYue
↓
3. 调用KlineManage.OnRealData(code, hyInfo)
↓
4. 添加到ListHeYueInfo队列
↓
5. CreateKlineThread(2个并行线程)处理队列
↓
6. CreateKline()方法生成/更新K线
↓
7. KlineHistoryManage.AddData/UpdateData持久化
↓
8. 发送WM_LOCAL_MSG_KLINE消息通知主窗口
↓
9. KlinePush()触发策略执行
4.2 K线周期支持
| 周期标识 | 周期值 | 时间粒度 |
|----------|--------|----------|
| `1m` | 4 | 1分钟 |
| `5m` | 5 | 5分钟 |
| `15m` | 6 | 15分钟 |
| `30m` | 7 | 30分钟 |
| `1H` | 8 | 1小时 |
| `2H` | 9 | 2小时 |
| `4H` | 10 | 4小时 |
| `D` | 0 | 日线 |
| `M` | 1 | 月线 |
| `Y` | 3 | 年线 |
4.3 K线时间计算逻辑
KlineManage.getKlineTime()` 根据时间戳和周期类型计算K线归属时间:
分钟级K线:根据分钟数组(M1/M5/M15/M30)找到最近的周期起点
小时级K线:根据小时数组(H1/H2/H4)找到最近的周期起点
日线:考虑跨天交易时段,判断当前时间属于第一天还是第二天的交易时段
月线/年线:直接取月初/年初时间
4.4 历史数据持久化
数据存储路径:kdata/{合约代码}/k_{合约}_{周期}.DAT
KlineHistoryManage 使用独立线程(threadSaveData)每60秒自动保存所有合约的K线数据。
五、策略执行系统
5.1 两套策略体系对比
| 特性 | TCeLueObj(HQChart脚本引擎) | CeLueMACDDuoGongZhen(纯C#) |
|------|-----------------------------|----------------------------|
| **执行引擎** | HQChartDLL(外部DLL) | 纯C#代码 |
| **策略定义** | 脚本语言(类似通达信公式) | C#类配置 |
| **加载方式** | 从 `celue.dat` 文件读取 | 代码硬编码 |
| **触发时机** | K线完成时通过 `KlinePush` 触发 | 实时行情更新时触发 |
| **指标计算** | 脚本内调用系统函数 | 内置C#算法实现 |
| **风控系统** | 基本下单信号 | 完整风控体系(最大回撤、日亏损、移动止损等) |
5.2 TCeLueObj执行流程
1. TCeLueObjManage.Init()从celue.dat加载策略
↓
2. 用户启动策略 → TCeLueObj.Start()
↓
3. K线完成时 → KlinePush() → TCeLueObj.Run()
↓
4. HQChartDLL.Run()执行脚本
↓
5. pHQChart_Success回调解析结果
↓
6. 识别BUY/SELL/SELLSHORT等输出变量
↓
7. 发送WM_LOCAL_MSG_CELUE_XIADAN消息到交易窗口
5.3 CeLueMACDDuoGongZhen策略详解
5.3.1 技术指标计算
| 指标 | 参数 | 计算方法 |
|------|------|----------|
| **MACD** | Fast=12, Slow=26, Signal=9 | EMA12-EMA26=DIF, EMA(DIF,9)=DEA, MACD=(DIF-DEA)*2 |
| **RSI** | Period=14 | 平均上涨幅度/(平均上涨幅度+平均下跌幅度)*100 |
| **KDJ** | Period=9, K=3, D=3 | RSV=(C-L)/(H-L)*100, K=(K_prev*2+RSV)/3, D=(D_prev*2+K)/3, J=3K-2D |
| **布林带** | Period=20, StdDev=2 | SMA(20) ± 2*标准差 |
5.3.2 多周期共振机制
策略同时检查多个周期(默认1m/5m/15m/30m)的MACD趋势,要求至少3个周期方向一致才产生信号。
5.3.3 特色分析模块
时辰能量:基于中国十二时辰(子丑寅卯...)计算能量偏向,结合成交量和动量
九宫八卦:将价格区间划分为9个宫格(乾兑离震中巽坎艮坤),判断当前价格位置
5.3.4 风控体系
| 风控类型 | 参数 | 说明 |
|----------|------|------|
| 最大回撤 | 20% | 超过阈值停止交易 |
| 日亏损限制 | 5% | 单日亏损超过阈值停止开仓 |
| 移动止损 | 1.5% | 盈利后动态调整止损位 |
| 时间止损 | 60分钟 | 持仓超过时间自动平仓 |
| 仓位控制 | 20% | 每笔仓位不超过资金的20% |
| 信号冷却 | 30秒 | 防止频繁发送信号 |
六、交易执行系统
6.1 FrmTrade核心功能
| 功能 | 实现方法 |
|------|----------|
| 资金查询 | `GetMoneyInfo()` → HTTP接口 `GetUserMoney` |
| 持仓查询 | `GetStorageList()` → HTTP接口 `GetChiCangList` |
| 委托查询 | `GetWeiTuoList()` → HTTP接口 `GetWeiTuoList` |
| 成交查询 | `GetTradeList()` → HTTP接口 `GetTradeList` |
| 止盈止损 | `GetZhiYingSunList()` → TradeSocket命令 `35;` |
| 下单 | `BuyTrade()` → TradeSocket命令 `15;9;...` |
| 撤单 | `CancelWeiTuo()` → TradeSocket命令 `25;...` |
6.2 下单消息格式
开仓消息:"15;9;{goodID};{toOpen};{price};{directionCode};{ip};{priceType};"
止盈止损消息:"34;{goodID};{buySell};{setNum};{yingPrice};{sunPrice};{yingMoney};{sunMoney};{lb};{chaojia_price};{ip};"
6.3 价格类型支持
| 类型 | 说明 |
|------|------|
| 市价 | 使用最新价下单 |
| 指定价 | 用户指定价格 |
| 对手价 | 买入用卖一价,卖出用买一价 |
七、线程安全架构
7.1 线程安全容器
项目使用自定义的线程安全容器:
| 容器类型 | 用途 |
|----------|------|
| `LockLinkedList<T>` | 消息队列(ListNetData、持仓列表、委托列表等) |
| `LockList<T>` | 策略列表、本地条件单列表 |
| `LockDictionary<TKey, TValue>` | 合约字典、K线历史字典 |
7.2 使用模式
// 标准读写模式
LinkedList<string> list = ListNetData.Lock();
try
{
// 操作数据
}
finally
{
ListNetData.UnLock();
}
7.3 多线程并行设计
| 模块 | 线程数量 | 用途 |
|------|----------|------|
| KlineManage | 2个 | 并行生成K线,按合约ID取模分配 |
| KlineHistoryManage | 1个 | 定时保存数据 |
| Socket(每个) | 3个 | 接收、分发、检测 |
| TCeLueObjManage | 1个 | 策略管理主线程 |
八、消息通信机制
8.1 Windows消息定义
| 消息常量 | 值 | 用途 |
|----------|-----|------|
| `WM_SHOW_INFO` | USER+10 | 显示初始化信息 |
| `WM_NET_MSG` | USER+101 | 交易网络消息 |
| `WM_NET_MSG_HQ` | USER+201 | 行情网络消息 |
| `WM_NET_MSG_GETDATA` | USER+202 | 备用数据网络消息 |
| `WM_LOCAL_MSG_KLINE` | USER+210 | K线数据更新 |
| `WM_LOCAL_MSG_CELUE_XIADAN` | USER+211 | 策略下单信号 |
8.2 消息传递方式
使用Windows API `SendMessage` 进行跨线程消息传递,数据通过 `Marshal.StructureToPtr` 序列化到非托管内存。
九、数据结构定义汇总
9.1 核心数据结构
| 结构 | 文件 | 用途 |
|------|------|------|
| `ST_HeYueInfo` | Global.cs | 合约信息(行情+静态属性) |
| `ST_KlineDataInfo` | Global.cs | K线数据(OHLCV) |
| `ST_MoneyInfo` | Global.cs | 资金信息 |
| `ST_Storage_Info` | Global.cs | 持仓信息 |
| `ST_WeiTuo_Info` | Global.cs | 委托信息 |
| `ST_Trade_Info` | Global.cs | 成交信息 |
| `ST_ZhiYingSun_Info` | Global.cs | 止盈止损信息 |
| `ST_NetMsg` | Global.cs | 网络消息结构 |
| `ST_LocalMsg_Kline` | Global.cs | K线本地消息 |
| `ST_LocalMsg_Celue_Xiadan` | Global.cs | 策略下单消息 |
十、总结
10.1 项目核心能力
-
多市场支持:通过合约配置支持全球多个期货市场
-
实时行情处理:支持12种时间周期的实时K线生成
-
双策略引擎:同时支持HQChart脚本策略和纯C#策略实现
-
完整交易功能:下单、平仓、撤单、持仓管理、止盈止损
-
完善风控体系:最大回撤、日亏损限制、移动止损、时间止损
10.2 架构特点
多线程设计:数据接收、处理、存储分离,提高吞吐量
事件驱动:通过Windows消息机制实现模块解耦
本地持久化:K线数据本地文件存储,减少网络依赖
自动重连:所有Socket都具备断线自动重连机制
十一、效果展示
行情页面
K线窗口
策略编辑器,支持麦语言
策略1
策略2
指标自定义交易策略
自定义跟单系统