Skip to main content

futucli/cli/commands/
trade_write.rs

1//! Trade-write clap argument structs split from commands.rs.
2
3use clap::Args;
4
5#[derive(Args)]
6pub struct ComboOrderArgs {
7    /// 官方 `Trd_PlaceComboOrder.C2S` JSON;`packetID` 可省略,CLI 会按连接补齐。
8    ///
9    /// 字段名按 generated proto serde 的 snake_case 写法,例如
10    /// `header`、`combo_legs`、`order_type`。CLI 不替用户改写价格、腿方向、
11    /// time_in_force 等交易语义字段。
12    #[arg(long = "c2s-json", value_name = "JSON")]
13    pub(crate) c2s_json: String,
14
15    /// real 交易环境必须显式确认。环境从 C2S.header.trdEnv 读取。
16    #[arg(long)]
17    pub(crate) confirm: bool,
18
19    /// 可选幂等键;设置后 CLI 用稳定 PacketID 派生同一请求。
20    #[arg(long)]
21    pub(crate) idempotency_key: Option<String>,
22}
23
24#[derive(Args)]
25pub struct PlaceOrderArgs {
26    #[arg(short, long)]
27    pub(crate) market: String,
28
29    #[arg(long)]
30    pub(crate) acc_id: Option<u64>,
31
32    /// App 显示卡号:4 位末尾或 16 位完整卡号
33    #[arg(long = "card-num")]
34    pub(crate) card_num: Option<String>,
35
36    /// 交易环境(默认 simulate 防实盘误触)
37    #[arg(short, long, default_value = "simulate")]
38    pub(crate) env: String,
39
40    /// 买卖方向: BUY | SELL | SELL_SHORT | BUY_BACK
41    #[arg(long)]
42    pub(crate) side: String,
43
44    /// 订单类型: NORMAL | MARKET | ABSOLUTE_LIMIT | AUCTION | AUCTION_LIMIT | SPECIAL_LIMIT
45    #[arg(long, default_value = "NORMAL")]
46    pub(crate) order_type: String,
47
48    /// 股票代码(不含 market 前缀,如 00700 / AAPL)
49    #[arg(long)]
50    pub(crate) code: String,
51
52    /// 数量
53    #[arg(long)]
54    pub(crate) qty: f64,
55
56    /// 价格(NORMAL 限价单必填,MARKET 可省)
57    #[arg(long)]
58    pub(crate) price: Option<f64>,
59
60    /// JP 子账户类型(TrdHeader.jpAccType / TrdSubAccType)
61    #[arg(long = "jp-acc-type")]
62    pub(crate) jp_acc_type: Option<i32>,
63
64    /// real env 必须显式加此 flag 才能下单
65    #[arg(long)]
66    pub(crate) confirm: bool,
67
68    /// v1.4.39:可选幂等键。**设置后**,同一键在 90s 内重试返 cached 响应不
69    /// 重复下单(对齐 REST `Idempotency-Key` header 语义)。不设置则每次调
70    /// 用都真实下单。例:`--idempotency-key my-order-2026-04-20-a`
71    #[arg(long)]
72    pub(crate) idempotency_key: Option<String>,
73
74    /// **v1.4.53 条件单**:止损/止盈触发价(仅对 STOP / STOP_LIMIT / MIT /
75    /// LIT / TRAILING_STOP / TRAILING_STOP_LIMIT 生效)。对齐 FTAPI `auxPrice`
76    #[arg(long)]
77    pub(crate) stop_price: Option<f64>,
78
79    /// **v1.4.53 条件单**:跟踪类型 1=Ratio(比例)/ 2=Amount(金额)
80    #[arg(long)]
81    pub(crate) trail_type: Option<i32>,
82
83    /// **v1.4.53 条件单**:跟踪金额 / 百分比(TrailType=1 时为百分比)
84    #[arg(long)]
85    pub(crate) trail_value: Option<f64>,
86
87    /// **v1.4.53 条件单**:指定价差(跟踪限价单用)
88    #[arg(long)]
89    pub(crate) trail_spread: Option<f64>,
90}
91
92#[derive(Args)]
93pub struct ModifyOrderArgs {
94    #[arg(short, long)]
95    pub(crate) market: String,
96
97    #[arg(long)]
98    pub(crate) acc_id: Option<u64>,
99
100    /// App 显示卡号:4 位末尾或 16 位完整卡号
101    #[arg(long = "card-num")]
102    pub(crate) card_num: Option<String>,
103
104    #[arg(short, long, default_value = "simulate")]
105    pub(crate) env: String,
106
107    #[arg(long)]
108    pub(crate) order_id: String,
109
110    /// 操作类型: NORMAL(改数量价格)| CANCEL | DISABLE | ENABLE | DELETE
111    #[arg(long)]
112    pub(crate) op: String,
113
114    /// 新数量(op=NORMAL 必填)
115    #[arg(long)]
116    pub(crate) qty: Option<f64>,
117
118    /// 新价格(op=NORMAL 必填)
119    #[arg(long)]
120    pub(crate) price: Option<f64>,
121
122    /// JP 子账户类型(TrdHeader.jpAccType / TrdSubAccType)
123    #[arg(long = "jp-acc-type")]
124    pub(crate) jp_acc_type: Option<i32>,
125
126    #[arg(long)]
127    pub(crate) confirm: bool,
128
129    /// v1.4.39:可选幂等键。同 `place-order --idempotency-key`
130    #[arg(long)]
131    pub(crate) idempotency_key: Option<String>,
132}
133
134#[derive(Args)]
135pub struct CancelOrderArgs {
136    #[arg(short, long)]
137    pub(crate) market: String,
138
139    #[arg(long)]
140    pub(crate) acc_id: Option<u64>,
141
142    /// App 显示卡号:4 位末尾或 16 位完整卡号
143    #[arg(long = "card-num")]
144    pub(crate) card_num: Option<String>,
145
146    #[arg(short, long, default_value = "simulate")]
147    pub(crate) env: String,
148
149    #[arg(long)]
150    pub(crate) order_id: String,
151
152    /// JP 子账户类型(TrdHeader.jpAccType / TrdSubAccType)
153    #[arg(long = "jp-acc-type")]
154    pub(crate) jp_acc_type: Option<i32>,
155
156    /// v1.4.110:可选幂等键。同 `modify-order --idempotency-key`
157    #[arg(long)]
158    pub(crate) idempotency_key: Option<String>,
159
160    #[arg(long)]
161    pub(crate) confirm: bool,
162}
163
164#[derive(Args)]
165pub struct ReconfirmOrderArgs {
166    #[arg(short, long)]
167    pub(crate) market: String,
168
169    #[arg(long)]
170    pub(crate) acc_id: Option<u64>,
171
172    /// App 显示卡号:4 位末尾或 16 位完整卡号
173    #[arg(long = "card-num")]
174    pub(crate) card_num: Option<String>,
175
176    #[arg(short, long, default_value = "simulate")]
177    pub(crate) env: String,
178
179    /// 待二次确认的 FTAPI numeric order_id
180    #[arg(long)]
181    pub(crate) order_id: String,
182
183    /// 二次确认原因(Trd_Common.ReconfirmOrderReason int)
184    #[arg(long)]
185    pub(crate) reason: i32,
186
187    /// JP 子账户类型(TrdHeader.jpAccType / TrdSubAccType)
188    #[arg(long = "jp-acc-type")]
189    pub(crate) jp_acc_type: Option<i32>,
190
191    /// real env 必须显式加此 flag 才能二次确认订单
192    #[arg(long)]
193    pub(crate) confirm: bool,
194}