如何使用QuickFix读取secdef.dat文件

时间:2012-09-11 22:49:55

标签: c# quickfix fix-protocol

我正在尝试从CME读取静态证券定义文件,该文件位于: ftp://ftp.cmegroup.com/fix/Production/secdef.dat.gz

由于它们似乎是标准修复消息,我认为我可以使用QuickFix帮助我将它们读入C#而不是自己解析文件。我创建了一个基本上做我想要的测试应用程序,但我有两个问题:

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());
        }
    }
}

2 个答案:

答案 0 :(得分:1)

消息似乎是FIX50sp2格式,由QuickFIX支持。 (请查看标签1128 = 9)。

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

但是每条消息似乎都没有很好地格式化。在标题中是miss标记8(应该是BeginString),还有标记56(TargetCompID),它们是必需的。

因此,为了在邮件中加载单行,您必须输入“false”参数以避免验证。

我认为第二个错误与格式不正确的消息有关。

答案 1 :(得分: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();
        }
    }
}