在高频交易中,尝试并行订单处理是否有意义?

5
我假设这是一个更理论性的问题,适用于熟悉高频交易的人。我从FAST接收订单并处理它们。我每秒接收大约2-3千个订单。问题是我应该尝试同步或异步处理它们。
每次我接收到下一个订单时,我需要执行以下操作:
更新相应工具的订单簿 更新依赖于该订单的指数和指标 更新策略,如果需要则安排一些操作(购买/出售等)
为了同步执行这些操作,我有大约200-300微秒的时间(以能够处理3000个订单每秒)。我认为这应该足够了。
仅为调度异步任务,我认为花费了大约30微秒。
优缺点:
同步:
不需要同步事物! “订单已收到”和“操作已执行”的延迟较小,因为不需要安排任务或将数据/工作传递给另一个进程(在高频交易中非常重要)。 但是,“订单已收到”操作可能会延迟,因为我们可以在套接字缓冲区中等待前一个订单进行处理。
异步:
可以利用现代服务器的强大功能(例如,我的服务器有24个核心) 在某些情况下更快,因为不必等待前一个消息被处理。 可以处理更多的消息或每个消息可以执行更多“复杂”的操作 需要同步很多事物,这可能会减慢程序。
同步的示例:我们接收到MSFT订单更新,然后是INTC订单更新,并在不同的线程中处理它们。在两种情况下,我们都会触发NASDAQ指数重新计算。因此,NASDAQ指数计算应该是同步的。但是,可以通过解决此特定问题来避免同步……这只是可能同步的一个示例。
因此,问题是我应该同步或异步处理订单更新。到目前为止,我异步处理它们,并且每个工具都有专用的线程。因为我可以异步处理两个不同工具(MSFT和INTC)的更新,但是同一工具(MSFT)的两个更新应该同步处理。

你考虑过使用线程池吗? - WiSaGaN
1个回答

4
我从FAST接收订单并处理。我每秒收到大约2-3千个订单。
真的吗?你在交易所工作吗?因为说实话,我从5个交易所获取数据,但那些不是订单;)我建议你把术语搞清楚——你得到了2-3千个事件,但我真的怀疑你是否得到了订单。
你有没有想过做一个多阶段的处理设置?即,你用2个线程获取数据,将其交给另一个线程查找仪器(ID而不是字符串),将其交给另一个线程更新订单簿,将其交给另一个线程进行指标计算,然后将其交给X个线程进行策略处理?
不需要一直安排任务,只需使用同步队列,每个队列上都有一个任务处理消息。采用无锁方法可以非常高效。
坦率地说:我完全支持多线程,但所有核心处理都必须保持基数,因此经典的多线程处理已经过时了。为什么?我需要完全可重复的处理,以便单元测试获得确定的输出。
到目前为止,我异步处理它们,并且每个仪器都有专用线程。
你交易的量不会很大,对吧?我的意思是,我跟踪大约20万个仪器(5个完整的交易所)。分配20万个线程是不可行的;)
使用分阶段管道——这意味着核心循环可以很小,并且您可以将它们分布到足够的核心上,从而使您的可扩展性更高。然后进行适当的优化——例如,很常见的情况是一个仪器的更新紧随着另一个仪器的更新(例如,在大订单执行时进行多次执行)。利用这一点。

我现在的工作不是在主要的交易所,所以我们没有像CME、纳斯达克等那样多的订单 :) - Oleg Vazhnev
你有没有想过使用多阶段处理设置?例如,你在两个线程中获取数据,将其交给另一个线程查找仪器(ID而不是字符串),将其交给另一个线程更新订单簿,将其交给另一个线程进行指标计算,最后将其交给X个线程执行策略?无需始终安排任务,只需同步队列,每个队列上有一个任务处理消息。采用无锁方法可以实现超级高效。你的程序是否采用这种方式?有没有示例、参考资料或文章? - Oleg Vazhnev
是的,我就是这样做的。不幸的是,在外面没有太多的例子。不,我不会为你写任何东西,除非是一份相当昂贵的合同工作。不过,这真的很容易 - 只需制定逻辑步骤并将它们分离。第一步应该只是“从FIX接口获取消息”,以使此循环尽可能紧凑,然后分阶段进行。我的最后一个高性能系统有6个阶段,使用了140个线程,然后我们再次进行了重新同步 ;) - TomTom
你用什么来从同步查询中提取对象?你使用“无限循环”吗?你考虑过使用BlockingCollection吗?例如,看看我在这里的代码https://dev59.com/VWXWa4cB1Zd3GeqPJyKt。如何防止同时处理一个工具的更新?你必须使用锁定。或者你有每个工具查询? - Oleg Vazhnev
我成功地用非常少的指令从队列中取出项目,只需移动指针即可。如果你从事HFT,那么每个周期都是宝贵的,必须认真对待。在这种情况下,您的场景通常不应该有锁,并且不需要等待(为此适当调整输入队列的规模)。在这种情况下,自旋锁的开销几乎为零,除了必需的内存屏障进行内存同步之外(这很糟糕,但英特尔要等到引入事务内存总线的2-3代才能解决)。您不想要锁定和阻塞-上下文切换会很慢。 - TomTom
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接