gpt4 book ai didi

java - Quickfix消息在序列化和反序列化后是不同的

转载 作者:行者123 更新时间:2023-12-05 05:16:51 26 4
gpt4 key购买 nike

我尝试实现创建 FIX 消息以手动创建 MarketDataIncrementalRefresh。当我将创建的消息转换为 String 然后将其从这个 String 转换为 MarketDataIncrementalRefresh - 我得到另一个 MarketDataIncrementalRefresh .

我不明白我的代码有什么问题。

import static org.testng.Assert.assertEquals;

import org.testng.annotations.Test;

import quickfix.ConfigError;
import quickfix.DataDictionary;
import quickfix.InvalidMessage;
import quickfix.field.MDEntryPx;
import quickfix.field.MDEntrySize;
import quickfix.field.MDEntryType;
import quickfix.field.MDUpdateAction;
import quickfix.field.Symbol;
import quickfix.fix44.MarketDataIncrementalRefresh;
import quickfix.fix44.MarketDataSnapshotFullRefresh;

public class TradeEventToFixMessageConverterTest2 {

private static final DataDictionary dataDictionary;

static {
try {
dataDictionary = new DataDictionary(TradeEventToFixMessageConverterTest2.class.getResourceAsStream("/conf/FIX44-CUSTOM.xml"));
} catch (ConfigError configError) {
throw new ExceptionInInitializerError(configError);
}
}

@Test
public void rawTest() throws InvalidMessage {
MarketDataIncrementalRefresh fixMessage = new MarketDataIncrementalRefresh();
MarketDataSnapshotFullRefresh.NoMDEntries group = new MarketDataSnapshotFullRefresh.NoMDEntries();
group.setField(new MDUpdateAction(MDUpdateAction.NEW));
group.setField(new MDEntryType(MDEntryType.TRADE));
group.setField(new Symbol("123456"));
group.setField(new MDEntryPx(12345L));
group.setField(new MDEntrySize(1234.0));
fixMessage.addGroup(group);

String fixString = fixMessage.toString();
System.out.println(fixString);

MarketDataIncrementalRefresh reversed = createMarketDataRequest(fixString);
System.out.println(reversed.toString());

assertEquals(reversed.toString(), fixString);
}


private MarketDataIncrementalRefresh createMarketDataRequest(String fixString) throws InvalidMessage {
MarketDataIncrementalRefresh message = new MarketDataIncrementalRefresh();
message.fromString(fixString, dataDictionary, true);
return message;
}

FIX Dictionary 基于标准 FIX44,看起来像

<message name="MarketDataIncrementalRefresh" msgtype="X" msgcat="app">
<field name="MDReqID" required="N"/>
<group name="NoMDEntries" required="Y">
<field name="MDUpdateAction" required="Y"/>
<field name="MDEntryType" required="N"/>
<field name="MDEntryID" required="N"/>
<field name="Symbol" required="Y"/>
<field name="MDEntryPx" required="N"/>
<field name="MDEntrySize" required="N"/>
</group>
</message>

当我尝试使用真正的 FIX 服务器运行此类转换时出现错误

2018-04-23 14:59:54.508 +0000 ERROR [QFJ Message Processor] quickfixj.errorEvent - FIX.4.4:1/Quote->QUICKFIX: Reject sent for Message 2: Out of order repeating group members:269

我错过了什么?任何帮助都会很有用。

已更新

这是我的代码中的拼写错误 - 我构建了 MarketDataIncrementalRefresh 但向其添加了 MarketDataSnapshotFullRefresh.NoMDEntries。我将其更改为 MarketDataIncrementalRefresh.NoMDEntries 并且一切正常。

最佳答案

检查由 toString() 生成的 fixstring。我怀疑它实际上可能不匹配您的自定义 DataDictionary,而是使用默认 Vanilla FIX44.xml 字典中的字段顺序构建的。

在构建消息的任何时候,您都不会传递自定义 DD。这可能意味着它没有使用它。

不幸的是,我的 QF/j 经验生疏了,我无法弄清楚如何或在何处将该 DD 注入(inject)到消息构建过程中。我查看了 API,但没有看到它的功能。

(当然,我对所有 QF 用户的一般建议是从您的自定义 DD 重新生成和重建您的代码,这样您就永远不会遇到这个问题。)

关于java - Quickfix消息在序列化和反序列化后是不同的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49984276/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com