Files
QuanTAlib/lib/channels/vwapsd/Vwapsd.Quantower.cs
T
Miha Kralj 2836f253c4 Refactor error handling and calculations in TheilU, Wmape, and TukeyBiweight classes; update buffer handling for consistency
- Updated buffer handling in TheilU and Wmape classes to ensure consistency after adding new values.
- Changed the resync interval constant in TukeyBiweight for better clarity.
- Refactored state structures to record structs in Gauss, Hann, Hp, Hpf, Kalman, Loess, Notch, and other filter classes for improved performance and readability.
- Enhanced numerical stability in Mama class calculations using Fused Multiply-Add (FMA) for precision.
- Added comprehensive tests for Atan2 validation to compare .NET's Math.Atan2 with PineScript's implementation, ensuring accuracy across various edge cases.
- Updated NDepend badges to reflect changes in classes, methods, and lines of code.
2026-01-24 23:07:09 -08:00

71 lines
2.7 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System.Drawing;
using TradingPlatform.BusinessLayer;
namespace QuanTAlib;
public class VwapsdIndicator : Indicator, IWatchlistIndicator
{
[InputParameter("Number of Deviations", sortIndex: 1, minimum: 0.1, maximum: 5.0, increment: 0.1, decimalPlaces: 1)]
public double NumDevs { get; set; } = 2.0;
[InputParameter("Show cold values", sortIndex: 21)]
public bool ShowColdValues { get; set; } = true;
private Vwapsd? vwapsd;
protected LineSeries? VwapSeries;
protected LineSeries? UpperSeries;
protected LineSeries? LowerSeries;
protected LineSeries? WidthSeries;
#pragma warning disable S2325 // Methods and properties that don't access instance data should be static
public int MinHistoryDepths => 2;
#pragma warning restore S2325
int IWatchlistIndicator.MinHistoryDepths => MinHistoryDepths;
public override string ShortName => $"VWAPSD ({NumDevs:F1})";
public override string SourceCodeLink => "https://github.com/mihakralj/QuanTAlib/blob/main/lib/channels/vwapsd/Vwapsd.cs";
public VwapsdIndicator()
{
Name = "VWAPSD - Volume Weighted Average Price with Configurable Standard Deviation Bands";
Description = "Volume weighted average price with configurable standard deviation bands";
VwapSeries = new("VWAP", Color.Blue, 2, LineStyle.Solid);
UpperSeries = new($"Upper (+{NumDevs}σ)", Color.Red, 1, LineStyle.Solid);
LowerSeries = new($"Lower (-{NumDevs}σ)", Color.Green, 1, LineStyle.Solid);
WidthSeries = new("Width", Color.Gray, 1, LineStyle.Dot);
AddLineSeries(VwapSeries);
AddLineSeries(UpperSeries);
AddLineSeries(LowerSeries);
AddLineSeries(WidthSeries);
SeparateWindow = false;
OnBackGround = true;
}
protected override void OnInit()
{
vwapsd = new(NumDevs);
base.OnInit();
}
protected override void OnUpdate(UpdateArgs args)
{
var item = HistoricalData[0, SeekOriginHistory.End];
// VWAP requires OHLCV data - using HLC3 for price
double high = item[PriceType.High];
double low = item[PriceType.Low];
double close = item[PriceType.Close];
double volume = item[PriceType.Volume];
TBar bar = new(item.TimeLeft, item[PriceType.Open], high, low, close, volume);
TValue result = vwapsd!.Update(bar, args.IsNewBar());
VwapSeries!.SetValue(result.Value, vwapsd.IsHot, ShowColdValues);
UpperSeries!.SetValue(vwapsd.Upper.Value, vwapsd.IsHot, ShowColdValues);
LowerSeries!.SetValue(vwapsd.Lower.Value, vwapsd.IsHot, ShowColdValues);
WidthSeries!.SetValue(vwapsd.Width.Value, vwapsd.IsHot, ShowColdValues);
}
}