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;