HFTrader高频交易系统架构

HFTrader高频交易系统架构

一、开发环境搭建

二、HFTrader高频交易系统架构

1、HFTrader功能特性

  • HFTrader期货功能特性如下:
    • 期货行情网关支持:CTP、REM
    • 期货交易柜台支持:CTP、REM、YD
    • 策略支持:单账户多策略
    • 风控支持:防自成交、撤单限制
  • HFTrader股票功能特性计划支持如下:
    • 华鑫Tora
    • 中泰XTP
    • 宽睿OES
    • 策略支持:单账户多策略
    • 风控支持:防自成交、委撤比限制

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.9
    • GCC编译器: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在交易时段重启会丢失最近行情数据。
  • 成员对象:

    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技术QQ群:748930268,加群验证码:QuantFabric

猜你喜欢

转载自blog.csdn.net/A642960662/article/details/129803839