Skip to main content

Side

Enum Side 

pub enum Side {
    Buy,
    Sell,
    Unspecified,
}
Expand description

Order direction specifying whether to buy or sell the base asset.

This enum defines the fundamental direction of an order, determining whether the trader wants to purchase (buy) or dispose of (sell) the base asset in a trading pair. Side is one of the most basic but critical order parameters.

§Market Pair Interpretation

In a trading pair like “BTCUSD”:

  • Base Asset: BTC (the asset being traded)
  • Quote Asset: USD (the asset used for pricing/payment)

§Buy Orders

  • Action: Purchase base asset (BTC)
  • Payment: Using quote asset (USD)
  • Result: Increase BTC position, decrease USD balance

§Sell Orders

  • Action: Dispose of base asset (BTC)
  • Receipt: Receive quote asset (USD)
  • Result: Decrease BTC position, increase USD balance

§Position Impact

Current PositionBuy OrderSell Order
Flat (0)LongShort
Long (+)LargerSmaller/Short
Short (-)Smaller/LongLarger

§Usage Examples

§Basic buy and sell orders

use types::common::Side;

// Buy 1 BTC with USD
let buy_order = Side::Buy;

// Sell 1 BTC for USD
let sell_order = Side::Sell;

// Sides can be flipped for opposite orders
assert_eq!(buy_order.flip(), Side::Sell);
assert_eq!(sell_order.flip(), Side::Buy);

§Order matching logic

use types::common::Side;

// Buy orders match against sell orders at same/better price
let incoming_buy = Side::Buy;   // Matches existing sells
let incoming_sell = Side::Sell; // Matches existing buys

// Order book has two sides
// Bid side: Buy orders (buyers willing to purchase)
// Ask side: Sell orders (sellers willing to sell)

§Risk and Position Management

§Reduce-Only Orders

  • Long position + Sell order: Reduces position (allowed)
  • Long position + Buy order: Increases position (blocked if reduce-only)
  • Short position + Buy order: Reduces position (allowed)
  • Short position + Sell order: Increases position (blocked if reduce-only)

§Stop-Loss Applications

  • Long position stop-loss: Sell order triggered on price drop
  • Short position stop-loss: Buy order triggered on price rise

§Trading Strategy Context

§Directional Strategies

  • Bullish: More buy orders, building long positions
  • Bearish: More sell orders, building short positions
  • Neutral: Balanced buy/sell for market making or arbitrage

§Market Making

  • Bid orders: Buy orders below current market price
  • Ask orders: Sell orders above current market price
  • Spread capture: Profit from bid-ask spread

§JSON Representation

"Buy"   // Purchase base asset
"Sell"  // Dispose of base asset

§Validation

  • Must not be Unspecified in valid orders
  • Should align with intended strategy and position management
  • Consider current position when using reduce-only flag

Variants§

§

Buy

Buy order - purchase the base asset using the quote asset.

Buy orders express demand for the base asset and willingness to pay the quote asset. They increase long positions or reduce short positions when executed.

§Market Mechanics

  • Order book side: Bid side (buyers)
  • Liquidity role: Can be maker (bid below market) or taker (bid at/above market)
  • Matching: Executes against existing sell orders
  • Price improvement: Executes at ask price or better (lower)

§Position Effects

  • From flat: Creates long position
  • From long: Increases position size (adds to long)
  • From short: Reduces position size (covers short)

§Execution Examples

§Limit Buy Order
  • Order: Buy 1 BTC at $50,000 (limit)
  • Execution: If market trades at $50,000 or lower
  • Result: Acquire 1 BTC, pay ≤ $50,000
§Market Buy Order
  • Order: Buy 1 BTC at market price
  • Execution: Immediately at best available ask price
  • Result: Acquire 1 BTC, pay current ask price

§Risk Considerations

  • Price risk: May pay higher than expected (market orders)
  • Liquidity risk: Large orders may impact price unfavorably
  • Margin requirements: May require additional collateral

§Common Use Cases

  • Opening long positions
  • Covering short positions
  • Dollar-cost averaging (regular buy orders)
  • Breakout trading (buy on resistance breaks)
  • Stop-loss for short positions
§

Sell

Sell order - dispose of the base asset to receive the quote asset.

Sell orders express supply of the base asset and willingness to accept the quote asset. They increase short positions or reduce long positions when executed.

§Market Mechanics

  • Order book side: Ask side (sellers)
  • Liquidity role: Can be maker (ask above market) or taker (ask at/below market)
  • Matching: Executes against existing buy orders
  • Price improvement: Executes at bid price or better (higher)

§Position Effects

  • From flat: Creates short position
  • From long: Reduces position size (sells long)
  • From short: Increases position size (adds to short)

§Execution Examples

§Limit Sell Order
  • Order: Sell 1 ETH at $3,500 (limit)
  • Execution: If market trades at $3,500 or higher
  • Result: Dispose 1 ETH, receive ≥ $3,500
§Market Sell Order
  • Order: Sell 1 ETH at market price
  • Execution: Immediately at best available bid price
  • Result: Dispose 1 ETH, receive current bid price

§Risk Considerations

  • Price risk: May receive less than expected (market orders)
  • Liquidity risk: Large orders may depress prices
  • Short selling risks: Unlimited loss potential for naked shorts

§Common Use Cases

  • Closing long positions (profit taking or loss cutting)
  • Opening short positions (bearish speculation)
  • Stop-loss for long positions
  • Rebalancing portfolios
  • Arbitrage opportunities
§

Unspecified

Unspecified order side - invalid for actual orders.

This is what serde substitutes when a submitted request omits side; validation then rejects the order. It is not Side::default() — #[default] sits on Buy, so building a request with Side::default() silently submits a buy — and it is not what SubmitOrderRequestBuilder starts from either: the builder holds Option<Side> and build() reports a missing field.

§Behavior

  • Always causes order validation to fail
  • Never valid for order submission
  • Should be replaced with Buy or Sell before submission
  • Will cause flip() method to panic if used

Implementations§

§

impl Side

pub fn flip(&self) -> Side

Trait Implementations§

§

impl Clone for Side

§

fn clone(&self) -> Side

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
§

impl Copy for Side

§

impl Debug for Side

§

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

Formats the value using the given formatter. Read more
§

impl Default for Side

§

fn default() -> Side

Returns the “default value” for a type. Read more
§

impl<'de> Deserialize<'de> for Side

§

fn deserialize<__D>( __deserializer: __D, ) -> Result<Side, <__D as Deserializer<'de>>::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
§

impl Eq for Side

§

impl PartialEq for Side

§

fn eq(&self, other: &Side) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
§

impl Serialize for Side

§

fn serialize<__S>( &self, __serializer: __S, ) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more
§

impl StructuralPartialEq for Side

Auto Trait Implementations§

§

impl Freeze for Side

§

impl RefUnwindSafe for Side

§

impl Send for Side

§

impl Sync for Side

§

impl Unpin for Side

§

impl UnsafeUnpin for Side

§

impl UnwindSafe for Side

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
§

impl<U> As for U

§

fn as_<T>(self) -> T
where T: CastFrom<U>, U: Sized,

Casts self to type T. The semantics of numeric casting with the as operator are followed, so <T as As>::as_::<U> can be used in the same way as T as U for numeric conversions. Read more
§

impl<T> AsOut<T> for T
where T: Copy,

§

fn as_out(&mut self) -> Out<'_, T>

Returns an out reference to self.
§

impl<'a, T, E> AsTaggedExplicit<'a, E> for T
where T: 'a,

§

fn explicit(self, class: Class, tag: u32) -> TaggedParser<'a, Explicit, Self, E>

§

impl<'a, T, E> AsTaggedImplicit<'a, E> for T
where T: 'a,

§

fn implicit( self, class: Class, constructed: bool, tag: u32, ) -> TaggedParser<'a, Implicit, Self, E>

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
§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

§

impl<T> Clear for T
where T: InitializableFromZeroed + ?Sized,

§

fn clear(&mut self)

Completely overwrites this value.
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
Source§

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,

Source§

impl<T> DynClone for T
where T: Clone,

Source§

fn __clone_box(&self, _: Private) -> *mut ()

§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> FromRef<T> for T
where T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
§

impl<T> InitializableFromZeroed for T
where T: Default,

§

unsafe fn initialize(place: *mut T)

Called to initialize a place to a valid value, after it is set to all-bits-zero. Read more
§

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 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> MaybeSend for T
where T: Send,

§

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

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
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