我是quickfix的新手,我对quickfix库有几个问题,我很乐意从你那里得到答案:
我打算开发FIX服务器,同时从多个客户端获取FIX请求。对此,
a)如果我需要区分不同客户的请求(我如何区分这些请求),TargetID(即CLIENT1)的确切含义是什么?
b)TargetID对服务器/客户端的含义一般是什么?
c)如何添加自定义字段和自定义消息以及与消息破解程序对象的确切连接是什么?
此致
Mordechai Yaakobi
答案 0 :(得分:8)
TargetID
是该框的名称
如果你发送消息的地方
你需要区分会话
对于多个客户(我假设进入
一个服务器)只给每个客户端
不同的SenderCompID
。
在您的服务器上,您必须为每个客户端设置一个会话。
一个服务器 - 客户端会话的示例:
在您的服务器上(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为sendercompid
和。{
定位到您发送消息的位置
为targetcompid
。你指定
beginstring
基于修复程序
您希望使用的版本
沟通(FIX4.0
/ FIX4.2
....)。
我想这是上面解释的,
TargetID是您所在的框的ID
发送消息。当服务器
回应客户,它会
设置SenderCompID
因为它(服务器)
id和TargetCompID
将设置为
响应所在的客户端
被发送。
自定义字段取决于具体内容 确切是必需的。 FIX协议 指定自定义字段 FieldID大于保留 范围,所以您的自定义字段可以 从FieldID 5000开始。
有几种选择 怎么去吧。最简单的一个 就是使用数值 消息并将其添加到消息(我 假设你使用c ++,但它是相似的 与其他语言)。
类似的东西:
msg.setField(5000,"SomeValue");
此自定义字段不会 由于FIX自动验证 我不知道。 FIX使用xml 每个消息和字段的文件 已指定。
有一个适当的程序来添加 新消息到xml规范然后 重新生成quickfixengine代码 生成新的字段结构但是如此 我不需要这样做。
消息破解者只是一种方法 将指针指向泛型 消息,然后它看着 消息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
然后你通常会实现
适当的方法,例如
如果你只关心
您实施的ExecutionReport
你的代码:
virtual void onMessage( ExecutionReport&, const FIX::SessionID& );
然后你的应用程序将获得
ExecutionReport
以便你可以
处理它。 onMessage
方法
对于你没有的消息
实施简单无所事事
返回所以消息永远不会到达
你的申请。
如果您需要添加我发现this useful的自定义消息/字段,我还是没有使用它。