Skip to main content

tradingview/study/
mod.rs

1//! TradingView study and fundamental data retrieval.
2//!
3//! Provides a clean, high-level API modeled after [`crate::historical::HistoricalClient`] for fetching
4//! TradingView indicator studies (both built-in and Pine Script studies) over WebSocket.
5//!
6//! # Architecture
7//!
8//! ```text
9//! StudyClient::retrieve(request)
10//!   ├── StudyRequest       (symbol/exchange, study config, interval, bar count, timeout)
11//!   ├── StudyState         (accumulates points keyed by study ID, tracks completion)
12//!   ├── StudyDataHandler   (inspects timescale_update / du for study points)
13//!   └── returns StudyResult (symbol info, sorted/deduplicated points, elapsed duration)
14//! ```
15//!
16//! # Example
17//!
18//! ```no_run
19//! use tradingview::Interval;
20//! use tradingview::chart::study::StudyConfiguration;
21//! use tradingview::study::{StudyClient, StudyRequest};
22//! use tradingview::models::pine_indicator::{PineIndicator, ScriptType};
23//! use tradingview::DataServer;
24//!
25//! # async fn run() -> tradingview::Result<()> {
26//! let client = StudyClient::new("unauthorized_user_token", DataServer::Data);
27//!
28//! let indicator = PineIndicator::build()
29//!     .fetch("STD;Fund_total_revenue_fy", "69.0", ScriptType::IntervalScript)
30//!     .await?;
31//!
32//! let request = StudyRequest::builder()
33//!     .symbol("AAPL")
34//!     .exchange("NASDAQ")
35//!     .interval(Interval::OneDay)
36//!     .base_bar_count(100)
37//!     .study(StudyConfiguration::Pine(Box::new(indicator)))
38//!     .build();
39//!
40//! let result = client.retrieve(request).await?;
41//! println!("received {} study points for {}", result.len(), result.symbol_info.name);
42//! # Ok(())
43//! # }
44//! ```
45
46mod client;
47mod request;
48mod result;
49mod state;
50
51pub use crate::chart::study::StudyConfiguration;
52pub use client::StudyClient;
53pub use request::StudyRequest;
54pub use result::StudyResult;