From 8715bed4cfa8c9c8581fca07d28a094127cc536b Mon Sep 17 00:00:00 2001 From: Sean Date: Tue, 10 Mar 2026 23:48:25 -0400 Subject: [PATCH] Fix ImageHelper not rendering images due to issue in PointMapping. --- .../CNNProcessing/DataProcessor.cs | 76 ++++-------------- .../CNNProcessing/ImageHelper.cs | 42 +++++++++- .../CNNProcessing/PointMapping.cs | 27 ++++--- .../MarketDataUnitTestClass.cs | 77 ++++++++++++++++++- 4 files changed, 147 insertions(+), 75 deletions(-) diff --git a/MarketData/MarketDataLib/CNNProcessing/DataProcessor.cs b/MarketData/MarketDataLib/CNNProcessing/DataProcessor.cs index 8aa00b0..75563a8 100755 --- a/MarketData/MarketDataLib/CNNProcessing/DataProcessor.cs +++ b/MarketData/MarketDataLib/CNNProcessing/DataProcessor.cs @@ -191,10 +191,12 @@ namespace MarketData.CNNProcessing if(null==NoiseArray)NoiseArray=new double[]{0.00}; if(testCase.TypeGenerate.Equals(TestCase.GenerateType.BollingerBand)) { + testCase.PathFileNames.Add(CreateFileName("T",testCase.Symbol,testCase.DayCount,0,0,0,TestCase.CaseType.Test,TestCase.GenerateType.BollingerBand,testCase.PurchaseDate)); ProcessBollingerBandData(testCase,PenWidthArray[0],NoiseArray[0]); } else if(testCase.TypeGenerate.Equals(TestCase.GenerateType.BollingerBandWithVIX)) { + testCase.PathFileNames.Add(CreateFileName("T",testCase.Symbol,testCase.DayCount,0,0,0,TestCase.CaseType.Test,TestCase.GenerateType.BollingerBandWithVIX,testCase.PurchaseDate)); ProcessBollingerBandDataWithVolatility(testCase,PenWidthArray[0],NoiseArray[0]); } } @@ -243,35 +245,14 @@ namespace MarketData.CNNProcessing imageHelper.CreateImage(Width,Height,pointMapping); imageHelper.Fill(FillBrush); - LineSegments lineSegments=new LineSegments(); - for(int index=0;index /// Draws a circle on the bitmap /// diff --git a/MarketData/MarketDataLib/CNNProcessing/PointMapping.cs b/MarketData/MarketDataLib/CNNProcessing/PointMapping.cs index 8774caa..173e9e7 100755 --- a/MarketData/MarketDataLib/CNNProcessing/PointMapping.cs +++ b/MarketData/MarketDataLib/CNNProcessing/PointMapping.cs @@ -29,7 +29,9 @@ namespace MarketData.CNNProcessing XMargin = pointMapping.XMargin; YMargin = pointMapping.YMargin; XDataExtent = pointMapping.XDataExtent; + XDataExtentMin = pointMapping.XDataExtentMin; YDataExtent = pointMapping.YDataExtent; + YDataExtentMin = pointMapping.YDataExtentMin; XScalingFactor = pointMapping.XScalingFactor; YScalingFactor = pointMapping.YScalingFactor; } @@ -43,15 +45,22 @@ namespace MarketData.CNNProcessing /// public SKPoint MapPoint(SKPoint sourcePoint) { - SKPoint mappedPoint = new SKPoint((int)((sourcePoint.X - XDataExtentMin) * XScalingFactor), (int)((Height - 1) - ((sourcePoint.Y - YDataExtentMin) * YScalingFactor))); - mappedPoint.X += (int)XMargin; // offset by the xMargin - mappedPoint.Y -= (int)YMargin; // offset by the yMargin - if (mappedPoint.X > XDataExtent) mappedPoint.X = (int)XDataExtent; // constrain X to XDataExtent - if (mappedPoint.Y > YDataExtent) mappedPoint.Y = (int)YDataExtent; // constrain Y to YDataExtent - if (mappedPoint.X < XDataExtentMin) mappedPoint.X = (int)XDataExtentMin; // constrain X to XDataExtentMin - if (mappedPoint.Y < YDataExtentMin) mappedPoint.Y = (int)YDataExtentMin; // constrain Y to YDataExtentMin - return mappedPoint; - } + SKPoint mappedPoint = new SKPoint( + (float)((sourcePoint.X - XDataExtentMin) * XScalingFactor), + (float)((Height - 1) - ((sourcePoint.Y - YDataExtentMin) * YScalingFactor)) + ); + + mappedPoint.X += (float)XMargin; + mappedPoint.Y -= (float)YMargin; + + // Clamp to image bounds + if (mappedPoint.X > Width - 1) mappedPoint.X = (float)(Width - 1); + if (mappedPoint.Y > Height - 1) mappedPoint.Y = (float)(Height - 1); + if (mappedPoint.X < 0) mappedPoint.X = 0; + if (mappedPoint.Y < 0) mappedPoint.Y = 0; + + return mappedPoint; + } // TranslatePoint will only translate the given point from an upper left origin system to a bottom left origin system public SKPoint TranslatePoint(SKPoint sourcePoint) { diff --git a/MarketDataUnitTests/MarketDataUnitTestClass.cs b/MarketDataUnitTests/MarketDataUnitTestClass.cs index 99a16b4..bb483d5 100644 --- a/MarketDataUnitTests/MarketDataUnitTestClass.cs +++ b/MarketDataUnitTests/MarketDataUnitTestClass.cs @@ -8,6 +8,7 @@ using MarketData; using MarketData.Configuration; using System.Diagnostics; using System.Net.Http.Headers; +using MarketData.CNNProcessing; namespace MarketDataUnitTests; @@ -145,6 +146,26 @@ public class MarketDataUnitTestClass Assert.IsTrue(null != prices, "No Price from DailyPricesYahoo"); } + // [TestMethod] + // public void CNNPredictionTest() + // { + // String cnnHostName = "10.0.0.240"; + // CMCandidate cmCandidate = new CMCandidate(); + // CMParams cmParams = new CMParams(); + + // cmParams.UseCNN = true; + // cmParams.UseCNNHost = "http://" + cnnHostName + ":5000"; + // cmParams.UseCNNDayCount = 270; + // cmParams.UseCNNRewardPercentDecimal = 0.25; + + // cmCandidate.Symbol = "MIDD"; + // cmCandidate.TradeDate = DateTime.Parse("07-01-2024"); + + // bool result = CMMomentumGenerator.PredictCandidate(cmCandidate, cmParams); + + // Assert.IsTrue(result); + // } + [TestMethod] public void CNNPredictionTest() { @@ -154,7 +175,7 @@ public class MarketDataUnitTestClass cmParams.UseCNN = true; cmParams.UseCNNHost = "http://" + cnnHostName + ":5000"; - cmParams.UseCNNDayCount = 270; + cmParams.UseCNNDayCount = 90; cmParams.UseCNNRewardPercentDecimal = 0.25; cmCandidate.Symbol = "MIDD"; @@ -163,7 +184,59 @@ public class MarketDataUnitTestClass bool result = CMMomentumGenerator.PredictCandidate(cmCandidate, cmParams); Assert.IsTrue(result); - } + } + + [TestMethod] + public void CNNGenerateOutputFileVIX() + { + DataProcessor dataProcessor=new DataProcessor(); + int imageDimensions=224; + dataProcessor.Width=imageDimensions; + dataProcessor.Height=imageDimensions; + dataProcessor.PenWidth=1; + + String cnnHostName = "10.0.0.240"; + CMCandidate cmCandidate = new CMCandidate(); + CMParams cmParams = new CMParams(); + + cmParams.UseCNN = true; + cmParams.UseCNNHost = "http://" + cnnHostName + ":5000"; + cmParams.UseCNNDayCount = 90; + cmParams.UseCNNRewardPercentDecimal = 0.25; + + cmCandidate.Symbol = "MIDD"; + cmCandidate.TradeDate = DateTime.Parse("07-01-2024"); + + TestCase testCase=new TestCase(cmCandidate.Symbol,cmCandidate.TradeDate,cmParams.UseCNNDayCount,TestCase.CaseType.Test,TestCase.GenerateType.BollingerBandWithVIX,TestCase.OutputType.OutputFile); + dataProcessor.ProcessData(testCase); + } + + [TestMethod] + public void CNNGenerateOutputFileBand() + { + DataProcessor dataProcessor=new DataProcessor(); + int imageDimensions=224; + dataProcessor.Width=imageDimensions; + dataProcessor.Height=imageDimensions; + dataProcessor.PenWidth=1; + + String cnnHostName = "10.0.0.240"; + CMCandidate cmCandidate = new CMCandidate(); + CMParams cmParams = new CMParams(); + + cmParams.UseCNN = true; + cmParams.UseCNNHost = "http://" + cnnHostName + ":5000"; + cmParams.UseCNNDayCount = 90; + cmParams.UseCNNRewardPercentDecimal = 0.25; + + cmCandidate.Symbol = "MIDD"; + cmCandidate.TradeDate = DateTime.Parse("07-01-2024"); + + TestCase testCase=new TestCase(cmCandidate.Symbol,cmCandidate.TradeDate,cmParams.UseCNNDayCount,TestCase.CaseType.Test,TestCase.GenerateType.BollingerBand,TestCase.OutputType.OutputFile); + dataProcessor.ProcessData(testCase); + } + + [TestMethod] public void PremarketRetrieval()