2

私はクイックフィックスのことは初めてで、クイックフィックス ライブラリに関していくつか質問があります。あなたからの回答をお待ちしております。

複数のクライアントから同時にFIXリクエストを取得するFIXサーバーを開発する予定です。それに関しては、

a) 異なるクライアントからのリクエストを区別する必要がある場合、TargetID (つまり CLIENT1) の正確な意味は何ですか? (これらのリクエストを互いに区別するにはどうすればよいですか?)

b) サーバー/クライアントに関する TargetID の一般的な意味は何ですか?

c) カスタム フィールドとカスタム メッセージを追加する方法と、メッセージ クラッカー オブジェクトへの正確な接続は何ですか?

よろしく、

モルデハイ・ヤアコビ

4

1 に答える 1

8
  1. TargetIDは、メッセージを送信するボックスの名前です。複数のクライアントのセッションを区別する必要がある場合 (1 つのサーバーを想定しています)、各クライアントに異なるSenderCompID.

    サーバーでは、クライアントごとに 1 つのセッションをセットアップする必要があります。

    1 つのサーバー クライアント セッションの例:

    サーバー上 (INCA):

    [SESSION]
    BeginString=FIX.4.0
    SenderCompID=INCA
    TargetCompID=CLIENT1
    

    クライアント (CLIENT1) で:

    [SESSION]
    BeginString=FIX.4.0
    SenderCompID=CLIENT1
    TargetCompID=INCA
    

    quickfixengine は、次の 3 つの値に基づいてセッション (サーバーとクライアントの接続) を区別します。(BeginString, TargetCompID, SenderCompID)

    メッセージを送信するときは、comp id を としてsendercompid、メッセージを送信するターゲットを として送信しますtargetcompidbeginstring通信に使用する修正バージョンに基づいて指定 します ( FIX4.0/ FIX4.2 ....)。

  2. 上記で説明したと思いますが、TargetID はメッセージを送信するボックスの ID です。サーバーがクライアントに応答するとき、それはSenderCompID(サーバー) ID としてTargetCompID設定され、応答が送信されるクライアントに設定されます。

  3. カスタムフィールドは、正確に何が必要かによって異なります。FIX プロトコルは、FieldID が予約範囲より大きいカスタム フィールドを指定するため、カスタム フィールドは FieldID 5000 から開始できます。

    その方法については、いくつかのオプションがあります。最も簡単な方法は、メッセージの数値を使用してメッセージに追加することです (c++ を使用していると仮定しますが、他の言語でも同様です)。

    何かのようなもの:

     msg.setField(5000,"SomeValue");
    

    このカスタム フィールドは、FIX が認識していないため、自動的に検証されません。FIX は、各メッセージとフィールドが指定されている xml ファイルを使用します。

    新しいメッセージを xml 仕様に追加し、quickfixengine コードを再生成して新しいフィールド構造を生成する適切な手順がありますが、これまでのところ、それを行う必要はありませんでした。

    メッセージクラッカーは、一般的なメッセージへのポインターを受け取り、メッセージIDを調べて(覚えていれば)適切なハンドラーを呼び出すメソッドです。

    これは、多くの文字列操作を伴う 1 つの大きな if ステートメントであるため、自分でチェックしたほうがよい場合もありますが、使用してもかまいません。

    メソッドは次のようになります。

    void crack( const Message& message, 
          const FIX::SessionID& sessionID )
    {
    const std::string& msgTypeValue 
             = message.getHeader().getField( FIX::FIELD::MsgType );        
    if( msgTypeValue == "0" )
      onMessage( (const Heartbeat&)message, sessionID );
    else
    if( msgTypeValue == "A" )
      onMessage( (const Logon&)message, sessionID );
    else
    if( msgTypeValue == "1" )
      onMessage( (const TestRequest&)message, sessionID );
    else
    

    次に、コードに実装する s のみを気にする場合など、通常は適切なメソッド ExecutionReportを実装します。

    virtual void onMessage( ExecutionReport&, const FIX::SessionID& );
    

    次に、アプリケーションは を取得して ExecutionReport処理できるようにします。実装しないメッセージのonMessageメソッドは何もせずに返すだけなので、メッセージがアプリケーションに到達することはありません。

カスタム メッセージ/フィールドを追加する必要がある場合、これは便利だと思いますが、使用していません。

于 2010-02-09T01:19:20.980 に答える