ig_client/application/models/
order.rs1use serde::{Deserialize, Serialize};
7
8#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
10#[serde(rename_all = "UPPERCASE")]
11pub enum Direction {
12 Buy,
14 Sell,
16}
17
18#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
20#[serde(rename_all = "UPPERCASE")]
21pub enum OrderType {
22 Limit,
24 Market,
26 Quote,
28 Stop,
30 StopLimit,
32}
33
34#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
36#[serde(rename_all = "UPPERCASE")]
37pub enum OrderStatus {
38 Accepted,
40 Rejected,
42 Working,
44 Filled,
46 Cancelled,
48 Expired,
50}
51
52#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
54pub enum TimeInForce {
55 #[serde(rename = "GOOD_TILL_CANCELLED")]
57 GoodTillCancelled,
58 #[serde(rename = "GOOD_TILL_DATE")]
60 GoodTillDate,
61 #[serde(rename = "IMMEDIATE_OR_CANCEL")]
63 ImmediateOrCancel,
64 #[serde(rename = "FILL_OR_KILL")]
66 FillOrKill,
67}
68
69#[derive(Debug, Clone, Serialize)]
71pub struct CreateOrderRequest {
72 pub epic: String,
74 pub direction: Direction,
76 pub size: f64,
78 #[serde(rename = "orderType")]
80 pub order_type: OrderType,
81 #[serde(rename = "timeInForce")]
83 pub time_in_force: TimeInForce,
84 #[serde(rename = "level", skip_serializing_if = "Option::is_none")]
86 pub level: Option<f64>,
87 #[serde(rename = "guaranteedStop", skip_serializing_if = "Option::is_none")]
89 pub guaranteed_stop: Option<bool>,
90 #[serde(rename = "stopLevel", skip_serializing_if = "Option::is_none")]
92 pub stop_level: Option<f64>,
93 #[serde(rename = "stopDistance", skip_serializing_if = "Option::is_none")]
95 pub stop_distance: Option<f64>,
96 #[serde(rename = "limitLevel", skip_serializing_if = "Option::is_none")]
98 pub limit_level: Option<f64>,
99 #[serde(rename = "limitDistance", skip_serializing_if = "Option::is_none")]
101 pub limit_distance: Option<f64>,
102 #[serde(rename = "expiry", skip_serializing_if = "Option::is_none")]
104 pub expiry: Option<String>,
105 #[serde(rename = "dealReference", skip_serializing_if = "Option::is_none")]
107 pub deal_reference: Option<String>,
108 #[serde(rename = "forceOpen", skip_serializing_if = "Option::is_none")]
110 pub force_open: Option<bool>,
111}
112
113impl CreateOrderRequest {
114 pub fn market(epic: String, direction: Direction, size: f64) -> Self {
116 Self {
117 epic,
118 direction,
119 size,
120 order_type: OrderType::Market,
121 time_in_force: TimeInForce::FillOrKill,
122 level: None,
123 guaranteed_stop: None,
124 stop_level: None,
125 stop_distance: None,
126 limit_level: None,
127 limit_distance: None,
128 expiry: None,
129 deal_reference: None,
130 force_open: Some(true),
131 }
132 }
133
134 pub fn limit(epic: String, direction: Direction, size: f64, level: f64) -> Self {
136 Self {
137 epic,
138 direction,
139 size,
140 order_type: OrderType::Limit,
141 time_in_force: TimeInForce::GoodTillCancelled,
142 level: Some(level),
143 guaranteed_stop: None,
144 stop_level: None,
145 stop_distance: None,
146 limit_level: None,
147 limit_distance: None,
148 expiry: None,
149 deal_reference: None,
150 force_open: Some(true),
151 }
152 }
153
154 pub fn with_stop_loss(mut self, stop_level: f64) -> Self {
156 self.stop_level = Some(stop_level);
157 self
158 }
159
160 pub fn with_take_profit(mut self, limit_level: f64) -> Self {
162 self.limit_level = Some(limit_level);
163 self
164 }
165
166 pub fn with_reference(mut self, reference: String) -> Self {
168 self.deal_reference = Some(reference);
169 self
170 }
171}
172
173#[derive(Debug, Clone, Deserialize)]
175pub struct CreateOrderResponse {
176 #[serde(rename = "dealReference")]
178 pub deal_reference: String,
179}
180
181#[derive(Debug, Clone, Deserialize)]
183pub struct OrderConfirmation {
184 pub date: String,
186 pub status: OrderStatus,
188 pub reason: Option<String>,
190 #[serde(rename = "dealId")]
192 pub deal_id: Option<String>,
193 #[serde(rename = "dealReference")]
195 pub deal_reference: String,
196 #[serde(rename = "dealStatus")]
198 pub deal_status: Option<String>,
199 pub epic: Option<String>,
201 #[serde(rename = "expiry")]
203 pub expiry: Option<String>,
204 #[serde(rename = "guaranteedStop")]
206 pub guaranteed_stop: Option<bool>,
207 #[serde(rename = "level")]
209 pub level: Option<f64>,
210 #[serde(rename = "limitDistance")]
212 pub limit_distance: Option<f64>,
213 #[serde(rename = "limitLevel")]
215 pub limit_level: Option<f64>,
216 pub size: Option<f64>,
218 #[serde(rename = "stopDistance")]
220 pub stop_distance: Option<f64>,
221 #[serde(rename = "stopLevel")]
223 pub stop_level: Option<f64>,
224 #[serde(rename = "trailingStop")]
226 pub trailing_stop: Option<bool>,
227 pub direction: Option<Direction>,
229}
230
231#[derive(Debug, Clone, Serialize)]
233pub struct UpdatePositionRequest {
234 #[serde(rename = "stopLevel", skip_serializing_if = "Option::is_none")]
236 pub stop_level: Option<f64>,
237 #[serde(rename = "limitLevel", skip_serializing_if = "Option::is_none")]
239 pub limit_level: Option<f64>,
240 #[serde(rename = "trailingStop", skip_serializing_if = "Option::is_none")]
242 pub trailing_stop: Option<bool>,
243 #[serde(
245 rename = "trailingStopDistance",
246 skip_serializing_if = "Option::is_none"
247 )]
248 pub trailing_stop_distance: Option<f64>,
249}
250
251#[derive(Debug, Clone, Serialize)]
253pub struct ClosePositionRequest {
254 #[serde(rename = "dealId")]
256 pub deal_id: String,
257 pub direction: Direction,
259 pub size: f64,
261 #[serde(rename = "orderType")]
263 pub order_type: OrderType,
264 #[serde(rename = "timeInForce")]
266 pub time_in_force: TimeInForce,
267 #[serde(rename = "level", skip_serializing_if = "Option::is_none")]
269 pub level: Option<f64>,
270}
271
272impl ClosePositionRequest {
273 pub fn market(deal_id: String, direction: Direction, size: f64) -> Self {
275 Self {
276 deal_id,
277 direction,
278 size,
279 order_type: OrderType::Market,
280 time_in_force: TimeInForce::FillOrKill,
281 level: None,
282 }
283 }
284}
285
286#[derive(Debug, Clone, Deserialize)]
288pub struct ClosePositionResponse {
289 #[serde(rename = "dealReference")]
291 pub deal_reference: String,
292}