最后一道坎:市场会疯,机器不能疯
前十章造出来的引擎,在风平浪静的日子里完美无缺。但交易所的职业生涯是用极端日子来定义的:利好落地全市场抢筹的日子、谣言炸开夺路而逃的日子、某个交易员手滑多敲三个零的日子。护栏的意义就是:在这些日子里,规则依然替你站岗,而且站得比人冷静。这一章把真实交易所的四道护栏讲透——每一道都能落成一个具体的代码位置。
护栏一:涨跌停——把价格关进笼子
A股的±10%涨跌停,实现上出乎意料地简单:一个随时间移动的合法价格区间。每天以昨收盘价为基准算出今日笼子的上下沿,收单时校验:限价超出笼子的订单直接拒掉;撮合时,笼子外的价位根本不存在(挂着涨停价的大量买单可以存在,但没人能以更高价卖,所以天然不成交——笼子就是这么"软"地生效的:不是不让你挂,是不让笼子外发生成交)。
注意一个细节:基准价不一定是昨收盘。除权除息日、复牌日,基准要调整。写成配置,别写死。美股的同类机制叫LULD( Limit Up-Limit Down):不是全天一个笼子,而是以最近成交价为轴心的滚动价格带,出带的订单不进撮合,价格带被顶死15秒就暂停交易5分钟,用一次小集合竞价重新开盘——把第七章的定价机器当成"重启按钮"用,这是很漂亮的规则设计。
护栏二:熔断——全市场的深呼吸
涨跌停管单个品种,熔断(circuit breaker)管整个市场。美股的规则是:标普500指数较昨收跌7%、13%时全市场暂停15分钟,跌20%直接收市。逻辑上一句话:当所有人都在向同一个方向逃时,让市场停下来,给信息追上情绪的时间。
工程实现:熔断是一个全局状态机——正常交易 / 暂停(拒新单、允许撤单或全拒,按规则定)/ 集合竞价重启 / 恢复。它凌驾于所有品种之上,每条指令进门前先问状态机。2016年初A股曾短暂引入指数熔断,四天后叫停——因为磁吸效应(价格快跌到熔断线时,大家抢着在熔断前卖,反而加速了下跌)。这个教训值得记住:护栏本身会改变人的行为,设计护栏要算进参与者会对它做出反应。
护栏三:防手滑——胖手指检查
2005年日本瑞穗证券的操作员把"61万日元卖1股"敲成"1日元卖61万股",系统居然接了,几分钟亏掉数亿美元。这类事故有个名字:胖手指(fat finger)。防御措施是一组廉价的合理性校验,在收单的最前端:
- 价格偏离检查:限价偏离最新价/昨收超过x%(比如20%)直接拒单;
- 数量上限:单张订单不得超过N股或N元名义价值;
- 频率限制:单账户每秒下单/撤单次数上限(顺手也挡了恶意刷流量)。
这些检查会误伤极小比例的合法订单,但拦住的事故价值远超此。原则:越靠前端的校验越便宜,越致命的事故越值得便宜地拦。
护栏四:风控前置与总开关
最后一道,也是最不起眼的一道:进撮合之前先问"这个人配不配下这张单"。买单进来,先冻结相应的钱(限价×数量);卖单进来,先冻结相应的货。钱不够、货不足,直接拒——绝不允许"先成交、后赖账"。这就是为什么撮合引擎能放心地只关心价格和时间:信用问题已经在它上游被解决了。期货还要查保证金、持仓限额,同一套"前置校验"框架,只是检查项更多。
以及,每台交易所都需要一个kill switch(总开关):一个按钮,按下后某账户、某网关、或全所的订单流立刻切断、在途订单批量撤掉。平时它一次都用不上;出事的那一分钟里,它是唯一重要的按钮。它必须是系统里最可靠、最少依赖的那条代码路径——不能因为它自己也卡在同一条出问题的链路上而按不下去。
收工:你现在拥有什么
回头看这本书攒下的零件:一面墙(订单簿)和它的形状(第二章);两个排队的人(限价单、市价单,第三、四章);一台手术台上解剖过的撮合循环(第五章);四组订单旋钮(第六章);一台开盘定价机器(第七章);一张各地法规的对照表(第八章);成交后的三张消息网(第九章);三张表五十行的内核(第十章);单线程定序加日志重放的躯干(第十一章);以及这一章的四道护栏。
它们拼起来就是一台完整交易所的图纸:网关定序 → 前置校验(格式、胖手指、风控冻结)→ 单线程撮合内核(循环+旋钮+护栏状态机)→ 事件日志 → 行情/回报/计费/对账外围。每个零件的"为什么"你都知道了——而知道为什么,才是能动手写的前提。
剩下的,就是打开编辑器了。祝你的引擎永远冷静。