LCOV - code coverage report
Current view: top level - include/app/model - order.hpp (source / functions) Coverage Total Hit
Test: coverage.info Lines: 100.0 % 33 33
Test Date: 2025-12-19 03:13:09 Functions: 100.0 % 4 4

            Line data    Source code
       1              : /**
       2              :  * @file order.hpp
       3              :  * @brief 内部订单数据结构
       4              :  *
       5              :  * 定义与协议无关的订单表示,用于撮合引擎内部处理。
       6              :  * 与 FIX 消息解耦,便于支持多种协议接入。
       7              :  */
       8              : 
       9              : #pragma once
      10              : 
      11              : #include <string>
      12              : #include <cstdint>
      13              : #include <chrono>
      14              : #include "fix/application.hpp"
      15              : 
      16              : namespace fix40 {
      17              : 
      18              : // ============================================================================
      19              : // 枚举定义
      20              : // ============================================================================
      21              : 
      22              : /**
      23              :  * @enum OrderSide
      24              :  * @brief 买卖方向
      25              :  */
      26              : enum class OrderSide {
      27              :     BUY = 1,    ///< 买入
      28              :     SELL = 2    ///< 卖出
      29              : };
      30              : 
      31              : /**
      32              :  * @enum OrderType
      33              :  * @brief 订单类型
      34              :  */
      35              : enum class OrderType {
      36              :     MARKET = 1,  ///< 市价单
      37              :     LIMIT = 2    ///< 限价单
      38              : };
      39              : 
      40              : /**
      41              :  * @enum TimeInForce
      42              :  * @brief 订单有效期
      43              :  */
      44              : enum class TimeInForce {
      45              :     DAY = 0,    ///< 当日有效
      46              :     GTC = 1,    ///< 撤销前有效 (Good Till Cancel)
      47              :     IOC = 3,    ///< 立即成交否则取消 (Immediate Or Cancel)
      48              :     FOK = 4     ///< 全部成交否则取消 (Fill Or Kill)
      49              : };
      50              : 
      51              : /**
      52              :  * @enum OrderStatus
      53              :  * @brief 订单状态
      54              :  * 
      55              :  * @note 枚举值与 FIX 协议 OrdStatus(39) 标准定义保持一致,
      56              :  *       数值不连续是故意的,便于与协议对照和日志分析。
      57              :  */
      58              : enum class OrderStatus {
      59              :     NEW = 0,              ///< 新订单(已接受)
      60              :     PARTIALLY_FILLED = 1, ///< 部分成交
      61              :     FILLED = 2,           ///< 全部成交
      62              :     CANCELED = 4,         ///< 已撤销
      63              :     REJECTED = 8,         ///< 已拒绝
      64              :     PENDING_NEW = 10,     ///< 待确认(内部状态)
      65              :     PENDING_CANCEL = 6    ///< 待撤销(内部状态)
      66              : };
      67              : 
      68              : /**
      69              :  * @enum ExecTransType
      70              :  * @brief 执行事务类型 (FIX 4.0)
      71              :  */
      72              : enum class ExecTransType {
      73              :     NEW = 0,      ///< 新执行报告
      74              :     CANCEL = 1,   ///< 取消之前的执行报告
      75              :     CORRECT = 2,  ///< 更正之前的执行报告
      76              :     STATUS = 3    ///< 状态查询响应
      77              : };
      78              : 
      79              : // ============================================================================
      80              : // 订单结构
      81              : // ============================================================================
      82              : 
      83              : /**
      84              :  * @struct Order
      85              :  * @brief 内部订单表示
      86              :  *
      87              :  * 与协议无关的订单数据结构,包含订单的所有业务属性。
      88              :  * 撮合引擎只处理此结构,不直接接触 FIX 消息。
      89              :  */
      90              : struct Order {
      91              :     // -------------------------------------------------------------------------
      92              :     // 标识符
      93              :     // -------------------------------------------------------------------------
      94              :     std::string clOrdID;       ///< 客户端订单ID(客户端生成)
      95              :     std::string orderID;       ///< 服务端订单ID(撮合引擎生成)
      96              :     SessionID sessionID;       ///< 来源会话
      97              : 
      98              :     // -------------------------------------------------------------------------
      99              :     // 订单参数
     100              :     // -------------------------------------------------------------------------
     101              :     std::string symbol;        ///< 标的代码
     102              :     OrderSide side;            ///< 买卖方向
     103              :     OrderType ordType;         ///< 订单类型
     104              :     TimeInForce timeInForce;   ///< 有效期类型
     105              :     int64_t orderQty;          ///< 订单数量
     106              :     double price;              ///< 限价(市价单为 0)
     107              : 
     108              :     // -------------------------------------------------------------------------
     109              :     // 执行状态
     110              :     // -------------------------------------------------------------------------
     111              :     OrderStatus status;        ///< 当前状态
     112              :     int64_t cumQty;            ///< 累计成交数量
     113              :     int64_t leavesQty;         ///< 剩余数量
     114              :     double avgPx;              ///< 平均成交价
     115              : 
     116              :     // -------------------------------------------------------------------------
     117              :     // 时间戳
     118              :     // -------------------------------------------------------------------------
     119              :     std::chrono::system_clock::time_point createTime;  ///< 创建时间
     120              :     std::chrono::system_clock::time_point updateTime;  ///< 最后更新时间
     121              : 
     122              :     // -------------------------------------------------------------------------
     123              :     // 构造函数
     124              :     // -------------------------------------------------------------------------
     125              : 
     126              :     /**
     127              :      * @brief 默认构造函数
     128              :      */
     129         1980 :     Order()
     130         3960 :         : side(OrderSide::BUY)
     131         1980 :         , ordType(OrderType::LIMIT)
     132         1980 :         , timeInForce(TimeInForce::DAY)
     133         1980 :         , orderQty(0)
     134         1980 :         , price(0.0)
     135         1980 :         , status(OrderStatus::PENDING_NEW)
     136         1980 :         , cumQty(0)
     137         1980 :         , leavesQty(0)
     138         1980 :         , avgPx(0.0)
     139         1980 :         , createTime(std::chrono::system_clock::now())
     140         1980 :         , updateTime(createTime)
     141         1980 :     {}
     142              : 
     143              :     /**
     144              :      * @brief 计算剩余数量
     145              :      */
     146              :     void updateLeavesQty() {
     147              :         leavesQty = orderQty - cumQty;
     148              :     }
     149              : 
     150              :     /**
     151              :      * @brief 检查订单是否已完成(不可再成交)
     152              :      */
     153           67 :     bool isTerminal() const {
     154          134 :         return status == OrderStatus::FILLED ||
     155          134 :                status == OrderStatus::CANCELED ||
     156          134 :                status == OrderStatus::REJECTED;
     157              :     }
     158              : 
     159              :     /**
     160              :      * @brief 检查订单是否可撤销
     161              :      */
     162              :     bool isCancelable() const {
     163              :         return status == OrderStatus::NEW ||
     164              :                status == OrderStatus::PARTIALLY_FILLED;
     165              :     }
     166              : };
     167              : 
     168              : // ============================================================================
     169              : // 撤单请求
     170              : // ============================================================================
     171              : 
     172              : /**
     173              :  * @struct CancelRequest
     174              :  * @brief 撤单请求
     175              :  */
     176              : struct CancelRequest {
     177              :     std::string clOrdID;       ///< 本次撤单请求的ID
     178              :     std::string origClOrdID;   ///< 要撤销的原订单ID
     179              :     std::string symbol;        ///< 标的代码
     180              :     SessionID sessionID;       ///< 来源会话
     181              : 
     182            3 :     CancelRequest() = default;
     183              : };
     184              : 
     185              : // ============================================================================
     186              : // 执行报告
     187              : // ============================================================================
     188              : 
     189              : /**
     190              :  * @struct ExecutionReport
     191              :  * @brief 执行报告
     192              :  *
     193              :  * 用于向客户端报告订单状态变化和成交信息。
     194              :  */
     195              : struct ExecutionReport {
     196              :     // 标识符
     197              :     std::string orderID;       ///< 服务端订单ID
     198              :     std::string clOrdID;       ///< 客户端订单ID
     199              :     std::string execID;        ///< 执行ID(每次报告唯一)
     200              :     std::string origClOrdID;   ///< 原订单ID(撤单时使用)
     201              : 
     202              :     // 订单信息
     203              :     std::string symbol;        ///< 标的代码
     204              :     OrderSide side;            ///< 买卖方向
     205              :     OrderType ordType;         ///< 订单类型
     206              :     int64_t orderQty;          ///< 订单数量
     207              :     double price;              ///< 订单价格
     208              : 
     209              :     // 执行信息
     210              :     ExecTransType execTransType; ///< 执行事务类型
     211              :     OrderStatus ordStatus;       ///< 订单状态
     212              :     int64_t lastShares;          ///< 本次成交数量 (FIX 4.0: LastShares)
     213              :     double lastPx;               ///< 本次成交价格
     214              :     int64_t leavesQty;           ///< 剩余数量
     215              :     int64_t cumQty;              ///< 累计成交数量
     216              :     double avgPx;                ///< 平均成交价
     217              : 
     218              :     // 时间
     219              :     std::chrono::system_clock::time_point transactTime;  ///< 交易时间
     220              : 
     221              :     // 拒绝信息
     222              :     int ordRejReason;            ///< 拒绝原因代码
     223              :     std::string text;            ///< 文本说明
     224              : 
     225              :     // 会话信息
     226              :     SessionID sessionID;         ///< 目标会话
     227              : 
     228              :     /**
     229              :      * @brief 默认构造函数
     230              :      */
     231          711 :     ExecutionReport()
     232         1422 :         : side(OrderSide::BUY)
     233          711 :         , ordType(OrderType::LIMIT)
     234          711 :         , orderQty(0)
     235          711 :         , price(0.0)
     236          711 :         , execTransType(ExecTransType::NEW)
     237          711 :         , ordStatus(OrderStatus::NEW)
     238          711 :         , lastShares(0)
     239          711 :         , lastPx(0.0)
     240          711 :         , leavesQty(0)
     241          711 :         , cumQty(0)
     242          711 :         , avgPx(0.0)
     243          711 :         , transactTime(std::chrono::system_clock::now())
     244         1422 :         , ordRejReason(0)
     245          711 :     {}
     246              : };
     247              : 
     248              : } // namespace fix40
        

Generated by: LCOV version 2.0-1