我是FIX和QuickFixJ的新手。在我的应用程序上工作时,我得到了FIX拒绝" Tag不止一次出现:"我们收到的消息之一。为了调试错误,我创建了一个小型Java应用程序,它使用客户端提供的数据字典和导致问题的消息。以下是调试应用程序的代码(使用quickfix / J版本1.6.3):
import quickfix.DataDictionary;
import quickfix.Message;
...
DataDictionary d = new DataDictionary("clientDictionary.xml");
String m = "FIX message taken from the application log. It has 102 tags";
Message message = new Message(m,d,true);
System.out.println("Message as text:" + message.toString());
System.out.println("Message as xml:" + message.toXML(d));
try{
d.validate(message);
} catch(Exception e) {
System.out.println("Validation Error:" + e.getMessage());
}
...
运行应用程序时,第一个print(message.toString())返回一个只有13个标签的FIX消息(m中的初始消息有102个标签)。当以XML格式打印消息时(message.toXML(d)),我只得到13个标签。有趣的是" CheckSum"字段在消息对象中从102(以m给出)更改为010。最后,在验证消息(d.validate(message))时,它会抛出以下错误:"标记超出所需顺序,field = 1128"。这不是帮助我调试最初的问题,而是提出了几个问题:
为什么从输入FIX消息创建的对象只包含13个标签而不包含102?
为什么字典验证会抛出创建字典时未引发的错误(新消息(m,d,true) - true表示验证)?
不确定它是否有帮助,但这里是message.toXML(d)方法返回的字段(正文中只有1个字段):
header
field name="BeginString" tag="8"
field name="BodyLength" tag="9"
field name="MsgSeqNum" tag="34"
field name="MsgType" tag="35"
field name="SenderCompID" tag="49"
field name="SendingTime" tag="52"
field name="TargetCompID" tag="56"
field name="OnBehalfOfCompID" tag="115"
field name="DeliverToCompID" tag="128"
field name="MessageEndcoding" tag="347"
field name="ApplVerID" tag="1128"
body
field name="ApplExtID" tag="1156"
trailer
field name="CheckSum" tag="10"
原始FIX消息中有许多字段缺少。例如字段名称="价格"标签=" 44&#34 ;.对我来说,似乎它使用的是不同的字典。我也尝试过像FIX50SP2.xml这样的其他标准词典,但结果完全一样。
提前致谢,