Skip to main content

futu_backend/
trade_cmd.rs

1//! Trade backend command registry.
2//!
3//! 交易 backend command 的唯一权威出处。调用点不得现场写 `base_cmd + 10000`
4//! 或重复解释 real/sim cmd、body proto、backend channel。历史上真实 / 模拟
5//! cmd 混用已多次造成 backend business error;这里把 wire contract 逐项显式列出。
6//!
7//! C++ `NNProto_Trd_Base::GetCmdID` 在 simulate 环境会把交易 cmd 映射到
8//! `real_cmd + SimTrdCmdOffset`;`NNInterCmdConfig.cpp` 也把 `14700..14718`
9//! 和 `14800` 标成模拟交易系统接口。但这个规律只作为交易 backend 证据,
10//! 不能推广为全局「1 开头 5 位 CMD = sim」规则:债券 `10043/10057`、
11//! 行情 `18008` 都是非 sim 业务 CMD。运行时调度只认下面的 registry。
12
13/// 账户资产查询命令 ID (真实账户: 资金+持仓)
14pub const CMD_ACCOUNT_INFO: u16 = 3020;
15/// 基金/债券总资产查询命令 ID (真实账户 sidecar, C++ QueryFundNoLimit)
16pub const CMD_FUND_BOND_DETAIL_ASSET: u16 = 20086;
17/// 资金查询 base command ID。真实 `GetFunds` 不直接发此 cmd:C++ real 分支
18/// 走 CMD3020 `AccountInfoReq`;SIM 分支走 registry 中的 14704。
19/// 注意:4704 不是模拟账户资金 wire cmd。
20pub const CMD_QUERY_FUND: u16 = 4704;
21/// 持仓查询 base command ID。真实 `GetPositionList` 不直接发此 cmd:C++
22/// real 分支走 CMD3020 `AccountInfoReq`;SIM 分支走 registry 中的 14705。
23/// 注意:4705 不是模拟账户持仓 wire cmd。
24pub const CMD_QUERY_POSITION: u16 = 4705;
25/// 订单查询命令 ID
26pub const CMD_QUERY_ORDER_LIST: u16 = 4708;
27/// 指定订单 ID 查询命令 ID。C++ push `NOTICE_TYPE_ORDER_UPDATE` /
28/// `NOTICE_TYPE_ORDER_OP_RESULT` 使用此 detail path,不用 4708 全量订单列表代替。
29pub const CMD_QUERY_ORDER_INFO: u16 = 4707;
30/// 成交列表查询命令 ID
31pub const CMD_QUERY_ORDER_FILL_LIST: u16 = 4710;
32/// 指定成交 ID 查询命令 ID。C++ `QueryDealInfo` 在成交通知
33/// `NOTICE_TYPE_ORDER_FILL_UPDATE` 中使用,不等同于成交列表 4710。
34pub const CMD_QUERY_ORDER_FILL_INFO: u16 = 4715;
35/// 历史订单查询命令 ID
36pub const CMD_QUERY_HISTORY_ORDER_LIST: u16 = 4711;
37/// 历史成交查询命令 ID
38pub const CMD_QUERY_HISTORY_ORDER_FILL_LIST: u16 = 4712;
39/// 最大可买卖查询命令 ID
40pub const CMD_MAX_BUY_SELL: u16 = 4713;
41/// 真实下单命令 ID。模拟下单必须走 registry 中的 14701。
42pub const CMD_PLACE_ORDER: u16 = 4701;
43/// 真实改单命令 ID。模拟改单必须走 registry 中的 14702。
44pub const CMD_MODIFY_ORDER: u16 = 4702;
45/// 真实撤单命令 ID。模拟撤单必须走 registry 中的 14703。
46pub const CMD_CANCEL_ORDER: u16 = 4703;
47/// 真实订单生效命令 ID。模拟路径由 APIServer 层拒绝;registry 仍显式列出
48/// C++ `NN_ProtoCmd_Trd_OrderOp_EnableOrder + SimTrdCmdOffset`。
49pub const CMD_ENABLE_ORDER: u16 = 4719;
50/// 真实订单失效命令 ID。模拟路径由 APIServer 层拒绝;registry 仍显式列出
51/// C++ `NN_ProtoCmd_Trd_OrderOp_DisableOrder + SimTrdCmdOffset`。
52pub const CMD_DISABLE_ORDER: u16 = 4720;
53/// 真实失败订单删除命令 ID。模拟路径由 APIServer 层拒绝;registry 仍显式列出
54/// C++ `NN_ProtoCmd_Trd_OrderOp_DeleteOrder + SimTrdCmdOffset`。
55pub const CMD_DELETE_ORDER: u16 = 4725;
56/// 真实二次确认命令 ID。模拟二次确认必须走 registry 中的 14728。
57pub const CMD_ORDER_CONFIRM: u16 = 4728;
58
59/// v1.4.53 BUG-6: Sim 账户资金查询 CMD。显式登记,禁止调用点用 offset 推导。
60pub const CMD_SIM_QUERY_FUND: u16 = 14704;
61/// v1.4.53 BUG-6: Sim 账户持仓查询 CMD。注意 4705 是 base QueryPositionList,
62/// 14705 才是 sim 专用 wire cmd。
63pub const CMD_SIM_QUERY_POSITION: u16 = 14705;
64/// v1.4.106: Sim 账户订单查询 CMD。显式登记,禁止调用点用 offset 推导。
65pub const CMD_SIM_QUERY_ORDER_LIST: u16 = 14708;
66/// Sim 账户指定订单 ID 查询 CMD。显式登记,禁止调用点用 offset 推导。
67pub const CMD_SIM_QUERY_ORDER_INFO: u16 = 14707;
68/// Sim 账户成交列表查询 CMD。显式登记,禁止调用点用 offset 推导。
69pub const CMD_SIM_QUERY_ORDER_FILL_LIST: u16 = 14710;
70/// Sim 账户指定成交 ID 查询 CMD。显式登记,禁止调用点用 offset 推导。
71pub const CMD_SIM_QUERY_ORDER_FILL_INFO: u16 = 14715;
72/// Sim 账户历史订单查询 CMD。显式登记,禁止调用点用 offset 推导。
73pub const CMD_SIM_QUERY_HISTORY_ORDER_LIST: u16 = 14711;
74/// Sim 账户历史成交查询 CMD。显式登记,禁止调用点用 offset 推导。
75pub const CMD_SIM_QUERY_HISTORY_ORDER_FILL_LIST: u16 = 14712;
76/// 模拟后端下单命令 ID。显式登记,禁止调用点用 offset 推导。
77pub const CMD_SIM_PLACE_ORDER: u16 = 14701;
78/// 模拟后端改单命令 ID。显式登记,禁止调用点用 offset 推导。
79pub const CMD_SIM_MODIFY_ORDER: u16 = 14702;
80/// 模拟后端撤单命令 ID。显式登记,禁止调用点用 offset 推导。
81pub const CMD_SIM_CANCEL_ORDER: u16 = 14703;
82/// 模拟订单生效 CMD。APIServer `IsNotSupportOrderOp` 早期拒绝 sim Enable;
83/// registry 仅用于保持 C++ wire contract 完整。
84pub const CMD_SIM_ENABLE_ORDER: u16 = 14719;
85/// 模拟订单失效 CMD。APIServer `IsNotSupportOrderOp` 早期拒绝 sim Disable;
86/// registry 仅用于保持 C++ wire contract 完整。
87pub const CMD_SIM_DISABLE_ORDER: u16 = 14720;
88/// 模拟失败订单删除 CMD。APIServer `IsNotSupportOrderOp` 早期拒绝 sim Delete;
89/// registry 仅用于保持 C++ wire contract 完整。
90pub const CMD_SIM_DELETE_ORDER: u16 = 14725;
91/// 模拟后端订单二次确认命令 ID。显式登记,禁止调用点用 offset 推导。
92pub const CMD_SIM_ORDER_CONFIRM: u16 = 14728;
93/// 模拟后端最大可买卖查询 CMD。显式登记,禁止调用点用 offset 推导。
94pub const CMD_SIM_MAX_BUY_SELL: u16 = 14713;
95
96/// Crypto 交易配置查询。Ref:
97/// `NNBase_Define_ProtoCmd.h:66-81` / `NNProto_Trd_CryptoTradeConfig.cpp:14-23`.
98pub const CMD_CRYPTO_FETCH_TRADE_CONFIG: u16 = 20102;
99/// Crypto 账户资产查询 (资金 + 持仓)。Ref:
100/// `NNBase_Define_ProtoCmd.h:66-81` / `NNProto_Trd_AccCrypto.cpp:197-215`.
101pub const CMD_CRYPTO_ACCOUNT_INFO: u16 = 20631;
102/// Crypto 订单列表。Ref:
103/// `NNBase_Define_ProtoCmd.h:66-81` / `NNProto_Trd_OrderCrypto.cpp:346-368`.
104pub const CMD_CRYPTO_QUERY_ORDER_LIST: u16 = 20621;
105/// Crypto 历史订单列表。Ref:
106/// `NNBase_Define_ProtoCmd.h:66-81` / `NNProto_Trd_OrderCrypto.cpp:373-398`.
107pub const CMD_CRYPTO_QUERY_HISTORY_ORDER_LIST: u16 = 20623;
108/// Crypto 订单详情。Ref:
109/// `NNBase_Define_ProtoCmd.h:66-81` / `NNProto_Trd_OrderCrypto.cpp:153-177`.
110pub const CMD_CRYPTO_QUERY_ORDER_INFO: u16 = 20625;
111/// Crypto 订单维度成交明细。Ref:
112/// `NNBase_Define_ProtoCmd.h:66-81` / `NNProto_Trd_DealCrypto.cpp:500-525`.
113pub const CMD_CRYPTO_QUERY_ORDER_FILL_DETAIL: u16 = 20624;
114/// Crypto 成交列表。Ref:
115/// `NNBase_Define_ProtoCmd.h:66-81` / `NNProto_Trd_DealCrypto.cpp:452-464`.
116pub const CMD_CRYPTO_QUERY_DEAL_LIST: u16 = 21237;
117/// Crypto 历史成交列表。Ref:
118/// `NNBase_Define_ProtoCmd.h:66-81` / `NNProto_Trd_DealCrypto.cpp:472-485`.
119pub const CMD_CRYPTO_QUERY_HISTORY_DEAL_LIST: u16 = 21234;
120/// Crypto 批量订单费用。Ref:
121/// `NNBase_Define_ProtoCmd.h:66-81` / `NNProto_Trd_OrderFeeCrypto.cpp:133-149`.
122pub const CMD_CRYPTO_QUERY_BATCH_ORDER_FEE: u16 = 21235;
123/// Crypto 最大可买卖。Ref:
124/// `NNBase_Define_ProtoCmd.h:66-81` / `NNProto_Trd_MaxQtyCrypto.cpp:14-38`.
125pub const CMD_CRYPTO_MAX_BUY_SELL_QTY: u16 = 20622;
126/// Crypto 资金流水。Ref:
127/// `NNBase_Define_ProtoCmd.h:66-81` / `NNProto_Trd_FlowSummaryCrypto.cpp:191-212`.
128pub const CMD_CRYPTO_QUERY_CASH_LOG: u16 = 20632;
129/// Crypto 下单。Ref:
130/// `NNBase_Define_ProtoCmd.h:66-81` / `NNProto_Trd_OrderOpCrypto.cpp:21-53`.
131pub const CMD_CRYPTO_PLACE_ORDER: u16 = 20626;
132/// Crypto 撤单。Ref:
133/// `NNBase_Define_ProtoCmd.h:66-81` / `NNProto_Trd_OrderOpCrypto.cpp:65-112`.
134pub const CMD_CRYPTO_CANCEL_ORDER: u16 = 20628;
135/// Crypto 资产 push。Ref:
136/// `NNBase_Define_ProtoCmd.h:66-81` / `NNProto_Trd_OnPush.cpp:284-307`.
137pub const CMD_CRYPTO_NOTIFY_ASSET: u16 = 20635;
138/// Crypto 订单 push。Ref:
139/// `NNBase_Define_ProtoCmd.h:66-81` / `NNProto_Trd_OnPush.cpp:246-272`.
140pub const CMD_CRYPTO_NOTIFY_ORDER: u16 = 20648;
141
142#[derive(Debug, Clone, Copy, PartialEq, Eq)]
143pub enum TradeBackendChannel {
144    Broker,
145    Platform,
146}
147
148#[derive(Debug, Clone, Copy, PartialEq, Eq)]
149pub enum TradeQueryOperation {
150    Funds,
151    Positions,
152    Orders,
153    OrderInfo,
154    Fills,
155    FillInfo,
156    HistoryOrders,
157    HistoryFills,
158}
159
160#[derive(Debug, Clone, Copy, PartialEq, Eq)]
161pub enum TradeQueryBodyProto {
162    RealAccountInfo,
163    SimCashInfo,
164    SimPositionInfo,
165    RealOrderList,
166    SimOrderList,
167    RealOrderInfo,
168    SimOrderInfo,
169    RealOrderFillList,
170    RealOrderFillInfo,
171    RealHistoryOrderList,
172    SimHistoryOrderList,
173    RealHistoryOrderFillList,
174}
175
176#[derive(Debug, Clone, Copy, PartialEq, Eq)]
177pub struct TradeQueryCommandSpec {
178    pub operation: TradeQueryOperation,
179    pub real_cmd: u16,
180    pub sim_cmd: u16,
181    pub real_body: TradeQueryBodyProto,
182    pub sim_body: TradeQueryBodyProto,
183    pub real_channel: TradeBackendChannel,
184    pub sim_channel: TradeBackendChannel,
185    pub cpp_ref: &'static str,
186}
187
188/// Trade read backend command registry.
189///
190/// 这是资金 / 持仓 / 订单读路径的唯一权威来源。
191pub const TRADE_QUERY_FUNDS: TradeQueryCommandSpec = TradeQueryCommandSpec {
192    operation: TradeQueryOperation::Funds,
193    real_cmd: CMD_ACCOUNT_INFO,
194    sim_cmd: CMD_SIM_QUERY_FUND,
195    real_body: TradeQueryBodyProto::RealAccountInfo,
196    sim_body: TradeQueryBodyProto::SimCashInfo,
197    real_channel: TradeBackendChannel::Broker,
198    sim_channel: TradeBackendChannel::Platform,
199    cpp_ref: "NNProto_Trd_Acc.cpp:882-922 QueryFundNoLimit",
200};
201
202pub const TRADE_QUERY_POSITIONS: TradeQueryCommandSpec = TradeQueryCommandSpec {
203    operation: TradeQueryOperation::Positions,
204    real_cmd: CMD_ACCOUNT_INFO,
205    sim_cmd: CMD_SIM_QUERY_POSITION,
206    real_body: TradeQueryBodyProto::RealAccountInfo,
207    sim_body: TradeQueryBodyProto::SimPositionInfo,
208    real_channel: TradeBackendChannel::Broker,
209    sim_channel: TradeBackendChannel::Platform,
210    cpp_ref: "NNProto_Trd_Acc.cpp:780-811 QueryPositionListNoLimit",
211};
212
213pub const TRADE_QUERY_ORDERS: TradeQueryCommandSpec = TradeQueryCommandSpec {
214    operation: TradeQueryOperation::Orders,
215    real_cmd: CMD_QUERY_ORDER_LIST,
216    sim_cmd: CMD_SIM_QUERY_ORDER_LIST,
217    real_body: TradeQueryBodyProto::RealOrderList,
218    sim_body: TradeQueryBodyProto::SimOrderList,
219    real_channel: TradeBackendChannel::Broker,
220    sim_channel: TradeBackendChannel::Platform,
221    cpp_ref: "NNProto_Trd_Order.cpp:202-218 QueryOrderList_Inner + NNProto_Trd_Base.cpp:68-70",
222};
223
224pub const TRADE_QUERY_ORDER_INFO: TradeQueryCommandSpec = TradeQueryCommandSpec {
225    operation: TradeQueryOperation::OrderInfo,
226    real_cmd: CMD_QUERY_ORDER_INFO,
227    sim_cmd: CMD_SIM_QUERY_ORDER_INFO,
228    real_body: TradeQueryBodyProto::RealOrderInfo,
229    // C++ sim QueryOrderInfo builds `order_sys_interface::OrderDetailReq`,
230    // sends `NN_ProtoCmd_Trd_QueryOrderInfo + SimTrdCmdOffset`, then decodes
231    // `sim_order_sys_interface::OrderDetailRsp`.
232    sim_body: TradeQueryBodyProto::SimOrderInfo,
233    real_channel: TradeBackendChannel::Broker,
234    sim_channel: TradeBackendChannel::Platform,
235    cpp_ref: "NNProto_Trd_OnPush.cpp:111-123,177-211 + NNProto_Trd_OrderReal.cpp:211-243 + NNProto_Trd_OrderSimulate.cpp:205-235",
236};
237
238pub const TRADE_QUERY_FILLS: TradeQueryCommandSpec = TradeQueryCommandSpec {
239    operation: TradeQueryOperation::Fills,
240    real_cmd: CMD_QUERY_ORDER_FILL_LIST,
241    sim_cmd: CMD_SIM_QUERY_ORDER_FILL_LIST,
242    real_body: TradeQueryBodyProto::RealOrderFillList,
243    sim_body: TradeQueryBodyProto::RealOrderFillList,
244    real_channel: TradeBackendChannel::Broker,
245    sim_channel: TradeBackendChannel::Platform,
246    cpp_ref: "NNProto_Trd_Deal.cpp:135-159 QueryDealList_Inner + NNProto_Trd_Base.cpp:68-70",
247};
248
249pub const TRADE_QUERY_FILL_INFO: TradeQueryCommandSpec = TradeQueryCommandSpec {
250    operation: TradeQueryOperation::FillInfo,
251    real_cmd: CMD_QUERY_ORDER_FILL_INFO,
252    sim_cmd: CMD_SIM_QUERY_ORDER_FILL_INFO,
253    real_body: TradeQueryBodyProto::RealOrderFillInfo,
254    sim_body: TradeQueryBodyProto::RealOrderFillInfo,
255    real_channel: TradeBackendChannel::Broker,
256    sim_channel: TradeBackendChannel::Platform,
257    cpp_ref: "NNProto_Trd_OnPush.cpp:151-161 + NNProto_Trd_Deal.cpp:216-248 + NNProto_Trd_Base.cpp:68-70",
258};
259
260pub const TRADE_QUERY_HISTORY_ORDERS: TradeQueryCommandSpec = TradeQueryCommandSpec {
261    operation: TradeQueryOperation::HistoryOrders,
262    real_cmd: CMD_QUERY_HISTORY_ORDER_LIST,
263    sim_cmd: CMD_SIM_QUERY_HISTORY_ORDER_LIST,
264    real_body: TradeQueryBodyProto::RealHistoryOrderList,
265    sim_body: TradeQueryBodyProto::SimHistoryOrderList,
266    real_channel: TradeBackendChannel::Broker,
267    sim_channel: TradeBackendChannel::Platform,
268    cpp_ref: "NNProto_Trd_Order.cpp:248-263 QueryHistoryOrderList + NNProto_Trd_Base.cpp:68-70",
269};
270
271pub const TRADE_QUERY_HISTORY_FILLS: TradeQueryCommandSpec = TradeQueryCommandSpec {
272    operation: TradeQueryOperation::HistoryFills,
273    real_cmd: CMD_QUERY_HISTORY_ORDER_FILL_LIST,
274    sim_cmd: CMD_SIM_QUERY_HISTORY_ORDER_FILL_LIST,
275    real_body: TradeQueryBodyProto::RealHistoryOrderFillList,
276    sim_body: TradeQueryBodyProto::RealHistoryOrderFillList,
277    real_channel: TradeBackendChannel::Broker,
278    sim_channel: TradeBackendChannel::Platform,
279    cpp_ref: "NNProto_Trd_Deal.cpp:188-208 QueryHistoryDealList + NNProto_Trd_Base.cpp:68-70",
280};
281
282pub const TRADE_QUERY_COMMANDS: &[TradeQueryCommandSpec] = &[
283    TRADE_QUERY_FUNDS,
284    TRADE_QUERY_POSITIONS,
285    TRADE_QUERY_ORDERS,
286    TRADE_QUERY_ORDER_INFO,
287    TRADE_QUERY_FILLS,
288    TRADE_QUERY_FILL_INFO,
289    TRADE_QUERY_HISTORY_ORDERS,
290    TRADE_QUERY_HISTORY_FILLS,
291];
292
293pub fn trade_query_command(operation: TradeQueryOperation) -> &'static TradeQueryCommandSpec {
294    match operation {
295        TradeQueryOperation::Funds => &TRADE_QUERY_FUNDS,
296        TradeQueryOperation::Positions => &TRADE_QUERY_POSITIONS,
297        TradeQueryOperation::Orders => &TRADE_QUERY_ORDERS,
298        TradeQueryOperation::OrderInfo => &TRADE_QUERY_ORDER_INFO,
299        TradeQueryOperation::Fills => &TRADE_QUERY_FILLS,
300        TradeQueryOperation::FillInfo => &TRADE_QUERY_FILL_INFO,
301        TradeQueryOperation::HistoryOrders => &TRADE_QUERY_HISTORY_ORDERS,
302        TradeQueryOperation::HistoryFills => &TRADE_QUERY_HISTORY_FILLS,
303    }
304}
305
306#[derive(Debug, Clone, Copy, PartialEq, Eq)]
307pub enum TradeWriteOperation {
308    PlaceOrder,
309    ModifyOrder,
310    CancelOrder,
311    DisableOrder,
312    EnableOrder,
313    DeleteOrder,
314    ReconfirmOrder,
315    MaxTrdQtys,
316}
317
318#[derive(Debug, Clone, Copy, PartialEq, Eq)]
319pub enum TradeWriteBodyProto {
320    OrderNew,
321    SimOrderNew,
322    OrderReplace,
323    SimOrderReplace,
324    OrderCancel,
325    SimOrderCancel,
326    OrderDisable,
327    OrderEnable,
328    OrderDelete,
329    OrderConfirm,
330    SimOrderConfirm,
331    MaxBuySell,
332    SimMaxBuySell,
333}
334
335#[derive(Debug, Clone, Copy, PartialEq, Eq)]
336pub struct TradeWriteCommandSpec {
337    pub operation: TradeWriteOperation,
338    pub real_cmd: u16,
339    pub sim_cmd: Option<u16>,
340    pub real_body: TradeWriteBodyProto,
341    pub sim_body: Option<TradeWriteBodyProto>,
342    pub real_channel: TradeBackendChannel,
343    pub sim_channel: Option<TradeBackendChannel>,
344    pub cpp_ref: &'static str,
345}
346
347/// Trade write backend command registry.
348///
349/// 写路径比读路径更敏感,禁止 handler 内现场推导 sim cmd。
350pub const TRADE_WRITE_PLACE_ORDER: TradeWriteCommandSpec = TradeWriteCommandSpec {
351    operation: TradeWriteOperation::PlaceOrder,
352    real_cmd: CMD_PLACE_ORDER,
353    sim_cmd: Some(CMD_SIM_PLACE_ORDER),
354    real_body: TradeWriteBodyProto::OrderNew,
355    sim_body: Some(TradeWriteBodyProto::SimOrderNew),
356    real_channel: TradeBackendChannel::Broker,
357    sim_channel: Some(TradeBackendChannel::Platform),
358    cpp_ref: "NNProto_Trd_OrderOp.cpp:41-71 + NNProto_Trd_Base.cpp:68-70",
359};
360
361pub const TRADE_WRITE_MODIFY_ORDER: TradeWriteCommandSpec = TradeWriteCommandSpec {
362    operation: TradeWriteOperation::ModifyOrder,
363    real_cmd: CMD_MODIFY_ORDER,
364    sim_cmd: Some(CMD_SIM_MODIFY_ORDER),
365    real_body: TradeWriteBodyProto::OrderReplace,
366    sim_body: Some(TradeWriteBodyProto::SimOrderReplace),
367    real_channel: TradeBackendChannel::Broker,
368    sim_channel: Some(TradeBackendChannel::Platform),
369    cpp_ref: "NNProto_Trd_OrderOp.cpp:113-137 + NNProto_Trd_Base.cpp:68-70",
370};
371
372pub const TRADE_WRITE_CANCEL_ORDER: TradeWriteCommandSpec = TradeWriteCommandSpec {
373    operation: TradeWriteOperation::CancelOrder,
374    real_cmd: CMD_CANCEL_ORDER,
375    sim_cmd: Some(CMD_SIM_CANCEL_ORDER),
376    real_body: TradeWriteBodyProto::OrderCancel,
377    sim_body: Some(TradeWriteBodyProto::SimOrderCancel),
378    real_channel: TradeBackendChannel::Broker,
379    sim_channel: Some(TradeBackendChannel::Platform),
380    cpp_ref: "NNProto_Trd_OrderOp.cpp:141-167 + NNProto_Trd_Base.cpp:68-70",
381};
382
383pub const TRADE_WRITE_DISABLE_ORDER: TradeWriteCommandSpec = TradeWriteCommandSpec {
384    operation: TradeWriteOperation::DisableOrder,
385    real_cmd: CMD_DISABLE_ORDER,
386    sim_cmd: Some(CMD_SIM_DISABLE_ORDER),
387    real_body: TradeWriteBodyProto::OrderDisable,
388    sim_body: Some(TradeWriteBodyProto::OrderDisable),
389    real_channel: TradeBackendChannel::Broker,
390    sim_channel: Some(TradeBackendChannel::Platform),
391    cpp_ref: "NNProto_Trd_OrderOpReal.cpp:122-141 + NNBase_Define_ProtoCmd.h:40",
392};
393
394pub const TRADE_WRITE_ENABLE_ORDER: TradeWriteCommandSpec = TradeWriteCommandSpec {
395    operation: TradeWriteOperation::EnableOrder,
396    real_cmd: CMD_ENABLE_ORDER,
397    sim_cmd: Some(CMD_SIM_ENABLE_ORDER),
398    real_body: TradeWriteBodyProto::OrderEnable,
399    sim_body: Some(TradeWriteBodyProto::OrderEnable),
400    real_channel: TradeBackendChannel::Broker,
401    sim_channel: Some(TradeBackendChannel::Platform),
402    cpp_ref: "NNProto_Trd_OrderOpReal.cpp:144-163 + NNBase_Define_ProtoCmd.h:39",
403};
404
405pub const TRADE_WRITE_DELETE_ORDER: TradeWriteCommandSpec = TradeWriteCommandSpec {
406    operation: TradeWriteOperation::DeleteOrder,
407    real_cmd: CMD_DELETE_ORDER,
408    sim_cmd: Some(CMD_SIM_DELETE_ORDER),
409    real_body: TradeWriteBodyProto::OrderDelete,
410    sim_body: Some(TradeWriteBodyProto::OrderDelete),
411    real_channel: TradeBackendChannel::Broker,
412    sim_channel: Some(TradeBackendChannel::Platform),
413    cpp_ref: "NNProto_Trd_OrderOpReal.cpp:166-181 + NNBase_Define_ProtoCmd.h:41",
414};
415
416pub const TRADE_WRITE_RECONFIRM_ORDER: TradeWriteCommandSpec = TradeWriteCommandSpec {
417    operation: TradeWriteOperation::ReconfirmOrder,
418    real_cmd: CMD_ORDER_CONFIRM,
419    sim_cmd: Some(CMD_SIM_ORDER_CONFIRM),
420    real_body: TradeWriteBodyProto::OrderConfirm,
421    sim_body: Some(TradeWriteBodyProto::SimOrderConfirm),
422    real_channel: TradeBackendChannel::Broker,
423    sim_channel: Some(TradeBackendChannel::Platform),
424    cpp_ref: "TradeCmdDefine.h CS_CMDID_TRADE_ORDER_CONFIRM_ORDER = 4728 + NNProto_Trd_Base.cpp:68-70",
425};
426
427pub const TRADE_WRITE_MAX_TRD_QTYS: TradeWriteCommandSpec = TradeWriteCommandSpec {
428    operation: TradeWriteOperation::MaxTrdQtys,
429    real_cmd: CMD_MAX_BUY_SELL,
430    sim_cmd: Some(CMD_SIM_MAX_BUY_SELL),
431    real_body: TradeWriteBodyProto::MaxBuySell,
432    sim_body: Some(TradeWriteBodyProto::SimMaxBuySell),
433    real_channel: TradeBackendChannel::Broker,
434    sim_channel: Some(TradeBackendChannel::Platform),
435    cpp_ref: "NNProto_Trd_MaxQty.cpp:95-105 + NNProto_Trd_Base.cpp:68-70",
436};
437
438pub const TRADE_WRITE_COMMANDS: &[TradeWriteCommandSpec] = &[
439    TRADE_WRITE_PLACE_ORDER,
440    TRADE_WRITE_MODIFY_ORDER,
441    TRADE_WRITE_CANCEL_ORDER,
442    TRADE_WRITE_DISABLE_ORDER,
443    TRADE_WRITE_ENABLE_ORDER,
444    TRADE_WRITE_DELETE_ORDER,
445    TRADE_WRITE_RECONFIRM_ORDER,
446    TRADE_WRITE_MAX_TRD_QTYS,
447];
448
449pub fn trade_write_command(operation: TradeWriteOperation) -> &'static TradeWriteCommandSpec {
450    match operation {
451        TradeWriteOperation::PlaceOrder => &TRADE_WRITE_PLACE_ORDER,
452        TradeWriteOperation::ModifyOrder => &TRADE_WRITE_MODIFY_ORDER,
453        TradeWriteOperation::CancelOrder => &TRADE_WRITE_CANCEL_ORDER,
454        TradeWriteOperation::DisableOrder => &TRADE_WRITE_DISABLE_ORDER,
455        TradeWriteOperation::EnableOrder => &TRADE_WRITE_ENABLE_ORDER,
456        TradeWriteOperation::DeleteOrder => &TRADE_WRITE_DELETE_ORDER,
457        TradeWriteOperation::ReconfirmOrder => &TRADE_WRITE_RECONFIRM_ORDER,
458        TradeWriteOperation::MaxTrdQtys => &TRADE_WRITE_MAX_TRD_QTYS,
459    }
460}
461
462#[derive(Debug, Clone, Copy, PartialEq, Eq)]
463pub enum CryptoTradeOperation {
464    FetchTradeConfig,
465    AccountInfo,
466    Orders,
467    HistoryOrders,
468    OrderInfo,
469    OrderFillDetail,
470    Deals,
471    HistoryDeals,
472    BatchOrderFee,
473    MaxBuySellQty,
474    CashLog,
475    PlaceOrder,
476    CancelOrder,
477    NotifyAsset,
478    NotifyOrder,
479}
480
481#[derive(Debug, Clone, Copy, PartialEq, Eq)]
482pub enum CryptoTradeBodyProto {
483    InboundOeFetchTradeConfig,
484    AssetPlAccountInfo,
485    InboundReadOrderList,
486    InboundReadHistoryOrderList,
487    InboundReadOrderDetail,
488    InboundReadOrderFillDetail,
489    InboundOeFillList,
490    InboundOeHistoryFillList,
491    InboundOeBatchOrderFee,
492    CryptoRiskMaxBuySell,
493    CashChangeDetailCashLog,
494    InboundOeOrderNew,
495    InboundOeOrderCancel,
496    CryptoNotifyOrder,
497    CryptoNotifyAsset,
498}
499
500#[derive(Debug, Clone, Copy, PartialEq, Eq)]
501pub struct CryptoTradeCommandSpec {
502    pub operation: CryptoTradeOperation,
503    pub cmd: u16,
504    pub body: CryptoTradeBodyProto,
505    pub channel: TradeBackendChannel,
506    pub cpp_ref: &'static str,
507}
508
509/// Crypto trade backend command registry.
510///
511/// C++ 10.5.6508 新增 crypto 交易 CMD 后,这里成为 Rust 侧唯一
512/// command 出处。Crypto 不走 real/sim 470x/147xx 交易族;调用点不得现场写
513/// `206xx` / `212xx` 魔数。
514pub const CRYPTO_TRADE_FETCH_TRADE_CONFIG: CryptoTradeCommandSpec = CryptoTradeCommandSpec {
515    operation: CryptoTradeOperation::FetchTradeConfig,
516    cmd: CMD_CRYPTO_FETCH_TRADE_CONFIG,
517    body: CryptoTradeBodyProto::InboundOeFetchTradeConfig,
518    channel: TradeBackendChannel::Broker,
519    cpp_ref: "NNProto_Trd_CryptoTradeConfig.cpp:14-23",
520};
521
522pub const CRYPTO_TRADE_ACCOUNT_INFO: CryptoTradeCommandSpec = CryptoTradeCommandSpec {
523    operation: CryptoTradeOperation::AccountInfo,
524    cmd: CMD_CRYPTO_ACCOUNT_INFO,
525    body: CryptoTradeBodyProto::AssetPlAccountInfo,
526    channel: TradeBackendChannel::Broker,
527    cpp_ref: "NNProto_Trd_AccCrypto.cpp:197-215",
528};
529
530pub const CRYPTO_TRADE_ORDERS: CryptoTradeCommandSpec = CryptoTradeCommandSpec {
531    operation: CryptoTradeOperation::Orders,
532    cmd: CMD_CRYPTO_QUERY_ORDER_LIST,
533    body: CryptoTradeBodyProto::InboundReadOrderList,
534    channel: TradeBackendChannel::Broker,
535    cpp_ref: "NNProto_Trd_OrderCrypto.cpp:346-368",
536};
537
538pub const CRYPTO_TRADE_HISTORY_ORDERS: CryptoTradeCommandSpec = CryptoTradeCommandSpec {
539    operation: CryptoTradeOperation::HistoryOrders,
540    cmd: CMD_CRYPTO_QUERY_HISTORY_ORDER_LIST,
541    body: CryptoTradeBodyProto::InboundReadHistoryOrderList,
542    channel: TradeBackendChannel::Broker,
543    cpp_ref: "NNProto_Trd_OrderCrypto.cpp:373-398",
544};
545
546pub const CRYPTO_TRADE_ORDER_INFO: CryptoTradeCommandSpec = CryptoTradeCommandSpec {
547    operation: CryptoTradeOperation::OrderInfo,
548    cmd: CMD_CRYPTO_QUERY_ORDER_INFO,
549    body: CryptoTradeBodyProto::InboundReadOrderDetail,
550    channel: TradeBackendChannel::Broker,
551    cpp_ref: "NNProto_Trd_OrderCrypto.cpp:153-177",
552};
553
554pub const CRYPTO_TRADE_ORDER_FILL_DETAIL: CryptoTradeCommandSpec = CryptoTradeCommandSpec {
555    operation: CryptoTradeOperation::OrderFillDetail,
556    cmd: CMD_CRYPTO_QUERY_ORDER_FILL_DETAIL,
557    body: CryptoTradeBodyProto::InboundReadOrderFillDetail,
558    channel: TradeBackendChannel::Broker,
559    cpp_ref: "NNProto_Trd_DealCrypto.cpp:500-525",
560};
561
562pub const CRYPTO_TRADE_DEALS: CryptoTradeCommandSpec = CryptoTradeCommandSpec {
563    operation: CryptoTradeOperation::Deals,
564    cmd: CMD_CRYPTO_QUERY_DEAL_LIST,
565    body: CryptoTradeBodyProto::InboundOeFillList,
566    channel: TradeBackendChannel::Broker,
567    cpp_ref: "NNProto_Trd_DealCrypto.cpp:452-464",
568};
569
570pub const CRYPTO_TRADE_HISTORY_DEALS: CryptoTradeCommandSpec = CryptoTradeCommandSpec {
571    operation: CryptoTradeOperation::HistoryDeals,
572    cmd: CMD_CRYPTO_QUERY_HISTORY_DEAL_LIST,
573    body: CryptoTradeBodyProto::InboundOeHistoryFillList,
574    channel: TradeBackendChannel::Broker,
575    cpp_ref: "NNProto_Trd_DealCrypto.cpp:472-485",
576};
577
578pub const CRYPTO_TRADE_BATCH_ORDER_FEE: CryptoTradeCommandSpec = CryptoTradeCommandSpec {
579    operation: CryptoTradeOperation::BatchOrderFee,
580    cmd: CMD_CRYPTO_QUERY_BATCH_ORDER_FEE,
581    body: CryptoTradeBodyProto::InboundOeBatchOrderFee,
582    channel: TradeBackendChannel::Broker,
583    cpp_ref: "NNProto_Trd_OrderFeeCrypto.cpp:133-149",
584};
585
586pub const CRYPTO_TRADE_MAX_BUY_SELL_QTY: CryptoTradeCommandSpec = CryptoTradeCommandSpec {
587    operation: CryptoTradeOperation::MaxBuySellQty,
588    cmd: CMD_CRYPTO_MAX_BUY_SELL_QTY,
589    body: CryptoTradeBodyProto::CryptoRiskMaxBuySell,
590    channel: TradeBackendChannel::Broker,
591    cpp_ref: "NNProto_Trd_MaxQtyCrypto.cpp:14-38",
592};
593
594pub const CRYPTO_TRADE_CASH_LOG: CryptoTradeCommandSpec = CryptoTradeCommandSpec {
595    operation: CryptoTradeOperation::CashLog,
596    cmd: CMD_CRYPTO_QUERY_CASH_LOG,
597    body: CryptoTradeBodyProto::CashChangeDetailCashLog,
598    channel: TradeBackendChannel::Broker,
599    cpp_ref: "NNProto_Trd_FlowSummaryCrypto.cpp:191-212",
600};
601
602pub const CRYPTO_TRADE_PLACE_ORDER: CryptoTradeCommandSpec = CryptoTradeCommandSpec {
603    operation: CryptoTradeOperation::PlaceOrder,
604    cmd: CMD_CRYPTO_PLACE_ORDER,
605    body: CryptoTradeBodyProto::InboundOeOrderNew,
606    channel: TradeBackendChannel::Broker,
607    cpp_ref: "NNProto_Trd_OrderOpCrypto.cpp:21-53",
608};
609
610pub const CRYPTO_TRADE_CANCEL_ORDER: CryptoTradeCommandSpec = CryptoTradeCommandSpec {
611    operation: CryptoTradeOperation::CancelOrder,
612    cmd: CMD_CRYPTO_CANCEL_ORDER,
613    body: CryptoTradeBodyProto::InboundOeOrderCancel,
614    channel: TradeBackendChannel::Broker,
615    cpp_ref: "NNProto_Trd_OrderOpCrypto.cpp:65-112",
616};
617
618pub const CRYPTO_TRADE_NOTIFY_ASSET: CryptoTradeCommandSpec = CryptoTradeCommandSpec {
619    operation: CryptoTradeOperation::NotifyAsset,
620    cmd: CMD_CRYPTO_NOTIFY_ASSET,
621    body: CryptoTradeBodyProto::CryptoNotifyAsset,
622    channel: TradeBackendChannel::Broker,
623    cpp_ref: "NNProto_Trd_OnPush.cpp:284-307",
624};
625
626pub const CRYPTO_TRADE_NOTIFY_ORDER: CryptoTradeCommandSpec = CryptoTradeCommandSpec {
627    operation: CryptoTradeOperation::NotifyOrder,
628    cmd: CMD_CRYPTO_NOTIFY_ORDER,
629    body: CryptoTradeBodyProto::CryptoNotifyOrder,
630    channel: TradeBackendChannel::Broker,
631    cpp_ref: "NNProto_Trd_OnPush.cpp:246-272",
632};
633
634pub const CRYPTO_TRADE_COMMANDS: &[CryptoTradeCommandSpec] = &[
635    CRYPTO_TRADE_FETCH_TRADE_CONFIG,
636    CRYPTO_TRADE_ACCOUNT_INFO,
637    CRYPTO_TRADE_ORDERS,
638    CRYPTO_TRADE_HISTORY_ORDERS,
639    CRYPTO_TRADE_ORDER_INFO,
640    CRYPTO_TRADE_ORDER_FILL_DETAIL,
641    CRYPTO_TRADE_DEALS,
642    CRYPTO_TRADE_HISTORY_DEALS,
643    CRYPTO_TRADE_BATCH_ORDER_FEE,
644    CRYPTO_TRADE_MAX_BUY_SELL_QTY,
645    CRYPTO_TRADE_CASH_LOG,
646    CRYPTO_TRADE_PLACE_ORDER,
647    CRYPTO_TRADE_CANCEL_ORDER,
648    CRYPTO_TRADE_NOTIFY_ASSET,
649    CRYPTO_TRADE_NOTIFY_ORDER,
650];
651
652pub fn crypto_trade_command(operation: CryptoTradeOperation) -> &'static CryptoTradeCommandSpec {
653    match operation {
654        CryptoTradeOperation::FetchTradeConfig => &CRYPTO_TRADE_FETCH_TRADE_CONFIG,
655        CryptoTradeOperation::AccountInfo => &CRYPTO_TRADE_ACCOUNT_INFO,
656        CryptoTradeOperation::Orders => &CRYPTO_TRADE_ORDERS,
657        CryptoTradeOperation::HistoryOrders => &CRYPTO_TRADE_HISTORY_ORDERS,
658        CryptoTradeOperation::OrderInfo => &CRYPTO_TRADE_ORDER_INFO,
659        CryptoTradeOperation::OrderFillDetail => &CRYPTO_TRADE_ORDER_FILL_DETAIL,
660        CryptoTradeOperation::Deals => &CRYPTO_TRADE_DEALS,
661        CryptoTradeOperation::HistoryDeals => &CRYPTO_TRADE_HISTORY_DEALS,
662        CryptoTradeOperation::BatchOrderFee => &CRYPTO_TRADE_BATCH_ORDER_FEE,
663        CryptoTradeOperation::MaxBuySellQty => &CRYPTO_TRADE_MAX_BUY_SELL_QTY,
664        CryptoTradeOperation::CashLog => &CRYPTO_TRADE_CASH_LOG,
665        CryptoTradeOperation::PlaceOrder => &CRYPTO_TRADE_PLACE_ORDER,
666        CryptoTradeOperation::CancelOrder => &CRYPTO_TRADE_CANCEL_ORDER,
667        CryptoTradeOperation::NotifyAsset => &CRYPTO_TRADE_NOTIFY_ASSET,
668        CryptoTradeOperation::NotifyOrder => &CRYPTO_TRADE_NOTIFY_ORDER,
669    }
670}
671
672#[cfg(test)]
673mod tests;