1

我正在开发具有 FixAcceptor 和 FixInitiator 的示例应用程序。我正在从发起方发送 MarketDataRequest 消息,并从 Acceptor 发送 MarketDataIncrementalRefresh 消息,但收到 NoMDEntries 消息的 FieldNotFound 异常错误。我很确定我从接受者那里发送了错误的信息,但找不到。如果有任何机构可以,请提供帮助。

这是修复启动器消息

发送 MarketDataRequest

字符串符号=“MSFT”;//发送 MarketData 请求 QuickFix42.MarketDataRequest marketDataRequest = new QuickFix42.MarketDataRequest();

        marketDataRequest.set(new MDReqID("1"));
        marketDataRequest.set(new SubscriptionRequestType('1'));
        marketDataRequest.set(new MarketDepth(1));
        marketDataRequest.set(new MDUpdateType(1));
        marketDataRequest.set(new AggregatedBook(true));
        marketDataRequest.set(new NoMDEntryTypes(2));
        QuickFix42.MarketDataRequest.NoMDEntryTypes group = new QuickFix42.MarketDataRequest.NoMDEntryTypes();
        group.set(new MDEntryType('0'));
        marketDataRequest.addGroup(group);
        group.set(new MDEntryType('1'));
        marketDataRequest.addGroup(group);
        marketDataRequest.set(new NoRelatedSym(1));
        QuickFix42.MarketDataRequest.NoRelatedSym group2 = new QuickFix42.MarketDataRequest.NoRelatedSym();
        group2.set(new Symbol(symbol));
        marketDataRequest.addGroup(group2);

        //Send message
        Session.sendToTarget(marketDataRequest, sessionID);

FixAcceptor 代码

公共覆盖无效 onMessage(QuickFix42.MarketDataRequest 消息,SessionID 会话){ var relatedSymbol = new QuickFix42.MarketDataRequest.NoRelatedSym();

        Group g = message.getGroup(1, relatedSymbol);

        string symbol=relatedSymbol.get(new Symbol()).getValue();

        Console.WriteLine("Got marketdata request for Symbol {0}", symbol );

       // Thread.Sleep(1000);

        QuickFix42.MarketDataIncrementalRefresh prices = new QuickFix42.MarketDataIncrementalRefresh();

        prices.set(new MDReqID("1"));


        var mp = new QuickFix42.MarketDataIncrementalRefresh.NoMDEntries();

        mp.set(new MDUpdateAction('0'));//tag 279
        //price type
        mp.set(new MDEntryType('0'));//tag:269

        mp.set(new MDEntrySize(2345));
        //Symbol
        mp.set(new Symbol(symbol));
        //Price of the Market Data Entry.
        mp.set(new MDEntryPx(36.45d));

        prices.addGroup(mp);



        try
        {
            Session.sendToTarget(prices, session);
        }
        catch (SessionNotFound) { }


    }

在 FixAcceptor 中接收 MarketDataIncrementalRefresh 消息

 public override void onMessage(MarketDataIncrementalRefresh message, SessionID session)
    {
        try
        {
            System.Console.WriteLine("MarketDataIncrementalRefresh : " + message.ToString());

            MDReqID mdreqid = new MDReqID();
            NoMDEntries nomdentries = new NoMDEntries();
            QuickFix42.MarketDataIncrementalRefresh.NoMDEntries group
                = new QuickFix42.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();
            Text text = new Text();

            //message.get(mdreqid);
            message.get(nomdentries);
            int list = nomdentries.getValue();
            if (message.isSetNoMDEntries())
                for (uint i = 0; i < list; i++)
                {

                    message.getGroup(i + 1, group);
                    //group.get(mdupdateaction);
                    //if (mdupdateaction.getValue() == '2')
                    //    Console.WriteLine("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);
                    //group.get(expiredate);
                    //group.get(expiretime);
                    //if (mdupdateaction.getValue() == '0')
                    //  group.get(numberoforders);
                    //group.get(mdentrypositionno);
                    //group.get(text);

                    //if (mdupdateaction.getValue() == '0')
                    //{
                    //    for (int x = 0; x < mainapp.MDlist.Length; x++)
                    //    {
                    //        if (symbol.ToString() == mainapp.MDlist[x].Symbol)
                    //        {
                    //            if (mdentrytype.getValue() == '0')
                    //                mainapp.MDlist[x].Bid = (float)mdentrypx.getValue();
                    //            else if (mdentrytype.getValue() == '1')
                    //                mainapp.MDlist[x].Ask = (float)mdentrypx.getValue();
                    //        }
                    //    }
                    //}
                }




            Console.WriteLine("Got Symbol {0} Price {1}", symbol.getValue(), mdentrypx.getValue());
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }

但在出现错误 FieldNotFoundException

message.getGroup(i + 1, group);

4

2 回答 2

0

我解决了它,问题是数据字典的路径错误并且没有指向正确的数据字典文件。

于 2012-08-06T05:14:35.533 回答
0
int list = nomdentries.getValue();

你的问题是这条线。如果 list 不为 0,则仅使用 getGroup。你有这个值,你不需要这个

if (message.isSetNoMDEntries())

你为什么不这样做

for (uint i = 1; i <= list; ++i)
{
    message.getGroup(i, group);

您能否粘贴您收到的 FIX 消息,正确分解,而不是模糊的字符串。如果你尝试分解你的 FIX 字符串,你会处于一个更好的位置。

您的消息不完整,因为它缺少必填标签 279。请查看此网站,了解消息中的必填字段和非必填字段。将帮助您更轻松地找到错误。

于 2012-02-17T15:33:07.057 回答