210 lines
8.2 KiB
C#
210 lines
8.2 KiB
C#
using System;
|
|
using Avalonia.Media;
|
|
using Eremex.AvaloniaUI.Charts;
|
|
using MarketData.DataAccess;
|
|
using MarketData.Generator;
|
|
using MarketData.MarketDataModel;
|
|
using PortfolioManager.DataSeriesViewModels;
|
|
using PortfolioManager.Models;
|
|
using ScottPlot;
|
|
using ScottPlot.Avalonia;
|
|
using ScottPlot.Plottables;
|
|
using ShimSkiaSharp;
|
|
using SkiaSharp;
|
|
|
|
namespace PortfolioManager.ViewModels
|
|
{
|
|
public class BollingerBandCompositeDataSourceGenerater
|
|
{
|
|
public BollingerBandCompositeDataSourceGenerater()
|
|
{
|
|
}
|
|
|
|
public void Render(AvaPlot plotter)
|
|
{
|
|
plotter.Plot.Axes.AutoScale();
|
|
plotter.Refresh();
|
|
}
|
|
|
|
public void SetData(String selectedSymbol, int selectedDayCount, AvaPlot plotter)
|
|
{
|
|
Prices prices = PricingDA.GetPrices(selectedSymbol, selectedDayCount);
|
|
BollingerBands bollingerBands = BollingerBandGenerator.GenerateBollingerBands(prices);
|
|
|
|
// calculate the break even price on the open trades for this symbol
|
|
PortfolioTrades portfolioTrades = PortfolioDA.GetTradesSymbol(selectedSymbol);
|
|
PortfolioTrades openTrades = portfolioTrades.GetOpenTrades();
|
|
DateTime latestPricingDate = PricingDA.GetLatestDate(selectedSymbol);
|
|
Price latestPrice = PricingDA.GetPrice(selectedSymbol, latestPricingDate);
|
|
Price zeroPrice = ParityGenerator.GenerateGainLossValue(openTrades, latestPrice);
|
|
GenerateCompositeDataSources(plotter, bollingerBands);
|
|
GenerateZeroPoint(plotter, zeroPrice);
|
|
}
|
|
|
|
private void GenerateZeroPoint(AvaPlot plotter, Price zeroPrice)
|
|
{
|
|
ZeroPoint = GainLossModel.Price(zeroPrice);
|
|
(DateTime[] dates, double[] values) = ZeroPoint.ToXYData();
|
|
|
|
Scatter scatter = plotter.Plot.Add.Scatter(dates, values, ScottPlot.Color.FromSKColor(SKColors.Blue));
|
|
// Marker marker = plotter.Plot.Add.Marker(dates[0].ToOADate(), values[0] / 1.025);
|
|
// marker.MarkerFillColor = ScottPlot.Color.FromSKColor(SKColors.Blue);
|
|
// marker.MarkerStyle.Shape = MarkerShape.TriUp;
|
|
// marker.MarkerStyle.Size = 15;
|
|
|
|
IImage image = TextMarkerImageGenerator.GenerateImage("Even $52.14 (+.25%");
|
|
Coordinates coordinates = new Coordinates(dates[0].ToOADate(), values[0] / 1.025);
|
|
Marker marker = plotter.Plot.Add.ImageMarker(coordinates, image);
|
|
Image image = default;
|
|
|
|
|
|
|
|
|
|
// Marker marker=plotter.Plot.Add.Marker(K.DataAdapter.ItemCount-1,values[0]);
|
|
// Marker marker=plotter.Plot.Add.Marker(0,values[0]);
|
|
// marker.MarkerFillColor = ScottPlot.Color.FromSKColor(SKColors.Blue);
|
|
// marker.MarkerStyle.Shape = MarkerShape.TriUp;
|
|
// marker.MarkerStyle.Size = 15;
|
|
}
|
|
|
|
private void GenerateCompositeDataSources(AvaPlot plotter, BollingerBands bollingerBands)
|
|
{
|
|
K = BollingerBandModel.K(bollingerBands);
|
|
KL1 = BollingerBandModel.KL1(bollingerBands);
|
|
L = BollingerBandModel.L(bollingerBands);
|
|
LP1 = BollingerBandModel.LP1(bollingerBands);
|
|
High = BollingerBandModel.High(bollingerBands);
|
|
Low = BollingerBandModel.Low(bollingerBands);
|
|
Close = BollingerBandModel.Close(bollingerBands);
|
|
SMAN = BollingerBandModel.SMAN(bollingerBands);
|
|
Volume = BollingerBandModel.Volume(bollingerBands);
|
|
LeastSquares = BollingerBandModel.LeastSquares(bollingerBands);
|
|
|
|
Scatter scatter = default;
|
|
{
|
|
(DateTime[] dates, double[] values) = K.ToXYData();
|
|
scatter = plotter.Plot.Add.ScatterLine(dates, values, ScottPlot.Color.FromSKColor(SKColors.Green));
|
|
scatter.LegendText = "K";
|
|
scatter.LineWidth = 3;
|
|
}
|
|
|
|
{
|
|
(DateTime[] dates, double[] values) = KL1.ToXYData();
|
|
scatter = plotter.Plot.Add.ScatterLine(dates, values, ScottPlot.Color.FromSKColor(SKColors.Green));
|
|
scatter.LegendText = "KL1";
|
|
scatter.LineWidth = 2;
|
|
}
|
|
|
|
{
|
|
(DateTime[] dates, double[] values) = L.ToXYData();
|
|
scatter = plotter.Plot.Add.ScatterLine(dates, values, ScottPlot.Color.FromSKColor(SKColors.Green));
|
|
scatter.LegendText = "L";
|
|
scatter.LineWidth = 3;
|
|
}
|
|
|
|
{
|
|
(DateTime[] dates, double[] values) = LP1.ToXYData();
|
|
scatter = plotter.Plot.Add.ScatterLine(dates, values, ScottPlot.Color.FromSKColor(SKColors.Green));
|
|
scatter.LegendText = "LP1";
|
|
scatter.LineWidth = 2;
|
|
}
|
|
|
|
{
|
|
(DateTime[] dates, double[] values) = High.ToXYData();
|
|
scatter = plotter.Plot.Add.ScatterLine(dates, values, ScottPlot.Color.FromSKColor(SKColors.Blue));
|
|
scatter.LegendText = "High";
|
|
scatter.LineWidth = 2;
|
|
}
|
|
|
|
{
|
|
(DateTime[] dates, double[] values) = Low.ToXYData();
|
|
scatter = plotter.Plot.Add.ScatterLine(dates, values, ScottPlot.Color.FromSKColor(SKColors.Red));
|
|
scatter.LegendText = "Low";
|
|
scatter.LineWidth = 2;
|
|
}
|
|
|
|
{
|
|
(DateTime[] dates, double[] values) = Close.ToXYData();
|
|
scatter = plotter.Plot.Add.ScatterLine(dates, values, ScottPlot.Color.FromSKColor(SKColors.Black));
|
|
scatter.LegendText = "Close";
|
|
scatter.LineWidth = 2;
|
|
}
|
|
|
|
{
|
|
(DateTime[] dates, double[] values) = LeastSquares.ToXYData();
|
|
scatter = plotter.Plot.Add.ScatterLine(dates, values, ScottPlot.Color.FromSKColor(SKColors.Orange));
|
|
scatter.LegendText = "LeastSquares";
|
|
scatter.LineWidth = 2;
|
|
}
|
|
|
|
{
|
|
(DateTime[] dates, double[] values) = SMAN.ToXYData();
|
|
scatter = plotter.Plot.Add.ScatterLine(dates, values, ScottPlot.Color.FromSKColor(SKColors.Purple));
|
|
scatter.LegendText = "SMAN";
|
|
scatter.LineWidth = 2;
|
|
}
|
|
}
|
|
|
|
public CompositeDataSource K { get; private set; } = Empty();
|
|
public CompositeDataSource KL1 { get; private set; } = Empty();
|
|
public CompositeDataSource L { get; private set; } = Empty();
|
|
public CompositeDataSource LP1 { get; private set; } = Empty();
|
|
public CompositeDataSource High { get; private set; } = Empty();
|
|
public CompositeDataSource Low { get; private set; } = Empty();
|
|
public CompositeDataSource Close { get; private set; } = Empty();
|
|
public CompositeDataSource SMAN { get; private set; } = Empty();
|
|
public CompositeDataSource Volume { get; private set; } = Empty();
|
|
public CompositeDataSource LeastSquares { get; private set; } = Empty();
|
|
public CompositeDataSource ZeroPoint { get; private set; } = Empty();
|
|
|
|
private static CompositeDataSource Empty()
|
|
{
|
|
return new CompositeDataSource()
|
|
{
|
|
DataAdapter = new SortedDateTimeDataAdapter()
|
|
};
|
|
}
|
|
}
|
|
|
|
public partial class ScottPlotViewModel : PlotterWorkspaceViewModel
|
|
{
|
|
private AvaPlot plotter = default;
|
|
public ScottPlotViewModel()
|
|
{
|
|
OnPlotterLoadedEventHandler += PlotterLoadedEvent;
|
|
}
|
|
|
|
public void PlotterLoadedEvent(object sender, PlotterLoadedEventArgs e)
|
|
{
|
|
String selectedSymbol = "SPY";
|
|
int selectedDayCount = 180;
|
|
|
|
plotter = e.AvaPlot; // we should store this somewhere
|
|
// Prices prices = PricingDA.GetPrices("SPY", 180);
|
|
// BollingerBands bollingerBands = BollingerBandGenerator.GenerateBollingerBands(prices);
|
|
|
|
BollingerBandCompositeDataSourceGenerater bollingerBandCompositeDataSourceGenerater = new BollingerBandCompositeDataSourceGenerater();
|
|
bollingerBandCompositeDataSourceGenerater.SetData(selectedSymbol, selectedDayCount, plotter);
|
|
//public void SetData(String selectedSymbol, int selectedDayCount, AvaPlot plotter)
|
|
|
|
// bollingerBandCompositeDataSourceGenerater.GenerateCompositeDataSources(plotter, bollingerBands);
|
|
bollingerBandCompositeDataSourceGenerater.Render(plotter);
|
|
// plotter.Plot.Axes.AutoScale();
|
|
// plotter.Refresh();
|
|
}
|
|
// ********************************************** P E R S I S T E N C E *************************
|
|
public override bool CanPersist()
|
|
{
|
|
return false;
|
|
}
|
|
|
|
public override SaveParameters GetSaveParameters()
|
|
{
|
|
return null;
|
|
}
|
|
|
|
public override void SetSaveParameters(SaveParameters saveParameters)
|
|
{
|
|
}
|
|
}
|
|
} |