在HFT中尝试并行订单处理是否有意义?

时间:2012-07-03 07:19:41

标签: c# fix-protocol hft

我认为对于那些熟悉hft的人来说,这是一个更为理论性的问题。我收到FAST的订单并处理它们。我每秒收到大约2-3千个订单。问题是我是否应该尝试同步或异步处理它们。

每次收到下一个订单时,我都需要执行以下操作:

  • 更新相应工具的订单
  • 更新依赖于该订单的索引和指标
  • 更新策略并根据需要安排某些操作(买/卖等)。

为了做同步,我有大约200-300μs(能够每秒处理3000个订单)。我认为这应该足够了。

只是计划异步任务我花了大约30μs

利弊:

同步:

  • ++不需要同步!
  • ++“收到订单”和“采取行动”之间的延迟较少,因为不需要安排任务或将数据/工作传递给另一个进程(在hft中非常重要!)。
  • - 但是“收到订单”操作可能会延迟,因为我们可以在套接字缓冲区中等待以前的订单处理

异步:

  • ++使用现代服务器的能力(例如我的服务器有24个核心)
  • ++在某些情况下更快,因为在处理上一条消息时不要等待。
  • ++可以处理更多消息,或者可以为每条消息做更复杂的事情
  • - 需要同步很多可以减慢程序的东西

同步示例:我们收到更新的MSFT订单,然后INTC订单更新并在不同的线程中处理它们。在这两种情况下,我们都会触发NASDAQ指数重新计算。因此纳斯达克指数的计算应该是同步的。 然而,这个特殊问题可以通过工作以避免同步......这只是可能同步的一个例子。

所以问题是我应该处理同步或异步的订单更新。到目前为止,我处理它们异步,我有每个仪器的专用线程。因为我可以处理针对不同仪器更新的异步两个(MSFT和INTC),但是应该同步处理一个仪器(MSFT)的两个更新。

1 个答案:

答案 0 :(得分:4)

  

我收到FAST的订单并处理它们。我每秒收到大约2-3千个订单

真的?你在交易所工作?严重的是,我从5个交易所获得数据,但这些不是订单;)我建议你排好你的任期 - 你得到2-3万个事件,但我真的怀疑你得到了ORDERS。

您有没有考虑过进行多阶段处理设置?即你在2个线程中获取数据,将其移交给另一个线程以找到该工具(id而不是字符串),将其交给另一个线程来更新订单簿,将其移交给另一个线程来做指标,将其交给X线程做策略?

无需在任何时间安排任务,只需同步队列就可以在每个队列上处理消息。使用无锁方法可以超级有效。

残酷地说:我全都是多线程的,但所有核心处理都必须保持基数,因此经典的多线程已经完成。为什么?我需要完全可重复的处理,以便单元测试得到确定的输出。

  

到目前为止,我处理它们是异步的,每个工具都有专用的线程

你不交易很多,对吗?我的意思是,我跟踪了大约200,000个乐器(5个完整的交换)。分配200.000个线程将是 - 啊 - 禁止;)

GO阶段管道 - 这意味着核心环路可以很小,您可以将它们分配到足够可扩展的核心。然后进行适当的优化 - 例如,对于一台仪器的更新,然后是SAME仪器的另一次更新(例如,在执行大订单时执行多次),这是很常见的。利用这一点。