You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:06:18