HFTrader高频交易系统架构
一、开发环境搭建
- HFTrader高频交易系统作为QuantFabric量化交易系统的一部分,开发环境搭建与开源QuantFabric量化交易系统相同。
二、HFTrader高频交易系统架构
1、HFTrader功能特性
- HFTrader期货功能特性如下: 期货行情网关支持:CTP、REM期货交易柜台支持:CTP、REM、YD策略支持:单账户多策略风控支持:防自成交、撤单限制
- HFTrader股票功能特性支持如下: 华鑫Tora中泰XTP策略支持:单账户多策略风控支持:防自成交、委撤比限制
2、HFTrader高频交易系统架构
- HFTrader高频交易组件是QuantFabric量化交易系统的一部分,与XMonitor监控客户端、XServer中间件、XWatcher监控组件、XMarketCenter行情网关、XTrader交易网关、XRiskJudge风控系统一起组成QuantFabric量化中高频交易系统。
- HFTrader高频交易系统架构如下:
- HFTrader机构版:对于拥有Colo托管交易服务器完整使用权限的交易机构、团队或个人用户,HFTrader高频交易系统由XMonitor监控客户端、XServer中间件、XWatcher监控组件、HFTrader交易组件四个组件构成。
- HFTrader轻量版:对于只拥有Colo托管交易服务器部分资源(如只能使用2个CPU)使用权限的个人用户(通常只有一个交易账户),HFTrader高频交易系统由XMonitor监控客户端、XServer中间件、HFTrader交易组件三个组件构成。
三、HFTrader高频交易系统展示
1、开发服务器
- 开发测试服务器由深圳塞克普斯提供,交易服务器配置如下: CPU:Intel Core i9-10980XE 18核内存:32GB磁盘:480GB SSD网卡:低延迟网卡SolarFlare X2522 x 1, 普通万兆网卡 x 1
- 开发测试服务器环境: CentOS 7.9GCC编译器:GCC 9.3.1
2、HFTrader交易系统展示
- XMonitor监控客户端Monitor插件:
- XMonitor监控客户端OrderManager插件:
- XMonitor监控客户端RiskJudge插件:
3、HFTrader性能指标
- CPU超频至5.0GHZ,并绑定CPU到线程
- 配置CTP行情网关和CTP交易网关,使用上期技术SimNow测试环境,使用简单高频策略进行交易,HFTrader性能延迟数据如下:
Perf Indicator:Tick2Order(ns) count: 219 min: 1008 max: 4184 first: 1008 mean: 1851.33 median: 1762 std: 530.66 10%: 1312 20%: 1414 30%: 1548 40%: 1672 50%: 1762 60%: 1856 70%: 1958 75%: 2044 80%: 2146 85%: 2276 90%: 2542 95%: 3070 99%: 3510
- HFTrader共计报单219笔,Tick2Order最大延迟4184ns,最小延迟1008ns,延迟中位数1762ns,90%分位数2542ns,99%分位数3510ns。
四、HFTrader高频交易系统开发指南
1、HFTrader配置
- HFTrader交易组件配置如下:
HFTraderConfig:
Account : xxxxxx
XWatcherIP: 127.0.0.1
XWatcherPort: 6001
MarketGateWay: CTPMarketGateWay
TraderGateWay: CTPTraderGateWay
StrategyFactory: FutureStrategyFactory
MarketConfig: /home/xtrader/Test/HFTrader/Config/HFTraderXXX.yml
TraderConfig: /home/xtrader/Test/HFTrader/Config/HFTraderXXX.yml
SnapShot: true
SnapShotPath: /home/xtrader/Test/HFTrader/Bin/FutureData.bin
Colo: XServer
CPUSET: 12, 13
AutoTrade: true
StrategyList:
-
Name: LatencyTestStrategy
ExchangeID: DCE
ConfigPath:
ContinuousAuctionPeriod:
- 21:00:00.000-23:00:00.000
- 09:00:00.000-10:15:00.000
- 10:30:00.000-11:30:00.000
- 13:30:00.000-15:00:00.000
Interval: 250
CloseTick: 10
TickerListPath: /home/xtrader/Test/HFTrader/Config/TickerList.yml
MarketConfig:
CallAuctionPeriod: 20:59:00.000
ContinuousAuctionPeriod:
- 21:00:00.000-23:00:00.000
- 09:00:00.000-10:15:00.000
- 10:30:00.000-11:30:00.000
- 13:30:00.000-15:00:00.000
Interval: 250
Interface:
LocalIP:
MultiCastIP:
LocalPort:
TickerListPath: /home/xtrader/Test/HFTrader/Config/TickerList.yml
APIErrorPath: /home/xtrader/Test/HFTrader/Config/YDError.yml
# CTP:FrontAddr REM: LoginID
Extend1:
# CTP:BrokerID REM: PassWord
Extend2:
# CTP: UserID REMTCP: IP REMUDP: ExchangeID
Extend3:
# CTP: PassWord REMTCP: Port
Extend4:
Extend5:
TraderConfig:
Broker: ZX
Product: ZX_Product_1
ExchangeID: CFFEX
BussinessType: 3
BrokerID : xxxx
Account : xxxxxx
Password : 123456
AppID : xxxxx
AuthCode : xxxxxxxxxxxxxxxxxx
QryFund: true
CancelAll: true
CloseToday: false
TickerCancelLimit: 300
TickerListPath: /home/xtrader/Test/HFTrader/Config/TickerList.yml
APIErrorPath: /home/xtrader/Test/HFTrader/Config/YDError.yml
# CTP:FrontAddr YD: YD API Config file REM: EES Trader Lib Path
Extend1:
# REM: TradeServerIP
Extend2:
# REM: TradeServerPort
Extend3:
# REM: TradeServerUDPPort
Extend4:
# REM: QueryServerIP
Extend5:
# REM: QueryServerPort
Extend6:
# REM: QuoteServerIP
Extend7:
# REM: QuoteServerPort
Extend8:
# REM: LocalTradeIP
Extend9:
# REM: LocalTradeUDPPort
Extend10:
- TickerList.yml配置文件如下:
TickerList:
-
TickerIndex: 0
Ticker: IC2209
ExchangeID: CFFEX
PriceTick: 0.2
-
TickerIndex: 1
Ticker: IC2210
ExchangeID: CFFEX
PriceTick: 0.2
-
TickerIndex: 2
Ticker: IC2212
ExchangeID: CFFEX
PriceTick: 0.2
- XXXError.yml错误配置文件如下:
Error:
-
Code: 0
Error: CTP-正确
-
Code: 1
Error: CTP-不在已同步状态
-
Code: 2
Error: CTP-会话信息不一致
-
Code: 3
Error: CTP-不合法的登录
-
Code: 4
Error: CTP-用户不活跃
-
Code: 5
Error: CTP-重复的登录
2、HFTrader线程模型
- HFTrader线程模型如下:
- HFTrader包括行情、策略、交易、监控四个模块,每个模块创建一个线程运行,其中行情、策略、交易建议分别绑定隔离CPU提高性能,HFTrader进程启动时建议绑定CPU,因此每个HFTrader实例占用4个CPU。
3、自定义策略
- 期货交易策略必须从FutureStrategy派生,并实现如下接口:
virtual void LoadStrategyConfig(const ConfigUtil::StrategyProperty& Config) = 0; virtual void OnFastOrder(const Message::TFastOrder& FastOrder) = 0; virtual void OnFutureData(const HFTrader::TFutureMarketData& data, uint32_t TickerIndex) = 0; virtual void OnHistoryData(const HFTrader::TFutureMarketData& data, uint32_t TickerIndex) = 0;
- LoadStrategyConfig:加载具体策略配置。
- OnFastOrder:推送订单状态。
- OnFutureData:推送实时行情数据,计算信号,执行交易信号,进行报单、撤单。
- OnHistoryData:推送历史行情数据,HFTrader在交易时段重启会丢失最近行情数据。
- 股票交易策略必须从StockStrategy派生,并实现如下接口:
virtual void OnStockData(const HFTrader::TStockMarketData& data, uint32_t TickerIndex) = 0; virtual void OnTickOrder(const HFTrader::TTickOrder& data, uint32_t TickerIndex) = 0; virtual void OnTickTrade(const HFTrader::TTickTrade& data, uint32_t TickerIndex) = 0; virtual void OnOrderBook(const HFTrader::TOrderBook& data, uint32_t TickerIndex) = 0;
- OnStockData:推送快照行情
- OnTickOrder: 推送逐笔委托
- OnTickTrade: 推送逐笔成交
- OnOrderBook: 推送订单簿
- 成员对象:
protected:
uint32_t m_StrategyID;
ConfigUtil::StrategyProperty m_StrategyProperty;
std::vector<ConfigUtil::TickerProperty> m_TickerPropertyList;
typedef phmap::flat_hash_map<std::string, ConfigUtil::TickerProperty,
phmap::priv::hash_default_hash<std::string>,
phmap::priv::hash_default_eq<std::string>,
std::allocator<std::pair<const std::string, ConfigUtil::TickerProperty>>>
TickerPropertyMapT;
TickerPropertyMapT m_TickerPropertyMap;
uint64_t m_CurrentSectionStart;
uint64_t m_CurrentSectionEnd;
typedef phmap::flat_hash_map<std::string, uint32_t,
phmap::priv::hash_default_hash<std::string>,
phmap::priv::hash_default_eq<std::string>,
std::allocator<std::pair<const std::string, uint32_t>>>
TickerIndexMapT;
TickerIndexMapT m_TickerIndexMap;
typedef phmap::flat_hash_map<uint32_t, Message::TFastOrder,
phmap::priv::hash_default_hash<uint32_t>,
phmap::priv::hash_default_eq<uint32_t>,
std::allocator<std::pair<const uint32_t, Message::TFastOrder>>>
OrderStatusMapT;
OrderStatusMapT m_OrderStatusMap;
static Message::TAccountFund m_AccountFund;
static phmap::flat_hash_map<std::string, Message::TAccountPosition,
phmap::priv::hash_default_hash<std::string>,
phmap::priv::hash_default_eq<std::string>,
std::allocator<std::pair<const std::string, Message::TAccountPosition>>>
m_LastAccountPositionMap;
Message::TFastOrder m_FastOrder;
protected:
static phmap::flat_hash_map<std::string, HFTrader::TFutureMarketData,
phmap::priv::hash_default_hash<std::string>,
phmap::priv::hash_default_eq<std::string>,
std::allocator<std::pair<const std::string, HFTrader::TFutureMarketData>>>
m_LastFutureMarketDataMap;
- 上述数据结构可以在具体策略中直接使用,但不需要维护。
- 报单、撤单接口如下:
protected:
void SendOrder(const Message::TFastOrder& FastOrder);
void CancelOrder(uint32_t OrderRef);
- SendOrder用于报单,可以复用预定义m_FastOrder成员对象,只填写部分字段,减少开销。m_FastOrder成员对象的通用字段在具体策略构造函数或策略配置加载函数内填写。
- CancelOrder用于撤单,只用填写挂单的OrderRef即可。
推荐参考学习资料:

联想公司福利 1523人发布