Java 从marketdataincremental刷新获取值时出错
我的quickfixj应用程序出错。首先,我得到了这样一个错误:Java 从marketdataincremental刷新获取值时出错,java,fix-protocol,quickfixj,Java,Fix Protocol,Quickfixj,我的quickfixj应用程序出错。首先,我得到了这样一个错误: Out of order repeating group members Out of order repeating group members 之后,我将以下文本添加到initiator.config中: ValidateUserDefinedFields=N ValidateIncomingMessage=N ValidateUserDefinedFields=N ValidateIncomingMessage=N
Out of order repeating group members
Out of order repeating group members
之后,我将以下文本添加到initiator.config中:
ValidateUserDefinedFields=N
ValidateIncomingMessage=N
ValidateUserDefinedFields=N
ValidateIncomingMessage=N
但现在我的应用程序中出现了另一个错误:
quickfix.FieldNotFound: Field was not found in message, field=55
at quickfix.FieldMap.getField(FieldMap.java:223)
at quickfix.FieldMap.getString(FieldMap.java:237)
at com.dxtr.fastmatch.marketdatarequestapps.TestMarketdataRequest.fromApp(TestMarketdataRequest.java:38)
at quickfix.Session.fromCallback(Session.java:1847)
at quickfix.Session.verify(Session.java:1791)
at quickfix.Session.verify(Session.java:1862)
at quickfix.Session.next(Session.java:1047)
at quickfix.Session.next(Session.java:1204)
at quickfix.mina.SingleThreadedEventHandlingStrategy$SessionMessageEvent.processMessage(SingleThreadedEventHandlingStrategy.java:163)
at quickfix.mina.SingleThreadedEventHandlingStrategy.block(SingleThreadedEventHandlingStrategy.java:113)
at quickfix.mina.SingleThreadedEventHandlingStrategy.lambda$blockInThread$1(SingleThreadedEventHandlingStrategy.java:145)
at quickfix.mina.SingleThreadedEventHandlingStrategy$ThreadAdapter$RunnableWrapper.run(SingleThreadedEventHandlingStrategy.java:267)
at java.lang.Thread.run(Thread.java:748)
我获取符号值的代码是:
public void fromApp(quickfix.Message message, SessionID sessionID)
throws FieldNotFound, IncorrectDataFormat, IncorrectTagValue, UnsupportedMessageType {
try {
String symbol = message.getString(Symbol.FIELD);
System.out.println(" FromApp " + message);
message.getString(TransactTime.FIELD);
// String seqNo = message.getString(MsgSeqNum.FIELD);
double bid = message.getDouble(MDEntryPx.FIELD);
double ask = message.getDouble(MDEntryPx.FIELD);
// System.out.println(seqNo + " " + message);
} catch (FieldNotFound fieldNotFound) {
fieldNotFound.printStackTrace();
}
}
我还使用了这个代码
public void onMessage (MarketDataIncrementalRefresh message, SessionID sessionID) throws FieldNotFound{
try
{
MDReqID mdreqid = new MDReqID();
SendingTime sendingtime = new SendingTime();
NoMDEntries nomdentries = new NoMDEntries();
quickfix.fix42.MarketDataIncrementalRefresh.NoMDEntries group
= new quickfix.fix42.MarketDataIncrementalRefresh.NoMDEntries();
MDUpdateAction mdupdateaction = new MDUpdateAction();
DeleteReason deletereason = new DeleteReason();
MDEntryType mdentrytype = new MDEntryType();
MDEntryID mdentryid = new MDEntryID();
Symbol symbol = new Symbol();
MDEntryOriginator mdentryoriginator = new MDEntryOriginator();
MDEntryPx mdentrypx = new MDEntryPx();
Currency currency = new Currency();
MDEntrySize mdentrysize = new MDEntrySize();
ExpireDate expiredate = new ExpireDate();
ExpireTime expiretime = new ExpireTime();
NumberOfOrders numberoforders = new NumberOfOrders();
MDEntryPositionNo mdentrypositionno = new MDEntryPositionNo();
message.getField(nomdentries);
message.getField(sendingtime);
message.getGroup(1, group);
int list = nomdentries.getValue();
for (int i = 0; i < list; i++)
{
message.getGroup(i + 1, group);
group.get(mdupdateaction);
if (mdupdateaction.getValue() == '2')
System.out.println("Enter");
group.get(deletereason);
group.get(mdentrytype);
group.get(mdentryid);
group.get(symbol);
group.get(mdentryoriginator);
if (mdupdateaction.getValue() == '0')
group.get(mdentrypx);
group.get(currency);
if (mdupdateaction.getValue() == '0')
group.get(mdentrysize);
}
System.out.printf("Got Symbol {0} Price {1}",
symbol.getValue(), mdentrypx.getValue());
}catch (Exception ex)
{
System.out.println("error" + ex);
这里是我在message.log中检查的值
8=FIX.4.2^A9=0217^A35=X^A34=7291^A49=Fastmatch1^A52=20200401-10:47:59.833^A56=MDValueTrade2UAT1^A262=VT^A268=02^A279=2^A55=GBP/CHF^A269=0^A278=1140851192^A270=1.19503^A271=02000000^A279=0^A55=GBP/CHF^A269=0^A278=1140851194=1950671^A101
我的经纪人已将价格等寄给我
我的问题是:如何从这段代码修复我的问题
首先,我得到了这样一个错误:
Out of order repeating group members
Out of order repeating group members
您的数据字典与您的交易对手的不匹配。修好它,这个就会消失
之后,我将以下文本添加到initiator.config中:
ValidateUserDefinedFields=N
ValidateIncomingMessage=N
ValidateUserDefinedFields=N
ValidateIncomingMessage=N
这并没有解决任何问题——它隐藏了您的实际问题,让您看到了一个新的假问题
您需要做的是:
你的配置有这个,对吗
UseDataDictionary=Y
DataDictionary=path/to/FIXnn.xml
# or if FIX5:
AppDataDictionary=path/to/FIX5n.xml
TransportDataDictionary=path/to/FIXT.xml
查找您的交易对手的文档,并确保您的xml文件的消息和字段与他们所说的要发送给您的内容相匹配。确保所有重复组具有相同顺序的相同字段
下面介绍数据字典xml文件的结构。这很简单。您在哪里调用此方法?sendMarketDatarequest?我使用fromAppquickfix获取数据。消息消息消息,SessionID SessionID抛出FieldNotFound,不正确的数据格式,不正确的TagValue,不支持的消息类型{try{String symbol=message.getStringSymbol.FIELD;System.out.println FromApp+message;message.getStringTransactionTime.FIELD;//String seqNo=message.getStringMsgSeqNum.FIELD;double bid=message.getDoubleMDEntryPx.FIELD;double ask=message.getDoubleMDEntryPx.FIELD;@UmaisGillani我已经用代码更新了我的问题。我不知道我的代码哪里出了问题。在我检查了我的代理文档后,他们使用了268个nomdentry Y、279个MDUpdateAction Y、55个符号Y、269个MDEntryType Y、278个MDEntryID Y、270个MDEntryPX N我的重复组有问题吗?嗨@Grant Birchmeier你的解决方案现在也可以了谢谢broGreat,很高兴听到这个消息。