好吧,我认为对于那些熟悉 hft 的人来说,这是一个更理论的问题。我收到来自 FAST 的订单并进行处理。我每秒收到大约 2-3 千个订单。问题是我是否应该尝试同步或异步处理它们。
每次收到下一个订单时,我都需要执行以下操作:
- 更新相应工具的订单簿
- 更新取决于该顺序的索引和指标
- 如果需要,更新策略并安排一些行动(买/卖东西等)
为了实现同步,我需要大约 200-300 µs(每秒能够处理 3000 个订单)。我想这应该足够了。
只是为了安排异步任务,我认为大约 30 µs
优点和缺点:
同步:
- ++ 不需要同步东西!
- ++ “收到订单”和“采取行动”之间的延迟较少,因为不需要安排任务或将数据/工作传递给另一个流程(在 hft 中非常重要!)。
- -- 然而,“订单已收到”操作可能会延迟,因为我们可以在套接字缓冲区中等待处理上一个订单
异步:
- ++ 使用现代服务器功能的能力(例如我的服务器有 24 个核心)
- ++ 在某些情况下速度更快,因为在处理上一条消息时无需等待。
- ++ 可以处理更多消息或者可以为每条消息做更多“复杂”的事情
- -- 需要同步很多东西,这会减慢程序速度
同步示例:我们接收更新的 MSFT 订单,然后接收更新的 INTC 订单,并在不同的线程中处理它们。在这两种情况下,我们都会触发纳斯达克指数重新计算。所以纳斯达克指数的计算应该是同步的。
但是,可以解决此特定问题以避免同步...这只是可能同步的一个示例。
所以问题是我应该同步还是异步处理订单更新。到目前为止,我异步处理它们,并且每个仪器都有专用线程。因为我可以异步处理不同仪器(MSFT 和 INTC)的两个更新,但一台仪器(MSFT)的两个更新应该同步处理。
我收到来自 FAST 的订单并进行处理。我每秒收到大约 2-3 千个订单
真的吗?你在交易所工作吗?因为说真的,我从 5 个交易所获取数据,但这些不是订单;)我建议你让你的术语一致 - 你会得到 2-3 千个事件,但我真的怀疑你会得到订单。
您是否想过进行多阶段处理设置? IE。你在2个线程中获取数据,将其交给另一个线程来查找工具(id而不是字符串),将其交给另一个线程来更新订单簿,将其交给另一个线程来做指标,将irt交给X线程做策略?
无需一直安排任务,只需将队列与每个任务上的一个任务处理消息进行同步即可。使用无锁方法可以非常高效。
残酷地说:我完全赞成多线程,但所有核心处理都必须保持基数,所以经典的多线程已经过时了。为什么?我需要完全可重复的处理,以便单元测试获得确定的输出。
到目前为止,我异步处理它们,并且每个仪器都有专用线程
你的交易量并不大,对吧?我的意思是,我跟踪了大约 200.000 个工具(5 个完整的交易所)。分配 200.000 个线程会 - 啊 - 令人望而却步;)
GO 分阶段管道 - 这意味着核心循环可以很小,您可以将它们分配到足够的核心,从而更具可扩展性。然后适当优化 - 例如,更新一个工具后紧接着同一工具的另一个更新是很常见的(例如,在执行大订单时多次执行)。利用这一点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)