通过 QuickFixJ 向彭博社发送消息时出错

Error when sending message to Bloomberg via QuickFixJ

我正在尝试通过 QuickFixJ 将数据包类型 X 发送到 Bloomberg。我能够成功连接,但是当我发送数据包时,我收到一条错误消息:

8=FIXT.1.1^A9=160^A35=X^A34=4^A49=ARHGBETA^A52=20210915-13:16:04.156^A56=BBGBETA^A1022=****^A22=1^A48=BQ4434677^A268=2^A279=0^A269=0^A270=99.00357818603516^A279=0^A269=1^A270=99.01358032226562^A10=060^A
8=FIXT.1.1^A9=253^A35=j^A49=BBGBETA^A56=ARHGBETA^A34=4^A52=20210915-13:16:04.380^A45=4^A372=X^A380=0^A58=Validation failed for incoming X packet:
In mDIncGrp: In groupMDEntries[0]: NULL component instrument_MarketData
In groupMDEntries[1]: NULL component instrument_MarketData

然而,我不知道如何定义组件 instrument_MarketData。我正在使用以下代码生成组:

/**
 * Méthode de création d'un nouveau prix pour le publier sur Bloomberg
 * @param marketPrice
 * */
public MarketDataIncrementalRefresh createMarketDataIncrementalRefresh(MarketPrice marketPrice) {

    quickfix.fix50sp2.MarketDataIncrementalRefresh message = new MarketDataIncrementalRefresh();

    quickfix.fix50sp2.MarketDataIncrementalRefresh.NoMDEntries group = new MarketDataIncrementalRefresh.NoMDEntries();

    message.getHeader().setString(1022, "****");

    quickfix.fix50sp2.component.MDIncGrp mdIncGrp = new MDIncGrp();

    mdIncGrp.setString(48, marketPrice.getCUSIP());

    mdIncGrp.setString(22, "1");

    Instrument instrument =new Instrument();
    /**
     * Ajout prix Bid au message
     * */
    instrument.setString(279, "0");
    instrument.setString(269, "0");
    instrument.setString(270, marketPrice.getBid_kech().toString());
    group.set(instrument);
    mdIncGrp.addGroup(group);

    /**
     * Ajout prix Ask au message
     * */
    instrument.setString(279, "0");
    instrument.setString(269, "1");
    instrument.setString(270, marketPrice.getAsk_kech().toString());
    group.set(instrument);
    mdIncGrp.addGroup(group);

    message.set(mdIncGrp);

    return message;
}

我做错了什么?我应该定义一个自定义词典来发送消息,还是可以使用默认词典来实现?

非常感谢!

您不需要自定义词典即可发送 自定义消息。字典验证仅对 收到的 消息进行,因此您可能需要更改字典才能成功接收对方发送的响应。

关于你的问题:这个错误听起来好像你的组中缺少关于乐器的东西。查看您的代码,我认为您有点混淆了组的东西。我发布这个 link 是为了回答你之前的一个问题:https://www.quickfixj.org/usermanual/2.3.0/usage/repeating_groups.html

我认为重要的部分是您应该像这样将组添加到消息中:

quickfix.fix42.MarketDataSnapshotFullRefresh.NoMDEntries group =
  new quickfix.fix42.MarketDataSnapshotFullRefresh.NoMDEntries();

group.set(new MDEntryType('0'));
group.set(new MDEntryPx(12.32));
group.set(new MDEntrySize(100));
group.set(new OrderID("ORDERID"));
message.addGroup(group);      // important part

在您的代码中,您将一个组添加到一个组 (mdIncGrp.addGroup(group)) 并在您真正应该使用 addGroup() 的地方执行 message.set(mdIncGrp)。因此,48/SecurityID 字段不会在 MDIncGrp 中结束,而是在根消息中结束。

8=FIXT.1.1^....removed...^A22=1^A48=BQ4434677^A268=2^A279=0^A269=0^A270=99.00357818603516^A279=0^A269=1^A270=99.01358032226562^A10=060^A
                                 ^^^ 48 is here where it should really
                                      be in each of these groups starting with delimiter tag 279