# Usage Guides QuanTAlib supports four distinct operating modes to handle different architectural requirements. ## 1. Span Mode (High Performance) **Best for:** Backtesting, batch processing, research. Operates directly on `Span` or arrays. Zero allocations, maximum speed. ```csharp using QuanTAlib; // 1. Prepare data double[] prices = GetPrices(); // Your data source double[] results = new double[prices.Length]; // 2. Calculate // Sma.Calculate(source, destination, period) Sma.Calculate(prices, results, 14); // 3. Use results Console.WriteLine($"Last SMA: {results[^1]}"); ``` ## 2. Streaming Mode (Real-Time) **Best for:** Live trading, tick-by-tick analysis. Updates one value at a time. Maintains internal state. ```csharp using QuanTAlib; // 1. Initialize var sma = new Sma(period: 14); // 2. Update loop (e.g., connected to a feed) void OnData(double price) { // Update returns a TValue struct { Time, Value, IsHot } TValue result = sma.Update(new TValue(DateTime.UtcNow, price)); if (result.IsHot) { Console.WriteLine($"SMA: {result.Value}"); } } // 3. Handle bar updates (correction) // If your feed sends updates for the *same* bar multiple times: sma.Update(new TValue(time, openPrice), isNew: true); // New bar opens sma.Update(new TValue(time, currentPrice), isNew: false); // Price changes within bar ``` ## 3. Batch Mode (TSeries) **Best for:** Exploratory analysis, notebooks. Wraps calculations in `TSeries` objects that handle timestamps and alignment. ```csharp using QuanTAlib; // 1. Create series TSeries prices = new TSeries(); prices.Add(DateTime.Now, 100.0); prices.Add(DateTime.Now.AddMinutes(1), 101.0); // ... add more data ... // 2. Calculate // Returns a new TSeries aligned with input TSeries smaSeries = new Sma(prices, period: 14); // 3. Access Console.WriteLine($"Last Value: {smaSeries.Last.Value}"); Console.WriteLine($"Value at index 5: {smaSeries[5].Value}"); ``` ## 4. Event-Driven Architecture **Best for:** Complex reactive systems. Indicators can subscribe to other indicators or data sources. ```csharp using QuanTAlib; // 1. Setup chain var source = new TSeries(); var smaFast = new Sma(source, 10); var smaSlow = new Sma(source, 20); // 2. Subscribe to events smaFast.Pub += (sender, args) => { Console.WriteLine($"Fast SMA updated: {args.Tick.Value}"); }; // 3. Feed data // This triggers the chain: source -> smaFast -> event handler source.Add(DateTime.UtcNow, 105.0); ``` ## Common Patterns ### Handling Warmup Always check `IsHot` or `Count` before using values. ```csharp var rsi = new Rsi(14); // ... feed data ... if (rsi.IsHot) { // Safe to use rsi.Value } ``` ### Combining Indicators You can feed the output of one indicator into another. ```csharp var ema = new Ema(period: 12); var rsiOfEma = new Rsi(period: 14); void OnData(double price) { var emaResult = ema.Update(new TValue(DateTime.UtcNow, price)); var finalResult = rsiOfEma.Update(emaResult); }