Skip to main content

nautilus_common/messages/execution/
cancel.rs

1// -------------------------------------------------------------------------------------------------
2//  Copyright (C) 2015-2026 Nautech Systems Pty Ltd. All rights reserved.
3//  https://nautechsystems.io
4//
5//  Licensed under the GNU Lesser General Public License Version 3.0 (the "License");
6//  You may not use this file except in compliance with the License.
7//  You may obtain a copy of the License at https://www.gnu.org/licenses/lgpl-3.0.en.html
8//
9//  Unless required by applicable law or agreed to in writing, software
10//  distributed under the License is distributed on an "AS IS" BASIS,
11//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12//  See the License for the specific language governing permissions and
13//  limitations under the License.
14// -------------------------------------------------------------------------------------------------
15
16use std::fmt::Display;
17
18use derive_builder::Builder;
19use nautilus_core::{Params, UUID4, UnixNanos};
20use nautilus_model::{
21    enums::OrderSide,
22    identifiers::{ClientId, ClientOrderId, InstrumentId, StrategyId, TraderId, VenueOrderId},
23};
24use serde::{Deserialize, Serialize};
25
26#[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize, Builder)]
27#[serde(tag = "type")]
28pub struct CancelOrder {
29    pub trader_id: TraderId,
30    pub client_id: Option<ClientId>,
31    pub strategy_id: StrategyId,
32    pub instrument_id: InstrumentId,
33    pub client_order_id: ClientOrderId,
34    pub venue_order_id: Option<VenueOrderId>,
35    pub command_id: UUID4,
36    pub ts_init: UnixNanos,
37    pub params: Option<Params>,
38    #[builder(default)]
39    pub correlation_id: Option<UUID4>,
40    #[builder(default)]
41    #[serde(default, skip_serializing_if = "Option::is_none")]
42    pub causation_id: Option<UUID4>,
43}
44
45impl CancelOrder {
46    /// Creates a new [`CancelOrder`] instance.
47    #[expect(clippy::too_many_arguments)]
48    #[must_use]
49    pub fn new(
50        trader_id: TraderId,
51        client_id: Option<ClientId>,
52        strategy_id: StrategyId,
53        instrument_id: InstrumentId,
54        client_order_id: ClientOrderId,
55        venue_order_id: Option<VenueOrderId>,
56        command_id: UUID4,
57        ts_init: UnixNanos,
58        params: Option<Params>,
59        correlation_id: Option<UUID4>,
60    ) -> Self {
61        Self {
62            trader_id,
63            client_id,
64            strategy_id,
65            instrument_id,
66            client_order_id,
67            venue_order_id,
68            command_id,
69            ts_init,
70            params,
71            correlation_id,
72            causation_id: None,
73        }
74    }
75}
76
77impl Display for CancelOrder {
78    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
79        write!(
80            f,
81            "CancelOrder(instrument_id={}, client_order_id={}, venue_order_id={:?})",
82            self.instrument_id, self.client_order_id, self.venue_order_id,
83        )
84    }
85}
86
87#[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize, Builder)]
88#[serde(tag = "type")]
89pub struct CancelAllOrders {
90    pub trader_id: TraderId,
91    pub client_id: Option<ClientId>,
92    pub strategy_id: StrategyId,
93    pub instrument_id: InstrumentId,
94    pub order_side: OrderSide,
95    pub command_id: UUID4,
96    pub ts_init: UnixNanos,
97    pub params: Option<Params>,
98    #[builder(default)]
99    pub correlation_id: Option<UUID4>,
100    #[builder(default)]
101    #[serde(default, skip_serializing_if = "Option::is_none")]
102    pub causation_id: Option<UUID4>,
103}
104
105impl CancelAllOrders {
106    /// Creates a new [`CancelAllOrders`] instance.
107    #[expect(clippy::too_many_arguments)]
108    #[must_use]
109    pub fn new(
110        trader_id: TraderId,
111        client_id: Option<ClientId>,
112        strategy_id: StrategyId,
113        instrument_id: InstrumentId,
114        order_side: OrderSide,
115        command_id: UUID4,
116        ts_init: UnixNanos,
117        params: Option<Params>,
118        correlation_id: Option<UUID4>,
119    ) -> Self {
120        Self {
121            trader_id,
122            client_id,
123            strategy_id,
124            instrument_id,
125            order_side,
126            command_id,
127            ts_init,
128            params,
129            correlation_id,
130            causation_id: None,
131        }
132    }
133}
134
135impl Display for CancelAllOrders {
136    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
137        write!(
138            f,
139            "CancelAllOrders(instrument_id={}, order_side={})",
140            self.instrument_id, self.order_side,
141        )
142    }
143}
144
145#[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize, Builder)]
146#[serde(tag = "type")]
147pub struct BatchCancelOrders {
148    pub trader_id: TraderId,
149    pub client_id: Option<ClientId>,
150    pub strategy_id: StrategyId,
151    pub instrument_id: InstrumentId,
152    pub cancels: Vec<CancelOrder>,
153    pub command_id: UUID4,
154    pub ts_init: UnixNanos,
155    pub params: Option<Params>,
156    #[builder(default)]
157    pub correlation_id: Option<UUID4>,
158    #[builder(default)]
159    #[serde(default, skip_serializing_if = "Option::is_none")]
160    pub causation_id: Option<UUID4>,
161}
162
163impl BatchCancelOrders {
164    /// Creates a new [`BatchCancelOrders`] instance.
165    #[expect(clippy::too_many_arguments)]
166    #[must_use]
167    pub fn new(
168        trader_id: TraderId,
169        client_id: Option<ClientId>,
170        strategy_id: StrategyId,
171        instrument_id: InstrumentId,
172        cancels: Vec<CancelOrder>,
173        command_id: UUID4,
174        ts_init: UnixNanos,
175        params: Option<Params>,
176        correlation_id: Option<UUID4>,
177    ) -> Self {
178        Self {
179            trader_id,
180            client_id,
181            strategy_id,
182            instrument_id,
183            cancels,
184            command_id,
185            ts_init,
186            params,
187            correlation_id,
188            causation_id: None,
189        }
190    }
191}
192
193impl Display for BatchCancelOrders {
194    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
195        write!(
196            f,
197            "BatchCancelOrders(instrument_id={}, cancels=TBD)",
198            self.instrument_id,
199        )
200    }
201}
202
203#[cfg(test)]
204mod tests {}