Skip to main content

tradingview/quote/
models.rs

1use serde::{Deserialize, Serialize};
2use ustr::Ustr;
3
4/// A single quote field as delivered by TradingView's WebSocket stream.
5///
6/// Each quote update contains a field `name` (e.g. `"lp"`, `"bid"`, `"ask"`),
7/// a `status` code, and a [`QuoteValue`] payload.
8#[derive(Debug, Default, Clone, PartialEq, Deserialize, Serialize, Copy)]
9pub struct QuoteData {
10    #[serde(rename(deserialize = "n"))]
11    pub name: Ustr,
12    #[serde(rename(deserialize = "s"))]
13    pub status: Ustr,
14    #[serde(rename(deserialize = "v"))]
15    pub value: QuoteValue,
16}
17
18/// The value payload of a quote update.
19///
20/// All fields are optional — TradingView only includes the fields that have
21/// changed since the last update. Common fields include `price` (last price),
22/// `bid`/`ask`, `volume`, `change`/`change_percent`, and OHLC values.
23#[derive(Clone, PartialEq, Deserialize, Serialize, Debug, Default, Copy)]
24pub struct QuoteValue {
25    #[serde(default)]
26    pub ask: Option<f64>,
27    #[serde(default)]
28    pub ask_size: Option<f64>,
29    #[serde(default)]
30    pub bid: Option<f64>,
31    #[serde(default)]
32    pub bid_size: Option<f64>,
33    #[serde(default, rename(deserialize = "ch"))]
34    pub change: Option<f64>,
35    #[serde(default, rename(deserialize = "chp"))]
36    pub change_percent: Option<f64>,
37    #[serde(default, rename(deserialize = "open_price"))]
38    pub open: Option<f64>,
39    #[serde(default, rename(deserialize = "high_price"))]
40    pub high: Option<f64>,
41    #[serde(default, rename(deserialize = "low_price"))]
42    pub low: Option<f64>,
43    #[serde(default, rename(deserialize = "prev_close_price"))]
44    pub prev_close: Option<f64>,
45    #[serde(default, rename(deserialize = "lp"))]
46    pub price: Option<f64>,
47    #[serde(default, rename(deserialize = "lp_time"))]
48    pub timestamp: Option<f64>,
49    #[serde(default)]
50    pub volume: Option<f64>,
51    #[serde(default, rename(deserialize = "currency_id"))]
52    pub currency: Option<Ustr>,
53    #[serde(default, rename(deserialize = "short_name"))]
54    pub symbol: Option<Ustr>,
55    #[serde(default, rename(deserialize = "exchange"))]
56    pub exchange: Option<Ustr>,
57    #[serde(default, rename(deserialize = "type"))]
58    pub market_type: Option<Ustr>,
59}