61阅读

高频交易软件系统-C++ 为核心语言的高频交易系统是如何做到低延迟?

发布时间:2017-08-03 所属栏目:传媒

一 : C++ 为核心语言的高频交易系统是如何做到低延迟?

[网络延时]C++ 为核心语言的高频交易系统是如何做到低延迟?
面试的时候问到了这个问题,本人是做基于C++的电信后台业务的,常用的性能优化手段也略知一二,但是这个问题就苦于无从入手了
下面就看看www.61k.com小编为您搜集整理的参考答案吧。

网友董可人[网络延时]C++ 为核心语言的高频交易系统是如何做到低延迟?给出的答复:
问题中限定语言是C++,可讨论的范围就比较精简了。现有的答案都在谈系统架构层次上的东西,略显跑题。我对C++了解不多,但我尝试以一名C++程序员的视角,从基本思路出发做一个分析,抛砖引玉。

首先我们要明确系统的需求。所谓交易系统,从一个应用程序的角度来说,有以下几个特点:
一定是一个网络相关的应用,假如机器没联网,肯定什么交易也干不了。所以系统需要通过TCP/IP连接来收发数据。数据要分两种,一种从交易所发过来的市场数据,流量很大,另一种是系统向交易所发出的交易指令,相比前者流量很小,这两种数据需要在不同的TCP/IP连接里传输。因为是自动化交易系统,人工干预的部分肯定比较小,所以图形界面不是重点。而为了性能考虑,图形界面需要和后台分开部署在不同的机器上,通过网络交互,以免任何图形界面上的问题导致后台系统故障或者被抢占资源。这样又要在后台增加新的TCP/IP连接。高频交易系统对延迟异常敏感,目前(2014)市面上的主流系统(可以直接买到的大众系统)延迟至少在100微秒级别,顶尖的系统(HFT专有)可以做到10微秒以下。其他答案里提到C++随便写写延迟做到几百微秒,是肯定不行的,这样的性能对于高频交易来说会是一场灾难。系统只需要专注于处理自己收到的数据,不需要和其他机器合作,不需要担心流量过载。
有了以上几点基本的认识,我们可以看看用C++做为开发语言有哪些需要注意的。

首先前两点需求就决定了,这种系统一定是一个多线程程序。虽然对于图形界面来说,后台系统相当于一个服务端,但这部分的性能不是重点,用常用的模式就能解决(也许这里你可以介绍一下常用的C++ Client/Server库,或者内嵌Web Server之类,相信应该有丰富的选择,这里不展开讨论)。而重要的面向交易所那端,系统其实是一个客户端程序,只需要维护好固定数量的连接就可以了。为延迟考虑,一定要选择异步I/O(阻塞的同步I/O会消耗时间在上下文切换),这里有两点需要注意:
是否可以在单线程内完成所有处理?考虑市场数据的流量远远高于发出的交易指令,在单线程内处理显然是不行的,否则可能收了一大堆数据还没开始处理,错过了发指令的最佳时机。有答案提到要压低平时的资源使用率,这是完全错误的设计思路。问题同样出在上下文切换上,一旦系统进入IDLE状态,再重新切换回处理模式是要付出时间代价的。正确的做法是在线程同步代码中保持对共享变量/内存区的疯狂轮询,一旦有消息就立刻处理,之后继续轮询,这样是最快的处理方式。(顺带一提现在的CPU一般会带有环保功能,使用率低了会导致CPU进入低功耗模式,同样对性能有严重影响。真正的低延迟系统一定是永远发烫的!)
现在我们知道核心的模块是一个多线程的,处理多个TCP/IP连接的模块,接下来就可以针对C++进行讨论。因为需要对接受到的每个TCP或UDP包进行处理,首先要考虑的是如何把包从接收线程传递给处理线程。我们知道C++是面向对象的语言,一般情况下最直观的思路是创建一个对象,然后发给处理线程,这样从逻辑上看是非常清晰的。但在追求低延迟的系统里不能这样做,因为对象是分配在堆上的,而堆的内存结构对我们来说是完全不透明的,没办法控制一个对象会具体分到内存的什么位置上,这直接导致的问题是本来连续收到的网络包,在内存里的分布是分散的,当处理线程需要读取数据时就会发生大量的cache miss,产生不可控的延迟。所以对C++开发者来说,第一条需要谨记的应该是,不要随便使用堆(用关键字new)。核心的数据要保证分配在连续内存里。

另一个问题在于,市场数据和交易指令都是结构化的,包含了股票名称,价格,时间等一系列信息。如果使用C++ class来对数据进行建模和封装,同样会产生不可知的内存结构。为了严格控制内存结构,应该使用struct来封装。一方面在对接收到的数据解析时可以直接定义名称,一方面在分配新对象(比如交易指令)时可以保证所有数据都分配在连续的内存区域。

以上两点是关于延迟方面最重要的注意事项(如果真正做好这两点,大概剩下的唯一问题是给系统取个好名字吧:TwoHardThings)。除此之外,需要考虑的是业务逻辑的编写。高频交易系统里注定了业务逻辑不会太复杂,但重要的是要保证正确性和避免指针错误。正确性应该可以借助于C++的特性比如强类型,模板等来加强验证,这方面我不熟悉就不多说了。高频系统往往运行时要处理大量订单,所以一定要保证系统运行时不能崩溃,一旦coredump后果很严重。这个问题也许可以多做编译期静态分析来加强,或者需要在系统外增加安全机制,这里不展开讨论了。

以下是几点引申思考:

如何存储系统日志?如何对系统进行实时监控?如果系统coredump,事后如何分析找出问题所在?如何设计保证系统可用性,使得出现coredump之类的情况时可以及时切换到备用系统?
这些问题相信在C++框架内都有合适的解决方案,我对此了解不多,所以只列在这里供大家讨论。

注:
从开发语言角度上说,C++只是一种选择,并不是唯一的解决方案。简单的认为低延迟就等同于用C++开发,是不正确的。其他语言同样有可能做出高性能的设计,需要根据语言特性具体分析。关于整体的软硬件架构,可以看我的另一个回答:高频交易软硬件是怎么架构的?关于C++在性能方面的一些最新发展,包括内存结构的一些分析,可以参看:Modern C++: What You Need to Know


网友陈硕[网络延时]C++ 为核心语言的高频交易系统是如何做到低延迟?给出的答复:
谢邀。只搞过 sell side,没搞过 buy side,只能算“实时交易”,算不上“高频交易”。工作以来一直在跟延迟做斗争,勉强可以说上几句。

要控制和降低延迟,首先要能准确测量延迟,因此需要比较准的钟,每个机房配几个带GPS和/或原子钟primary standard的NTP服务器是少不了的。而且就算用了NTP,同一机房两台机器的时间也会有毫秒级的差异,计算延迟的时候,两台机器的时间戳不能直接相减,因为不在同一时钟域。解决办法是设法补偿这个时差。另外,不仅要测量平均延迟,更重要的是要测量并控制长尾延迟,即99百分位数或99.9百分位数的延迟,就算是sell side,系统偶尔慢一下被speculator利用了也是要亏钱的。

普通的C++服务程序,内部延迟(从进程收到消息到进程发出消息)做到几百微秒(即亚毫秒级)是不需要特殊的努力的。没什么忌讳,该怎么写就怎么写,不犯低级错误就行。我很纳闷国内流传的写 C++ 服务程序时的那些“讲究”是怎么来的(而且还不是 latency critical 的服务程序)。如果瓶颈在CPU,那么最有效的优化方式是“强度消减”,即不在于怎么做得快,而在于怎么做得少。哪些可以不用做,哪些可以不提前做,哪些做一次就可以缓存起来用一阵子,这些都是值得考虑的。

网络延迟分传输延迟和惯性延迟,通常局域网内以后者为主,广域网以前者为主。前者是传送1字节消息的基本延迟,大致跟距离成正比,千兆局域网单程是近百微秒,伦敦到纽约是几十毫秒。这个延迟受物理定律限制,优化办法是买更好的网络设备和租更短的线路(或者想办法把光速调大,据说 Jeff Dean 干过)。惯性延迟跟消息大小成正比,跟网络带宽成反比,千兆网TCP有效带宽按115MB/s估算,那么发送1150字节的消息从第1个字节离开本机网卡到第1150个字节离开本机网卡至少需要 10us,这是无法降低的,因此必要的话可以减小消息长度。举例来说,要发10k的消息,先花20us CPU时间,压缩到3k,接收端再花10us解压缩,一共“60us+传输延迟”,这比直接发送10k消息花“100us+传输延迟”要快一点点。(广域网是否也适用这个办法取决于带宽和延迟的大小,不难估算的。)

延迟和吞吐量是矛盾的,通常吞吐量上去了延迟也会跟着飚上去,因此控制负载是控制延迟的重要手段。延迟跟吞吐量的关系通常是个U型曲线,吞吐量接近0的时候延迟反而比较高,因为系统比较“冷”;吞吐量上去一些,平均延迟会降到正常水平,这时系统是“温”的;吞吐量再上去一些,延迟缓慢上升,系统是“热”的;吞吐量过了某个临界点,延迟开始飙升,系统是“烫”的,还可能“冒烟”。因此要做的是把吞吐量控制在“温”和“热”的范围,不要“烫”,也不要太冷。系统启动之后要“预热”。

延迟和资源使用率是矛盾的,做高吞吐的服务程序,恨不得把CPU和IO都跑满,资源都用完。而低延迟的服务程序的资源占用率通常低得可怜,让人认为闲着没干什么事,可以再“加码”,要抵住这种压力。就算系统到了前面说的“发烫”的程度,其资源使用率也远没有到 100%。实际上平时资源使用率低是为了准备应付突发请求,请求或消息一来就可以立刻得到处理,尽量少排队,“排队”就意味着等待,等待就意味着长延迟。消除等待是最直接有效的降低延迟的办法,靠的就是富裕的容量。有时候队列的长度也可以作为系统的性能指标,而不仅仅是CPU使用率和网络带宽使用率。另外,队列也可能是隐式的,比如操作系统和网络设备的网络输入输出 buffer 也算是队列。

延迟和可靠传输也是矛盾的,TCP做到可靠传输的办法是超时重传,一旦发生重传,几百毫秒的延迟就搭进去了,因此保持网络随时畅通,避免拥塞也是控制延迟的必要手段。要注意不要让batch job抢serving job的带宽,比方说把服务器上的日志文件拷到备份存储,这件事不要在繁忙交易时段做。QoS也是办法;或者布两套网,每台机器两个网口,两个IP。

最后,设法保证关键服务进程的资源充裕,避免侵占(主要是CPU和网络带宽)。比如把服务器的日志文件拷到别的机器会占用网络带宽,一个办法是慢速拷贝,写个程序,故意降低拷贝速度,每50毫秒拷贝50kB,这样用时间换带宽。还可以先压缩再拷贝,比如gzip压缩100MB的服务器日志文件需要1秒,在生产服务器上会短期占满1个core的CPU资源,可能造成延迟波动。可以考虑写个慢速压缩的程序,每100毫秒压缩100kB,花一分半钟压缩完100MB数据,分散了CPU资源使用,减少对延迟的影响。千万不要为了加快压缩速度,采用多线程并发的办法,这就喧宾夺主了。


网友匿名用户[网络延时]C++ 为核心语言的高频交易系统是如何做到低延迟?给出的答复:
楼上的扯蛋的比较多
算来也在一家比较大的prop干了不短时间了
最近都不说自己搞的是hft,因为很多人都声称自己搞hft,能得我们很无奈,所以我现在做的是ultra high frequency.
数据的话,t2o, tick to order, 700nanosecond
FPGA + share memory,很多std的东西都不能用,都是自己的lib, 都是单线程,没有lock,最少IO, log很少, 用C++主要是写起来简单,但大部分情况下都是C sytle


网友蒙面大侠[网络延时]C++ 为核心语言的高频交易系统是如何做到低延迟?给出的答复:
从C++角度提几点:避免用不必要的virutal function,因为这样compiler无法做足够的优化,在compile的时候不知道哪个函数会被用。用memory pool,用lock free data structure (Intel TBB),避免kernel call. 善用cache。少用std::map, std::unordered_map,用std::array, std::vector.用pool allocator. 别用std::string.

Colo大家都在用,没有什么特别的优势。FPGA是肯定有用的,那些在几个us水平的应该都是用了FPGA的。

Java美国有一家顶级的quant fund做HFT在用。我知道有些地方用Java写低延时的系统是要改写JVM的,不然一个GC延迟就上去了。


网友匿名用户[网络延时]C++ 为核心语言的高频交易系统是如何做到低延迟?给出的答复:
kernel bypass,使用专用网卡搭配用户态网络协议栈,比如 openonload。

Update:
其他的软件层面的优化可以做的还包括 使用 realtime scheduler,cpu pinning,memory prefaulting 等等;部署上可以采用 colocation,把机器放在交易所的机房;硬件上,可以采用专用的网络设备,当然机器配置越高越好。程序本身的优化手段和其它场景并无太多差异。


网友Sean Go[网络延时]C++ 为核心语言的高频交易系统是如何做到低延迟?给出的答复:
先说,并不是c/c++的效率是决定因素。

最大的延时来自账户席位和网络延时,一席的账户成交优先级高于二席,二席又高于散户。怎样做倒一席呢?只要账户上有足够多的钱就可以。网络延时是最大的,因此在物理位置上离交易所核心机房越近越好,能直接放进去当然最好,如果不能,也要放到ping交易前置机在1ms以内的地方。证券公司会有资源,这要求动用你的一切力量争取到最满意的位置。早年间,这是场内交易和场外交易的区别。

接下来就是算法的效率了,这个可以抽象出来跟语言没关系,大多跟数学/统计模型有关系,然后是算法的实现,c/c++/fortran/汇编的效率确实很好,而且优化的空间很大,但是如果很复杂的算法matlab可能会优化得比自己写得好,那就用matlab实现。

这还没完,操作系统也可以调优,交易接口也可以不用交易所或者证券公司给的,自己分析通信协议重新实现;如果模型很复杂,计算量超大,那么就用并行计算架构,MPI, CUDA什么的用上。如果还要求绝对的速度,就用硬件实现算法, 这时候就轮到DSP芯片, FPGA什么的上阵,最后做一个专用的黑盒子。总之呢,就是所有能提高效率的地方,都是可以想办法做的。

但是,其实你要考虑的首先是,你的速度要求有多高,或者问你的交易策略是否真的需要那么高的速度吗?其次是投入产出比,你的算法是否真的能够挣足够的钱来支持你做各层面的优化。

以上很多虽然只有一句话,但是做起来东西很多,好多我现在也只知道概念,还不会做,提供个思路供参考。


----------+

忽然觉得题主可能理解错题了,考官想问的或许是:“如果指定你用C/C++做HFT , 你将怎么降低延时”,就是在语言和编程技巧这个层面上怎么做优化,我们都被带跑题了。我瞎猜。


网友vczh[网络延时]C++ 为核心语言的高频交易系统是如何做到低延迟?给出的答复:
最后你会发现,摩根斯坦利等公司觉得光靠C++还不够快,愣是把自己的机房盖在了交易所隔壁,用最后的网线长度作斗争……


网友胡彦[网络延时]C++ 为核心语言的高频交易系统是如何做到低延迟?给出的答复:
回答问题的有多少是高频交易员?目前国内最重要的是你能比别人先拿到同一时间戳的Tick数据。搞不定前面毫秒级差异,再是挖空心思优化系统及程序那十几微秒,都是徒劳。


网友阿哲[网络延时]C++ 为核心语言的高频交易系统是如何做到低延迟?给出的答复:
这种级别优化不是光架构或编程语言层面能搞定的,需要从更多层次入手。比如,我记得看过新闻,搞纳斯达克交易系统的人还贡献patch给linux内核。


网友蒙面大侠[网络延时]C++ 为核心语言的高频交易系统是如何做到低延迟?给出的答复:
虽然不是业内人士,但是像 @Sean Go 说的那样,搞HFT还在用C++你就输了
Undiscovered Country of HFT: FPGA JIT Ethernet Packet Assembly


网友Leon Wang[网络延时]C++ 为核心语言的高频交易系统是如何做到低延迟?给出的答复:
从战略上来说,避免任何可能的阻塞,以可预测的方式IO,包括但不限于:网络IO,磁盘,内存,甚至CPU的各级缓存。具体展开来讲:

网络IO:
使用非面向连接的协议,因为面向连接的协议有窗口,有可能引起阻塞。
磁盘:
使用Write Ahead Log(WAL),避免使用数据库。
内存:
1. 避免动态分配内存。(一次随机内存访问花费的时间和顺序访问对于CPU来说花费的时间相差两个数量级)
2. 零内存拷贝,不一定能做到,总之是拷贝的次数越少越好。
3. 数据无需编码解码,可以直接顺序从内存读取,直接可以在网络上收发。
CPU:
避免false sharing,cache miss等。

再具体到C++:
使用Pod,使用placement new,最好连Pod都不使用,直接读写ByteArray。

再具体到代码:
推荐Martin Thompson的两个库:Disruptor & SBE,这两个应该都有c++版本。


网友匿名用户[网络延时]C++ 为核心语言的高频交易系统是如何做到低延迟?给出的答复:
1. 成熟的消息驱动框架
2. Zero copy/kernel bypass
3. CPU isolation
4. 精简业务层逻辑

有些交易所还嫌这不够快,在自己的matching engine边上摆起了机架租给这些做高频交易的...


网友蒙面大侠[网络延时]C++ 为核心语言的高频交易系统是如何做到低延迟?给出的答复:
早上看到,随便讲一点和CPP本身有关的特性。编译期决定,比如meta programming. 非锁同步. cache friendly optimization等等。速度实际上还要调。而不经过内核TCP栈的也是必须的。同机内通信用shared memory,集群内用组播


网友蒙面大侠[网络延时]C++ 为核心语言的高频交易系统是如何做到低延迟?给出的答复:
我认识的做高频交易的有两位,一位上海期货,一位香港大行股票。

这二位的特点是,让题主失望了,二位都是java程序员。

上海期货的这位的要求是自主服务器在交易所服务器同一机架,再次,同一机房。
香港的这位要求专线到交易所网络延迟小于x。

所以,题主,你明白了吗?


网友蒙面大侠[网络延时]C++ 为核心语言的高频交易系统是如何做到低延迟?给出的答复:
曾经写过后端,略知一点点。不要用QuickFix 了,自己琢磨好好写 fix engine 和 OMS 吧。然后花钱烧硬件吧,把CBOT 楼下的包子铺给盘下来。


网友王维[网络延时]C++ 为核心语言的高频交易系统是如何做到低延迟?给出的答复:
说起来我就是干这个的,也面试过别人提过这样的问题,被面试人同样有电信背景。但是……世界应该没这么小吧。

二 : 、等标签。图片添加alt描述。 8、写模板前将系统标签直接套用。减少写时"/> A5交易 A5营销 A5任务 白狐软件 一团网 会员中心  /  

 

  相信做网站的SEOer们都是有心把网站打造出来,可是这个坚持的过程却是无比艰辛。那么如何去打造一个成功的网站呢?正所谓天将降大任于斯人也,所以懂的坚持,善于思考是我们成就事业的基石。

  一、首先,网站建立初期需要具备以下因素:

  1、系统选择很重要。

  2、网站一定要定位明确。

  3、网页风格颜色的统一。

  4、目录层次清晰。

  5、全部采用div+css书写,需要封装的文件尽量封装调用。代码整洁。

  7、合理的使用< h1 >、< h2 >等标签。图片添加alt描述。

  8、写模板前将系统标签直接套用。减少写时在html里面填充信息的时间。

  9、后期调试,检测网站内部错误链接。及时修正。

  二、网站定型以及前期推广

  掌握以上网站基本也就定型了。网站上线后就是做推广,新站刚刚做起来。先去各大搜索引擎提交入口去提交网址,吸引蜘蛛的到来。

  三、怎么积累外链资源去辅助网站的推广

  SEO工作中外链资源的重要性不言而喻,外链资源同时也是SEO高手的核心竞争力之一,掌握的丰富有效的外链资源就相当于seo工作中成功了一半。开拓外链资源掌握两点,首先是收集已知的资源,第二是发掘资源,最后就是综合整理资源。有了资源我们接下来做网站的外链推广工作就事半功倍了。

  1.已知资源的利用

  到各大论坛发帖做签名,因为论坛删帖也是比较严重的,所以切记灌水。相信你怎么对待别人的成果别人也会对你,保护好自己的账号,多注册几个号,顶贴。博客也是推广的手法之一,效果也是非常明显的,因为博客的出身很好,所以养好博客对你的效果会起到一个意想不到的效果。当然养博客并不只是注册了就放那不管理了。要抽空打理一下,提升等级。网络收藏夹,问答等等这些是所谓的已知的资源。

  2.资源的发掘

  那么如何发掘资源呢。SEO其实也是一种人脉关系,交朋友那么别人有好的资源也会愿意同你分享,还有到高权重网站投稿,比如A5,多交流这样做起事情来才能事半功倍。

  3.综合资源的整理

  所谓的综合整理资源其实也很简单,就是整理自己所有的资源做成excel分类管理。其实seo工作最重要的是积累,经验和人脉资源三方面的积累,技术因素虽然重要但在seo中不是最为核心的,所以如果我们想在seo行业中有一番的作为,必须用心去积累,用心去吸收,那么打造一个成功的网站其实也就变的很简单了。而郑州SEO韩旭东(http://www.seodiyi.com)也正是这样来做的。

三 : 微交易软件系统搭建,【科瑞得】云交易系统购买哪家好?

  2011 年以来,内盘市场经过了跨越式大发展时代,上千家大宗交易所创造了一个又一个的财富神话,却也备受争议。随着国家对期货市场监管力度的不断加大,原油、贵金属等品种纷纷下线。

   2017 年 1 月 10 日,证监会发布重磅消息称,将要展开部署清理整顿“回头看”工作,因此接下来的半年时间是集中整治的风暴期,将有90%的交易所及会员单位遭到清理。快速变天的市场让内盘交易所、经纪商意识到形势的严峻性和急迫性,开始另谋出路。

  与此不同的是,国内外汇市场迎来了井喷期。 2017 年被称为外汇元年, 2016 年人民币加入SDR菜篮子,中国外汇市场破浪起航,迎来了万众瞩目的时代,国内外汇市场具有更大的发展空间和可能。据了解,国内知名外汇期权平台一个月 3 亿的高额流水,整个中国区外汇平台月均交易量高达 1000 亿美元。

  虽然外汇市场潜力无限,但转型成功却具有一定难度,想要做好就难上加难了。一个专业权威的金融软件服务商,可以成为转型的最大助力,全球首家交易所(经纪商)孵化基地——科瑞得科技(CREATE TRADER)专注外汇交易系统搭建,形成了海外公司注册、公司牌照申请、交易系统搭建、CTS配套解决方案、运营推广、金融培训等一站式服务。

  对于经纪商最关注的牌照问题,科瑞得科技与 FOX 牌照交易中心 达成战略合作,在香港、纽西兰、塞浦路斯、英国设立专业业务服务团队,整合全球资源,代理注册海外公司、银行开户以及经营外汇、保险。信托、证券等金融监管牌照业务,提供专业、高效的牌照申请服务。

  对于外汇交易系统搭建,科瑞得服务涵盖了MT 4 平台、微盘交易系统、外汇期权平台等多种多样的交易平台,能为交易所打开更加广阔的市场,全方位覆盖PC端、手机端、微信端的客户。微盘系统搭配群控系统及多级代理返佣,做到边交易边推广,边盈利边赚取佣金,实现更强大的营销功效,创造更大的价值。

  关于科瑞得科技

  科瑞得科技,是一家专注于金融软件研发与金融解决方案的综合服务公司,致力于为大宗商品、外汇、期货、股指等金融衍生品交易平台提供整体解决方案和服务。

  科瑞得始创于伦敦,相继在开曼、香港、青岛、深圳和上海设立市场服务机构。至今,公司已拥有伦敦、新加坡、纽约、硅谷和北京五大研发中心,服务全球金融市场。

  公司团队由行业经验丰富的金融、IT、软件研发的专家组成,有着丰富的交易平台设计、咨询、管理、集成、开发经验,为合作伙伴提供一系列资源整合、产品开发、咨询服务。

  科瑞得(CREATE TRADER)以科技创新、交易便捷、平台安全、金融智能为战略,以诚信为本、合作共赢为经营理念,为全球客户提供优质的金融配套服务,矢志成为优秀交易所(经纪商)孵化基地。


声明:本文仅为传递更多网络信息,不代表61阅读观点和意见,仅供参考了解,更不能作为投资使用依据。

广告
本文标题:高频交易软件系统-C++ 为核心语言的高频交易系统是如何做到低延迟?
本文地址: http://www.61k.com/1081747.html

61阅读| 精彩专题| 最新文章| 热门文章| 苏ICP备13036349号-1