如何在QuickFix / J中创建列表顺序消息

时间:2016-03-03 11:07:36

标签: fix-protocol quickfixj

我试图生成一个"列表订单" (forex orders)由我的TargetCompID用QuickFix / J lib执行。

如果我正确理解FIX消息标准,我的消息必须包含以下字段(我将我的值放在括号中):

标题部分

  • 8 BeginString(FIX.4.4)
  • 9 BodyLength(发送时将由quickfixj计算并提供)
  • 35 MsgType(E = NewOrderList)
  • 34 MsgSeqNum(将由quickfixj发送时计算并提供)
  • 49 SenderCompId(那是我)
  • 52 SendingTime(将在发送时由quickfixj计算并提供)
  • 56 TargetCompId(我的交易对手将执行我的外汇订单)

然后是身体部位

  • 66 ListId(uniq id calculated)
  • 68 ToNoOrders(我的订单计入清单)
  • 73 NoOrders(与我相同的计数值将立即生成完整的订单列表)

然后重复以下字段列表(列表中每个订单一个列表字段):

  • 11 ClOrdId(我的订单ID)
  • 67 ListSeqNo(订单中的订单索引:从1到N; N = ToNoOrders = NoOrders)
  • ......其他几个字段为15(货币),120(SettlCurrency)

要做到这一点我已经完成了(在java / quickfixj中):

Message message = new Message();
Header header = message.getHeader();
header.setField(new BeginString("FIX.4.4"));
header.setField(new MsgType("E"));
header.setField(new SenderCompID("it's me"));
header.setField(new TargetCompID("my counterparty"));
message.setField(new ListID(_fixListId));
message.setField(new TotNoOrders(_list.size()));
message.setField(new NoOrders(_list.size()));
int idx = 0;
for (Order order : _list) {
    message.setField(new ClOrdID(order.getId()));
    message.setField(new ListSeqNo(++idx));
    //message.setField(.... other fields to add to describe my order)
}

但是这样做,在我的quickfixj应用程序的回调函数toApp中("这是对你被发送给交易对手" 的应用程序消息的回调),显示参数(syso(message))中的消息显示我的消息中只有一个订单,而且它是我放弃的最后一个订单。

看来他们是一些" group"我们可以在QuickFixJ中创建,我们可以在同一个消息中添加几个组。但是有很多类型的小组,我不知道哪个小组适合我的"列表顺序",如果有的话?我看到Message的子类是NewOrderList(它是我的MsgType = E),但它不是" group&#34 ;;并且必须可以创建Message并直接提供MsgType ...

或许我不能正确理解FIX消息标准和我必须提供的字段?

此致

亚历

2 个答案:

答案 0 :(得分:3)

您应该使用QuickFIX / J中的预定义消息,而不是从头开始创建消息。

在你的情况下,我会开始查看quickfix.fix44.NewOrderList

通过使用此类,将在消息的页眉和页脚部分(BeginString,BodyLength,MsgType,CheckSum,...)中填充许多字段。然后,您只需要关注自己主要与消息的主要部分(即正文)。

对于重复组,可以使用帮助程序类在消息中设置该信息。例如。对于NewOrderList.NoOrders

string MyQueryTest(){
 string returnValue;
 try{
   stmt->execute("UPDATE testtbl SET Name = 'Test' WHERE id = '2'");
 }
 catch(SQLException e){
   returnValue = "false";
 }

 returnValue = "true";

 return returnValue;
}

string MyValue =  MyQueryTest();

答案 1 :(得分:1)

好的,我已经得到了它。

我使用了通用组,并手动设置了字段。

如此更新的代码解决方案是:

Message message = new Message();
Header header = message.getHeader();
header.setField(new BeginString("FIX.4.4"));
header.setField(new MsgType("E"));
header.setField(new SenderCompID("it's me"));
header.setField(new TargetCompID("my counterparty"));
message.setField(new ListID(_fixListId));
message.setField(new TotNoOrders(_list.size()));
message.setField(new NoOrders(_list.size()));
int idx = 0;
for (Order order : _list) {
    Group group = new Group(18, new ClOrdID().getTag()); //18 is the number of field I will add below inot the group, second paramaeter is the first field of the group
    group.setField(new ClOrdID(order.getId()));
    group.setField(new ListSeqNo(++idx));
    //message.setField(.... other fields to add to describe my order)
    message.addGroup(group);
}