FieldNotFoundException Ошибка в сообщении MarketDataIncrementalRefresh QuickFix - PullRequest
1 голос
/ 17 февраля 2012

Я работаю над примером приложения, в котором есть FixAcceptor и FixInitiator.Я посылаю сообщение MarketDataRequest от инициатора и отправляю сообщение MarketDataIncrementalRefresh от Acceptor, но получаю ошибку исключения FieldNotFound для сообщения NoMDEntries.Я почти уверен, что получил неверное сообщение от получателя, но не смог найти.пожалуйста, помогите, если это возможно.

Это сообщение инициатора исправления

Отправить MarketDataRequest

string symbol = "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, SessionRequest), сообщение QuickFix42.MarketDataRequest)= новое 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) { }


    }

Получение сообщения MarketDataIncrementalRefresh в FixAcceptor

 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, группа);

Ответы [ 2 ]

0 голосов
/ 06 августа 2012

Я решил ее, и проблема была в том, что путь к словарю данных был неправильным и не указывал на правильный файл словаря данных.

0 голосов
/ 17 февраля 2012
int list = nomdentries.getValue();

Ваша проблема в этой строке.Используйте getGroup, только если list не равен 0. У вас есть это значение, и вам оно не нужно

if (message.isSetNoMDEntries())

И почему вы не делаете это

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

И не могли бы вывставьте полученное сообщение FIX, разбитое должным образом, а не туманную строку.Вы окажетесь в лучшем положении, если попытаетесь разорвать строку FIX.

Ваше сообщение неполное, так как в нем отсутствует обязательный тег 279. Проверьте этот веб-сайт , чтобы узнать, что требуетсяне обязательные поля в сообщении.Поможет вам легче найти ошибку.

...