DydxExecutionClient

Struct DydxExecutionClient 

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

Live execution client for the dYdX v4 exchange adapter.

Supports Market, Limit, Stop Market, Stop Limit, Take Profit Market (MarketIfTouched), and Take Profit Limit (LimitIfTouched) orders via gRPC. Trailing stops are NOT supported by the dYdX v4 protocol. dYdX requires u32 client IDs - strings are hashed to fit.

§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.

Supported order types:

  • Market orders (short-term, IOC)
  • Limit orders (short-term or long-term based on TIF)
  • Stop Market orders (conditional, triggered at stop price)
  • Stop Limit orders (conditional, triggered at stop price, executed at limit)
  • Take Profit Market (MarketIfTouched - triggered at take profit price)
  • Take Profit Limit (LimitIfTouched - triggered at take profit price, executed at limit)

Trailing stop orders are NOT supported by dYdX v4 protocol.

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§

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

Connects the client to the execution venue. 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 client from the execution venue. Read more
Source§

impl LiveExecutionClient for DydxExecutionClient

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§

§

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

§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

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

§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
§

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

§

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

Mutably borrows from an owned value. Read more
§

impl<T> From<T> for T

§

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
§

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

§

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<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> 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
§

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

§

type Error = Infallible

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

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

Performs the conversion.
§

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

§

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

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

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