目前在一家中小私募做量化开发程序员,整个交易系统是由C++搭建的,主要交易的品种为期权,期货,股票。
系统的整体架构分为三部分:1.加载信息端 2.交易端 3.行情处理端。
交易端跟行情处理端一般跟券商提供的交易API相同,分为Trader 和MD(Market Data)。交易端就是管理所有下单函数的地方,行情处理端主要是接收所有行情处理的地方,比如行情的深度数据(成交量,价格等)。
Trader端,主要由这3个函数,去完成整个下单逻辑,insert_order,on_order,on_trader。
insert_order:是主要的下订单函数,它往往跟随以下几个操作,判断账户信息,组合订单判断,往内存内写入订单信息,记录order_local id,向券商下订单等(操作比较多,但是都是下订单前的必要操作)。
on_order:订单回报函数,向券商下订单后,券商会返回调用on_order的接口,会包括成交订单的详情(全部成交,部分成交,撤单等)
on_trader:当订单成功成交以后,会返回订单已成交信息,这个函数往往会配有更新数据库或者更新订单仓位内容的信息,处理这个函数的时候,一定要注意仓位的多空方向,一旦写反,可能会导致策略的仓位无法正常平仓等。
MD端主要用于处理行情数据,收到的深度行情可以推送给其它服务器。比如Level2的行情数据可以通过组播的形式,从一台服务器推向其他几台服务器,行情数据的稳定性是很重要的,要时刻注意有没有可能出现丢包问题。一般券商推送行情数据,会给2个UDP的数据链路,在行情接收前可以加入一些简单的丢包检测判断,来避免丢包而导致的错误开单。如果配有成套的前端展示界面,可以通过MD端,推送行情到前端界面。笔者这里推送是用Redis服务器做中转的,目前还挺稳定。
加载信息端,一般用于盘前操作,主要是处理当天可交易的合约,并将合约信息的张跌停价等做记录,可以作为下单机制的交易限制。
整套交易系统,需要对接很多不同的券商接口,每个API根据券商接口的复杂程度而定,当然会使用大量的底层函数和托管的服务器,以期速度达到最快。笔者目前观察整条下单链路,延时在40-20微秒,暂未仔细了解市场中其他友商的能力。