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); 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;} /// /// DrawingBrush /// ///Gets/Sets the drawing brush brush public Brush DrawingBrushRed{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); 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 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