quickfix库问题

Mor*_*obi 2 finance quickfix fix-protocol

我是quickfix的新手,我对quickfix库有几个问题,我很乐意从你那里得到答案:

我打算开发FIX服务器,同时从多个客户端获取FIX请求.对此,

a)如果我需要区分来自不同客户端的请求(我如何区分这些请求),TargetID(即CLIENT1)的确切含义是什么?

b)TargetID对服务器/客户端的含义一般是什么意思?

c)如何添加自定义字段和自定义消息以及与消息破解程序对象的确切连接是什么?

问候,

Mordechai Yaakobi

ste*_*anB 8

  1. TargetID是您发送消息的框的名称,如果您需要区分多个客户端的会话(我假设为一个服务器)只是给每个客户端不同SenderCompID.

    在您的服务器上,您必须为每个客户端设置一个会话.

    一个服务器 - 客户端会话的示例:

    在您的服务器(INCA)上:

    [SESSION]
    BeginString=FIX.4.0
    SenderCompID=INCA
    TargetCompID=CLIENT1
    
    Run Code Online (Sandbox Code Playgroud)

    在您的客户端(CLIENT1):

    [SESSION]
    BeginString=FIX.4.0
    SenderCompID=CLIENT1
    TargetCompID=INCA
    
    Run Code Online (Sandbox Code Playgroud)

    quickfixengine根据这3个值区分会话(服务器 - 客户端连接): (BeginString, TargetCompID, SenderCompID)

    当您发送消息时,您将您的comp id sendercompid和目标发送到您发送消息的位置targetcompid.您可以beginstring根据要用于通信的修订版本进行指定 (FIX4.0/ FIX4.2 ....).

  2. 我想这是上面解释的,TargetID是你发送消息的框的ID.当服务器响应客户端时,它将设置SenderCompID为(服务器)id,TargetCompID并将设置为发送响应的客户端.

  3. 自定义字段取决于具体要求.FIX协议指定FieldID大于保留范围的自定义字段,因此您的自定义字段可以从FieldID 5000开始.

    关于如何去做,有几种选择.最简单的方法是使用消息的数值并将其添加到消息中(我假设您使用的是c ++,但它与其他语言类似).

    就像是:

     msg.setField(5000,"SomeValue");
    
    Run Code Online (Sandbox Code Playgroud)

    此自定义字段不会自动验证,因为FIX不知道它.FIX使用xml文件,其中指定了每个消息和字段.

    有一个正确的过程可以向xml规范添加新消息,然后重新生成quickfixengine代码以生成新的字段结构,但到目前为止我不需要这样做.

    message cracker只是一种将指针指向泛型消息的方法,然后它查看消息id(如果我记得的话)并调用适当的处理程序.

    这是一个很大的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
    
    Run Code Online (Sandbox Code Playgroud)

    然后,您通常会实现适当的方法,例如,如果您只关心ExecutionReport在代码中实现的方法 :

    virtual void onMessage( ExecutionReport&, const FIX::SessionID& );
    
    Run Code Online (Sandbox Code Playgroud)

    然后您的应用程序将获得, ExecutionReport以便您可以处理它.在onMessage为不实现干脆什么也不做,返回等等消息消息的方法将永远不会给你的应用程序.

如果您需要添加自定义消息/字段,我发现这很有用,但我还没有使用它.