(转)以C++为核心语言的高频交易系统的讨论? – Julia & Rust & Python

高频 交易
定量交易的中心
最大的推延出生于存款使就职和把编排到播送网联播推延。,任何的人存款比两个座位具有高的的前。,两个使就座高于散户包围者。。
以任何的方法做座位?既然存款里有十足的钱,你就可以。

把编排到播送网联播推延最大。,因而在物理成分上,中心房间越近越好。,最好把它径直地放上。,假设不克不及,也把它放在ping事务机在1ms里边的使分裂。。

证券公司将有资源。,这需求你所相当多的力去腰槽最称心满意的使就职。。

早岁间,这执意想法达到交易与想法达到交易的分离。。其次是算法的赢利性。,这是笼统的,与使假释出狱有关。,它们次要地与=mathematics/统计法霉相干。,当时的对算法举行了发作。,C/C /FORTRAN/编制的赢利性举世无双。,同时也十足的留空隙举行最优化。,尽管假设算法正是复杂,MATLAB能够比法院命令写得上进。,当时的用MATLAB发作。。

这还缺勤结束,表演零碎也可以被修补。,交易管嘴也可以在缺勤互换或安全性的冲击下预备。,通信协议的重行发作辨析;假设霉正是复杂,极度的计算,当时的使用权并列地计算组织。,MPI, CUDA,为了什么客观的?。假设你需求绝对一步,五金器具发作算法, 这是DSP动作迟缓的转向。, FPGA在举行什么?,决定性的,使成为任何的人公用的黑匣子。。

不管以任何的方法,,这完整是赢利性成绩。,有程度做到这点。。尽管,说起来,你率先要思索的是,你的一步需求High到哈佛?,或许你问你的交易战略假设真的需求很地高的一步?下任何的人是,你的算法真的能赚到十足多的钱来遭受你吗?。内侧的浓厚的的最好的总而言之。,尽管也很多事实要做。,很多,我如今只认识很概念。,还缺勤。,预备了一种顾及方法。。

所议论的使假释出狱是C.,议论的审视更为预先消化。。答案都在零碎组织的排列上。,稍许地无极限主旨。我对C++克制不多,但我尝试以一名C++按次员的视角,从根本理念辨析,打破冷场。

率先,朕需求廓清机构的需求。。同一的交易机构,从使用权的角度,以下独特的:它必需品是任何的人把编排到播送网联播相干的使用权按次。,假设机具缺勤衔接到因特网,自然缺勤交易可以做。。从此处,零碎需求经过TCP/IP衔接来发送和收执记载。。

有两种记载。,从安置发送的市场管理所记载。,交通正是草率地行事。,休息的是由零碎收回的交易管理的到ExChan.,与前者相形,通信量正是小。,这两个记载需求在不胜任的的TCP/IP衔接中迁移。。由于它是自动的交易零碎。,人工干涉的部分地必需品绝对较小。,因而图形接口求全责备主旨。。出于效能思索,图形接口需求独自布置在不胜任的的机具上。,经过把编排到播送网联播彼此的,为了撤销在图形接口上呈现任何的成绩,零碎将。这将在上下文添加新的TCP/IP衔接。。高频交易零碎对推延非常敏感,眼前(2014)市场上的主流零碎(可以径直地买到的群众零碎)推延其中的哪一个多少在100一百万分之一秒超越,顶部零碎(HFT独家制造的产品)可以实现10一百万分之一秒。。另任何的人答案是C 随机写几百一百万分之一秒。,自然求全责备。,很的效能当作高频交易来说会是拳击比赛灾荒。零碎只需求专注于处置它收执到的记载。,不需求与休息机具同事。,不用使烦恼交通重载。。

受胎这些根本的领会,朕可以钞票C 作为任何的人开采器时需求坚持到底的事项。。率先,决定前两个需求。,很的零碎必需品是多线索按次。。依然用于图形用户界面,上下文零碎相当于服侍。,但这部分地的表示求全责备主旨。,它可以用通常的典型来处理(或许你可以在这时引见一下 Client/Server库,或嵌入式Web 服侍等。,我信任理应有很多选择。,这时缺勤议论。。

同时当作互换端来说很要紧。,该零碎事实上的是任何的人客户端按次。,只需求饲料恒定数字的衔接。。

推延思索,朕必需品选择异步I/O(闭塞同一时刻I/O将耗费时期),有两点值当坚持到底。:
假设可以在单穿成串内抛光有处置?思索市场管理所记载的流量极高于收回的交易管理的,复线处置显然是不成受理的。,别的方法,能够会搜集浓厚的的记载。,思念了发布的压榨管理的的冠时期。。处理程度是在平常使沮丧资源出口率。,这是任何的人完整不义的行为的设计理念。。

异样的成绩出生于上下文切换。,零碎一旦进入余国家的,再次切换到处置典型需求破费时期和本钱。。立刻的做法是饲料共享变量/备忘账的轻浮开票。,假设有任何的音讯,立即地处置。,当时的持续轮询。,这是处置成绩的走得快方法。。(顺便地说一下,其时的CPU通常是环境友好型的。,低出口率会致使CPU进入低功耗典型。,它也对效能有极慢地的冲击。。真正的低推延零碎必需品曾经热。!如今朕认识中心模块是多线索的。,处置多个TCP/IP衔接的模块,接下来,朕可以议论C。由于必需品处置被受理的每个TCP或UDP包。,率先要思索的是多少从收执穿成串使分娩记载包。。

朕认识C 是迎合瞄准的使假释出狱。,总而言之,最适于眼睛的的方法是到达任何的人瞄准。,当时的发送处置穿成串。,从逻辑上讲,这是正是卓越的的。。尽管你不克不及在低推延零碎中很做。,由于瞄准是在堆上分派的。,同时堆栈的内存组织对朕来说完整是不透明的。,无法把持瞄准将被分派到内存的使就职。,这径直地致使了先前被记载的把编排到播送网联播记载包的成绩。,回想起说得中肯散布是疏散的。,当处置穿成串需求读取记载时,会发作浓厚的的缓存。 miss,不成控推延。

因而当作C 开采人员来说,,率先要记住。,不要随机使用权堆(使用钥匙词new)。包管中心记载在延续蓄电器中分派。。

另任何的人成绩停止,市场管理所记载和交易管理的是组织化的。,克制股权证券的专门名称。,价钱,时期与绕过通信。

假设你使用权C 类来建模和封装记载。,它还发生未知的内存组织。。为了严格把持内存组织,组织理应用于封装。。
一偏袒,当收执到的记载是可以径直地构成释义专门名称时,一偏袒在分派新瞄准(比方交易管理的)时可以包管有记载都分派在延续的内存区域。越过两点是延误最要紧的少量地。,给换底剩的成绩是达到任何的人好的零碎专门名称。:TwoHardThings)。

更,朕需求思索的是事情逻辑的编制。。高频交易零碎里命定了事情逻辑不克太复杂,尽管确保立刻性和撤销交给不义的行为是很要紧的。。立刻性理应本C 的特点,如强Ty。,模板等偷窃使有法律效力。,我对它不太克制。。

高频零碎通常在运转时处置大定单。,从此处,确保零碎在运转时不克不及垮。,CORDEMP一旦发生极慢地后果。很成绩可以经过组成静态辨析来增大。,或许您需求在零碎表面添加安全性机制。,这时缺勤议论。。

这时某种程度推广的思索。:多少蓄电零碎日记?多少实时监控零碎?假设零碎,多少预先辨析和见成绩?多少设计和包管,使得呈现coredump什么的的冲击时可以即时切换到备用零碎?这些成绩信任在C++构架系统内都有马上的处理方案,对此我不太克制。,这最好的议论罢了。。

注:从开展使假释出狱的角度看,C 最好的一种选择。,这求全责备给换底的处理程度。。停止划桨以为低推延相当于用C开采。,这是不合错误的。。休息使假释出狱也有能够做出高效能的设计。,地面使假释出狱独特的举行详细辨析。。使用着的所有的软五金器具组织,你可以钞票我的另任何的人答案。:高频交易软五金器具是怎样架构的?使用着的C++在效能偏袒的某一最新开展,包含回想起组织的某一辨析,你可以钞票。:Modern C++: What You Need to Know

就很做了。 sell side,从未做过。 buy side,它唯一的被要紧实时交易。,算不上“高频交易”。委派一向在延宕时期。,我实际上说不出几句话来。。

把持和加法推延,率先,朕必需品正确地测推延。,从此处,强制对正确的钟举行构成。,每个机房都装备了两三个GPS和/或原子钟。 规范的NTP服侍是必不成少的。。哪怕你使用权NTP,山姆的两台机具的时期会有手写本的差额。,当计算推延时,两台机具的时期戳不克不及径直地加法。,由于它求全责备在同任何的人时域中。。处理程度是想法组成时差。。

旁白,非但测平等地推延,测和把持长尾时延更为要紧。,也执意说,9900百分位数或百分位数的推延。,甚至卖。 side,偶然,零碎也被投机者渐渐使用权,这同样任何的人错过。。盛行C 发球者按次,室内的推延(从行动收到音讯到行动收回音讯)做到几百一百万分之一秒(即亚手写本级)是不需求特别的工作的。缺勤避免。,多少排和排,缺勤原生的不义的行为。。

我对在乡下排浅尝困惑不详。 C++ 是什么求全责备的发球者追逐(而求全责备)? latency critical 发球者按次)。假设阻碍是CPU,最无效的最优化方法是内涵使沮丧。,这求全责备多少短时间做成的抛光的。,但多少做得更少。。哪一些不克不及做?,哪一些不克不及提早抛光?,一次可以缓存一段时期。,这些都是值当思索的。。

把编排到播送网联播推延分开迁移推延与呆滞推延,通常冲击下,后者次要在网络中。,宛是前者。。前者是发送1八位字节音讯的根本推延。,与间隔多多少少成平衡。,千兆位网络是一百一百万分之一秒。,伦敦到纽约是几十手写本。。这种推延受到物理成分控告的限度局限。,最好的程度是贿赂上进的把编排到播送网联播设备和租用较短的线路(或T)。,根据风评 Jeff Dean 干旱)。

呆滞推延与音讯尺寸成直接比。,与把编排到播送网联播带宽成反比,千兆把编排到播送网联播TCP无效带宽观察115Mb/s,这么发送1150八位字节的音讯从第1个八位字节分开本机网卡到第1150个八位字节分开本机网卡其中的哪一个多少需求 10us,这是不克不及加法的。,从此处,假设大声喊,可以加法音讯广大地域。。插图画家来说,10K音讯,一号消耗20猛然弓背跃起 CPU时期,紧缩到3K,收执器将再次破费10US减压。,60U 迁移推延一共,这比将10K音讯径直地发送到100U TROM稍许地快少量地。。(远程输送网络也使用权这种方法停止带宽的尺寸)。,不难观察。。推延和流率是否认的。,通常流率会休会,推延将尾随。,从此处,负担把持是把持时延的要紧测量。。推延和流率私下的相干通常是U弯成弧形。,当流率接近于0时,推延高的。,由于很零碎是冷的。;某一流率休会。,平等地延误将缩小正规的程度。,很零碎是暖和的的。;流率又休会了。,推延慢慢地休会,很零碎是热的。;流率超越离子交换漏过点。,推延开端波涛,很零碎是热的。,它也能够会用烟熏。。从此处,朕需求做的是把持在暖和的的审视内的流率。,不要热。,不要太冷了。。零碎启动后,使热。。推延和资源使用是否认的。,表演高流率发球者按次。,我以为运转CPU和IO。,用尽资源。低推延发球者按次的资源出口率通常是POO。,让民间音乐以为在放牧中在放牧中。,它可以再次超负荷。,电阻这种压力。。哪怕零碎实现烫伤先前的程度。,资源出口率远未实现。 100%。说起来,平常资源出口率低是预备的。,可以立即地处置要求或音讯。,尽能够少排队。,排队使基于希望。,希望使基于长时期的推延。。移动希望是最径直地无效的使沮丧推延的程度,这停止穷人的资格。。不时队列广大地域可以作为零碎的效能指标。,非但仅是CPU的使用权和把编排到播送网联播带宽的使用权。。

旁白,队列也能够是隐式的。,像,表演零碎和把编排到播送网联播设备的把编排到播送网联播出口和出口。 buffer 它同样任何的人队列。。推延和可靠的迁移同样否认的。,发作TCP可靠的迁移的方法是加时赛重传。,一旦发作重传,数百手写本被推延。,因而任何时候饲料把编排到播送网联播吐艳。,撤销困境同样把持时延的大声喊测量。。谨慎不要让安置 job抢serving 作业带宽,像,将服侍上的日记发稿重复到备份文件蓄电。,在忙碌的交易时期不要很地做。。QoS同样一种方法。;或布两网。,每台机具有两个把编排到播送网联播港口。,双IP。

决定性的,在使用钥匙的发球者追逐中确保十足的资源。,撤销盗用(次要是CPU和把编排到播送网联播带宽)。像,将服侍日记发稿重复到休息机具居住把编排到播送网联播取缔。,一种方法是慢拷贝。,写个按次,有意使沮丧一次印刷一步,每隔50手写本重复50KB。,以这种方法,时期被用来交替带宽。。您可以先紧缩和重复。,像,GZIP紧缩100MB的服侍日记发稿一秒钟。,在粗制滥造服侍上,它将居住1个中心CPU资源。,能够会致使推延动摇。。思索组成任何的人慢速紧缩按次。,每100手写本紧缩100kb,紧缩100MB记载需求一分钱半钟。,CPU资源的疏散使用权,加法对推延的冲击。曾经不要减速紧缩一步。,多线索被附加方法,这是任何的人宏大的达到。。

C++开采高频交易校验是正是大声喊的选择,朕的按次的回答时期是10US(从收执到的回答时期),但平迅速的公司的前端机需求30猛然弓背跃起摆布。,见正文4。,从此处把编排到播送网联播推延居住了浓厚的的时期。。我所相当多的效能校验都在小谷。 在R630机上运转,这台机具有2个NUMA植物的节。,CPU霉是E5。 2643 v4(3.4GHz 6核)。有校验使用权RDTSC管理的来测时期。,有任何的人PDF文档[ Gabriele在智能官方网站上]。 Paoloni, 2010],界定方法多少正确地测时期(使用权CPUID举行同一时刻)。。我本人的效能校验总算将以100的组织来写。,平等地值为100nS。,规范偏差为20nS。。当我计算平等地值和规范差时,我将免除LUG。,由于这些记载如同求全责备按次推延。,相反,CPU被计划表演休息委派[见正文3 ]。。某一效能校验在网上先前取等等现成的总算。,我本人缺勤测。,它是径直地使用权的。,但嗣后我会在我的机具上校验它。。

值当朕坚持到底的两三个成绩。:

1。限度局限回想起相干知上下文的静态散布。:GLUBC默许的MALOC向后有复杂的算法。,当堆留空隙不可时,将命令SBRK。,当分派内存大时,命令MMAP。,这些是零碎命令。,如同要慢某一。,新分派的内存是第一名的。 触摸预备需求很长时期。。抱负做法:尽能够使用权带菌者或打扮(为设定初值分派十足的留空隙),在那以后,所相当多的服用都被拿走了。。尽能够使用权内存池。假设需求双叉树或肉末,尝试使用权沾手式一组(Booo::进行侵略式)。

效能校验:我的校验的尺寸是64和8128,两个。。率先,我校验了GLYBC。 MALLC效能,64八位字节的分派居住98(SD247)ns时期。,8128八位字节的分派居住1485(SD71)ns时期。。其次,我组成了任何的人多行动安全性内存池。,64八位字节的分派需求29(SD15)ns。,8128八位字节的分派需求22(SD12)ns。。内存池的详细通信如正文6所示。。决定性的,我分离校验了SBRK()和初。 有感觉的表示,但记载不记等等。。

2。使用权轮询,放量撤销梗塞相干的知上下文。:上下文切换是耗费时间的的。,恒定耗费包含(CPU流纹被扫过)。、需求拿住和回复各式各样的注册。、必需品表演内核说得中肯调整算法。,与此同时,浓厚的的找错误能够会被缓存。,这是任何的人不恒定的时期耗费。。抱负做法:具有内核旁道效能的网卡。每个行动或许穿成串都专卖任何的人cpu核【isolcpus和irqbalance的详述见正文3】,持续开票。,确保短时间做成的回答。。放量撤销能够致使闭塞的任何的事变(如互斥),其中的一部分命定很慢的灵活的(比方把log写到磁盘上)理应被孤独暴露放到别的cpu上,不克不及冲击主穿成串。效能校验:互联网网络上有任何的人视频博客。, 2010 ]校验典型 switch、thread switch、process 转变耗费时间的,但冠词为时过早了。,嗣后我会用我的新CPU重行校验它。。在很视频博客外面,零碎命令只需求<100ns,穿成串/行动切换需求>1US(不包含缓存时期)。

三。使用权共享内存作为给换底的IPC机制相干知上下文。:共享内在设定初值时只某种程度零碎命令。,当时的,它可以像正规的内存增长同样的使用权。。休息IPC机制(管道)、音讯队列、Socket是每回迁移记载时的零碎命令。,每个迁移记载先前被重复了很多次。。从此处共享内存是走得快的IPC机制。。抱负做法:使用权共享内存作为给换底的IPC机制。自然,您能够需求人工控制发作其中的一部分东西,以确保共享记载是S。,朕发作了本人的无锁内存池。、无锁队列和序列锁[使用着的SEQLoK的正文,见正文1 ]。

效能校验:我在Boost中使用权行动库和无锁库。,SPSC队列是扩大在共享内存上的。,当时的使用权此队列发送记载。,指定遗传密码指的是堆栈溢流管的答案[SEHE。, 2014]。我发送的记载是任何的人8八位字节积分。,延时为153(SD61)ns。。竟至休息IPC机制,我在[剑桥], 2016)钞票了某一效能校验总算。,通常需求几一百万分之一秒到几十一百万分之一秒。。

4。在使分娩音讯时使用权解锁队列的知上下文。:我只关怀本打扮的无锁队列。,内侧的:SPSC队列是无希望的。,其中的哪一个同胎仔假设在同胎仔中,都可以在DE内抛光。,它只需求在表演时根本的原子容易搬运。为是什么T;MPMC队列以多种方法发作。,但它们会慢少量地。,由于它们需求用某一构成重的原子容易搬运(CAS或许FAA),不时他们不得不希望任何的人不决定的时期,直到另任何的人穿成串C。;旁白,也有多个检查员的播送队列。,多个读者可以收执胜任的的音讯播送。,很队列也有SP和MP典型。,可以反省或不反省重写。;决定性的,也任何的人队列,容许音讯蓄电不定。。抱负做法:归纳起来,应撤销MP典型队列。,插图画家:假设你想使用权MPSC队列,多个SPSC可以用来发作很目的。,不需求MP队列。;同样地,假设是压榨播送。,多个SP队列也可以用来掉换MP队列。;假设播送,检查员最好的想订阅某一压榨。,当时的可以使用权多个SPCS 计数内存池[见正文2 ];假设需求多个检查员检查多个粗制滥造者的音讯,按次同样同样的的。,它唯一的用MP来排队。。总结一下,应放量撤销MP型队列。,由于当多个粗制滥造者同时占领队列时,,推延将一次的加法。。效能校验:我写了任何的人mp典型的播送队列,迁移的记载是8八位字节INT。,当仅任何的人粗制滥造者,迁移推延为105(SD26)ns。。加法检查员会使推延稍大某一。,加法粗制滥造者会使延时急剧长胖(我用rdtsc管理的把持不胜任的粗制滥造者同时发送音讯)。当作很队列,它的推延仅比穿插芯可见推延略高[校验RE ],因而理应相当合适的。。

5。思索缓存对一步和上下文知的冲击。:如今机具内存先前十足了。,尽管缓存依然很小。,从此处,所相当多的内存节省技术依然是可用的的。。抱负做法:尝试获取可以同时使用权的记载。;加法交给用环连接(像,用打扮掉换带菌者)。,由于用环连接能够缺席的缓存中。;尽能够节省内存(像,使用权UnQuyJ-PTR)

发表评论

电子邮件地址不会被公开。 必填项已用*标注