1

私は FixAcceptor と FixInitiator を持つサンプル アプリケーションに取り組んでいます。イニシエーターから MarketDataRequest メッセージを送信し、アクセプターから 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 コード

public override void 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, グループ);

4

2 に答える 2

0
int list = nomdentries.getValue();

あなたの問題はこの行です。リストが0でない場合にのみgetGroupを使用します。この値があり、これは必要ありません

if (message.isSetNoMDEntries())

そして、なぜあなたはこれをしないのですか

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

そして、ぼんやりとした文字列ではなく、受信したFIXメッセージを適切に分解して貼り付けることができますか。FIX文字列を分解しようとすると、より良い位置になります。

必須タグ279がないため、メッセージは不完全です。メッセージの必須フィールドと不要フィールドについては、このWebサイトを確認してください。エラーをより簡単に見つけるのに役立ちます。

于 2012-02-17T15:33:07.057 に答える
0

私はそれを解決し、問題はデータ ディクショナリのパスが間違っていて、正しいデータ ディクショナリ ファイルを指していませんでした。

于 2012-08-06T05:14:35.533 に答える