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
|