2

我正在使用 Quickfix 和 stunnel 使用 RSA 私钥连接到服务器。

当我发送市场数据请求(MsgType=V)时,我收到以下错误

8=FIX.4.49=14735=Y34=55349=ABCD52=20130513-03:23:23.24356=ABCDEFGHI58=在message.262=85ee75f8-ab5d-4aff-b87d-108b74d3281=010=53中找不到字段[5232]

我从这个链接中搜索并发现5232 是货币字段

所以我将货币值传递给 5232 如下

Message message = new Message();
................
message.setField(5232, new quickfix.field.Currency("EUR"));
................
Session.sendToTarget(message, sessId);

但是当我检查传出消息的代码时,我发现字段 5232 自动转换为'15 = EUR',并且它再次给出错误'字段 [5232] 未在消息中找到'

谁能指出我在这里缺少什么?

4

4 回答 4

1

我对字段编号有点困惑,但无论您犯的错误是请求必须有一个组并且货币字段必须在该组中。

这是一个例子:

    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/目录中。

于 2013-05-13T07:33:58.863 回答
0

感谢所有回复此主题的人。我将解释我为解决问题所遵循的步骤

启动器.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。

启动器.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);

希望这可以帮助任何陷入生成数据字典的人:)

于 2013-07-15T11:47:20.863 回答
0

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

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

所以,有了这一切,这就是你需要做的:

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

此外,如果他们添加了 5232,他们可能也添加了其他字段。您需要了解他们的所有自定义设置。

更新您的 FIX44.xml 文件以反映这些更改。要这样做,否则您的引擎将拒绝带有意外字段的消息。这个文件很容易理解。消息定义在顶部,字段定义在底部。

重建 QuickFIX/J 引擎(可选但推荐)。 请参阅常见问题条目“我应该重新生成/重建 QF/J 吗?” 为什么以及如何去做。

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

于 2013-05-13T14:25:06.410 回答
0

通常标签 > 1000 是自定义标签。为了实现您的消息正确性,请查看对应规范,并相应地编辑 FIX 字典(适用于 4.4 版本)。

标准市场数据请求消息具有以下结构:

http://www.onixs.biz/fix-dictionary/4.4/msgType_V_86.html

并且其中没有标签#5232。

于 2013-05-13T13:16:07.547 回答