MarketDataIncrementalRefresh消息QuickFix中出现FieldNotFoundExcept

本文关键字:FieldNotFoundExcept 消息 QuickFix MarketDataIncrementalRefresh | 更新日期: 2023-09-27 18:24:53

我正在开发一个具有FixAcceptor和FixInitiator的示例应用程序。我正在从启动器发送MarketDataRequest消息,并从Acceptor发送MarketDataIncrementalRefresh消息,但收到NoMDEntries消息的FieldNotFound异常的错误。我很确定我是发送了错误的信息,从受体,但找不到。如果有人能帮忙,请帮忙。

这是修复启动器消息

发送市场数据请求

string symbol="MSFT";//发送市场数据请求QuickFix42.MarketDataRequest市场数据请求=新的QuickFix42.市场数据请求();

        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代码

public override void onMessage(QuickFix42.MarketDataRequest消息,SessionID会话){var relatedSymbol=新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);

MarketDataIncrementalRefresh消息QuickFix中出现FieldNotFoundExcept

int list = nomdentries.getValue();

你的问题是这条线。仅当列表不为0时使用getGroup。你有这个价值,你不需要这个

if (message.isSetNoMDEntries())

你为什么不做这个

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

你能不能把你收到的一条FIX消息粘贴在上面,正确地分解,而不是一条模糊的字符串。如果你试着解开固定装置的绳子,你会处于一个更好的位置。

您的消息不完整,因为它缺少一个强制标记279。查看此网站了解消息中的必填字段和非必填字段。将帮助您更容易地发现错误。

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

相关文章:
  • 没有找到相关文章