我正在尝试从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());
}
}
}
答案 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();
}
}
}