HFTrader高频交易系统架构

一、开发环境搭建

二、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即可。

推荐参考学习资料:

量化IT技术专栏

QuantFabric开源量化交易系统

#高频交易##量化交易##HFTrader#
全部评论

相关推荐

1 2 评论
分享
牛客网
牛客企业服务