これは、hftに精通している人にとってはより理論的な質問だと思います。FASTから注文を受け取り、処理します。私は毎秒約2〜3千件の注文を受け取ります。問題は、それらを同期または非同期で処理する必要があるかどうかです。
次の注文を受けるたびに、次のことを行う必要があります。
- 対応する機器のオーダーブックを更新する
- その順序に依存するインデックスとインジケーターを更新します
- 戦略を更新し、必要に応じていくつかのアクションをスケジュールします(何かを購入/販売するなど)
その同期を行うには、約200〜300 µsがあります(1秒あたり3000オーダーを処理できるようにするため)。それで十分だと思います。
私が費やした非同期タスクをスケジュールするためだけに、約30 µsだと思います
長所と短所:
同期:
- ++物事を同期する必要はありません!
- ++「注文を受け取った」と「アクションを実行した」の間の遅延は、タスクをスケジュールしたり、データ/作業を別のプロセスに渡したりする必要がないため、少なくなります(hftでは非常に重要です!)。
- -ただし、前の注文が処理されるのを待機しているソケットバッファで待機できるため、「注文を受信しました」アクションが遅延する可能性があります
非同期:
- ++最新のサーバーの能力を使用する機能(たとえば、私のサーバーには24コアがあります)
- ++一部のシナリオでは、前のメッセージが処理されるまで待たないため、より高速になります。
- ++は、より多くのメッセージを処理したり、メッセージごとにより多くの「複雑な」ことを実行したりできます
- -プログラムの速度を低下させる可能性のある多くのものを同期させる必要があります
同期の例:更新されたMSFT注文を受け取り、次にINTC注文更新を受け取り、それらを異なるスレッドで処理します。どちらの場合も、NASDAQインデックスの再計算をトリガーします。したがって、NASDAQインデックスの計算は同期する必要があります。ただし、この特定の問題は、同期を回避するために回避できます...これは可能な同期の単なる例です。
したがって、問題は、注文の更新を同期または非同期で処理する必要があるかどうかです。これまでのところ、私はそれらを非同期で処理し、楽器ごとに専用のスレッドを持っています。異なる機器(MSFTとINTC)に対して2つの更新を非同期で処理できますが、1つの機器(MSFT)に対して2つの更新を同期的に処理する必要があるためです。