1

ftp://ftp.cmegroup.com/fix/Production/secdef.dat.gzにある CME から静的証券定義ファイルを読み取ろうとしています。

これらは標準的な修正メッセージのように見えるので、ファイルを自分で解析するのではなく、QuickFix を使用して C# に読み込むことができると考えました。基本的に必要なことを行うテストアプリを作成しましたが、2 つの問題があります。

1) 文字列からメッセージを作成するときに、「無効なメッセージ: ヘッダー フィールドの順序が正しくありません」という QuickFix 例外が発生します。「validate」ブール値を false に設定すると、このメッセージは消えてコンストラクターは成功しますが、次の問題の指標になる可能性があります。

2) p.Crack を呼び出すと、QuickFix 例外 "QuickFix.UnsupportedMessageType" が発生しますが、サポートされていないと思われるメッセージの種類を示すものはないようです。

とにかく、QuickFix はこのように使用することを意図していなかったのかもしれませんが、これを機能させる方法についてのアイデアはありますか?

using System;
using System.IO;
using System.Collections.Generic;
using System.Text;
using QuickFix;

namespace TestQuickFix
{
    class Program : QuickFix.MessageCracker
    {
        static void Main(string[] args)
        {
            int count = 0;
            string line;

            Program p = new Program();
            StreamReader file = new StreamReader(@"C:\secdef.dat");

            while (((line = file.ReadLine()) != null && count < 10))
            {
                // ISSUE #1 REQUIRES false 2ND ARG WHEN CREATING THE MESSAGE
                Message m = new Message(line, false); 

                // ISSUE #2 Exception of type 'QuickFix.UnsupportedMessageType' was thrown.
                p.Crack(m, new SessionID("beginString", "senderCompID", "targetCompID"));
            }

            file.Close();

        }

        public void OnMessage(QuickFix.FIX50.SecurityDefinition secDef, SessionID sessionID)
        {
            Console.WriteLine(secDef.ToString());
        }
    }
}
4

2 に答える 2

1

メッセージは、QuickFIX でサポートされている FIX50sp2 形式のようです。(タグ 1128=9 を見てください)。

http://www.onixs.biz/fix-dictionary/5.0.SP2/tagNum_1128.html

しかし、すべてのメッセージは適切にフォーマットされていないようです。ヘッダーには、必須のタグ 8 (BeginString である必要があります) とタグ 56 (TargetCompID) がありません。

したがって、メッセージに 1 行をロードするには、検証を回避するために「false」パラメーターを指定する必要があります。

2 番目のエラーは、適切にフォーマットされていないメッセージに関連していると思います。

于 2012-09-12T14:05:38.823 に答える
0

この質問を QuickFix listserv にメールで送信したところ、これを機能させるのに十分な情報を得ることができました。なんらかの理由で各行の形式が正しくないように見えますが、検証をオフのままにしておくと、次の単純化されたコードを使用してパーサーに必要なことを正確に実行させることができます。

using System;
using System.IO;
using QuickFix;
using QuickFix.DataDictionary;

namespace TestQuickFix
{
    class Program
    {
        private const int MAX_LINES = 10;

        static void Main(string[] args)
        {
            DataDictionary dd = new QuickFix.DataDictionary.DataDictionary("fix\\FIX50SP2.xml");   
            StreamReader file = new StreamReader(@"C:\secdef.dat");
            int count = 0; string line;
            while (((line = file.ReadLine()) != null && count++ < MAX_LINES))
            {
                QuickFix.FIX50.SecurityDefinition secDef = new QuickFix.FIX50.SecurityDefinition();
                secDef.FromString(line, false, dd, dd);
                Console.WriteLine(secDef.SecurityDesc);
            }
            file.Close();
        }
    }
}
于 2012-09-12T14:32:19.140 に答える