2016-03-03 65 views
2

我試圖通過使用QuickFix/J lib的TargetCompID執行「列表順序」(外匯訂單)。如何在QuickFix/J中創建列表順序消息

如果我理解正確的FIX標準的消息,我的消息必須具有以下字段(我已經把我的價值觀括號):

頁眉部分

  • 8 BeginString(FIX.4.4)
  • 9 BodyLength(將被計算併發送時由quickfixj提供)
  • 35 MSGTYPE(E = NewOrderList)
  • 34 MsgSeqNum(將被計算並通過曲提供ickfixj whend發送)
  • 49 SenderCompId(就是我)
  • 52 SendingTime(將被計算和發送時quickfixj提供)
  • 56 TargetCompId(這是我的對手,這將執行我的FX訂單)

然後身體部分

  • 66 ListId(uniq的ID計算的)
  • 68 ToNoOrders(我的訂單的計數到列表)
  • 73個NoOrders(計數值用的,因爲我會馬上生成訂單的完整列表)

然後重複以下領域(每個訂單一個列表域在我的列表)的列表:

  • 11 ClOrdId(我的訂單編號)
  • 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))中顯示消息來顯示我的信息中只有一個訂單,這是我放過的最後一個訂單。

看起來他們是我們可以在QuickFixJ中創建的一些「組」,我們可以在同一個消息中添加幾個組。但是有很多類型的組,我不知道什麼是適合我的「列表順序」的組,如果有的話?我發現Message的子類是NewOrderList(它是我的MsgType = E),但它不是一個「組」。並且它必須可以創建消息並直接提供MsgType ...

或者我可能不正確地理解我必須提供的FIX消息標準和字段?

問候,

亞歷

+0

好的,從http://btobits.com/fixopaedia/fixdic44/message_New_Order_List_E_.html;它表示「ClOrdID必須是重複組中的第一個字段」;所以我不得不使用重複組...來找到quickfixj(以及哪一個)。 – Alexxx

回答

3

相反從頭開始創建消息時,你應該在的QuickFix/J使用所述預定義的消息。

在你的情況下,我會開始尋找quickfix.fix44.NewOrderList

通過使用此類,消息的標題和頁腳部分(BeginString,BodyLength,MsgType,CheckSum,...)中將爲您填充大量字段。然後你只需要主要關注消息的主要部分(即主體)。

對於重複組,有助手類可用於在消息中設置該信息。例如。對於NewOrderList.NoOrders

quickfix.fix44.NewOrderList fixMessage = new quickfix.fix44.NewOrderList (
    .... // check constructor for what parameters to pass 
); 
// ... 
quickfix.fix44.NewOrderList.NoOrders noOrders = new quickfix.fix44.NewOrderList.NoOrders(); 
// ... 
fixMessage.addGroup(noOrders); 
+0

是的,我知道我可以使用預定義的消息。但我喜歡控制會發生什麼,然後使用基本消息。而且由於我的交易對手向我發送了關於他們參與接收的規格的說明,所以通過使用預定義的消息,我不確定是否會設置所有必需(通過對方)字段。但理想情況下,你是對的。我上面發佈了我的解決方案。 – Alexxx

+0

@Alexxx我看到了=)總是很好,你可以解決你自己的問題。 minium /有條件的必填字段由字典管理(由配置選項設置)。這些反映了FIX標準要求的內容。對手方總是可以要求額外的必填字段,但在使用手動消息和預定義消息之間在這方面沒有區別。 –

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); 
} 
+0

手動消息構建工作正確。使用預定義的消息可以節省你很多打字/管理的時間。 –