nautilus_common/messages/execution/
submit.rs

1// -------------------------------------------------------------------------------------------------
2//  Copyright (C) 2015-2025 Posei Systems Pty Ltd. All rights reserved.
3//  https://poseitrader.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 nautilus_core::{UUID4, UnixNanos};
19use nautilus_model::{
20    identifiers::{
21        ClientId, ClientOrderId, ExecAlgorithmId, InstrumentId, PositionId, StrategyId, TraderId,
22        VenueOrderId,
23    },
24    orders::{OrderAny, OrderList},
25};
26use serde::{Deserialize, Serialize};
27
28// Fix: equality and default and builder
29#[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)]
30// #[builder(default)]
31#[serde(tag = "type")]
32pub struct SubmitOrder {
33    pub trader_id: TraderId,
34    pub client_id: ClientId,
35    pub strategy_id: StrategyId,
36    pub instrument_id: InstrumentId,
37    pub client_order_id: ClientOrderId,
38    pub venue_order_id: VenueOrderId,
39    pub order: OrderAny,
40    pub exec_algorith_id: Option<ExecAlgorithmId>,
41    pub position_id: Option<PositionId>,
42    pub command_id: UUID4,
43    pub ts_init: UnixNanos,
44}
45
46impl SubmitOrder {
47    /// Creates a new [`SubmitOrder`] instance.
48    ///
49    /// # Errors
50    ///
51    /// Returns an error if parameters are invalid.
52    #[allow(clippy::too_many_arguments)]
53    pub const fn new(
54        trader_id: TraderId,
55        client_id: ClientId,
56        strategy_id: StrategyId,
57        instrument_id: InstrumentId,
58        client_order_id: ClientOrderId,
59        venue_order_id: VenueOrderId,
60        order: OrderAny,
61        exec_algorith_id: Option<ExecAlgorithmId>,
62        position_id: Option<PositionId>,
63        command_id: UUID4,
64        ts_init: UnixNanos,
65    ) -> anyhow::Result<Self> {
66        Ok(Self {
67            trader_id,
68            client_id,
69            strategy_id,
70            instrument_id,
71            client_order_id,
72            venue_order_id,
73            order,
74            exec_algorith_id,
75            position_id,
76            command_id,
77            ts_init,
78        })
79    }
80}
81
82impl Display for SubmitOrder {
83    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
84        write!(
85            f,
86            "SubmitOrder(instrument_id={}, order=TBD, position_id={})",
87            self.instrument_id,
88            self.position_id
89                .map_or("None".to_string(), |position_id| format!("{position_id}")),
90        )
91    }
92}
93
94#[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)]
95#[serde(tag = "type")]
96pub struct SubmitOrderList {
97    pub trader_id: TraderId,
98    pub client_id: ClientId,
99    pub strategy_id: StrategyId,
100    pub instrument_id: InstrumentId,
101    pub client_order_id: ClientOrderId,
102    pub venue_order_id: VenueOrderId,
103    pub order_list: OrderList,
104    pub exec_algorith_id: Option<ExecAlgorithmId>,
105    pub position_id: Option<PositionId>,
106    pub command_id: UUID4,
107    pub ts_init: UnixNanos,
108}
109
110impl SubmitOrderList {
111    /// Creates a new [`SubmitOrderList`] instance.
112    ///
113    /// # Errors
114    ///
115    /// Returns an error if parameters are invalid.
116    #[allow(clippy::too_many_arguments)]
117    pub const fn new(
118        trader_id: TraderId,
119        client_id: ClientId,
120        strategy_id: StrategyId,
121        instrument_id: InstrumentId,
122        client_order_id: ClientOrderId,
123        venue_order_id: VenueOrderId,
124        order_list: OrderList,
125        exec_algorith_id: Option<ExecAlgorithmId>,
126        position_id: Option<PositionId>,
127        command_id: UUID4,
128        ts_init: UnixNanos,
129    ) -> anyhow::Result<Self> {
130        Ok(Self {
131            trader_id,
132            client_id,
133            strategy_id,
134            instrument_id,
135            client_order_id,
136            venue_order_id,
137            order_list,
138            exec_algorith_id,
139            position_id,
140            command_id,
141            ts_init,
142        })
143    }
144}
145
146impl Display for SubmitOrderList {
147    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
148        write!(
149            f,
150            "SubmitOrderList(instrument_id={}, order_list=TBD, position_id={})",
151            self.instrument_id,
152            self.position_id
153                .map_or("None".to_string(), |position_id| format!("{position_id}")),
154        )
155    }
156}