ig_client/application/models/
order.rs1use serde::{Deserialize, Serialize};
7
8#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
10#[serde(rename_all = "UPPERCASE")]
11pub enum Direction {
12 #[default]
14 Buy,
15 Sell,
17}
18
19#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
21#[serde(rename_all = "UPPERCASE")]
22pub enum OrderType {
23 #[default]
25 Limit,
26 Market,
28 Quote,
30 Stop,
32 StopLimit,
34}
35
36#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
41#[serde(rename_all = "UPPERCASE")]
42pub enum Status {
43 Amended,
45 Deleted,
47 #[serde(rename = "FULLY_CLOSED")]
49 FullyClosed,
50 Opened,
52 #[serde(rename = "PARTIALLY_CLOSED")]
54 PartiallyClosed,
55 Closed,
57 #[default]
59 Open,
60 Updated,
62 Accepted,
64 Rejected,
66 Working,
68 Filled,
70 Cancelled,
72 Expired,
74}
75
76#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
78pub enum TimeInForce {
79 #[serde(rename = "GOOD_TILL_CANCELLED")]
81 #[default]
82 GoodTillCancelled,
83 #[serde(rename = "GOOD_TILL_DATE")]
85 GoodTillDate,
86 #[serde(rename = "IMMEDIATE_OR_CANCEL")]
88 ImmediateOrCancel,
89 #[serde(rename = "FILL_OR_KILL")]
91 FillOrKill,
92}
93
94#[derive(Debug, Clone, Serialize)]
96pub struct CreateOrderRequest {
97 pub epic: String,
99 pub direction: Direction,
101 pub size: f64,
103 #[serde(rename = "orderType")]
105 pub order_type: OrderType,
106 #[serde(rename = "timeInForce")]
108 pub time_in_force: TimeInForce,
109 #[serde(rename = "level", skip_serializing_if = "Option::is_none")]
111 pub level: Option<f64>,
112 #[serde(rename = "guaranteedStop", skip_serializing_if = "Option::is_none")]
114 pub guaranteed_stop: Option<bool>,
115 #[serde(rename = "stopLevel", skip_serializing_if = "Option::is_none")]
117 pub stop_level: Option<f64>,
118 #[serde(rename = "stopDistance", skip_serializing_if = "Option::is_none")]
120 pub stop_distance: Option<f64>,
121 #[serde(rename = "limitLevel", skip_serializing_if = "Option::is_none")]
123 pub limit_level: Option<f64>,
124 #[serde(rename = "limitDistance", skip_serializing_if = "Option::is_none")]
126 pub limit_distance: Option<f64>,
127 #[serde(rename = "expiry", skip_serializing_if = "Option::is_none")]
129 pub expiry: Option<String>,
130 #[serde(rename = "dealReference", skip_serializing_if = "Option::is_none")]
132 pub deal_reference: Option<String>,
133 #[serde(rename = "forceOpen", skip_serializing_if = "Option::is_none")]
135 pub force_open: Option<bool>,
136}
137
138impl CreateOrderRequest {
139 pub fn market(epic: String, direction: Direction, size: f64) -> Self {
141 Self {
142 epic,
143 direction,
144 size,
145 order_type: OrderType::Market,
146 time_in_force: TimeInForce::FillOrKill,
147 level: None,
148 guaranteed_stop: None,
149 stop_level: None,
150 stop_distance: None,
151 limit_level: None,
152 limit_distance: None,
153 expiry: None,
154 deal_reference: None,
155 force_open: Some(true),
156 }
157 }
158
159 pub fn limit(epic: String, direction: Direction, size: f64, level: f64) -> Self {
161 Self {
162 epic,
163 direction,
164 size,
165 order_type: OrderType::Limit,
166 time_in_force: TimeInForce::GoodTillCancelled,
167 level: Some(level),
168 guaranteed_stop: None,
169 stop_level: None,
170 stop_distance: None,
171 limit_level: None,
172 limit_distance: None,
173 expiry: None,
174 deal_reference: None,
175 force_open: Some(true),
176 }
177 }
178
179 pub fn with_stop_loss(mut self, stop_level: f64) -> Self {
181 self.stop_level = Some(stop_level);
182 self
183 }
184
185 pub fn with_take_profit(mut self, limit_level: f64) -> Self {
187 self.limit_level = Some(limit_level);
188 self
189 }
190
191 pub fn with_reference(mut self, reference: String) -> Self {
193 self.deal_reference = Some(reference);
194 self
195 }
196}
197
198#[derive(Debug, Clone, Deserialize)]
200pub struct CreateOrderResponse {
201 #[serde(rename = "dealReference")]
203 pub deal_reference: String,
204}
205
206#[derive(Debug, Clone, Deserialize)]
208pub struct OrderConfirmation {
209 pub date: String,
211 pub status: Status,
213 pub reason: Option<String>,
215 #[serde(rename = "dealId")]
217 pub deal_id: Option<String>,
218 #[serde(rename = "dealReference")]
220 pub deal_reference: String,
221 #[serde(rename = "dealStatus")]
223 pub deal_status: Option<String>,
224 pub epic: Option<String>,
226 #[serde(rename = "expiry")]
228 pub expiry: Option<String>,
229 #[serde(rename = "guaranteedStop")]
231 pub guaranteed_stop: Option<bool>,
232 #[serde(rename = "level")]
234 pub level: Option<f64>,
235 #[serde(rename = "limitDistance")]
237 pub limit_distance: Option<f64>,
238 #[serde(rename = "limitLevel")]
240 pub limit_level: Option<f64>,
241 pub size: Option<f64>,
243 #[serde(rename = "stopDistance")]
245 pub stop_distance: Option<f64>,
246 #[serde(rename = "stopLevel")]
248 pub stop_level: Option<f64>,
249 #[serde(rename = "trailingStop")]
251 pub trailing_stop: Option<bool>,
252 pub direction: Option<Direction>,
254}
255
256#[derive(Debug, Clone, Serialize)]
258pub struct UpdatePositionRequest {
259 #[serde(rename = "stopLevel", skip_serializing_if = "Option::is_none")]
261 pub stop_level: Option<f64>,
262 #[serde(rename = "limitLevel", skip_serializing_if = "Option::is_none")]
264 pub limit_level: Option<f64>,
265 #[serde(rename = "trailingStop", skip_serializing_if = "Option::is_none")]
267 pub trailing_stop: Option<bool>,
268 #[serde(
270 rename = "trailingStopDistance",
271 skip_serializing_if = "Option::is_none"
272 )]
273 pub trailing_stop_distance: Option<f64>,
274}
275
276#[derive(Debug, Clone, Serialize)]
278pub struct ClosePositionRequest {
279 #[serde(rename = "dealId")]
281 pub deal_id: String,
282 pub direction: Direction,
284 pub size: f64,
286 #[serde(rename = "orderType")]
288 pub order_type: OrderType,
289 #[serde(rename = "timeInForce")]
291 pub time_in_force: TimeInForce,
292 #[serde(rename = "level", skip_serializing_if = "Option::is_none")]
294 pub level: Option<f64>,
295}
296
297impl ClosePositionRequest {
298 pub fn market(deal_id: String, direction: Direction, size: f64) -> Self {
300 Self {
301 deal_id,
302 direction,
303 size,
304 order_type: OrderType::Market,
305 time_in_force: TimeInForce::FillOrKill,
306 level: None,
307 }
308 }
309}
310
311#[derive(Debug, Clone, Deserialize)]
313pub struct ClosePositionResponse {
314 #[serde(rename = "dealReference")]
316 pub deal_reference: String,
317}