如何在ExecutionReport中处理NewOrderList并通过onMessage获取订单列表详情?
处理FIX协议中ExecutionReport里的NewOrderList问题
作为常年跟FIX协议打交道的开发者,我来帮你理清这个问题~
你提到的文档表述完全正确:NewOrderList中的每个订单都会被单独处理,并且每个订单的状态和交易明细都会通过独立的ExecutionReport消息返回,不会有针对整个订单列表的汇总报告。
回到你的问题:你完全可以通过onMessage(ExecutionReport report, SessionID sessionID)这个方法来获取每个订单的详情,不过有几个关键细节需要注意:
- 每个ExecutionReport都会关联到原NewOrderList中的单个订单:你可以通过
FieldListNo字段定位该订单在原列表中的位置,或者用ClOrdID匹配原列表里对应的单个订单ID。 - 同一个NewOrderList下的所有ExecutionReport都会携带相同的
ListID字段:你可以用这个字段把同列表的订单报告分组,从而还原整个订单列表的处理状态和进度。 - 每个订单的状态是独立的:比如列表里的某个订单可能已经成交(
OrdStatus=Filled),另一个可能还在待处理(OrdStatus=New),甚至被拒绝(OrdStatus=Rejected),这些状态互不影响,需要单独跟踪。
给你一个简单的实现示例,帮你理解怎么在onMessage里处理:
public void onMessage(ExecutionReport report, SessionID sessionID) { // 获取列表唯一标识,用于分组同列表的订单报告 String listId = report.getString(ListID.FIELD); // 获取当前订单在列表中的序号 int listItemNumber = report.getInt(FieldListNo.FIELD); // 获取单个订单的客户订单ID String clientOrderId = report.getString(ClOrdID.FIELD); // 获取当前订单的状态 char orderStatus = report.getChar(OrdStatus.FIELD); // 示例:打印订单状态,实际业务中可以聚合同列表的订单状态、更新本地存储等 System.out.printf("订单列表[%s]中第%d个订单[%s]的状态更新为: %c%n", listId, listItemNumber, clientOrderId, orderStatus); // 处理订单拒绝的情况(如果有) if (orderStatus == OrdStatus.REJECTED) { String rejectReason = report.getString(OrdRejReason.FIELD); System.out.printf("订单[%s]被拒绝,原因: %s%n", clientOrderId, rejectReason); } }
额外提醒几点:
- 不同的FIX协议版本(比如4.4、5.0)对字段的可选性可能有细微差异,建议你对照使用的协议版本确认
ListID、FieldListNo这些字段是否为必传项。 - 如果你的业务需要跟踪整个订单列表的处理结果,可以在本地维护一个以
ListID为键的缓存,把同列表的所有ExecutionReport聚合起来,直到所有订单都处理完成。
内容的提问来源于stack exchange,提问作者Sandeep K Nair
相关产品推荐
相关产品推荐

