1

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

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

1) 从字符串形成消息时,我收到 QuickFix 异常“无效消息:标头字段乱序”。如果我将“验证”布尔值设置为 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

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

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

但是每条消息似乎格式不正确。标头中有遗漏的标签 8(应该是 BeginString),以及标签 56(TargetCompID),这是强制性的。

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

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

于 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 回答