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#
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-10 15:58
投个小米提前批试试水,先投一个岗位看看形势,不行就再沉淀一下投第二个岗位,莫辜负
Java抽象带篮子:我嘞个骚刚,已经开始研发6g了吗
投递小米集团等公司7个岗位
点赞 评论 收藏
分享
废物一个0offer:认真的吗二本本科找人工智能岗位
点赞 评论 收藏
分享
避坑恶心到我了大家好,今天我想跟大家聊聊我在成都千子成智能科技有限公司(以下简称千子成)的求职经历,希望能给大家一些参考。千子成的母公司是“同创主悦”,主要经营各种产品,比如菜刀、POS机、电话卡等等。听起来是不是有点像地推销售公司?没错,就是那种类型的公司。我当时刚毕业,急需一份临时工作,所以在BOSS上看到了千子成的招聘信息。他们承诺无责底薪5000元,还包住宿,这吸引了我。面试的时候,HR也说了同样的话,感觉挺靠谱的。于是,我满怀期待地等待结果。结果出来后,我通过了面试,第二天就收到了试岗通知。试岗的内容就是地推销售,公司划定一个区域,然后你就得见人就问,问店铺、问路人,一直问到他们有意向为止。如果他们有兴趣,你就得摇同事帮忙推动,促进成交。说说一天的工作安排吧。工作时间是从早上8:30到晚上18:30。早上7点有人叫你起床,收拾后去公司,然后唱歌跳舞(销售公司都这样),7:55早课(类似宣誓),8:05同事间联系销售话术,8:15分享销售技巧,8:30经理训话。9:20左右从公司下市场,公交、地铁、自行车自费。到了市场大概10点左右,开始地推工作。中午吃饭时间大约是12:00,公司附近的路边盖饭面馆店自费AA,吃饭时间大约40分钟左右。吃完饭后继续地推工作,没有所谓的固定中午午休时间。下午6点下班后返回公司,不能直接下班,需要与同事交流话术,经理讲话洗脑。正常情况下9点下班。整个上班的一天中,早上到公司就是站着的,到晚上下班前都是站着。每天步数2万步以上。公司员工没有自己的工位,百来号人挤在一个20平方米的空间里听经理洗脑。白天就在市场上奔波,公司的投入成本几乎只有租金和工资,没有中央空调。早上2小时,晚上加班2小时,纯蒸桑拿。没有任何福利,节假日也没有3倍工资之类的。偶尔会有冲的酸梅汤和西瓜什么的。公司的晋升路径也很有意思:新人—组长—领队—主管—副经理—经理。要求是业绩和团队人数,类似传销模式,把人留下来。新人不能加微信、不能吐槽公司、不能有负面情绪、不能谈恋爱、不能说累。在公司没有任何坐的地方,不能依墙而坐。早上吃早饭在公司外面的安全通道,未到上班时间还会让你吃快些不能磨蹭。总之就是想榨干你。复试的时候,带你的师傅会给你营造一个钱多事少离家近的工作氛围,吹嘘工资有多高、还能吹自己毕业于好大学。然后让你早点来公司、无偿加班、抓住你可能不会走的心思进一步压榨你。总之,大家在找工作的时候一定要擦亮眼睛,避免踩坑!———来自网友
qq乃乃好喝到咩噗茶:不要做没有专业门槛的工作
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-10 11:45
你不要过来啊啊啊啊啊啊啊
码农索隆:对面:“今天你不面也得面”
点赞 评论 收藏
分享
评论
2
3
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务