我正在使用Quickfix和stunnel通过RSA私钥连接到服务器。
当我发送市场数据请求(MsgType = V)时,我收到以下错误
8 = FIX.4.49 = 14735 = Y34 = 55349 = ABCD52 = 20130513-03:23:23.24356 = ABCDEFGHI58 =在消息中未找到字段[5232] .262 = 85ee75f8-ab5d-4aff-b87d-108b74d3281 = 010 = 53
我搜索并在this链接中找到5232是货币字段
所以我将货币值传递给5232,如下所示
Message message = new Message();
................
message.setField(5232, new quickfix.field.Currency("EUR"));
................
Session.sendToTarget(message, sessId);
但是当我检查传出消息的代码时,我发现字段5232自动转换为'15 = EUR',并且它再次给出错误'字段[5232]在消息中找不到'
有谁可以指出我在这里缺少的东西?
答案 0 :(得分:0)
我对字段编号感到有点困惑,但无论你犯的错误是请求必须有一个组,而且货币字段必须在该组中。
以下是一个例子:
MarketDataRequest marketDataRequest = new MarketDataRequest();
String reqID = symbol+new Date().getTime(); //unique ID
marketDataRequest.setString(MDReqID.FIELD,reqID); // set ID
char requestType = SubscriptionRequestType.SNAPSHOT_PLUS_UPDATES;
marketDataRequest.setChar(SubscriptionRequestType.FIELD,requestType); // set update type
marketDataRequest.setInt(MarketDepth.FIELD, 0);
marketDataRequest.setInt(MDUpdateType.FIELD, 0);
MarketDataRequest.NoMDEntryTypes entryTypes = new MarketDataRequest.NoMDEntryTypes(); // create group to request both bid and offers
entryTypes.set(new MDEntryType(MDEntryType.BID));
marketDataRequest.addGroup(entryTypes);
entryTypes.set(new MDEntryType(MDEntryType.OFFER));
marketDataRequest.addGroup(entryTypes);
MarketDataRequest.NoRelatedSym noRelatedSym = new MarketDataRequest.NoRelatedSym(); // create group to add list of symbols
noRelatedSym.set(new Symbol(getSymbol(symbol)));
marketDataRequest.addGroup(noRelatedSym);
正如您所看到的,必须首先将某些字段输入到组中,然后输入到消息中。
应该有一个名为FIX44.xml的字典定义,它将显示消息的结构。它在quickfix/etc/
目录中。
答案 1 :(得分:0)
通常标签> 1000是自定义标签。 为了实现您的消息相关性,请查看反制规范,并相应地编辑FIX字典(适用于4.4版本)。
标准的市场数据请求消息具有以下结构:
http://www.onixs.biz/fix-dictionary/4.4/msgType_V_86.html
并且其中没有标记#5232。
答案 2 :(得分:0)
我在这里看到了多个问题和误解。
message.setField(5232,"EUR")
,但这可能仍然是错误的。请继续阅读。所以,尽管如此,这就是你需要做的事情:
获取此FIX界面的对手方文档。您需要了解5232是什么以及他们希望您如何使用它,以及它是否在消息的重复组中。< / p>
另外,如果他们添加了5232,他们可能也添加了其他字段。您需要知道所有的自定义项。
更新您的FIX44.xml文件以反映这些更改。您需要执行此操作,否则您的引擎将拒绝包含意外字段的邮件。这个文件很容易理解。消息defs位于顶部,字段defs位于底部。
重建QuickFIX / J引擎(可选但建议使用)。请参阅the FAQ entry "Should I regenerate/rebuild QF/J?"了解原因以及操作方法。
毕竟,事情应该对你更有意义。
答案 3 :(得分:0)
感谢所有回复此帖子的人。 我将解释我为解决问题而采取的步骤
UseDataDictionary=Y
ValidateUserDefinedFields=N
ValidateFieldsOutOfOrder=N
ValidateFieldsHaveValues=N
DataDictionary=/var/www/FIX44_edited.xml
<message name="MarketDataRequest" msgtype="V" msgcat="app">
<field name="MDReqID" required="Y"/>
<field name="SubscriptionRequestType" required="Y"/>
<field name="MarketDepth" required="Y"/>
<field name="MDUpdateType" required="N"/>
<field name="AggregatedBook" required="N"/>
<field name="OpenCloseSettlFlag" required="N"/>
<field name="Scope" required="N"/>
<field name="MDImplicitDelete" required="N"/>
<group name="NoMDEntryTypes" required="Y">
<field name="MDEntryType" required="Y"/>
</group>
<group name="NoRelatedSym" required="Y">
<component name="Instrument" required="Y"/>
<group name="NoUnderlyings" required="N">
<component name="UnderlyingInstrument" required="N"/>
</group>
<group name="NoLegs" required="N">
<component name="InstrumentLeg" required="N"/>
</group>
</group>
<group name="NoTradingSessions" required="N">
<field name="TradingSessionID" required="N"/>
<field name="TradingSessionSubID" required="N"/>
</group>
<field name="ApplQueueAction" required="N"/>
<field name="ApplQueueMax" required="N"/>
<field name="CurrencyNew" required="Y"/>
</message>
和
<field number="5232" name="CurrencyNew" type="STRING"/>
使用唯一名称定义字段5232(我给出“CurrencyNew”),并使用消息中需要使用自定义变量5232的字段。
Message message = new Message();
quickfix.fix44.MarketDataRequest.NoRelatedSym group = new quickfix.fix44.MarketDataRequest.NoRelatedSym();
StringField currency= new StringField(5232, "EUR");
group.setField(currency);
message.addGroup(group);
希望这可以帮助那些生成数据字典的人:)