mirror of
https://github.com/mihakralj/QuanTAlib.git
synced 2026-08-23 13:08:04 +00:00
Add VWAPSD (Volume Weighted Average Price with Standard Deviation Bands) implementation and validation tests
- Implemented Vwapsd class for calculating VWAP with configurable standard deviation bands. - Added methods for updating the indicator with new bars and calculating VWAPSD using both bar series and span arrays. - Created comprehensive validation tests for VWAPSD, including checks for consistency between streaming and batch modes, mathematical correctness, and handling of edge cases such as NaN values and zero volume bars. - Ensured that the implementation adheres to performance standards with tests for large datasets and fractional numDevs values.
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
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[Count - 1, SeekOriginHistory.Begin];
|
||||
var time = HistoricalData.Time();
|
||||
|
||||
// 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(time, 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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user