修复协议错误:在消息中找不到字段[5232]

时间:2013-05-13 03:43:16

标签: java quickfix fix-protocol

我正在使用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]在消息中找不到'

有谁可以指出我在这里缺少的东西?

4 个答案:

答案 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)

我在这里看到了多个问题和误解。

  • 您使用RSA密钥的事实与您的问题无关
  • 为什么要将消息操作为通用Message对象而不是MarketDataRequest对象?后者更安全。
  • 你得到15 = EUR,因为货币是标准FIX定义中的标签11。 (参见http://fixprotocol.org/FIXimate3.0/这是有史以来最好的FIX资源。)该方法忽略了你的5232参数。你真正想做的是message.setField(5232,"EUR"),但这可能仍然是错误的。请继续阅读。
  • 我99%确定5232并不意味着货币,除非您与Velocity Systems International合作。你找到的那个链接只是公司在FIX组织注册的自定义字段列表,但它真的没用,因为没有人必须遵守它。您的交易对手可能正在使用5232。

所以,尽管如此,这就是你需要做的事情:

获取此FIX界面的对手方文档。您需要了解5232是什么以及他们希望您如何使用它,以及它是否在消息的重复组中。< / p>

另外,如果他们添加了5232,他们可能也添加了其他字段。您需要知道所有的自定义项。

更新您的FIX44.xml文件以反映这些更改。需要执行此操作,否则您的引擎将拒绝包含意外字段的邮件。这个文件很容易理解。消息defs位于顶部,字段defs位于底部。

重建QuickFIX / J引擎(可选但建议使用)。请参阅the FAQ entry "Should I regenerate/rebuild QF/J?"了解原因以及操作方法。

毕竟,事情应该对你更有意义。

答案 3 :(得分:0)

感谢所有回复此帖子的人。 我将解释我为解决问题而采取的步骤

initiator.cfg

UseDataDictionary=Y
ValidateUserDefinedFields=N
ValidateFieldsOutOfOrder=N
ValidateFieldsHaveValues=N
DataDictionary=/var/www/FIX44_edited.xml

/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的字段。

Initiator.java

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);

希望这可以帮助那些生成数据字典的人:)