using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Drawing;
using System.IO;
using MarketData.Numerical;
using MarketData.DataAccess;
using MarketData.MarketDataModel;
using MarketData.Generator;
using MarketData.Utils;
using System.Drawing.Drawing2D;
using MarketData.Generator.MovingAverage;
namespace MarketData.CNNProcessing
{
public class DataProcessor
{
private String strFolderPath=@"c:\1\";
public DataProcessor(int width=640,int height=480)
{
Width=width;
Height=height;
PenWidth=2f;
DrawingBrush=new SolidBrush(Color.Black);
DrawingBrushRed=new SolidBrush(Color.Red);
DrawingBrushGreen=new SolidBrush(Color.Green);
FillBrush=new SolidBrush(Color.White);
DrawPrice=true;
UseGrayScale=false;
NoiseColor=Color.White;
}
///
/// Width
///
///Gets/Sets the width of the output image
public int Width{get;set;}
///
/// Height
///
///Gets/Sets the height of the output image
public int Height{get;set;}
///
/// PenWidth
///
///Gets/Sets the width of the drawing pen
public float PenWidth{get;set;}
///
/// FillBrush
///
///Gets/Sets the background brush
public Brush FillBrush{get;set;}
///
/// DrawingBrush
///
///Gets/Sets the drawing brush brush
public Brush DrawingBrush{get;set;}
///
/// DrawingBrushRed
///
///Gets/Sets the drawing brush brush
public Brush DrawingBrushRed{get;set;}
///
/// DrawingBrushGreen
///
///Gets/Sets the drawing brush brush
public Brush DrawingBrushGreen{get;set;}
///
/// DrawBlack
///
///Sets up the canvas to do black drawing
public void DrawBlack()
{
DrawingBrush=new SolidBrush(Color.Black);
FillBrush=new SolidBrush(Color.White);
}
///
/// IncludePrice
///
///Indicates whether we want to include price data in the graph
public bool DrawPrice{get; set;}
///
/// UseGrayScale
///
///Indicates whether we want to use grayscale.. default is B&W
public bool UseGrayScale{get; set;}
///
/// DrawWhite
///
///Sets up the canvas to do white drawing
public void DrawWhite()
{
DrawingBrush=new SolidBrush(Color.White);
FillBrush=new SolidBrush(Color.Black);
}
///
/// MovingAverageArray
///
///Gets/Sets the moving average array
public int[] MovingAverageArray{get; set; }
///
/// PenWidthArray
///
///Gets/Sets thepen width array
public float[] PenWidthArray{get; set; }
///
/// NoiseArray
///
///Gets/Sets the noise array
public double[] NoiseArray{get; set; }
///
/// NoiseColor
///
///Gets/Sets the noise color
public Color NoiseColor{get; set; }
///
/// UseNoise
///
///The seed value
///The increment
///The size
public void UseNoise(double seed, double increment, int length, Color noiseColor)
{
NoiseColor=noiseColor;
NoiseArray=new double[length+1];
NoiseArray[0]=0.00;
for(int index=1;index
/// SetOutputFolderPath
///
///The test cases
public void SetOutputFolderPath(String strFolderPath)
{
this.strFolderPath=strFolderPath;
if(!this.strFolderPath.EndsWith(@"\"))this.strFolderPath=this.strFolderPath+@"\";
}
///
/// ClearFolderPath
///
///The test cases
public void ClearFolderPath()
{
if(String.IsNullOrEmpty(strFolderPath))throw new InvalidDataException($"{nameof(strFolderPath)} cannot be null");
if(!Directory.Exists(strFolderPath))
{
Directory.CreateDirectory(strFolderPath);
}
else
{
String[] pathFileNames = Directory.GetFiles(strFolderPath);
Console.WriteLine($"Deleting {pathFileNames.Length} files from {strFolderPath}");
foreach(String file in pathFileNames)
{
File.Delete(file);
}
}
}
public void ProcessData(TestCases testCases)
{
for(int index=0;index
/// ProcessData item
///
///The test cases
public void ProcessData(TestCase testCase,int index=0)
{
if(null==PenWidthArray)PenWidthArray=new float[]{PenWidth};
if(null==NoiseArray)NoiseArray=new double[]{0.00};
if(testCase.TypeGenerate.Equals(TestCase.GenerateType.Price))
{
for(int penIndex=0;penIndex
/// ProcessBollingerBandData item - Draws Price, K, L and Volatility
///
///Symbol
private void ProcessBollingerBandDataWithVolatility(TestCase testCase,float penWidth,double noise)
{
String symbolVolatility="^VIX";
DateGenerator dateGenerator=new DateGenerator();
int daysInPeriod=dateGenerator.DaysBetweenActual(testCase.PurchaseDate,testCase.HistDate);
daysInPeriod+=60;
Prices prices=PricingDA.GetPrices(testCase.Symbol,testCase.PurchaseDate,daysInPeriod);
Prices volatilityPrices=PricingDA.GetPrices(symbolVolatility,testCase.PurchaseDate,daysInPeriod);
BollingerBands bollingerBands=BollingerBandGenerator.GenerateBollingerBands(prices); // we want to grab K, L, and Close
bollingerBands=new BollingerBands(bollingerBands.Where(x=>x.Date>=testCase.HistDate).ToList());
float[] k=new float[bollingerBands.Count];
float[] l=new float[bollingerBands.Count];
float[] close=new float[bollingerBands.Count];
// Line up volatility dates with bollinger bands
DateTime minDate = bollingerBands.Min(x=>x.Date);
DateTime maxDate = bollingerBands.Max(x=>x.Date);
volatilityPrices = new Prices(volatilityPrices.Where(x=>x.Date<=maxDate && x.Date>=minDate).OrderBy(x=>x.Date).ToList()); // most historical date in lowest index
float[] v=volatilityPrices.GetPrices();
float minV=Numerics.Min(ref v); // get the minimum volatility value
double minP=bollingerBands.Min(x=>x.Close); // get minimum price
double factor=minP/minV; // determine scaling factor
for(int index=0;index=0;index--)
{
BollingerBandElement bollingerBandElement=bollingerBands[index];
k[bollingerBands.Count-index-1]=(float)Math.Log(bollingerBandElement.K)*1000.00f; // put the data in log form
l[bollingerBands.Count-index-1]=(float)Math.Log(bollingerBandElement.L)*1000.00f; // put the data in log form
close[bollingerBands.Count-index-1]=(float)Math.Log(bollingerBandElement.Close)*1000.00f; // put the data in log form
}
Numerics.ZeroForNaNOrInfinity(ref k);
Numerics.ZeroForNaNOrInfinity(ref l);
Numerics.ZeroForNaNOrInfinity(ref close);
Numerics.ZeroForNaNOrInfinity(ref v);
float maxY=Math.Max(Math.Max(Numerics.Max(ref l),Math.Max(Numerics.Max(ref close),Numerics.Max(ref k))),Numerics.Max(ref v));
float minY=Math.Min(Math.Min(Numerics.Min(ref l),Math.Min(Numerics.Min(ref close),Numerics.Min(ref k))),Numerics.Min(ref v))-5f;
float maxX=close.Length;
float minX=0.00f;
Pen pen=new Pen(DrawingBrush,penWidth);
Pen redPen=new Pen(DrawingBrushRed,penWidth);
Pen greenPen= new Pen(DrawingBrushGreen,penWidth);
ImageHelper imageHelper=new ImageHelper();
PointMapping pointMapping=new PointMapping(Width,Height,maxX,minX,maxY,minY);
imageHelper.CreateImage(Width,Height,pointMapping);
imageHelper.Fill(FillBrush);
LineSegments lineSegments=new LineSegments();
// draw volatility - red pen
for(int index=0;index
/// Generate Bollinger Band Data
///
///
///
///
///
private void ProcessBollingerBandData(TestCase testCase,int movingAverageDays,float penWidth,double noise)
{
int bufferDays=60;
DateGenerator dateGenerator=new DateGenerator();
int daysInPeriod=dateGenerator.DaysBetweenActual(testCase.PurchaseDate,testCase.HistDate);
if(movingAverageDays>bufferDays)daysInPeriod=movingAverageDays*2;
else daysInPeriod+=60;
Prices prices=PricingDA.GetPrices(testCase.Symbol,testCase.PurchaseDate,daysInPeriod);
BollingerBands bollingerBands=BollingerBandGenerator.GenerateBollingerBands(prices); // we want to grab K, L, and Close
bollingerBands=new BollingerBands(bollingerBands.Where(x=>x.Date>=testCase.HistDate).ToList());
float[] k=new float[bollingerBands.Count];
float[] l=new float[bollingerBands.Count];
float[] close=new float[bollingerBands.Count];
DMAPrices dmaPrices=MovingAverageGenerator.GenerateMovingAverage(prices, movingAverageDays);
DMAPricesByDate dmaPricesByDate=dmaPrices.GetDMAPricesByDate();
// populate the arrays in reverse order so that we have the most historical date in the lowest index
for(int index=bollingerBands.Count-1;index>=0;index--)
{
BollingerBandElement bollingerBandElement=bollingerBands[index];
if(!dmaPricesByDate.ContainsKey(bollingerBandElement.Date))continue;
k[bollingerBands.Count-index-1]=(float)Math.Log(bollingerBandElement.K)*1000.00f;
l[bollingerBands.Count-index-1]=(float)Math.Log(bollingerBandElement.L)*1000.00f;
double movingAverageClose=dmaPricesByDate[bollingerBandElement.Date].AVGPrice;
close[bollingerBands.Count-index-1]=(float)Math.Log(movingAverageClose)*1000.00f;
}
Numerics.ZeroForNaNOrInfinity(ref k);
Numerics.ZeroForNaNOrInfinity(ref l);
Numerics.ZeroForNaNOrInfinity(ref close);
float maxY=Math.Max(Numerics.Max(ref l),Math.Max(Numerics.Max(ref close),Numerics.Max(ref k)));
float minY=Math.Min(Numerics.Min(ref l),Math.Min(Numerics.Min(ref close),Numerics.Min(ref k)))-5f;
float maxX=close.Length;
float minX=0.00f;
Pen pen=new Pen(DrawingBrush,penWidth);
ImageHelper imageHelper=new ImageHelper();
PointMapping pointMapping=new PointMapping(Width,Height,maxX,minX,maxY,minY);
imageHelper.CreateImage(Width,Height,pointMapping);
imageHelper.Fill(FillBrush);
LineSegments lineSegments=new LineSegments();
for(int index=0;index
/// ProcessBollingerBandData item
///
///Symbol
private void ProcessBollingerBandData(TestCase testCase,float penWidth,double noise)
{
DateGenerator dateGenerator=new DateGenerator();
int daysInPeriod=dateGenerator.DaysBetweenActual(testCase.PurchaseDate,testCase.HistDate);
daysInPeriod+=60;
Prices prices=PricingDA.GetPrices(testCase.Symbol,testCase.PurchaseDate,daysInPeriod);
BollingerBands bollingerBands=BollingerBandGenerator.GenerateBollingerBands(prices); // we want to grab K, L, and Close
bollingerBands=new BollingerBands(bollingerBands.Where(x=>x.Date>=testCase.HistDate).ToList());
float[] k=new float[bollingerBands.Count];
float[] l=new float[bollingerBands.Count];
float[] close=new float[bollingerBands.Count];
// populate the arrays in reverse order so that we have the most historical date in the lowest index
for(int index=bollingerBands.Count-1;index>=0;index--)
{
BollingerBandElement bollingerBandElement=bollingerBands[index];
k[bollingerBands.Count-index-1]=(float)Math.Log(bollingerBandElement.K)*1000.00f;
l[bollingerBands.Count-index-1]=(float)Math.Log(bollingerBandElement.L)*1000.00f;
close[bollingerBands.Count-index-1]=(float)Math.Log(bollingerBandElement.Close)*1000.00f;
}
Numerics.ZeroForNaNOrInfinity(ref k);
Numerics.ZeroForNaNOrInfinity(ref l);
Numerics.ZeroForNaNOrInfinity(ref close);
float maxY=Math.Max(Numerics.Max(ref l),Math.Max(Numerics.Max(ref close),Numerics.Max(ref k)));
float minY=Math.Min(Numerics.Min(ref l),Math.Min(Numerics.Min(ref close),Numerics.Min(ref k)))-5f;
float maxX=close.Length;
float minX=0.00f;
Pen pen=new Pen(DrawingBrush,penWidth);
ImageHelper imageHelper=new ImageHelper();
PointMapping pointMapping=new PointMapping(Width,Height,maxX,minX,maxY,minY);
imageHelper.CreateImage(Width,Height,pointMapping);
imageHelper.Fill(FillBrush);
LineSegments lineSegments=new LineSegments();
for(int index=0;index
/// ProcessPriceData item
///
///TestCase
private void ProcessPriceData(TestCase testCase,float penWidth,double noise)
{
Prices prices=PricingDA.GetPrices(testCase.Symbol,testCase.PurchaseDate,testCase.HistDate);
prices.Reverse(); // get the most historical date into the lowest index
float[] priceArray=prices.GetPrices();
for(int index=0;index