【问题标题】:How to convert raw String with a FIX message to QuickFIX/J Message object如何将带有 FIX 消息的原始字符串转换为 QuickFIX/J 消息对象
【发布时间】:2021-10-15 21:14:21
【问题描述】:

将带有一条 FIX 消息的原始字符串转换为一个适当类型的 QuickFIX/J 消息对象(如 quickfix.fix44.ExecutionReport 对象)的推荐方法是什么?

我只需要处理 FIX 4.4 版本。

我在this thread on Quickfixj-users mailing list 找到了两个选项。

我根据自己的情况调整了这些选项,并且能够以两种不同的方式成功转换消息。

FIX 消息示例:

8=FIX.4.49=11035=834=749=EXEC52=20211014-19:39:25.75856=BANZAI6=011=114=10017=137=139=154=155=IBM150=2151=40010=237

我想知道以下哪个选项更好,或者如果两者都错了,还有更好的方法。

提前致谢。

1 个选项

quickfix.Message rawMessage = new quickfix.Message(rawMessageString);

// Example of MsgType = 8
MsgType msgType = new MsgType();
rawMessage.getHeader().getField(msgType);

MessageFactory messageFactory = new DefaultMessageFactory(ApplVerID.FIX44);

quickfix.Message message = messageFactory.create("FIX.4.4", msgType.getValue());

message.fromString(messageString, null, false, true);

// message.getName() = quickfix.fix44.ExecutionReport
System.out.println(message.getName() = " + message.getClass().getName());

2 选项

MessageFactory messageFactory = new DefaultMessageFactory(ApplVerID.FIX44);

quickfix.Message messageFromMessageUtils = quickfix.MessageUtils.parse(messageFactory, null, rawMessageString);

// message.getName() = quickfix.fix44.ExecutionReport
System.out.println(message.getName() = " + message.getClass().getName());

数据字典

在上述测试中,我没有使用数据字典,但在我的实际应用程序中我会使用一个。

【问题讨论】:

    标签: quickfixj


    【解决方案1】:

    我特别不喜欢选项 1 是您需要构造两条消息。一个用于提取MsgType,然后是实际消息。对我来说似乎没有必要。

    如果你只使用 FIX4.4,我会选择第二个选项,因为它为你做了所有的事情,即从原始字符串中提取所需的东西,如 BeginStringMsgType

    缺点:它只适用于并包括 FIX4.4,因为MessageUtils.parse() 只考虑BeginString(而不是ApplVerID)。 但是,这对于您的用例应该没有问题。

    P.S.:如果您需要解析 FIX5.0 及更高版本的消息,请使用以下内容(基本上是选项 1,但不构造消息来获取 MsgType):

    String msgType = MessageUtils.getMessageType(rawMessageString);
    MessageFactory messageFactory = new DefaultMessageFactory(ApplVerID.FIX50);  // FIX5.0 for example
    quickfix.Message message = messageFactory.create("FIXT.1.1", ApplVerID.FIX50, msgType);
    message.fromString(rawMessageString, dd, false, true);
    

    P.P.S.:对您的用例不感兴趣,但为了完整起见:您也可以使用 quickfix.Message(String) 构造函数之一,但这不会返回正确类型的消息。只是一般quickfix.Message

    【讨论】:

    • 非常感谢这个非常完整的答案。我会选择第二个选项,并会记住您解释的所有内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多