5

これは、hftに精通している人にとってはより理論的な質問だと思います。FASTから注文を受け取り、処理します。私は毎秒約2〜3千件の注文を受け取ります。問題は、それらを同期または非同期で処理する必要があるかどうかです。

次の注文を受けるたびに、次のことを行う必要があります。

  • 対応する機器のオーダーブックを更新する
  • その順序に依存するインデックスとインジケーターを更新します
  • 戦略を更新し、必要に応じていくつかのアクションをスケジュールします(何かを購入/販売するなど)

その同期を行うには、約200〜300 µsがあります(1秒あたり3000オーダーを処理できるようにするため)。それで十分だと思います。

私が費やした非同期タスクをスケジュールするためだけに、約30 µsだと思います

長所と短所:

同期:

  • ++物事を同期する必要はありません!
  • ++「注文を受け取った」と「アクションを実行した」の間の遅延は、タスクをスケジュールしたり、データ/作業を別のプロセスに渡したりする必要がないため、少なくなります(hftでは非常に重要です!)。
  • -ただし、前の注文が処理されるのを待機しているソケットバッファで待機できるため、「注文を受信しました」アクションが遅延する可能性があります

非同期:

  • ++最新のサーバーの能力を使用する機能(たとえば、私のサーバーには24コアがあります)
  • ++一部のシナリオでは、前のメッセージが処理されるまで待たないため、より高速になります。
  • ++は、より多くのメッセージを処理したり、メッセージごとにより多くの「複雑な」ことを実行したりできます
  • -プログラムの速度を低下させる可能性のある多くのものを同期させる必要があります

同期の例:更新されたMSFT注文を受け取り、次にINTC注文更新を受け取り、それらを異なるスレッドで処理します。どちらの場合も、NASDAQインデックスの再計算をトリガーします。したがって、NASDAQインデックスの計算は同期する必要があります。ただし、この特定の問題は、同期を回避するために回避できます...これは可能な同期の単なる例です。

したがって、問題は、注文の更新を同期または非同期で処理する必要があるかどうかです。これまでのところ、私はそれらを非同期で処理し、楽器ごとに専用のスレッドを持っています。異なる機器(MSFTとINTC)に対して2つの更新を非同期で処理できますが、1つの機器(MSFT)に対して2つの更新を同期的に処理する必要があるためです。

4

1 に答える 1

4

FASTから注文を受け取り、処理します。毎秒約2〜3千件の注文があります

本当に?あなたは取引所で働いていますか?真剣に、私は5つの取引所からデータを取得しますが、それらは注文ではありません;)私はあなたがあなたの任期を一列に並べることを提案します-あなたは2〜3000のイベントを取得します、しかし私はあなたが注文を取得することを本当に疑っています。

多段階の処理セットアップを行うことを考えたことはありますか?つまり、2スレッドでデータを取得し、それを別のスレッドに渡して楽器を見つけ(文字列ではなくid)、別のスレッドに渡してオーダーブックを更新し、別のスレッドに渡してインジケーターを実行し、irtをXに渡します戦略を実行するスレッド?

常にタスクをスケジュールする必要はありません。キューを同期して、それぞれに1つのtas処理メッセージを表示するだけです。ノーロックアプローチで非常に効率的にすることができます。

残酷に言えば、私はすべてマルチスレッドに賛成ですが、コア処理のすべてがカーディナリティを維持する必要があるため、従来のマルチスレッドは廃止されています。なんで?ユニットテストが決定された出力を取得できるように、完全に繰り返し可能な処理が必要です。

これまでのところ、私はそれらを非同期で処理し、楽器ごとに専用のスレッドを持っています

あなたはたくさん取引しませんよね?つまり、私は約200.000の楽器を追跡します(5つの完全な交換)。200.000スレッドを割り当てると、-ああ-禁止になります;)

GOステージングパイプライン-つまり、コアループを小さくして、よりスケーラブルな十分なコアにそれらを分散させることができます。適切に最適化する-たとえば、ある商品の更新の後に同じ商品の別の更新が続くことは非常に一般的です(たとえば、大量の注文が実行されている間に複数の実行が行われます)。それを利用してください。

于 2012-07-03T07:26:59.300 に答える