Skip to content

Commit

Permalink
Scaffold execution messages in Rust
Browse files Browse the repository at this point in the history
  • Loading branch information
cjdsellers committed Apr 14, 2024
1 parent 2746e1b commit 931f357
Show file tree
Hide file tree
Showing 24 changed files with 502 additions and 23 deletions.
1 change: 1 addition & 0 deletions nautilus_core/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions nautilus_core/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ documentation = "https://docs.nautilustrader.io"
[workspace.dependencies]
anyhow = "1.0.82"
chrono = "0.4.37"
derive_builder = "0.20.0"
futures = "0.3.30"
indexmap = { version = "2.2.6", features = ["serde"] }
itertools = "0.12.1"
Expand Down
1 change: 1 addition & 0 deletions nautilus_core/execution/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ nautilus-common = { path = "../common" }
nautilus-core = { path = "../core" }
nautilus-model = { path = "../model", features = ["stubs"] }
anyhow = { workspace = true }
derive_builder = { workspace = true }
indexmap = { workspace = true }
log = { workspace = true }
pyo3 = { workspace = true, optional = true }
Expand Down
1 change: 1 addition & 0 deletions nautilus_core/execution/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,4 @@
pub mod client;
pub mod engine;
pub mod matching_core;
pub mod messages;
79 changes: 79 additions & 0 deletions nautilus_core/execution/src/messages/cancel.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
// -------------------------------------------------------------------------------------------------
// Copyright (C) 2015-2024 Nautech Systems Pty Ltd. All rights reserved.
// https://nautechsystems.io
//
// Licensed under the GNU Lesser General Public License Version 3.0 (the "License");
// You may not use this file except in compliance with the License.
// You may obtain a copy of the License at https://www.gnu.org/licenses/lgpl-3.0.en.html
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// -------------------------------------------------------------------------------------------------

use std::fmt::Display;

use derive_builder::Builder;
use nautilus_core::{time::UnixNanos, uuid::UUID4};
use nautilus_model::identifiers::{
client_id::ClientId, client_order_id::ClientOrderId, instrument_id::InstrumentId,
strategy_id::StrategyId, trader_id::TraderId, venue_order_id::VenueOrderId,
};
use serde::{Deserialize, Serialize};

#[derive(Clone, PartialEq, Eq, Debug, Default, Serialize, Deserialize, Builder)]
#[builder(default)]
#[serde(tag = "type")]
pub struct CancelOrder {
pub trader_id: TraderId,
pub client_id: ClientId,
pub strategy_id: StrategyId,
pub instrument_id: InstrumentId,
pub client_order_id: ClientOrderId,
pub venue_order_id: VenueOrderId,
pub command_id: UUID4,
pub ts_init: UnixNanos,
}

impl CancelOrder {
#[allow(clippy::too_many_arguments)]
pub fn new(
trader_id: TraderId,
client_id: ClientId,
strategy_id: StrategyId,
instrument_id: InstrumentId,
client_order_id: ClientOrderId,
venue_order_id: VenueOrderId,
command_id: UUID4,
ts_init: UnixNanos,
) -> anyhow::Result<Self> {
Ok(Self {
trader_id,
client_id,
strategy_id,
instrument_id,
client_order_id,
venue_order_id,
command_id,
ts_init,
})
}
}

impl Display for CancelOrder {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"CancelOrder(instrument_id={}, client_order_id={}, venue_order_id={})",
self.instrument_id, self.client_order_id, self.venue_order_id,
)
}
}

////////////////////////////////////////////////////////////////////////////////
// Tests
////////////////////////////////////////////////////////////////////////////////
#[cfg(test)]
mod tests {}
79 changes: 79 additions & 0 deletions nautilus_core/execution/src/messages/cancel_all.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
// -------------------------------------------------------------------------------------------------
// Copyright (C) 2015-2024 Nautech Systems Pty Ltd. All rights reserved.
// https://nautechsystems.io
//
// Licensed under the GNU Lesser General Public License Version 3.0 (the "License");
// You may not use this file except in compliance with the License.
// You may obtain a copy of the License at https://www.gnu.org/licenses/lgpl-3.0.en.html
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// -------------------------------------------------------------------------------------------------

use std::fmt::Display;

use derive_builder::Builder;
use nautilus_core::{time::UnixNanos, uuid::UUID4};
use nautilus_model::{
enums::OrderSide,
identifiers::{
client_id::ClientId, instrument_id::InstrumentId, strategy_id::StrategyId,
trader_id::TraderId,
},
};
use serde::{Deserialize, Serialize};

#[derive(Clone, PartialEq, Eq, Debug, Default, Serialize, Deserialize, Builder)]
#[builder(default)]
#[serde(tag = "type")]
pub struct CancelAllOrders {
pub trader_id: TraderId,
pub client_id: ClientId,
pub strategy_id: StrategyId,
pub instrument_id: InstrumentId,
pub order_side: OrderSide,
pub command_id: UUID4,
pub ts_init: UnixNanos,
}

impl CancelAllOrders {
#[allow(clippy::too_many_arguments)]
pub fn new(
trader_id: TraderId,
client_id: ClientId,
strategy_id: StrategyId,
instrument_id: InstrumentId,
order_side: OrderSide,
command_id: UUID4,
ts_init: UnixNanos,
) -> anyhow::Result<Self> {
Ok(Self {
trader_id,
client_id,
strategy_id,
instrument_id,
order_side,
command_id,
ts_init,
})
}
}

impl Display for CancelAllOrders {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"CancelAllOrders(instrument_id={}, order_side={})",
self.instrument_id, self.order_side,
)
}
}

////////////////////////////////////////////////////////////////////////////////
// Tests
////////////////////////////////////////////////////////////////////////////////
#[cfg(test)]
mod tests {}
21 changes: 21 additions & 0 deletions nautilus_core/execution/src/messages/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
// -------------------------------------------------------------------------------------------------
// Copyright (C) 2015-2024 Nautech Systems Pty Ltd. All rights reserved.
// https://nautechsystems.io
//
// Licensed under the GNU Lesser General Public License Version 3.0 (the "License");
// You may not use this file except in compliance with the License.
// You may obtain a copy of the License at https://www.gnu.org/licenses/lgpl-3.0.en.html
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// -------------------------------------------------------------------------------------------------

pub mod cancel;
pub mod cancel_all;
pub mod modify;
pub mod query;
pub mod submit;
pub mod submit_list;
94 changes: 94 additions & 0 deletions nautilus_core/execution/src/messages/modify.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
// -------------------------------------------------------------------------------------------------
// Copyright (C) 2015-2024 Nautech Systems Pty Ltd. All rights reserved.
// https://nautechsystems.io
//
// Licensed under the GNU Lesser General Public License Version 3.0 (the "License");
// You may not use this file except in compliance with the License.
// You may obtain a copy of the License at https://www.gnu.org/licenses/lgpl-3.0.en.html
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// -------------------------------------------------------------------------------------------------

use std::fmt::Display;

use derive_builder::Builder;
use nautilus_core::{time::UnixNanos, uuid::UUID4};
use nautilus_model::{
identifiers::{
client_id::ClientId, client_order_id::ClientOrderId, instrument_id::InstrumentId,
strategy_id::StrategyId, trader_id::TraderId, venue_order_id::VenueOrderId,
},
types::{price::Price, quantity::Quantity},
};
use serde::{Deserialize, Serialize};

#[derive(Clone, PartialEq, Eq, Debug, Default, Serialize, Deserialize, Builder)]
#[builder(default)]
#[serde(tag = "type")]
pub struct ModifyOrder {
pub trader_id: TraderId,
pub client_id: ClientId,
pub strategy_id: StrategyId,
pub instrument_id: InstrumentId,
pub client_order_id: ClientOrderId,
pub venue_order_id: VenueOrderId,
pub quantity: Option<Quantity>,
pub price: Option<Price>,
pub trigger_price: Option<Price>,
pub command_id: UUID4,
pub ts_init: UnixNanos,
}

impl ModifyOrder {
#[allow(clippy::too_many_arguments)]
pub fn new(
trader_id: TraderId,
client_id: ClientId,
strategy_id: StrategyId,
instrument_id: InstrumentId,
client_order_id: ClientOrderId,
venue_order_id: VenueOrderId,
quantity: Option<Quantity>,
price: Option<Price>,
trigger_price: Option<Price>,
command_id: UUID4,
ts_init: UnixNanos,
) -> anyhow::Result<Self> {
Ok(Self {
trader_id,
client_id,
strategy_id,
instrument_id,
client_order_id,
venue_order_id,
quantity,
price,
trigger_price,
command_id,
ts_init,
})
}
}

impl Display for ModifyOrder {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"ModifyOrder(instrument_id={}, client_order_id={}, venue_order_id={}, quantity={}, price={}, trigger_price={})",
self.instrument_id, self.client_order_id, self.venue_order_id,
self.quantity.map_or("None".to_string(), |quantity| format!("{quantity}")),
self.price.map_or("None".to_string(), |price| format!("{price}")),
self.trigger_price.map_or("None".to_string(), |trigger_price| format!("{trigger_price}")),
)
}
}

////////////////////////////////////////////////////////////////////////////////
// Tests
////////////////////////////////////////////////////////////////////////////////
#[cfg(test)]
mod tests {}
79 changes: 79 additions & 0 deletions nautilus_core/execution/src/messages/query.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
// -------------------------------------------------------------------------------------------------
// Copyright (C) 2015-2024 Nautech Systems Pty Ltd. All rights reserved.
// https://nautechsystems.io
//
// Licensed under the GNU Lesser General Public License Version 3.0 (the "License");
// You may not use this file except in compliance with the License.
// You may obtain a copy of the License at https://www.gnu.org/licenses/lgpl-3.0.en.html
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// -------------------------------------------------------------------------------------------------

use std::fmt::Display;

use derive_builder::Builder;
use nautilus_core::{time::UnixNanos, uuid::UUID4};
use nautilus_model::identifiers::{
client_id::ClientId, client_order_id::ClientOrderId, instrument_id::InstrumentId,
strategy_id::StrategyId, trader_id::TraderId, venue_order_id::VenueOrderId,
};
use serde::{Deserialize, Serialize};

#[derive(Clone, PartialEq, Eq, Debug, Default, Serialize, Deserialize, Builder)]
#[builder(default)]
#[serde(tag = "type")]
pub struct QueryOrder {
pub trader_id: TraderId,
pub client_id: ClientId,
pub strategy_id: StrategyId,
pub instrument_id: InstrumentId,
pub client_order_id: ClientOrderId,
pub venue_order_id: VenueOrderId,
pub command_id: UUID4,
pub ts_init: UnixNanos,
}

impl QueryOrder {
#[allow(clippy::too_many_arguments)]
pub fn new(
trader_id: TraderId,
client_id: ClientId,
strategy_id: StrategyId,
instrument_id: InstrumentId,
client_order_id: ClientOrderId,
venue_order_id: VenueOrderId,
command_id: UUID4,
ts_init: UnixNanos,
) -> anyhow::Result<Self> {
Ok(Self {
trader_id,
client_id,
strategy_id,
instrument_id,
client_order_id,
venue_order_id,
command_id,
ts_init,
})
}
}

impl Display for QueryOrder {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"QueryOrder(instrument_id={}, client_order_id={}, venue_order_id={})",
self.instrument_id, self.client_order_id, self.venue_order_id,
)
}
}

////////////////////////////////////////////////////////////////////////////////
// Tests
////////////////////////////////////////////////////////////////////////////////
#[cfg(test)]
mod tests {}
Loading

0 comments on commit 931f357

Please sign in to comment.