相关疑难解决方法(0)

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

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

每次收到下一个订单时,我都需要做以下事情:

  • 更新相应仪器的订单
  • 更新依赖于该订单的索引和指标
  • 更新策略并根据需要安排一些操作(买/卖东西等)

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

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

利弊:

同步:

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

异步:

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

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

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

c# fix-protocol hft

5
推荐指数
1
解决办法
1081
查看次数

在 C# 中重现十进制的撕裂读取

眼见为实。任何人都可以重现读取撕裂的小数的程序吗?我尝试旋转多个线程,在 1 和 2 之间更改相同的小数。我没有捕获任何与 1 或 2 不同的读取。

我希望看到读取器线程看不到写入器线程的原子更改,因此该值应该与 1 或 2 不同。

void TornDecimalReadTest()
{
    decimal sharedDecimal = 1;
    int threadCount = 100;
    var threads = new List<Thread>();

    for (int i = 0; i < threadCount; i++)
    {
        int threadId = i;
        var thread = new Thread(() =>
        {
            Thread.Sleep(5000);

            decimal newValue = threadId % 2 == 0 ? 1 : 2;
            bool isWriterThread = threadId % 2 == 0;

            Console.WriteLine("Writer : " + isWriterThread +
                " - …
Run Code Online (Sandbox Code Playgroud)

c# atomic thread-safety lock-free

4
推荐指数
1
解决办法
766
查看次数

标签 统计

c# ×2

atomic ×1

fix-protocol ×1

hft ×1

lock-free ×1

thread-safety ×1