StreamerClient

Struct StreamerClient 

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

Streaming client for IG Markets real-time data.

This client manages two Lightstreamer connections for different data types:

  • Market streamer: Handles market data (prices, market state), trade updates (CONFIRMS, OPU, WOU), and account updates (positions, orders, balance). Uses the default adapter.
  • Price streamer: Handles detailed price data (bid/ask levels, sizes, multiple currencies). Uses the “Pricing” adapter.

Each connection type can be managed independently and runs in parallel.

Implementations§

Source§

impl StreamerClient

Source

pub async fn new() -> Result<Self, AppError>

Creates a new streaming client instance.

This initializes both streaming clients (market and price) but does not establish connections yet. Connections are established when connect() is called.

§Returns

Returns a new StreamerClient instance or an error if initialization fails.

Source

pub async fn default() -> Result<Self, AppError>

Creates a default streaming client instance.

Source

pub async fn market_subscribe( &mut self, epics: Vec<String>, fields: HashSet<StreamingMarketField>, ) -> Result<UnboundedReceiver<PriceData>, AppError>

Subscribes to market data updates for the specified instruments.

This method creates a subscription to receive real-time market data updates for the given EPICs and returns a channel receiver for consuming the updates.

§Arguments
  • epics - List of instrument EPICs to subscribe to
  • fields - Set of market data fields to receive (e.g., BID, OFFER, etc.)
§Returns

Returns a receiver channel for PriceData updates, or an error if the subscription setup failed.

§Examples
let mut receiver = client.market_subscribe(
    vec!["IX.D.DAX.DAILY.IP".to_string()],
    fields
).await?;

tokio::spawn(async move {
    while let Some(price_data) = receiver.recv().await {
        println!("Price update: {:?}", price_data);
    }
});
Source

pub async fn trade_subscribe( &mut self, ) -> Result<UnboundedReceiver<TradeFields>, AppError>

Subscribes to trade updates for the account.

This method creates a subscription to receive real-time trade confirmations, order updates (OPU), and working order updates (WOU) for the account, and returns a channel receiver for consuming the updates.

§Returns

Returns a receiver channel for TradeFields updates, or an error if the subscription setup failed.

§Examples
let mut receiver = client.trade_subscribe().await?;

tokio::spawn(async move {
    while let Some(trade_fields) = receiver.recv().await {
        println!("Trade update: {:?}", trade_fields);
    }
});
Source

pub async fn account_subscribe( &mut self, fields: HashSet<StreamingAccountDataField>, ) -> Result<UnboundedReceiver<AccountFields>, AppError>

Subscribes to account data updates.

This method creates a subscription to receive real-time account updates including profit/loss, margin, equity, available funds, and other account metrics, and returns a channel receiver for consuming the updates.

§Arguments
  • fields - Set of account data fields to receive (e.g., PNL, MARGIN, EQUITY, etc.)
§Returns

Returns a receiver channel for AccountFields updates, or an error if the subscription setup failed.

§Examples
let mut receiver = client.account_subscribe(fields).await?;

tokio::spawn(async move {
    while let Some(account_fields) = receiver.recv().await {
        println!("Account update: {:?}", account_fields);
    }
});
Source

pub async fn price_subscribe( &mut self, epics: Vec<String>, fields: HashSet<StreamingPriceField>, ) -> Result<UnboundedReceiver<PriceData>, AppError>

Subscribes to price data updates for the specified instruments.

This method creates a subscription to receive real-time price updates including bid/ask prices, sizes, and multiple currency levels for the given EPICs, and returns a channel receiver for consuming the updates.

§Arguments
  • epics - List of instrument EPICs to subscribe to
  • fields - Set of price data fields to receive (e.g., BID_PRICE1, ASK_PRICE1, etc.)
§Returns

Returns a receiver channel for PriceData updates, or an error if the subscription setup failed.

§Examples
let mut receiver = client.price_subscribe(
    vec!["IX.D.DAX.DAILY.IP".to_string()],
    fields
).await?;

tokio::spawn(async move {
    while let Some(price_data) = receiver.recv().await {
        println!("Price update: {:?}", price_data);
    }
});
Source

pub async fn chart_subscribe( &mut self, epics: Vec<String>, scale: ChartScale, fields: HashSet<StreamingChartField>, ) -> Result<UnboundedReceiver<ChartData>, AppError>

Subscribes to chart data updates for the specified instruments and scale.

This method creates a subscription to receive real-time chart updates including OHLC data, volume, and other chart metrics for the given EPICs and chart scale, and returns a channel receiver for consuming the updates.

§Arguments
  • epics - List of instrument EPICs to subscribe to.
  • scale - Chart scale (e.g., Tick, 1Min, 5Min, etc.).
  • fields - Set of chart data fields to receive (e.g., OPEN, HIGH, LOW, CLOSE, VOLUME).
§Returns

Returns a receiver channel for ChartData updates, or an error if the subscription setup failed.

§Examples
let mut receiver = client.chart_subscribe(
    vec!["IX.D.DAX.DAILY.IP".to_string()],
    ChartScale::OneMin,
    fields
).await?;

tokio::spawn(async move {
    while let Some(chart_data) = receiver.recv().await {
        println!("Chart update: {:?}", chart_data);
    }
});
Source

pub async fn connect( &mut self, shutdown_signal: Option<Arc<Notify>>, ) -> Result<(), AppError>

Connects all active Lightstreamer clients and maintains the connections.

This method establishes connections for all streaming clients that have active subscriptions (market and price). Each client runs in its own task and all connections are maintained until a shutdown signal is received.

§Arguments
  • shutdown_signal - Optional signal to gracefully shutdown all connections. If None, a default signal handler for SIGINT/SIGTERM will be created.
§Returns

Returns Ok(()) when all connections are closed gracefully, or an error if any connection fails after maximum retry attempts.

Source

pub async fn disconnect(&mut self) -> Result<(), AppError>

Disconnects all active Lightstreamer clients.

This method gracefully closes all streaming connections (market and price).

§Returns

Returns Ok(()) if all disconnections were successful.

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.

Source§

impl<T> Instrument for T

Source§

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

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

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

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

Source§

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

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

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

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

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

fn with_current_subscriber(self) -> WithDispatch<Self>

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