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
28pub const CMD_QUERY_ORDER_FILL_LIST: u16 = 4710;
29/// 指定成交 ID 查询命令 ID。C++ `QueryDealInfo` 在成交通知
30/// `NOTICE_TYPE_ORDER_FILL_UPDATE` 中使用,不等同于成交列表 4710。
31pub const CMD_QUERY_ORDER_FILL_INFO: u16 = 4715;
32/// 历史订单查询命令 ID
33pub const CMD_QUERY_HISTORY_ORDER_LIST: u16 = 4711;
34/// 历史成交查询命令 ID
35pub const CMD_QUERY_HISTORY_ORDER_FILL_LIST: u16 = 4712;
36/// 最大可买卖查询命令 ID
37pub const CMD_MAX_BUY_SELL: u16 = 4713;
38/// 真实下单命令 ID。模拟下单必须走 registry 中的 14701。
39pub const CMD_PLACE_ORDER: u16 = 4701;
40/// 真实改单命令 ID。模拟改单必须走 registry 中的 14702。
41pub const CMD_MODIFY_ORDER: u16 = 4702;
42/// 真实撤单命令 ID。模拟撤单必须走 registry 中的 14703。
43pub const CMD_CANCEL_ORDER: u16 = 4703;
44/// 真实二次确认命令 ID。模拟二次确认必须走 registry 中的 14728。
45pub const CMD_ORDER_CONFIRM: u16 = 4728;
46
47/// v1.4.53 BUG-6: Sim 账户资金查询 CMD。显式登记,禁止调用点用 offset 推导。
48pub const CMD_SIM_QUERY_FUND: u16 = 14704;
49/// v1.4.53 BUG-6: Sim 账户持仓查询 CMD。注意 4705 是 base QueryPositionList,
50/// 14705 才是 sim 专用 wire cmd。
51pub const CMD_SIM_QUERY_POSITION: u16 = 14705;
52/// v1.4.106: Sim 账户订单查询 CMD。显式登记,禁止调用点用 offset 推导。
53pub const CMD_SIM_QUERY_ORDER_LIST: u16 = 14708;
54/// Sim 账户成交列表查询 CMD。显式登记,禁止调用点用 offset 推导。
55pub const CMD_SIM_QUERY_ORDER_FILL_LIST: u16 = 14710;
56/// Sim 账户指定成交 ID 查询 CMD。显式登记,禁止调用点用 offset 推导。
57pub const CMD_SIM_QUERY_ORDER_FILL_INFO: u16 = 14715;
58/// Sim 账户历史订单查询 CMD。显式登记,禁止调用点用 offset 推导。
59pub const CMD_SIM_QUERY_HISTORY_ORDER_LIST: u16 = 14711;
60/// Sim 账户历史成交查询 CMD。显式登记,禁止调用点用 offset 推导。
61pub const CMD_SIM_QUERY_HISTORY_ORDER_FILL_LIST: u16 = 14712;
62/// 模拟后端下单命令 ID。显式登记,禁止调用点用 offset 推导。
63pub const CMD_SIM_PLACE_ORDER: u16 = 14701;
64/// 模拟后端改单命令 ID。显式登记,禁止调用点用 offset 推导。
65pub const CMD_SIM_MODIFY_ORDER: u16 = 14702;
66/// 模拟后端撤单命令 ID。显式登记,禁止调用点用 offset 推导。
67pub const CMD_SIM_CANCEL_ORDER: u16 = 14703;
68/// 模拟后端订单二次确认命令 ID。显式登记,禁止调用点用 offset 推导。
69pub const CMD_SIM_ORDER_CONFIRM: u16 = 14728;
70/// 模拟后端最大可买卖查询 CMD。显式登记,禁止调用点用 offset 推导。
71pub const CMD_SIM_MAX_BUY_SELL: u16 = 14713;
72
73/// Crypto 交易配置查询。Ref:
74/// `NNBase_Define_ProtoCmd.h:66-81` / `NNProto_Trd_CryptoTradeConfig.cpp:14-23`.
75pub const CMD_CRYPTO_FETCH_TRADE_CONFIG: u16 = 20102;
76/// Crypto 账户资产查询 (资金 + 持仓)。Ref:
77/// `NNBase_Define_ProtoCmd.h:66-81` / `NNProto_Trd_AccCrypto.cpp:197-215`.
78pub const CMD_CRYPTO_ACCOUNT_INFO: u16 = 20631;
79/// Crypto 订单列表。Ref:
80/// `NNBase_Define_ProtoCmd.h:66-81` / `NNProto_Trd_OrderCrypto.cpp:346-368`.
81pub const CMD_CRYPTO_QUERY_ORDER_LIST: u16 = 20621;
82/// Crypto 历史订单列表。Ref:
83/// `NNBase_Define_ProtoCmd.h:66-81` / `NNProto_Trd_OrderCrypto.cpp:373-398`.
84pub const CMD_CRYPTO_QUERY_HISTORY_ORDER_LIST: u16 = 20623;
85/// Crypto 订单详情。Ref:
86/// `NNBase_Define_ProtoCmd.h:66-81` / `NNProto_Trd_OrderCrypto.cpp:153-177`.
87pub const CMD_CRYPTO_QUERY_ORDER_INFO: u16 = 20625;
88/// Crypto 订单维度成交明细。Ref:
89/// `NNBase_Define_ProtoCmd.h:66-81` / `NNProto_Trd_DealCrypto.cpp:500-525`.
90pub const CMD_CRYPTO_QUERY_ORDER_FILL_DETAIL: u16 = 20624;
91/// Crypto 成交列表。Ref:
92/// `NNBase_Define_ProtoCmd.h:66-81` / `NNProto_Trd_DealCrypto.cpp:452-464`.
93pub const CMD_CRYPTO_QUERY_DEAL_LIST: u16 = 21237;
94/// Crypto 历史成交列表。Ref:
95/// `NNBase_Define_ProtoCmd.h:66-81` / `NNProto_Trd_DealCrypto.cpp:472-485`.
96pub const CMD_CRYPTO_QUERY_HISTORY_DEAL_LIST: u16 = 21234;
97/// Crypto 批量订单费用。Ref:
98/// `NNBase_Define_ProtoCmd.h:66-81` / `NNProto_Trd_OrderFeeCrypto.cpp:133-149`.
99pub const CMD_CRYPTO_QUERY_BATCH_ORDER_FEE: u16 = 21235;
100/// Crypto 最大可买卖。Ref:
101/// `NNBase_Define_ProtoCmd.h:66-81` / `NNProto_Trd_MaxQtyCrypto.cpp:14-38`.
102pub const CMD_CRYPTO_MAX_BUY_SELL_QTY: u16 = 20622;
103/// Crypto 资金流水。Ref:
104/// `NNBase_Define_ProtoCmd.h:66-81` / `NNProto_Trd_FlowSummaryCrypto.cpp:191-212`.
105pub const CMD_CRYPTO_QUERY_CASH_LOG: u16 = 20632;
106/// Crypto 下单。Ref:
107/// `NNBase_Define_ProtoCmd.h:66-81` / `NNProto_Trd_OrderOpCrypto.cpp:21-53`.
108pub const CMD_CRYPTO_PLACE_ORDER: u16 = 20626;
109/// Crypto 撤单。Ref:
110/// `NNBase_Define_ProtoCmd.h:66-81` / `NNProto_Trd_OrderOpCrypto.cpp:65-112`.
111pub const CMD_CRYPTO_CANCEL_ORDER: u16 = 20628;
112/// Crypto 资产 push。Ref:
113/// `NNBase_Define_ProtoCmd.h:66-81` / `NNProto_Trd_OnPush.cpp:284-307`.
114pub const CMD_CRYPTO_NOTIFY_ASSET: u16 = 20635;
115/// Crypto 订单 push。Ref:
116/// `NNBase_Define_ProtoCmd.h:66-81` / `NNProto_Trd_OnPush.cpp:246-272`.
117pub const CMD_CRYPTO_NOTIFY_ORDER: u16 = 20648;
118
119#[derive(Debug, Clone, Copy, PartialEq, Eq)]
120pub enum TradeBackendChannel {
121    Broker,
122    Platform,
123}
124
125#[derive(Debug, Clone, Copy, PartialEq, Eq)]
126pub enum TradeQueryOperation {
127    Funds,
128    Positions,
129    Orders,
130    Fills,
131    FillInfo,
132    HistoryOrders,
133    HistoryFills,
134}
135
136#[derive(Debug, Clone, Copy, PartialEq, Eq)]
137pub enum TradeQueryBodyProto {
138    RealAccountInfo,
139    SimCashInfo,
140    SimPositionInfo,
141    RealOrderList,
142    SimOrderList,
143    RealOrderFillList,
144    RealOrderFillInfo,
145    RealHistoryOrderList,
146    SimHistoryOrderList,
147    RealHistoryOrderFillList,
148}
149
150#[derive(Debug, Clone, Copy, PartialEq, Eq)]
151pub struct TradeQueryCommandSpec {
152    pub operation: TradeQueryOperation,
153    pub real_cmd: u16,
154    pub sim_cmd: u16,
155    pub real_body: TradeQueryBodyProto,
156    pub sim_body: TradeQueryBodyProto,
157    pub real_channel: TradeBackendChannel,
158    pub sim_channel: TradeBackendChannel,
159    pub cpp_ref: &'static str,
160}
161
162/// Trade read backend command registry.
163///
164/// 这是资金 / 持仓 / 订单读路径的唯一权威来源。
165pub const TRADE_QUERY_FUNDS: TradeQueryCommandSpec = TradeQueryCommandSpec {
166    operation: TradeQueryOperation::Funds,
167    real_cmd: CMD_ACCOUNT_INFO,
168    sim_cmd: CMD_SIM_QUERY_FUND,
169    real_body: TradeQueryBodyProto::RealAccountInfo,
170    sim_body: TradeQueryBodyProto::SimCashInfo,
171    real_channel: TradeBackendChannel::Broker,
172    sim_channel: TradeBackendChannel::Platform,
173    cpp_ref: "NNProto_Trd_Acc.cpp:882-922 QueryFundNoLimit",
174};
175
176pub const TRADE_QUERY_POSITIONS: TradeQueryCommandSpec = TradeQueryCommandSpec {
177    operation: TradeQueryOperation::Positions,
178    real_cmd: CMD_ACCOUNT_INFO,
179    sim_cmd: CMD_SIM_QUERY_POSITION,
180    real_body: TradeQueryBodyProto::RealAccountInfo,
181    sim_body: TradeQueryBodyProto::SimPositionInfo,
182    real_channel: TradeBackendChannel::Broker,
183    sim_channel: TradeBackendChannel::Platform,
184    cpp_ref: "NNProto_Trd_Acc.cpp:780-811 QueryPositionListNoLimit",
185};
186
187pub const TRADE_QUERY_ORDERS: TradeQueryCommandSpec = TradeQueryCommandSpec {
188    operation: TradeQueryOperation::Orders,
189    real_cmd: CMD_QUERY_ORDER_LIST,
190    sim_cmd: CMD_SIM_QUERY_ORDER_LIST,
191    real_body: TradeQueryBodyProto::RealOrderList,
192    sim_body: TradeQueryBodyProto::SimOrderList,
193    real_channel: TradeBackendChannel::Broker,
194    sim_channel: TradeBackendChannel::Platform,
195    cpp_ref: "NNProto_Trd_Order.cpp:202-218 QueryOrderList_Inner + NNProto_Trd_Base.cpp:68-70",
196};
197
198pub const TRADE_QUERY_FILLS: TradeQueryCommandSpec = TradeQueryCommandSpec {
199    operation: TradeQueryOperation::Fills,
200    real_cmd: CMD_QUERY_ORDER_FILL_LIST,
201    sim_cmd: CMD_SIM_QUERY_ORDER_FILL_LIST,
202    real_body: TradeQueryBodyProto::RealOrderFillList,
203    sim_body: TradeQueryBodyProto::RealOrderFillList,
204    real_channel: TradeBackendChannel::Broker,
205    sim_channel: TradeBackendChannel::Platform,
206    cpp_ref: "NNProto_Trd_Deal.cpp:135-159 QueryDealList_Inner + NNProto_Trd_Base.cpp:68-70",
207};
208
209pub const TRADE_QUERY_FILL_INFO: TradeQueryCommandSpec = TradeQueryCommandSpec {
210    operation: TradeQueryOperation::FillInfo,
211    real_cmd: CMD_QUERY_ORDER_FILL_INFO,
212    sim_cmd: CMD_SIM_QUERY_ORDER_FILL_INFO,
213    real_body: TradeQueryBodyProto::RealOrderFillInfo,
214    sim_body: TradeQueryBodyProto::RealOrderFillInfo,
215    real_channel: TradeBackendChannel::Broker,
216    sim_channel: TradeBackendChannel::Platform,
217    cpp_ref: "NNProto_Trd_OnPush.cpp:151-161 + NNProto_Trd_Deal.cpp:216-248 + NNProto_Trd_Base.cpp:68-70",
218};
219
220pub const TRADE_QUERY_HISTORY_ORDERS: TradeQueryCommandSpec = TradeQueryCommandSpec {
221    operation: TradeQueryOperation::HistoryOrders,
222    real_cmd: CMD_QUERY_HISTORY_ORDER_LIST,
223    sim_cmd: CMD_SIM_QUERY_HISTORY_ORDER_LIST,
224    real_body: TradeQueryBodyProto::RealHistoryOrderList,
225    sim_body: TradeQueryBodyProto::SimHistoryOrderList,
226    real_channel: TradeBackendChannel::Broker,
227    sim_channel: TradeBackendChannel::Platform,
228    cpp_ref: "NNProto_Trd_Order.cpp:248-263 QueryHistoryOrderList + NNProto_Trd_Base.cpp:68-70",
229};
230
231pub const TRADE_QUERY_HISTORY_FILLS: TradeQueryCommandSpec = TradeQueryCommandSpec {
232    operation: TradeQueryOperation::HistoryFills,
233    real_cmd: CMD_QUERY_HISTORY_ORDER_FILL_LIST,
234    sim_cmd: CMD_SIM_QUERY_HISTORY_ORDER_FILL_LIST,
235    real_body: TradeQueryBodyProto::RealHistoryOrderFillList,
236    sim_body: TradeQueryBodyProto::RealHistoryOrderFillList,
237    real_channel: TradeBackendChannel::Broker,
238    sim_channel: TradeBackendChannel::Platform,
239    cpp_ref: "NNProto_Trd_Deal.cpp:188-208 QueryHistoryDealList + NNProto_Trd_Base.cpp:68-70",
240};
241
242pub const TRADE_QUERY_COMMANDS: &[TradeQueryCommandSpec] = &[
243    TRADE_QUERY_FUNDS,
244    TRADE_QUERY_POSITIONS,
245    TRADE_QUERY_ORDERS,
246    TRADE_QUERY_FILLS,
247    TRADE_QUERY_FILL_INFO,
248    TRADE_QUERY_HISTORY_ORDERS,
249    TRADE_QUERY_HISTORY_FILLS,
250];
251
252pub fn trade_query_command(operation: TradeQueryOperation) -> &'static TradeQueryCommandSpec {
253    match operation {
254        TradeQueryOperation::Funds => &TRADE_QUERY_FUNDS,
255        TradeQueryOperation::Positions => &TRADE_QUERY_POSITIONS,
256        TradeQueryOperation::Orders => &TRADE_QUERY_ORDERS,
257        TradeQueryOperation::Fills => &TRADE_QUERY_FILLS,
258        TradeQueryOperation::FillInfo => &TRADE_QUERY_FILL_INFO,
259        TradeQueryOperation::HistoryOrders => &TRADE_QUERY_HISTORY_ORDERS,
260        TradeQueryOperation::HistoryFills => &TRADE_QUERY_HISTORY_FILLS,
261    }
262}
263
264#[derive(Debug, Clone, Copy, PartialEq, Eq)]
265pub enum TradeWriteOperation {
266    PlaceOrder,
267    ModifyOrder,
268    CancelOrder,
269    ReconfirmOrder,
270    MaxTrdQtys,
271}
272
273#[derive(Debug, Clone, Copy, PartialEq, Eq)]
274pub enum TradeWriteBodyProto {
275    OrderNew,
276    SimOrderNew,
277    OrderReplace,
278    SimOrderReplace,
279    OrderCancel,
280    SimOrderCancel,
281    OrderConfirm,
282    SimOrderConfirm,
283    MaxBuySell,
284    SimMaxBuySell,
285}
286
287#[derive(Debug, Clone, Copy, PartialEq, Eq)]
288pub struct TradeWriteCommandSpec {
289    pub operation: TradeWriteOperation,
290    pub real_cmd: u16,
291    pub sim_cmd: Option<u16>,
292    pub real_body: TradeWriteBodyProto,
293    pub sim_body: Option<TradeWriteBodyProto>,
294    pub real_channel: TradeBackendChannel,
295    pub sim_channel: Option<TradeBackendChannel>,
296    pub cpp_ref: &'static str,
297}
298
299/// Trade write backend command registry.
300///
301/// 写路径比读路径更敏感,禁止 handler 内现场推导 sim cmd。
302pub const TRADE_WRITE_PLACE_ORDER: TradeWriteCommandSpec = TradeWriteCommandSpec {
303    operation: TradeWriteOperation::PlaceOrder,
304    real_cmd: CMD_PLACE_ORDER,
305    sim_cmd: Some(CMD_SIM_PLACE_ORDER),
306    real_body: TradeWriteBodyProto::OrderNew,
307    sim_body: Some(TradeWriteBodyProto::SimOrderNew),
308    real_channel: TradeBackendChannel::Broker,
309    sim_channel: Some(TradeBackendChannel::Platform),
310    cpp_ref: "NNProto_Trd_OrderOp.cpp:41-71 + NNProto_Trd_Base.cpp:68-70",
311};
312
313pub const TRADE_WRITE_MODIFY_ORDER: TradeWriteCommandSpec = TradeWriteCommandSpec {
314    operation: TradeWriteOperation::ModifyOrder,
315    real_cmd: CMD_MODIFY_ORDER,
316    sim_cmd: Some(CMD_SIM_MODIFY_ORDER),
317    real_body: TradeWriteBodyProto::OrderReplace,
318    sim_body: Some(TradeWriteBodyProto::SimOrderReplace),
319    real_channel: TradeBackendChannel::Broker,
320    sim_channel: Some(TradeBackendChannel::Platform),
321    cpp_ref: "NNProto_Trd_OrderOp.cpp:113-137 + NNProto_Trd_Base.cpp:68-70",
322};
323
324pub const TRADE_WRITE_CANCEL_ORDER: TradeWriteCommandSpec = TradeWriteCommandSpec {
325    operation: TradeWriteOperation::CancelOrder,
326    real_cmd: CMD_CANCEL_ORDER,
327    sim_cmd: Some(CMD_SIM_CANCEL_ORDER),
328    real_body: TradeWriteBodyProto::OrderCancel,
329    sim_body: Some(TradeWriteBodyProto::SimOrderCancel),
330    real_channel: TradeBackendChannel::Broker,
331    sim_channel: Some(TradeBackendChannel::Platform),
332    cpp_ref: "NNProto_Trd_OrderOp.cpp:141-167 + NNProto_Trd_Base.cpp:68-70",
333};
334
335pub const TRADE_WRITE_RECONFIRM_ORDER: TradeWriteCommandSpec = TradeWriteCommandSpec {
336    operation: TradeWriteOperation::ReconfirmOrder,
337    real_cmd: CMD_ORDER_CONFIRM,
338    sim_cmd: Some(CMD_SIM_ORDER_CONFIRM),
339    real_body: TradeWriteBodyProto::OrderConfirm,
340    sim_body: Some(TradeWriteBodyProto::SimOrderConfirm),
341    real_channel: TradeBackendChannel::Broker,
342    sim_channel: Some(TradeBackendChannel::Platform),
343    cpp_ref: "TradeCmdDefine.h CS_CMDID_TRADE_ORDER_CONFIRM_ORDER = 4728 + NNProto_Trd_Base.cpp:68-70",
344};
345
346pub const TRADE_WRITE_MAX_TRD_QTYS: TradeWriteCommandSpec = TradeWriteCommandSpec {
347    operation: TradeWriteOperation::MaxTrdQtys,
348    real_cmd: CMD_MAX_BUY_SELL,
349    sim_cmd: Some(CMD_SIM_MAX_BUY_SELL),
350    real_body: TradeWriteBodyProto::MaxBuySell,
351    sim_body: Some(TradeWriteBodyProto::SimMaxBuySell),
352    real_channel: TradeBackendChannel::Broker,
353    sim_channel: Some(TradeBackendChannel::Platform),
354    cpp_ref: "NNProto_Trd_MaxQty.cpp:95-105 + NNProto_Trd_Base.cpp:68-70",
355};
356
357pub const TRADE_WRITE_COMMANDS: &[TradeWriteCommandSpec] = &[
358    TRADE_WRITE_PLACE_ORDER,
359    TRADE_WRITE_MODIFY_ORDER,
360    TRADE_WRITE_CANCEL_ORDER,
361    TRADE_WRITE_RECONFIRM_ORDER,
362    TRADE_WRITE_MAX_TRD_QTYS,
363];
364
365pub fn trade_write_command(operation: TradeWriteOperation) -> &'static TradeWriteCommandSpec {
366    match operation {
367        TradeWriteOperation::PlaceOrder => &TRADE_WRITE_PLACE_ORDER,
368        TradeWriteOperation::ModifyOrder => &TRADE_WRITE_MODIFY_ORDER,
369        TradeWriteOperation::CancelOrder => &TRADE_WRITE_CANCEL_ORDER,
370        TradeWriteOperation::ReconfirmOrder => &TRADE_WRITE_RECONFIRM_ORDER,
371        TradeWriteOperation::MaxTrdQtys => &TRADE_WRITE_MAX_TRD_QTYS,
372    }
373}
374
375#[derive(Debug, Clone, Copy, PartialEq, Eq)]
376pub enum CryptoTradeOperation {
377    FetchTradeConfig,
378    AccountInfo,
379    Orders,
380    HistoryOrders,
381    OrderInfo,
382    OrderFillDetail,
383    Deals,
384    HistoryDeals,
385    BatchOrderFee,
386    MaxBuySellQty,
387    CashLog,
388    PlaceOrder,
389    CancelOrder,
390    NotifyAsset,
391    NotifyOrder,
392}
393
394#[derive(Debug, Clone, Copy, PartialEq, Eq)]
395pub enum CryptoTradeBodyProto {
396    InboundOeFetchTradeConfig,
397    AssetPlAccountInfo,
398    InboundReadOrderList,
399    InboundReadHistoryOrderList,
400    InboundReadOrderDetail,
401    InboundReadOrderFillDetail,
402    InboundOeFillList,
403    InboundOeHistoryFillList,
404    InboundOeBatchOrderFee,
405    CryptoRiskMaxBuySell,
406    CashChangeDetailCashLog,
407    InboundOeOrderNew,
408    InboundOeOrderCancel,
409    CryptoNotifyOrder,
410    CryptoNotifyAsset,
411}
412
413#[derive(Debug, Clone, Copy, PartialEq, Eq)]
414pub struct CryptoTradeCommandSpec {
415    pub operation: CryptoTradeOperation,
416    pub cmd: u16,
417    pub body: CryptoTradeBodyProto,
418    pub channel: TradeBackendChannel,
419    pub cpp_ref: &'static str,
420}
421
422/// Crypto trade backend command registry.
423///
424/// C++ 10.5.6508 新增 crypto 交易 CMD 后,这里成为 Rust 侧唯一
425/// command 出处。Crypto 不走 real/sim 470x/147xx 交易族;调用点不得现场写
426/// `206xx` / `212xx` 魔数。
427pub const CRYPTO_TRADE_FETCH_TRADE_CONFIG: CryptoTradeCommandSpec = CryptoTradeCommandSpec {
428    operation: CryptoTradeOperation::FetchTradeConfig,
429    cmd: CMD_CRYPTO_FETCH_TRADE_CONFIG,
430    body: CryptoTradeBodyProto::InboundOeFetchTradeConfig,
431    channel: TradeBackendChannel::Broker,
432    cpp_ref: "NNProto_Trd_CryptoTradeConfig.cpp:14-23",
433};
434
435pub const CRYPTO_TRADE_ACCOUNT_INFO: CryptoTradeCommandSpec = CryptoTradeCommandSpec {
436    operation: CryptoTradeOperation::AccountInfo,
437    cmd: CMD_CRYPTO_ACCOUNT_INFO,
438    body: CryptoTradeBodyProto::AssetPlAccountInfo,
439    channel: TradeBackendChannel::Broker,
440    cpp_ref: "NNProto_Trd_AccCrypto.cpp:197-215",
441};
442
443pub const CRYPTO_TRADE_ORDERS: CryptoTradeCommandSpec = CryptoTradeCommandSpec {
444    operation: CryptoTradeOperation::Orders,
445    cmd: CMD_CRYPTO_QUERY_ORDER_LIST,
446    body: CryptoTradeBodyProto::InboundReadOrderList,
447    channel: TradeBackendChannel::Broker,
448    cpp_ref: "NNProto_Trd_OrderCrypto.cpp:346-368",
449};
450
451pub const CRYPTO_TRADE_HISTORY_ORDERS: CryptoTradeCommandSpec = CryptoTradeCommandSpec {
452    operation: CryptoTradeOperation::HistoryOrders,
453    cmd: CMD_CRYPTO_QUERY_HISTORY_ORDER_LIST,
454    body: CryptoTradeBodyProto::InboundReadHistoryOrderList,
455    channel: TradeBackendChannel::Broker,
456    cpp_ref: "NNProto_Trd_OrderCrypto.cpp:373-398",
457};
458
459pub const CRYPTO_TRADE_ORDER_INFO: CryptoTradeCommandSpec = CryptoTradeCommandSpec {
460    operation: CryptoTradeOperation::OrderInfo,
461    cmd: CMD_CRYPTO_QUERY_ORDER_INFO,
462    body: CryptoTradeBodyProto::InboundReadOrderDetail,
463    channel: TradeBackendChannel::Broker,
464    cpp_ref: "NNProto_Trd_OrderCrypto.cpp:153-177",
465};
466
467pub const CRYPTO_TRADE_ORDER_FILL_DETAIL: CryptoTradeCommandSpec = CryptoTradeCommandSpec {
468    operation: CryptoTradeOperation::OrderFillDetail,
469    cmd: CMD_CRYPTO_QUERY_ORDER_FILL_DETAIL,
470    body: CryptoTradeBodyProto::InboundReadOrderFillDetail,
471    channel: TradeBackendChannel::Broker,
472    cpp_ref: "NNProto_Trd_DealCrypto.cpp:500-525",
473};
474
475pub const CRYPTO_TRADE_DEALS: CryptoTradeCommandSpec = CryptoTradeCommandSpec {
476    operation: CryptoTradeOperation::Deals,
477    cmd: CMD_CRYPTO_QUERY_DEAL_LIST,
478    body: CryptoTradeBodyProto::InboundOeFillList,
479    channel: TradeBackendChannel::Broker,
480    cpp_ref: "NNProto_Trd_DealCrypto.cpp:452-464",
481};
482
483pub const CRYPTO_TRADE_HISTORY_DEALS: CryptoTradeCommandSpec = CryptoTradeCommandSpec {
484    operation: CryptoTradeOperation::HistoryDeals,
485    cmd: CMD_CRYPTO_QUERY_HISTORY_DEAL_LIST,
486    body: CryptoTradeBodyProto::InboundOeHistoryFillList,
487    channel: TradeBackendChannel::Broker,
488    cpp_ref: "NNProto_Trd_DealCrypto.cpp:472-485",
489};
490
491pub const CRYPTO_TRADE_BATCH_ORDER_FEE: CryptoTradeCommandSpec = CryptoTradeCommandSpec {
492    operation: CryptoTradeOperation::BatchOrderFee,
493    cmd: CMD_CRYPTO_QUERY_BATCH_ORDER_FEE,
494    body: CryptoTradeBodyProto::InboundOeBatchOrderFee,
495    channel: TradeBackendChannel::Broker,
496    cpp_ref: "NNProto_Trd_OrderFeeCrypto.cpp:133-149",
497};
498
499pub const CRYPTO_TRADE_MAX_BUY_SELL_QTY: CryptoTradeCommandSpec = CryptoTradeCommandSpec {
500    operation: CryptoTradeOperation::MaxBuySellQty,
501    cmd: CMD_CRYPTO_MAX_BUY_SELL_QTY,
502    body: CryptoTradeBodyProto::CryptoRiskMaxBuySell,
503    channel: TradeBackendChannel::Broker,
504    cpp_ref: "NNProto_Trd_MaxQtyCrypto.cpp:14-38",
505};
506
507pub const CRYPTO_TRADE_CASH_LOG: CryptoTradeCommandSpec = CryptoTradeCommandSpec {
508    operation: CryptoTradeOperation::CashLog,
509    cmd: CMD_CRYPTO_QUERY_CASH_LOG,
510    body: CryptoTradeBodyProto::CashChangeDetailCashLog,
511    channel: TradeBackendChannel::Broker,
512    cpp_ref: "NNProto_Trd_FlowSummaryCrypto.cpp:191-212",
513};
514
515pub const CRYPTO_TRADE_PLACE_ORDER: CryptoTradeCommandSpec = CryptoTradeCommandSpec {
516    operation: CryptoTradeOperation::PlaceOrder,
517    cmd: CMD_CRYPTO_PLACE_ORDER,
518    body: CryptoTradeBodyProto::InboundOeOrderNew,
519    channel: TradeBackendChannel::Broker,
520    cpp_ref: "NNProto_Trd_OrderOpCrypto.cpp:21-53",
521};
522
523pub const CRYPTO_TRADE_CANCEL_ORDER: CryptoTradeCommandSpec = CryptoTradeCommandSpec {
524    operation: CryptoTradeOperation::CancelOrder,
525    cmd: CMD_CRYPTO_CANCEL_ORDER,
526    body: CryptoTradeBodyProto::InboundOeOrderCancel,
527    channel: TradeBackendChannel::Broker,
528    cpp_ref: "NNProto_Trd_OrderOpCrypto.cpp:65-112",
529};
530
531pub const CRYPTO_TRADE_NOTIFY_ASSET: CryptoTradeCommandSpec = CryptoTradeCommandSpec {
532    operation: CryptoTradeOperation::NotifyAsset,
533    cmd: CMD_CRYPTO_NOTIFY_ASSET,
534    body: CryptoTradeBodyProto::CryptoNotifyAsset,
535    channel: TradeBackendChannel::Broker,
536    cpp_ref: "NNProto_Trd_OnPush.cpp:284-307",
537};
538
539pub const CRYPTO_TRADE_NOTIFY_ORDER: CryptoTradeCommandSpec = CryptoTradeCommandSpec {
540    operation: CryptoTradeOperation::NotifyOrder,
541    cmd: CMD_CRYPTO_NOTIFY_ORDER,
542    body: CryptoTradeBodyProto::CryptoNotifyOrder,
543    channel: TradeBackendChannel::Broker,
544    cpp_ref: "NNProto_Trd_OnPush.cpp:246-272",
545};
546
547pub const CRYPTO_TRADE_COMMANDS: &[CryptoTradeCommandSpec] = &[
548    CRYPTO_TRADE_FETCH_TRADE_CONFIG,
549    CRYPTO_TRADE_ACCOUNT_INFO,
550    CRYPTO_TRADE_ORDERS,
551    CRYPTO_TRADE_HISTORY_ORDERS,
552    CRYPTO_TRADE_ORDER_INFO,
553    CRYPTO_TRADE_ORDER_FILL_DETAIL,
554    CRYPTO_TRADE_DEALS,
555    CRYPTO_TRADE_HISTORY_DEALS,
556    CRYPTO_TRADE_BATCH_ORDER_FEE,
557    CRYPTO_TRADE_MAX_BUY_SELL_QTY,
558    CRYPTO_TRADE_CASH_LOG,
559    CRYPTO_TRADE_PLACE_ORDER,
560    CRYPTO_TRADE_CANCEL_ORDER,
561    CRYPTO_TRADE_NOTIFY_ASSET,
562    CRYPTO_TRADE_NOTIFY_ORDER,
563];
564
565pub fn crypto_trade_command(operation: CryptoTradeOperation) -> &'static CryptoTradeCommandSpec {
566    match operation {
567        CryptoTradeOperation::FetchTradeConfig => &CRYPTO_TRADE_FETCH_TRADE_CONFIG,
568        CryptoTradeOperation::AccountInfo => &CRYPTO_TRADE_ACCOUNT_INFO,
569        CryptoTradeOperation::Orders => &CRYPTO_TRADE_ORDERS,
570        CryptoTradeOperation::HistoryOrders => &CRYPTO_TRADE_HISTORY_ORDERS,
571        CryptoTradeOperation::OrderInfo => &CRYPTO_TRADE_ORDER_INFO,
572        CryptoTradeOperation::OrderFillDetail => &CRYPTO_TRADE_ORDER_FILL_DETAIL,
573        CryptoTradeOperation::Deals => &CRYPTO_TRADE_DEALS,
574        CryptoTradeOperation::HistoryDeals => &CRYPTO_TRADE_HISTORY_DEALS,
575        CryptoTradeOperation::BatchOrderFee => &CRYPTO_TRADE_BATCH_ORDER_FEE,
576        CryptoTradeOperation::MaxBuySellQty => &CRYPTO_TRADE_MAX_BUY_SELL_QTY,
577        CryptoTradeOperation::CashLog => &CRYPTO_TRADE_CASH_LOG,
578        CryptoTradeOperation::PlaceOrder => &CRYPTO_TRADE_PLACE_ORDER,
579        CryptoTradeOperation::CancelOrder => &CRYPTO_TRADE_CANCEL_ORDER,
580        CryptoTradeOperation::NotifyAsset => &CRYPTO_TRADE_NOTIFY_ASSET,
581        CryptoTradeOperation::NotifyOrder => &CRYPTO_TRADE_NOTIFY_ORDER,
582    }
583}
584
585#[cfg(test)]
586mod tests;