architect_api/orderflow/
mod.rs

1use crate::{oms::*, symbology::ExecutionVenue, AccountIdOrName, TraderIdOrEmail};
2use derive::grpc;
3use schemars::JsonSchema;
4use serde::{Deserialize, Serialize};
5
6pub mod cancel;
7pub mod fill;
8pub mod modify;
9pub mod order;
10pub mod order_id;
11pub mod order_types;
12
13pub use cancel::*;
14pub use fill::*;
15pub use modify::*;
16pub use order::*;
17pub use order_id::*;
18pub use order_types::*;
19
20#[grpc(package = "json.architect")]
21#[grpc(service = "Orderflow", name = "orderflow", response = "Orderflow", bidi_streaming)]
22#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
23#[serde(tag = "t")]
24/// <!-- py: tag=t -->
25pub enum OrderflowRequest {
26    #[serde(rename = "p")]
27    #[schemars(title = "PlaceOrder|PlaceOrderRequest")]
28    PlaceOrder(PlaceOrderRequest),
29    #[serde(rename = "pp")]
30    #[schemars(title = "PlaceBatchOrder|PlaceBatchOrderRequest")]
31    PlaceBatchOrder(PlaceBatchOrderRequest),
32    #[serde(rename = "x")]
33    #[schemars(title = "CancelOrder|CancelOrderRequest")]
34    CancelOrder(CancelOrderRequest),
35    #[serde(rename = "xo")]
36    #[schemars(title = "CancelAllOrders|CancelAllOrdersRequest")]
37    CancelAllOrders(CancelAllOrdersRequest),
38    #[serde(rename = "xb")]
39    #[schemars(title = "BatchCancelOrders|BatchCancelOrdersRequest")]
40    BatchCancelOrders(BatchCancelOrdersRequest),
41    #[serde(rename = "modify_order")]
42    #[schemars(title = "ModifyOrder|ModifyOrderRequest")]
43    ModifyOrder(ModifyOrderRequest),
44}
45
46#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
47#[serde(tag = "t")]
48/// <!-- py: tag=t -->
49pub enum Orderflow {
50    #[serde(rename = "w")]
51    #[schemars(title = "OrderPending|Order")]
52    OrderPending(Order),
53    #[serde(rename = "a")]
54    #[schemars(title = "OrderAck|OrderAck")]
55    OrderAck(OrderAck),
56    #[serde(rename = "r")]
57    #[schemars(title = "OrderReject|OrderReject")]
58    OrderReject(OrderReject),
59    #[serde(rename = "o")]
60    #[schemars(title = "OrderOut|OrderOut")]
61    OrderOut(OrderOut),
62    #[serde(rename = "ox")]
63    #[schemars(title = "OrderReconciledOut|OrderOut")]
64    OrderReconciledOut(OrderOut),
65    #[serde(rename = "z")]
66    #[schemars(title = "OrderStale|OrderStale")]
67    OrderStale(OrderStale),
68    #[serde(rename = "xc")]
69    #[schemars(title = "CancelPending|Cancel")]
70    CancelPending(Cancel),
71    #[serde(rename = "xr")]
72    #[schemars(title = "CancelReject|CancelReject")]
73    CancelReject(CancelReject),
74    #[serde(rename = "xa")]
75    #[schemars(title = "OrderCanceling|OrderCanceling")]
76    OrderCanceling(OrderCanceling),
77    #[serde(rename = "xx")]
78    #[schemars(title = "OrderCanceled|OrderCanceled")]
79    OrderCanceled(OrderCanceled),
80    #[serde(rename = "mp")]
81    #[schemars(title = "ModifyPending|ModifyPending")]
82    ModifyPending(Modify),
83    #[serde(rename = "mr")]
84    #[schemars(title = "ModifyReject|ModifyReject")]
85    ModifyReject(ModifyReject),
86    #[serde(rename = "mm")]
87    #[schemars(title = "OrderModified|OrderModified")]
88    OrderModified(OrderModified),
89    #[serde(rename = "f")]
90    #[schemars(title = "Fill|Fill")]
91    Fill(Fill),
92    #[serde(rename = "af")]
93    #[schemars(title = "AberrantFill|AberrantFill")]
94    AberrantFill(AberrantFill),
95    #[serde(rename = "df")]
96    #[schemars(title = "DescendantFill|Fill")]
97    /// For parent algos with child algos, the parent algo will also receive copies
98    /// of fills from its descendants.  The fills will be modified such that their
99    /// order_id is set to the immediate child algo's order ID.
100    ///
101    /// For example, suppose algo order A spawns child algo order B, whose
102    /// suborder O receives fill F.  F's order_id is O.  A should also hear about
103    /// this fill as a DescendantFill F_desc where F_desc's order_id is B.
104    DescendantFill(Fill),
105}
106
107impl Orderflow {
108    pub fn order_id(&self) -> Option<OrderId> {
109        match self {
110            Orderflow::OrderPending(order) => Some(order.id),
111            Orderflow::OrderAck(ack) => Some(ack.order_id),
112            Orderflow::OrderReject(reject) => Some(reject.order_id),
113            Orderflow::OrderOut(out) => Some(out.order_id),
114            Orderflow::OrderReconciledOut(out) => Some(out.order_id),
115            Orderflow::OrderStale(stale) => Some(stale.order_id),
116            Orderflow::CancelPending(cancel) => Some(cancel.order_id),
117            Orderflow::CancelReject(reject) => Some(reject.order_id),
118            Orderflow::OrderCanceling(canceling) => Some(canceling.order_id),
119            Orderflow::OrderCanceled(canceled) => Some(canceled.order_id),
120            Orderflow::Fill(fill) => fill.order_id,
121            Orderflow::AberrantFill(aberrant_fill) => aberrant_fill.order_id,
122            Orderflow::ModifyPending(modify) => Some(modify.order_id),
123            Orderflow::ModifyReject(modify_reject) => Some(modify_reject.order_id),
124            Orderflow::OrderModified(order_modified) => Some(order_modified.order_id),
125            Orderflow::DescendantFill(fill) => fill.order_id,
126        }
127    }
128}
129
130/// Subscribe/listen to orderflow events.
131#[grpc(package = "json.architect")]
132#[grpc(
133    service = "Orderflow",
134    name = "subscribe_orderflow",
135    response = "Orderflow",
136    server_streaming
137)]
138#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema)]
139pub struct SubscribeOrderflowRequest {
140    #[serde(default)]
141    pub execution_venue: Option<ExecutionVenue>,
142    #[serde(default)]
143    pub trader: Option<TraderIdOrEmail>,
144    #[serde(default)]
145    pub account: Option<AccountIdOrName>,
146}
147
148#[grpc(package = "json.architect")]
149#[grpc(service = "Orderflow", name = "dropcopy", response = "Dropcopy", server_streaming)]
150#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
151pub struct DropcopyRequest {
152    #[serde(default)]
153    pub execution_venue: Option<ExecutionVenue>,
154    #[serde(default)]
155    pub trader: Option<TraderIdOrEmail>,
156    #[serde(default)]
157    pub account: Option<AccountIdOrName>,
158    #[serde(default)]
159    pub orders: bool,
160    #[serde(default = "DropcopyRequest::default_fills")]
161    pub fills: bool,
162    #[serde(default)]
163    pub aberrant_fills: bool,
164}
165
166impl DropcopyRequest {
167    fn default_fills() -> bool {
168        true
169    }
170}
171
172#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
173#[serde(tag = "t")]
174/// <!-- py: tag=t -->
175pub enum Dropcopy {
176    #[serde(rename = "o")]
177    #[schemars(title = "Order|Order")]
178    Order(Order),
179    #[schemars(title = "Fill|Fill")]
180    #[serde(rename = "f")]
181    Fill(Fill),
182    #[serde(rename = "af")]
183    #[schemars(title = "AberrantFill|AberrantFill")]
184    AberrantFill(AberrantFill),
185}