第三章 交易系统架构:四层架构的职责划分
做网格交易系统,最怕什么?
我见过太多人,一上来就写策略代码。结果呢?数据乱了,订单飞了,风控形同虚设。说白了,没有架构的交易系统,就像没有地基的房子。
今天我就把这套实战架构掰开揉碎了讲给你听。这是我做了多年量化交易系统后,沉淀下来的四层架构模型。
3.1 整体架构设计:四层模型
先看整体结构。我习惯把系统拆成四层:数据层、策略层、执行层、风控层。每层各司其职,互不干扰。
核心原则:上层依赖下层,下层不依赖上层。策略层只管算信号,执行层只管发单,风控层只管拦截。
下面这张图,是我用SVG画的架构图。你一看就明白。
嗯,这张图我画了好一会儿。你注意看右侧那条虚线——风控层不是独立的,它贯穿所有层级。数据进来要校验,策略信号要复核,订单发出要监控。这才是真正的风控。
3.2 数据层:系统的血液
数据层是整个系统的基础。没有干净的数据,策略就是瞎搞。
数据层要干三件事:
- 行情采集:实时拉取ETF的tick数据或1分钟K线。我个人习惯用WebSocket连接交易所,延迟低。
- 数据存储:历史数据存到本地数据库。我推荐用SQLite,轻量够用。别一上来就上MySQL,没必要。
- 数据清洗:去掉异常值、处理缺失数据。这一步很多人忽略,但坑最多。
避坑指南:我曾经遇到过行情数据突然断流的情况。交易所API偶尔会抽风。解决方案?加一个心跳检测,5秒没收到数据就报警,同时从备用数据源补数据。
数据层的输出是什么?就是一个干净、实时的价格序列。策略层只管拿这个序列算网格。
3.3 策略层:网格的核心逻辑
策略层是大脑。它负责把价格数据变成买卖信号。
核心流程:
- 确定价格区间:根据历史波动率,算出一个合理的上下边界。我一般用过去60天的最高最低价,再各加5%的缓冲。
- 划分网格:把区间分成N等份。每份就是一个网格。网格数量我建议10-20个,太多容易频繁交易,太少吃不到利润。
- 生成信号:价格每穿过一个网格线,就产生一个信号。向上穿出就卖,向下穿入就买。
你想想看,这个逻辑其实很简单。但难点在哪?动态调整。市场波动率变了,网格间距要不要调?我习惯用ATR(平均真实波幅)来做动态调整。
关键点:策略层只输出信号,不负责下单。它说「该买了」,执行层才去操作。这样职责清晰,出了问题好排查。
3.4 执行层:把信号变成订单
执行层是手脚。它负责把策略层的信号,变成真实的交易所订单。
执行层要处理的事:
- 订单管理:维护一个订单队列。每个网格对应一个挂单。价格到了就成交,没到就挂着。
- 撤单重发:有时候价格波动太快,挂单没成交就滑过去了。这时候要撤单,重新挂到新的网格位置。
- 成交确认:收到交易所的成交回报后,更新本地仓位。这一步容易出问题,我遇到过成交回报丢失的情况。
注意:执行层一定要做幂等处理。同一个信号不能重复下单。我见过有人因为网络重试,同一个网格下了两笔单,仓位直接翻倍。
说白了,执行层就是跟交易所API打交道。限价单怎么发?市价单什么时候用?这些细节我后面会专门讲。
3.5 风控层:最后的防线
风控层是保安。它不直接参与交易,但每笔交易它都要盯着。
风控层监控什么?
| 监控项 | 说明 | 触发动作 |
|---|---|---|
| 资金余额 | 账户可用资金是否充足 | 余额不足时暂停交易,发报警 |
| 持仓上限 | 单只ETF持仓不能超过总资金的30% | 超限时拒绝买入信号 |
| 异常波动 | 价格5分钟内涨跌超过3% | 触发熔断,暂停所有交易10分钟 |
| 订单超时 | 挂单超过30分钟未成交 | 撤单并重新评估网格位置 |
我习惯把风控做成一个独立的服务。它订阅所有层级的消息,一旦发现异常,直接发指令让执行层停止操作。这样即使策略层写错了,风控层也能兜底。
我的经验:风控规则不要写死在代码里。用配置文件管理,方便随时调整。我曾经因为写死了一个熔断阈值,结果市场剧烈波动时系统直接罢工,损失不小。
3.6 四层之间的通信
层与层之间怎么通信?我推荐用消息队列。数据层把行情数据推给策略层,策略层把信号推给执行层。每层都是异步的,互不阻塞。
这样做的好处很明显:
- 数据层卡住了,策略层还能用缓存数据继续算
- 执行层下单慢了,策略层不会等它
- 风控层可以随时插入,拦截异常信号
嗯,这套架构我用了好几年。从最初的单线程脚本,到现在的多进程消息队列架构,踩过的坑都变成了经验。你照着这个框架搭,至少能少走半年弯路。
总结一句话:数据层管数据,策略层管信号,执行层管订单,风控层管安全。各司其职,系统才能稳定运行。
公众号:蓝海资料掘金营,微信deep3321