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

标签 c# fix-protocol hft

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

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

  • 更新相应工具的订单簿
  • 更新依赖于该顺序的索引和指标
  • 更新策略并根据需要安排一些行动(买/卖东西等)

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

只是为了安排异步任务,我花了大约 30 µs

优缺点:

同步:

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

异步:

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

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

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

最佳答案

I receive orders from FAST and process them. I receive about 2-3 thousands orders per second

真的吗?你在交易所工作?因为严重的是,我从 5 个交易所获得数据,但这些不是订单;)我建议你按照你的期限行事 - 你得到 2-3 千个事件,但我真的怀疑你得到订单。

您有没有想过进行多级处理设置? IE。您在 2 个线程中获取数据,将其移交给另一个线程以查找工具(id 而不是字符串),将其移交给另一个线程以更新订单簿,将其移交给另一个线程以执行指标,将 irt 移交给 X 线程做攻略?

无需一直安排任务,只需将队列与一个任务同步处理消息即可。使用无锁方法可以非常高效。

粗暴地说:我是全支持多线程的,但是所有在核心处理中的都必须保持基数,所以经典的多线程已经过时了。为什么?我需要完全可重复的处理,以便单元测试获得确定的输出。

So far I process them asynchronous and I have dedicated thread per instrument

您的交易量不多,对吧?我的意思是,我跟踪了大约 200.000 种工具(5 次完整的交易)。分配 200.000 个线程会让人望而却步 ;)

GO 分阶段流水线 - 这意味着核心循环可以很小,您可以将它们分布到足够多的核心,从而提高可扩展性。然后适当优化 - 例如,一个工具的更新之后是同一工具的另一个更新是很常见的(例如,在执行大订单时多次执行)。好好利用这一点。

关于c# - 在高频交易中尝试并行处理订单是否有意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11306205/

相关文章:

c# - QuickFIX/n - 启动器在登录阶段反复抛出错误

c++ - 如何在gentoo上编译Mellanox libvma?

java - 为什么 JVM 性能会随着负载的增加而提高?

c# - XDocument 未正确加载

c# - 如何在 sitefinity CMS 中创建站点地图?

c# - 从 WCF-RESTful 服务读取多部分表单数据和 json 输入

algorithm - 如何防止整数序列经常具有相同的值

c# - 使用 ODP.Net 的问题

java - SocketInitiator getSession 提供的 session 顺序与配置文件中的顺序不同

python - 在正则表达式中解析 FIX 协议(protocol)?