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    /// 订单有效期限:DAY|GTC|IOC|GTD 或 0|1|2|3
61    #[arg(long = "time-in-force")]
62    pub(crate) time_in_force: Option<String>,
63
64    /// 允许美股盘前/盘后成交(FTAPI fillOutsideRTH)
65    #[arg(long = "fill-outside-rth")]
66    pub(crate) fill_outside_rth: bool,
67
68    /// 美股订单时段:NONE|RTH|ETH|ALL|OVERNIGHT 或 0|1|2|3|4
69    #[arg(long)]
70    pub(crate) session: Option<String>,
71
72    /// GTD 到期日期 YYYY-MM-DD,仅在 --time-in-force GTD 时有效
73    #[arg(long = "expire-time")]
74    pub(crate) expire_time: Option<String>,
75
76    /// JP 子账户类型(TrdHeader.jpAccType / TrdSubAccType)
77    #[arg(long = "jp-acc-type")]
78    pub(crate) jp_acc_type: Option<i32>,
79
80    /// real env 必须显式加此 flag 才能下单
81    #[arg(long)]
82    pub(crate) confirm: bool,
83
84    /// v1.4.39:可选幂等键。**设置后**,同一键在 90s 内重试返 cached 响应不
85    /// 重复下单(对齐 REST `Idempotency-Key` header 语义)。不设置则每次调
86    /// 用都真实下单。例:`--idempotency-key my-order-2026-04-20-a`
87    #[arg(long)]
88    pub(crate) idempotency_key: Option<String>,
89
90    /// **v1.4.53 条件单**:止损/止盈触发价(仅对 STOP / STOP_LIMIT / MIT /
91    /// LIT / TRAILING_STOP / TRAILING_STOP_LIMIT 生效)。对齐 FTAPI `auxPrice`
92    #[arg(long)]
93    pub(crate) stop_price: Option<f64>,
94
95    /// **v1.4.53 条件单**:跟踪类型 1=Ratio(比例)/ 2=Amount(金额)
96    #[arg(long)]
97    pub(crate) trail_type: Option<i32>,
98
99    /// **v1.4.53 条件单**:跟踪金额 / 百分比(TrailType=1 时为百分比)
100    #[arg(long)]
101    pub(crate) trail_value: Option<f64>,
102
103    /// **v1.4.53 条件单**:指定价差(跟踪限价单用)
104    #[arg(long)]
105    pub(crate) trail_spread: Option<f64>,
106}
107
108#[derive(Args)]
109pub struct ModifyOrderArgs {
110    #[arg(short, long)]
111    pub(crate) market: String,
112
113    #[arg(long)]
114    pub(crate) acc_id: Option<u64>,
115
116    /// App 显示卡号:4 位末尾或 16 位完整卡号
117    #[arg(long = "card-num")]
118    pub(crate) card_num: Option<String>,
119
120    #[arg(short, long, default_value = "simulate")]
121    pub(crate) env: String,
122
123    #[arg(long)]
124    pub(crate) order_id: String,
125
126    /// 操作类型: NORMAL(改数量价格)| CANCEL | DISABLE | ENABLE | DELETE
127    #[arg(long)]
128    pub(crate) op: String,
129
130    /// 新数量(op=NORMAL 必填)
131    #[arg(long)]
132    pub(crate) qty: Option<f64>,
133
134    /// 新价格(op=NORMAL 必填)
135    #[arg(long)]
136    pub(crate) price: Option<f64>,
137
138    /// JP 子账户类型(TrdHeader.jpAccType / TrdSubAccType)
139    #[arg(long = "jp-acc-type")]
140    pub(crate) jp_acc_type: Option<i32>,
141
142    #[arg(long)]
143    pub(crate) confirm: bool,
144
145    /// v1.4.39:可选幂等键。同 `place-order --idempotency-key`
146    #[arg(long)]
147    pub(crate) idempotency_key: Option<String>,
148}
149
150#[derive(Args)]
151pub struct CancelOrderArgs {
152    #[arg(short, long)]
153    pub(crate) market: String,
154
155    #[arg(long)]
156    pub(crate) acc_id: Option<u64>,
157
158    /// App 显示卡号:4 位末尾或 16 位完整卡号
159    #[arg(long = "card-num")]
160    pub(crate) card_num: Option<String>,
161
162    #[arg(short, long, default_value = "simulate")]
163    pub(crate) env: String,
164
165    #[arg(long)]
166    pub(crate) order_id: String,
167
168    /// JP 子账户类型(TrdHeader.jpAccType / TrdSubAccType)
169    #[arg(long = "jp-acc-type")]
170    pub(crate) jp_acc_type: Option<i32>,
171
172    /// v1.4.110:可选幂等键。同 `modify-order --idempotency-key`
173    #[arg(long)]
174    pub(crate) idempotency_key: Option<String>,
175
176    #[arg(long)]
177    pub(crate) confirm: bool,
178}
179
180#[derive(Args)]
181pub struct ReconfirmOrderArgs {
182    #[arg(short, long)]
183    pub(crate) market: String,
184
185    #[arg(long)]
186    pub(crate) acc_id: Option<u64>,
187
188    /// App 显示卡号:4 位末尾或 16 位完整卡号
189    #[arg(long = "card-num")]
190    pub(crate) card_num: Option<String>,
191
192    #[arg(short, long, default_value = "simulate")]
193    pub(crate) env: String,
194
195    /// 待二次确认的 FTAPI numeric order_id
196    #[arg(long)]
197    pub(crate) order_id: String,
198
199    /// 二次确认原因(Trd_Common.ReconfirmOrderReason int)
200    #[arg(long)]
201    pub(crate) reason: i32,
202
203    /// JP 子账户类型(TrdHeader.jpAccType / TrdSubAccType)
204    #[arg(long = "jp-acc-type")]
205    pub(crate) jp_acc_type: Option<i32>,
206
207    /// real env 必须显式加此 flag 才能二次确认订单
208    #[arg(long)]
209    pub(crate) confirm: bool,
210}