architect_api/oms/
mod.rs

1use crate::{
2    orderflow::{
3        order_types::*, Cancel, CancelReject, Modify, Order, OrderReject, OrderSource,
4        TimeInForce,
5    },
6    symbology::ExecutionVenue,
7    AccountIdOrName, Dir, OrderId, TraderIdOrEmail,
8};
9use chrono::{DateTime, Utc};
10use derive::grpc;
11use derive_builder::Builder;
12use rust_decimal::Decimal;
13use schemars::JsonSchema;
14use serde::{Deserialize, Serialize};
15use serde_with::skip_serializing_none;
16use uuid::Uuid;
17
18#[grpc(package = "json.architect")]
19#[grpc(service = "Oms", name = "place_order", response = "Order")]
20#[derive(Builder, Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
21/// <!-- py: unflatten=k/order_type/OrderType, tag=k -->
22pub struct PlaceOrderRequest {
23    /// If not specified, one will be generated for you; note, in that case,
24    /// you won't know for sure if the specific request went through.
25    pub id: Option<OrderId>,
26    #[serde(rename = "pid", default)]
27    #[schemars(title = "parent_id")]
28    #[serde(skip_serializing_if = "Option::is_none")]
29    pub parent_id: Option<OrderId>,
30    #[serde(rename = "s")]
31    #[schemars(title = "symbol")]
32    pub symbol: String,
33    #[serde(rename = "d")]
34    #[schemars(title = "dir")]
35    pub dir: Dir,
36    #[serde(rename = "q")]
37    #[schemars(title = "quantity")]
38    pub quantity: Decimal,
39    #[serde(rename = "u", default)]
40    #[schemars(title = "trader")]
41    #[builder(setter(strip_option), default)]
42    pub trader: Option<TraderIdOrEmail>,
43    #[serde(rename = "a", default)]
44    #[schemars(title = "account")]
45    #[builder(setter(strip_option), default)]
46    pub account: Option<AccountIdOrName>,
47    #[serde(flatten)]
48    pub order_type: OrderType,
49    #[serde(rename = "tif")]
50    #[schemars(title = "time_in_force")]
51    #[builder(default = "TimeInForce::GoodTilCancel")]
52    pub time_in_force: TimeInForce,
53    #[serde(rename = "src", default)]
54    #[schemars(title = "source")]
55    #[builder(setter(strip_option), default)]
56    pub source: Option<OrderSource>,
57    #[serde(rename = "x", default)]
58    #[schemars(title = "execution_venue")]
59    #[builder(setter(strip_option), default)]
60    pub execution_venue: Option<ExecutionVenue>,
61}
62
63#[grpc(package = "json.architect")]
64#[grpc(service = "Oms", name = "place_batch_order", response = "PlaceBatchOrderResponse")]
65#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
66pub struct PlaceBatchOrderRequest {
67    pub place_orders: Vec<PlaceOrderRequest>,
68}
69
70#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
71pub struct PlaceBatchOrderResponse {
72    pub pending_orders: Vec<Order>,
73    pub order_rejects: Vec<OrderReject>,
74}
75
76#[grpc(package = "json.architect")]
77#[grpc(service = "Oms", name = "cancel_order", response = "Cancel")]
78#[derive(Debug, Clone, Copy, Serialize, Deserialize, JsonSchema)]
79pub struct CancelOrderRequest {
80    /// If not specified, one will be generated for you; note, in that case,
81    /// you won't know for sure if the specific request went through.
82    #[serde(rename = "xid", default)]
83    #[schemars(title = "cancel_id")]
84    pub cancel_id: Option<Uuid>,
85    #[serde(rename = "id")]
86    #[schemars(title = "order_id")]
87    pub order_id: OrderId,
88}
89
90/// Batch cancel orders.  Depending on the cpty, their may be different
91/// semantics on how the batch cancel is handled.
92#[grpc(package = "json.architect")]
93#[grpc(
94    service = "Oms",
95    name = "batch_cancel_orders",
96    response = "BatchCancelOrdersResponse"
97)]
98#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
99pub struct BatchCancelOrdersRequest {
100    pub cancel_orders: Vec<CancelOrderRequest>,
101}
102
103#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
104pub struct BatchCancelOrdersResponse {
105    pub cancels: Vec<Cancel>,
106    pub cancel_rejects: Vec<CancelReject>,
107}
108
109/// The ModifyOrderRequest will cause the order to get a new OrderId.
110/// The new OrderId will come in the Modify Response.
111#[grpc(package = "json.architect")]
112#[grpc(service = "Oms", name = "modify_order", response = "Modify")]
113#[derive(Debug, Clone, Copy, Serialize, Deserialize, JsonSchema)]
114pub struct ModifyOrderRequest {
115    /// If not specified, one will be generated for you; note, in that case,
116    /// you won't know for sure if the specific request went through.
117    #[serde(rename = "mid", default)]
118    #[schemars(title = "modify_id")]
119    pub modify_id: Option<Uuid>,
120
121    #[serde(rename = "id")]
122    #[schemars(title = "order_id")]
123    pub order_id: OrderId,
124
125    #[serde(rename = "q")]
126    #[schemars(title = "new_quantity")]
127    pub new_quantity: Option<Decimal>,
128
129    #[serde(rename = "p")]
130    #[schemars(title = "new_price")]
131    pub new_price: Option<Decimal>,
132}
133
134#[grpc(package = "json.architect")]
135#[grpc(service = "Oms", name = "cancel_all_orders", response = "CancelAllOrdersResponse")]
136#[skip_serializing_none]
137#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
138pub struct CancelAllOrdersRequest {
139    pub id: Uuid,
140    #[serde(default)]
141    pub trader: Option<TraderIdOrEmail>,
142    #[serde(default)]
143    pub account: Option<AccountIdOrName>,
144    #[serde(default)]
145    pub execution_venue: Option<ExecutionVenue>,
146}
147
148// CR alee: we could think of a more useful response
149#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
150pub struct CancelAllOrdersResponse {}
151
152#[grpc(package = "json.architect")]
153#[grpc(service = "Oms", name = "open_orders", response = "OpenOrdersResponse")]
154#[skip_serializing_none]
155#[derive(Debug, Default, Clone, Serialize, Deserialize, JsonSchema)]
156pub struct OpenOrdersRequest {
157    pub venue: Option<ExecutionVenue>,
158    pub account: Option<AccountIdOrName>,
159    pub trader: Option<TraderIdOrEmail>,
160    pub symbol: Option<String>,
161    pub parent_order_id: Option<OrderId>,
162    pub order_ids: Option<Vec<OrderId>>,
163    #[serde(default, skip_serializing_if = "Option::is_none")]
164    pub from_inclusive: Option<DateTime<Utc>>,
165    #[serde(default, skip_serializing_if = "Option::is_none")]
166    pub to_exclusive: Option<DateTime<Utc>>,
167    #[serde(default)]
168    pub limit: Option<i32>,
169}
170
171#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
172pub struct OpenOrdersResponse {
173    pub open_orders: Vec<Order>,
174}
175
176#[grpc(package = "json.architect")]
177#[grpc(service = "Oms", name = "pending_cancels", response = "PendingCancelsResponse")]
178#[skip_serializing_none]
179#[derive(Debug, Default, Clone, Serialize, Deserialize, JsonSchema)]
180pub struct PendingCancelsRequest {
181    pub venue: Option<ExecutionVenue>,
182    pub account: Option<AccountIdOrName>,
183    pub trader: Option<TraderIdOrEmail>,
184    pub symbol: Option<String>,
185    pub cancel_ids: Option<Vec<Uuid>>,
186}
187
188#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
189pub struct PendingCancelsResponse {
190    pub pending_cancels: Vec<Cancel>,
191}
192
193#[grpc(package = "json.architect")]
194#[grpc(service = "Oms", name = "pending_modifies", response = "PendingModifiesResponse")]
195#[skip_serializing_none]
196#[derive(Debug, Default, Clone, Serialize, Deserialize, JsonSchema)]
197pub struct PendingModifiesRequest {
198    pub venue: Option<ExecutionVenue>,
199    pub account: Option<AccountIdOrName>,
200    pub trader: Option<TraderIdOrEmail>,
201    pub symbol: Option<String>,
202    pub modify_ids: Option<Vec<Uuid>>,
203}
204
205#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
206pub struct PendingModifiesResponse {
207    pub pending_modifies: Vec<Modify>,
208}
209/// Manually reconcile out orders.  Useful for clearing stuck orders
210/// or stale orders when a human wants to intervene.
211#[grpc(package = "json.architect")]
212#[grpc(service = "Oms", name = "reconcile_out", response = "ReconcileOutResponse")]
213#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
214pub struct ReconcileOutRequest {
215    pub order_id: Option<OrderId>,
216    pub order_ids: Option<Vec<OrderId>>,
217}
218
219#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
220pub struct ReconcileOutResponse {}