DydxExecutionClient

Struct DydxExecutionClient 

Source
pub struct DydxExecutionClient { /* private fields */ }
Expand description

Live execution client for the dYdX v4 exchange adapter.

Supports Market and Limit orders via gRPC. Conditional orders (Stop, Take Profit, Trailing Stop) planned for future releases. dYdX requires u32 client IDs - strings are hashed to fit this constraint.

§Architecture

The client follows a two-layer execution model:

  1. Synchronous validation - Immediate checks and event generation
  2. Async submission - Non-blocking gRPC calls via OrderSubmitter

This matches the pattern used in OKX and other exchange adapters, ensuring consistent behavior across the Nautilus ecosystem.

Implementations§

Source§

impl DydxExecutionClient

Source

pub fn new( core: ExecutionClientCore, config: DydxAdapterConfig, wallet_address: String, subaccount_number: u32, ) -> Result<Self>

Creates a new DydxExecutionClient.

§Errors

Returns an error if the WebSocket client fails to construct.

Trait Implementations§

Source§

impl Debug for DydxExecutionClient

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl ExecutionClient for DydxExecutionClient

Source§

fn submit_order(&self, cmd: &SubmitOrder) -> Result<()>

Submits an order to dYdX via gRPC.

dYdX requires u32 client IDs - Nautilus ClientOrderId strings are hashed to fit. Only Market and Limit orders supported currently. Conditional orders (Stop, Take Profit) will be implemented in future releases.

Validates synchronously, generates OrderSubmitted event, then spawns async task for gRPC submission to avoid blocking. Unsupported order types generate OrderRejected.

Source§

fn cancel_order(&self, cmd: &CancelOrder) -> Result<()>

Cancels an order on dYdX exchange.

Validates the order state and retrieves instrument details before spawning an async task to cancel via gRPC.

§Validation
  • Checks order exists in cache
  • Validates order is not already closed
  • Retrieves instrument from cache for order builder

The cmd contains client/venue order IDs. Returns Ok(()) if cancel request is spawned successfully or validation fails gracefully. Returns Err if not connected.

§Events
  • OrderCanceled - Generated when WebSocket confirms cancellation
  • OrderCancelRejected - Generated if exchange rejects cancellation
Source§

fn is_connected(&self) -> bool

Source§

fn client_id(&self) -> ClientId

Source§

fn account_id(&self) -> AccountId

Source§

fn venue(&self) -> Venue

Source§

fn oms_type(&self) -> OmsType

Source§

fn get_account(&self) -> Option<AccountAny>

Source§

fn generate_account_state( &self, balances: Vec<AccountBalance>, margins: Vec<MarginBalance>, reported: bool, ts_event: UnixNanos, ) -> Result<()>

Generates and publishes the account state event. Read more
Source§

fn start(&mut self) -> Result<()>

Starts the execution client. Read more
Source§

fn stop(&mut self) -> Result<()>

Stops the execution client. Read more
Source§

fn submit_order_list(&self, _cmd: &SubmitOrderList) -> Result<()>

Submits a list of orders to the execution venue. Read more
Source§

fn modify_order(&self, _cmd: &ModifyOrder) -> Result<()>

Modifies an existing order. Read more
Source§

fn cancel_all_orders(&self, cmd: &CancelAllOrders) -> Result<()>

Cancels all orders. Read more
Source§

fn batch_cancel_orders(&self, _cmd: &BatchCancelOrders) -> Result<()>

Cancels a batch of orders. Read more
Source§

fn query_account(&self, _cmd: &QueryAccount) -> Result<()>

Queries the status of an account. Read more
Source§

fn query_order(&self, _cmd: &QueryOrder) -> Result<()>

Queries the status of an order. Read more
Source§

impl LiveExecutionClient for DydxExecutionClient

Source§

fn get_message_channel(&self) -> UnboundedSender<ExecutionEvent>

Source§

fn get_clock(&self) -> Ref<'_, dyn Clock>

Source§

fn connect<'life0, 'async_trait>( &'life0 mut self, ) -> Pin<Box<dyn Future<Output = Result<()>> + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Establishes a connection for live execution. Read more
Source§

fn disconnect<'life0, 'async_trait>( &'life0 mut self, ) -> Pin<Box<dyn Future<Output = Result<()>> + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Disconnects the live execution client. Read more
Source§

fn generate_order_status_report<'life0, 'life1, 'async_trait>( &'life0 self, cmd: &'life1 GenerateOrderStatusReport, ) -> Pin<Box<dyn Future<Output = Result<Option<OrderStatusReport>>> + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Generates a single order status report. Read more
Source§

fn generate_order_status_reports<'life0, 'life1, 'async_trait>( &'life0 self, cmd: &'life1 GenerateOrderStatusReport, ) -> Pin<Box<dyn Future<Output = Result<Vec<OrderStatusReport>>> + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Generates multiple order status reports. Read more
Source§

fn generate_fill_reports<'life0, 'async_trait>( &'life0 self, cmd: GenerateFillReports, ) -> Pin<Box<dyn Future<Output = Result<Vec<FillReport>>> + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Generates fill reports based on execution results. Read more
Source§

fn generate_position_status_reports<'life0, 'life1, 'async_trait>( &'life0 self, cmd: &'life1 GeneratePositionReports, ) -> Pin<Box<dyn Future<Output = Result<Vec<PositionStatusReport>>> + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Generates position status reports. Read more
Source§

fn generate_mass_status<'life0, 'async_trait>( &'life0 self, lookback_mins: Option<u64>, ) -> Pin<Box<dyn Future<Output = Result<Option<ExecutionMassStatus>>> + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Generates mass status for executions. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
§

impl<T> IntoRequest<T> for T

§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
§

impl<T> IntoRequest<T> for T

§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
§

impl<L> LayerExt<L> for L

§

fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>
where L: Layer<S>,

Applies the layer to a service and wraps it in [Layered].
§

impl<L> LayerExt<L> for L

§

fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>
where L: Layer<S>,

Applies the layer to a service and wraps it in [Layered].
§

impl<T> Pointable for T

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> PolicyExt for T
where T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more