[Quantproject-developers] QuantProject/b7_Scripts/TechnicalAnalysisTesting/Oscillators/FixedLevelOs
Brought to you by:
glauco_1
Update of /cvsroot/quantproject/QuantProject/b7_Scripts/TechnicalAnalysisTesting/Oscillators/FixedLevelOscillators/PortfolioValueOscillator In directory sc8-pr-cvs7.sourceforge.net:/tmp/cvs-serv21838/b7_Scripts/TechnicalAnalysisTesting/Oscillators/FixedLevelOscillators/PortfolioValueOscillator Modified Files: RunPVO.cs GenomeManagerPVO.cs EndOfDayTimerHandlerPVO.cs Log Message: Added symmetricalThresholds parameter, in order to fix a unique threshold for overbought / oversold. Index: GenomeManagerPVO.cs =================================================================== RCS file: /cvsroot/quantproject/QuantProject/b7_Scripts/TechnicalAnalysisTesting/Oscillators/FixedLevelOscillators/PortfolioValueOscillator/GenomeManagerPVO.cs,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** GenomeManagerPVO.cs 17 Sep 2006 21:24:53 -0000 1.1 --- GenomeManagerPVO.cs 22 Oct 2006 18:49:20 -0000 1.2 *************** *** 46,49 **** --- 46,51 ---- private int maxLevelForOverboughtThreshold; private int divisorForThresholdComputation; + private bool symmetricalThresholds = false; + private int numOfGenesDedicatedToThresholds; private double currentOversoldThreshold = 0.0; private double currentOverboughtThreshold = 0.0; *************** *** 54,65 **** //throughout the period itself ! private void genomeManagerPVO_checkParametersForThresholdComputation() { if(this.maxLevelForOverboughtThreshold < this.minLevelForOverboughtThreshold || this.maxLevelForOversoldThreshold < this.minLevelForOversoldThreshold || this.divisorForThresholdComputation < this.maxLevelForOverboughtThreshold || ! this.divisorForThresholdComputation < this.maxLevelForOversoldThreshold) ! throw new Exception("Bad parameters for threshold computation!"); } --- 56,69 ---- //throughout the period itself ! private void genomeManagerPVO_checkParametersForThresholdsComputation() { if(this.maxLevelForOverboughtThreshold < this.minLevelForOverboughtThreshold || this.maxLevelForOversoldThreshold < this.minLevelForOversoldThreshold || this.divisorForThresholdComputation < this.maxLevelForOverboughtThreshold || ! this.divisorForThresholdComputation < this.maxLevelForOversoldThreshold || ! (this.symmetricalThresholds && (this.minLevelForOversoldThreshold != this.minLevelForOverboughtThreshold || ! this.maxLevelForOversoldThreshold != this.maxLevelForOverboughtThreshold) ) ) ! throw new Exception("Bad parameters for thresholds computation!"); } *************** *** 74,78 **** int maxLevelForOverboughtThreshold, int divisorForThresholdComputation, ! PortfolioType portfolioType) : base(setOfInitialTickers, --- 78,83 ---- int maxLevelForOverboughtThreshold, int divisorForThresholdComputation, ! bool symmetricalThresholds, ! PortfolioType inSamplePortfolioType) : base(setOfInitialTickers, *************** *** 81,95 **** numberOfTickersInPortfolio, 0.0, ! portfolioType) { this.numDaysForOscillatingPeriod = numDaysForOscillatingPeriod; ! this.minLevelForOversoldThreshold = minLevelForOversoldThreshold; this.maxLevelForOversoldThreshold = maxLevelForOversoldThreshold; this.minLevelForOverboughtThreshold = minLevelForOverboughtThreshold; this.maxLevelForOverboughtThreshold = maxLevelForOverboughtThreshold; ! this.divisorForThresholdComputation = divisorForThresholdComputation; ! this.genomeManagerPVO_checkParametersForThresholdComputation(); this.retrieveData(); } --- 86,105 ---- numberOfTickersInPortfolio, 0.0, ! inSamplePortfolioType) { this.numDaysForOscillatingPeriod = numDaysForOscillatingPeriod; ! this.divisorForThresholdComputation = divisorForThresholdComputation; ! this.minLevelForOversoldThreshold = minLevelForOversoldThreshold; this.maxLevelForOversoldThreshold = maxLevelForOversoldThreshold; this.minLevelForOverboughtThreshold = minLevelForOverboughtThreshold; this.maxLevelForOverboughtThreshold = maxLevelForOverboughtThreshold; ! this.symmetricalThresholds = symmetricalThresholds; ! if(this.symmetricalThresholds)//value for thresholds must be unique ! numOfGenesDedicatedToThresholds = 1; ! else ! numOfGenesDedicatedToThresholds = 2; ! this.genomeManagerPVO_checkParametersForThresholdsComputation(); this.retrieveData(); } *************** *** 97,102 **** public override int GenomeSize { ! get{return this.genomeSize + 2;} ! //two initial genes are for oversold and overbought thresholds } --- 107,128 ---- public override int GenomeSize { ! get{return this.genomeSize + this.numOfGenesDedicatedToThresholds;} ! } ! ! #region Get Min and Max Value ! ! private int getMinValueForGenes_getMinValueForTicker() ! { ! int returnValue; ! switch (this.portfolioType) ! { ! case PortfolioType.OnlyLong : ! returnValue = 0; ! break; ! default://For ShortAndLong or OnlyShort portfolios ! returnValue = - this.originalNumOfTickers; ! break; ! } ! return returnValue; } *************** *** 110,117 **** break; case 1 ://gene for overbought threshold ! returnValue = this.minLevelForOverboughtThreshold; ! break; default://gene for ticker ! returnValue = - this.originalNumOfTickers; break; } --- 136,146 ---- break; case 1 ://gene for overbought threshold ! if(this.numOfGenesDedicatedToThresholds == 2) ! returnValue = this.minLevelForOverboughtThreshold; ! else ! returnValue = this.getMinValueForGenes_getMinValueForTicker(); ! break; default://gene for ticker ! returnValue = this.getMinValueForGenes_getMinValueForTicker(); break; } *************** *** 119,122 **** --- 148,166 ---- } + private int getMaxValueForGenes_getMaxValueForTicker() + { + int returnValue; + switch (this.portfolioType) + { + case PortfolioType.OnlyShort : + returnValue = - 1; + break; + default ://For ShortAndLong or OnlyLong portfolios + returnValue = this.originalNumOfTickers - 1; + break; + } + return returnValue; + } + public override int GetMaxValueForGenes(int genePosition) { *************** *** 128,144 **** break; case 1 ://gene for overbought threshold ! returnValue = this.maxLevelForOverboughtThreshold; break; default://gene for ticker ! returnValue = this.originalNumOfTickers - 1; break; } return returnValue; } ! protected override float[] getArrayOfRatesOfReturn(string ticker) { float[] returnValue = null; Quotes tickerQuotes = new Quotes(ticker, this.firstQuoteDate, this.lastQuoteDate); returnValue = QuantProject.ADT.ExtendedDataTable.GetArrayOfFloatFromColumn(tickerQuotes, Quotes.AdjustedCloseToCloseRatio); --- 172,194 ---- break; case 1 ://gene for overbought threshold ! if(this.numOfGenesDedicatedToThresholds == 2) ! returnValue = this.maxLevelForOverboughtThreshold; ! else ! returnValue = this.getMaxValueForGenes_getMaxValueForTicker(); break; default://gene for ticker ! returnValue = this.getMaxValueForGenes_getMaxValueForTicker(); break; } return returnValue; } ! ! #endregion ! protected override float[] getArrayOfRatesOfReturn(string ticker) { float[] returnValue = null; Quotes tickerQuotes = new Quotes(ticker, this.firstQuoteDate, this.lastQuoteDate); + tickerQuotes.RecalculateCloseToCloseRatios(); returnValue = QuantProject.ADT.ExtendedDataTable.GetArrayOfFloatFromColumn(tickerQuotes, Quotes.AdjustedCloseToCloseRatio); *************** *** 175,180 **** this.currentOversoldThreshold = Convert.ToDouble(genome.Genes()[0])/ Convert.ToDouble(this.divisorForThresholdComputation); ! this.currentOverboughtThreshold = Convert.ToDouble(genome.Genes()[1])/ ! Convert.ToDouble(this.divisorForThresholdComputation); } --- 225,234 ---- this.currentOversoldThreshold = Convert.ToDouble(genome.Genes()[0])/ Convert.ToDouble(this.divisorForThresholdComputation); ! ! if(this.symmetricalThresholds) ! this.currentOverboughtThreshold = this.currentOversoldThreshold; ! else ! this.currentOverboughtThreshold = Convert.ToDouble(genome.Genes()[1])/ ! Convert.ToDouble(this.divisorForThresholdComputation); } *************** *** 183,187 **** int returnValue = 0; foreach(double equityReturn in equityLine) ! if(equityReturn > 0.0) returnValue++; --- 237,242 ---- int returnValue = 0; foreach(double equityReturn in equityLine) ! if(equityReturn != 0.0) ! //the applied strategy gets positions on the market returnValue++; *************** *** 234,239 **** protected override double getTickerWeight(int[] genes, int tickerPositionInGenes) { ! return 1.0/(genes.Length - 2); ! //two genes are for thresholds } --- 289,293 ---- protected override double getTickerWeight(int[] genes, int tickerPositionInGenes) { ! return 1.0/(genes.Length - this.numOfGenesDedicatedToThresholds); } *************** *** 243,247 **** for(int i = 0; i<returnValue.Length; i++) { ! for(int j=2; j<genes.Length; j++)//the first two genes are for thresholds returnValue[i] += this.getPortfolioRatesOfReturn_getRateOfTickerToBeAddedToTheArray(genes,j,i); --- 297,301 ---- for(int i = 0; i<returnValue.Length; i++) { ! for(int j=this.numOfGenesDedicatedToThresholds; j<genes.Length; j++)//the first numOfGenesDedicatedToThresholds are for thresholds returnValue[i] += this.getPortfolioRatesOfReturn_getRateOfTickerToBeAddedToTheArray(genes,j,i); *************** *** 252,264 **** public override object Decode(Genome genome) { ! string[] arrayOfTickers = new string[genome.Genes().Length - 2]; int geneForTicker; ! for(int genePosition = 2; genePosition < genome.Genes().Length; genePosition++) { geneForTicker = (int)genome.Genes().GetValue(genePosition); ! arrayOfTickers[genePosition - 2] = this.decode_getTickerCodeForLongOrShortTrade(geneForTicker); } ! GenomeMeaningPVO meaning = new GenomeMeaningPVO( arrayOfTickers, Convert.ToDouble(genome.Genes()[0])/Convert.ToDouble(this.divisorForThresholdComputation), --- 306,329 ---- public override object Decode(Genome genome) { ! string[] arrayOfTickers = ! new string[genome.Genes().Length - this.numOfGenesDedicatedToThresholds]; int geneForTicker; ! GenomeMeaningPVO meaning; ! for(int genePosition = this.numOfGenesDedicatedToThresholds; ! genePosition < genome.Genes().Length; ! genePosition++) { geneForTicker = (int)genome.Genes().GetValue(genePosition); ! arrayOfTickers[genePosition - this.numOfGenesDedicatedToThresholds] = this.decode_getTickerCodeForLongOrShortTrade(geneForTicker); } ! if(this.symmetricalThresholds) ! meaning = new GenomeMeaningPVO( ! arrayOfTickers, ! Convert.ToDouble(genome.Genes()[0])/Convert.ToDouble(this.divisorForThresholdComputation), ! Convert.ToDouble(genome.Genes()[0])/Convert.ToDouble(this.divisorForThresholdComputation), ! this.numDaysForOscillatingPeriod); ! else ! meaning = new GenomeMeaningPVO( arrayOfTickers, Convert.ToDouble(genome.Genes()[0])/Convert.ToDouble(this.divisorForThresholdComputation), *************** *** 277,284 **** childs[1] = parent2.Clone(); //exchange of genes coding thresholds ! childs[0].SetGeneValue(parent2.GetGeneValue(0),0); ! childs[0].SetGeneValue(parent2.GetGeneValue(1),1); ! childs[1].SetGeneValue(parent1.GetGeneValue(0),0); ! childs[1].SetGeneValue(parent1.GetGeneValue(1),1); return childs; } --- 342,358 ---- childs[1] = parent2.Clone(); //exchange of genes coding thresholds ! ! if(this.symmetricalThresholds)//unique value for thresholds ! { ! childs[0].SetGeneValue(parent2.GetGeneValue(0),0); ! childs[1].SetGeneValue(parent1.GetGeneValue(0),0); ! } ! else//two different values for thresholds ! { ! childs[0].SetGeneValue(parent2.GetGeneValue(0),0); ! childs[1].SetGeneValue(parent1.GetGeneValue(0),0); ! childs[0].SetGeneValue(parent2.GetGeneValue(1),1); ! childs[1].SetGeneValue(parent1.GetGeneValue(1),1); ! } return childs; } *************** *** 295,300 **** returnValue = GenomeManagement.RandomGenerator.Next(minValueForGene, maxValueForGene + 1); ! while(genePosition > 1 ! && GenomeManipulator.IsTickerContainedInGenome(returnValue,genome,2,genome.Size - 1)) //while in the given position has to be stored //a new gene pointing to a ticker and --- 369,377 ---- returnValue = GenomeManagement.RandomGenerator.Next(minValueForGene, maxValueForGene + 1); ! while(genePosition > this.numOfGenesDedicatedToThresholds - 1 ! && GenomeManipulator.IsTickerContainedInGenome(returnValue, ! genome, ! this.numOfGenesDedicatedToThresholds, ! genome.Size - 1)) //while in the given position has to be stored //a new gene pointing to a ticker and *************** *** 319,326 **** { int newValueForGene = GenomeManagement.RandomGenerator.Next(minValueForGene, ! maxValueForGene +1); ! while(genePositionToBeMutated > 1 && ! GenomeManipulator.IsTickerContainedInGenome(newValueForGene,genome,2,genome.Size - 1)) //while in the proposed genePositionToBeMutated has to be stored //a new gene pointing to a ticker and --- 396,406 ---- { int newValueForGene = GenomeManagement.RandomGenerator.Next(minValueForGene, ! maxValueForGene + 1); ! while(genePositionToBeMutated > this.numOfGenesDedicatedToThresholds - 1 && ! GenomeManipulator.IsTickerContainedInGenome(newValueForGene, ! genome, ! this.numOfGenesDedicatedToThresholds, ! genome.Size - 1)) //while in the proposed genePositionToBeMutated has to be stored //a new gene pointing to a ticker and Index: RunPVO.cs =================================================================== RCS file: /cvsroot/quantproject/QuantProject/b7_Scripts/TechnicalAnalysisTesting/Oscillators/FixedLevelOscillators/PortfolioValueOscillator/RunPVO.cs,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** RunPVO.cs 17 Sep 2006 21:24:53 -0000 1.1 --- RunPVO.cs 22 Oct 2006 18:49:20 -0000 1.2 *************** *** 53,65 **** public class RunPVO : RunEfficientPortfolio { ! private int minLevelForOversoldThreshold; ! private int maxLevelForOversoldThreshold; ! private int minLevelForOverboughtThreshold; ! private int maxLevelForOverboughtThreshold; ! private int divisorForThresholdComputation; //to be used by the optimizer ! private int numDaysBetweenEachOptimization; ! private double maxAcceptableCloseToCloseDrawdown; ! private int numDaysForOscillatingPeriod; public RunPVO(string tickerGroupID, int maxNumOfEligibleTickersForOptimization, --- 53,66 ---- public class RunPVO : RunEfficientPortfolio { ! protected int minLevelForOversoldThreshold; ! protected int maxLevelForOversoldThreshold; ! protected int minLevelForOverboughtThreshold; ! protected int maxLevelForOverboughtThreshold; ! protected int divisorForThresholdComputation; //to be used by the optimizer ! protected int numDaysBetweenEachOptimization; ! protected double maxAcceptableCloseToCloseDrawdown; ! protected int numDaysForOscillatingPeriod; ! protected bool symmetricalThresholds = false; public RunPVO(string tickerGroupID, int maxNumOfEligibleTickersForOptimization, *************** *** 74,79 **** int maxLevelForOverboughtThreshold, int divisorForThresholdComputation, int numDaysBetweenEachOptimization, ! PortfolioType portfolioType, double maxAcceptableCloseToCloseDrawdown, double maxRunningHours): base(tickerGroupID, maxNumOfEligibleTickersForOptimization, --- 75,81 ---- int maxLevelForOverboughtThreshold, int divisorForThresholdComputation, + bool symmetricalThresholds, int numDaysBetweenEachOptimization, ! PortfolioType inSamplePortfolioType, double maxAcceptableCloseToCloseDrawdown, double maxRunningHours): base(tickerGroupID, maxNumOfEligibleTickersForOptimization, *************** *** 82,86 **** populationSizeForGeneticOptimizer, benchmark, startDate, endDate, 0.0, ! portfolioType, maxRunningHours) { this.ScriptName = "PVO_SR_NoWeights_PriceSel"; --- 84,88 ---- populationSizeForGeneticOptimizer, benchmark, startDate, endDate, 0.0, ! inSamplePortfolioType, maxRunningHours) { this.ScriptName = "PVO_SR_NoWeights_PriceSel"; *************** *** 90,93 **** --- 92,96 ---- this.maxLevelForOverboughtThreshold = maxLevelForOverboughtThreshold; this.divisorForThresholdComputation = divisorForThresholdComputation; + this.symmetricalThresholds = symmetricalThresholds; this.maxAcceptableCloseToCloseDrawdown = maxAcceptableCloseToCloseDrawdown; this.numDaysForOscillatingPeriod = numDaysForOscillatingPeriod; *************** *** 110,113 **** --- 113,117 ---- this.maxLevelForOverboughtThreshold, this.divisorForThresholdComputation, + this.symmetricalThresholds, this.numDaysBetweenEachOptimization, this.portfolioType, this.maxAcceptableCloseToCloseDrawdown); *************** *** 137,141 **** public override void SaveScriptResults() { ! string fileName = this.scriptName + "OsDays_" + numDaysForOscillatingPeriod + "_From_" + this.tickerGroupID + "_" + this.numberOfEligibleTickers + "_DaysForOpt" + this.numDaysForOptimizationPeriod + "Tick" + --- 141,147 ---- public override void SaveScriptResults() { ! string fileName = DateTime.Now.Hour.ToString().PadLeft(2,'0') + "_" + ! DateTime.Now.Minute.ToString().PadLeft(2,'0') + "_" + ! this.scriptName + "OsDays_" + numDaysForOscillatingPeriod + "_From_" + this.tickerGroupID + "_" + this.numberOfEligibleTickers + "_DaysForOpt" + this.numDaysForOptimizationPeriod + "Tick" + Index: EndOfDayTimerHandlerPVO.cs =================================================================== RCS file: /cvsroot/quantproject/QuantProject/b7_Scripts/TechnicalAnalysisTesting/Oscillators/FixedLevelOscillators/PortfolioValueOscillator/EndOfDayTimerHandlerPVO.cs,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** EndOfDayTimerHandlerPVO.cs 17 Sep 2006 21:24:53 -0000 1.1 --- EndOfDayTimerHandlerPVO.cs 22 Oct 2006 18:49:20 -0000 1.2 *************** *** 48,70 **** public class EndOfDayTimerHandlerPVO : EndOfDayTimerHandler { ! private int minLevelForOversoldThreshold; ! private int maxLevelForOversoldThreshold; ! private int minLevelForOverboughtThreshold; ! private int maxLevelForOverboughtThreshold; ! private int divisorForThresholdComputation; protected int numDaysForOscillatingPeriod; protected double currentOversoldThreshold; protected double currentOverboughtThreshold; ! private double maxAcceptableCloseToCloseDrawdown; ! private bool stopLossConditionReached; ! private double currentAccountValue; ! private double previousAccountValue; ! private int numDaysBetweenEachOptimization; ! private int numDaysElapsedSinceLastOptimization; ! private DateTime lastCloseDate; ! private IGenomeManager iGenomeManager; ! private int seedForRandomGenerator; ! private bool portfolioHasBeenOverbought; ! private bool portfolioHasBeenOversold; public EndOfDayTimerHandlerPVO(string tickerGroupID, int numberOfEligibleTickers, --- 48,71 ---- public class EndOfDayTimerHandlerPVO : EndOfDayTimerHandler { ! protected int minLevelForOversoldThreshold; ! protected int maxLevelForOversoldThreshold; ! protected int minLevelForOverboughtThreshold; ! protected int maxLevelForOverboughtThreshold; ! protected int divisorForThresholdComputation; protected int numDaysForOscillatingPeriod; protected double currentOversoldThreshold; protected double currentOverboughtThreshold; ! protected double maxAcceptableCloseToCloseDrawdown; ! protected bool stopLossConditionReached; ! protected double currentAccountValue; ! protected double previousAccountValue; ! protected int numDaysBetweenEachOptimization; ! protected int numDaysElapsedSinceLastOptimization; ! protected DateTime lastCloseDate; ! protected IGenomeManager iGenomeManager; ! protected int seedForRandomGenerator; ! protected bool portfolioHasBeenOverbought; ! protected bool portfolioHasBeenOversold; ! protected bool symmetricalThresholds; public EndOfDayTimerHandlerPVO(string tickerGroupID, int numberOfEligibleTickers, *************** *** 80,83 **** --- 81,85 ---- int maxLevelForOverboughtThreshold, int divisorForThresholdComputation, + bool symmetricalThresholds, int numDaysBetweenEachOptimization, PortfolioType portfolioType, double maxAcceptableCloseToCloseDrawdown): *************** *** 95,98 **** --- 97,101 ---- this.maxLevelForOverboughtThreshold = maxLevelForOverboughtThreshold; this.divisorForThresholdComputation = divisorForThresholdComputation; + this.symmetricalThresholds = symmetricalThresholds; this.maxAcceptableCloseToCloseDrawdown = maxAcceptableCloseToCloseDrawdown; this.stopLossConditionReached = false; *************** *** 259,263 **** ! protected DataTable getSetOfTickersToBeOptimized(DateTime currentDate) { SelectorByGroup temporizedGroup = new SelectorByGroup(this.tickerGroupID, currentDate); --- 262,266 ---- ! protected virtual DataTable getSetOfTickersToBeOptimized(DateTime currentDate) { SelectorByGroup temporizedGroup = new SelectorByGroup(this.tickerGroupID, currentDate); *************** *** 266,271 **** SelectorByAverageRawOpenPrice byPrice = ! new SelectorByAverageRawOpenPrice(tickersFromGroup,false,currentDate, ! currentDate.AddDays(-30), numOfTickersInGroupAtCurrentDate, 25,500, 0.0001,100); --- 269,274 ---- SelectorByAverageRawOpenPrice byPrice = ! new SelectorByAverageRawOpenPrice(tickersFromGroup,false,currentDate.AddDays(-30), ! currentDate, numOfTickersInGroupAtCurrentDate, 25,500, 0.0001,100); *************** *** 276,288 **** this.numberOfEligibleTickers); ! SelectorByQuotationAtEachMarketDay quotedAtEachMarketDayFromMostLiquid = ! new SelectorByQuotationAtEachMarketDay(mostLiquidSelector.GetTableOfSelectedTickers(), false, currentDate.AddDays(-this.numDaysForOptimizationPeriod), currentDate, ! this.numberOfEligibleTickers, this.benchmark); ! return quotedAtEachMarketDayFromMostLiquid.GetTableOfSelectedTickers(); } ! private void addPVOGenomeToBestGenomes(Genome genome, DateTime firstOptimizationDate, DateTime secondOptimizationDate, --- 279,298 ---- this.numberOfEligibleTickers); ! SelectorByCloseToCloseCorrelationToBenchmark byCorrelationToBenchmark = ! new SelectorByCloseToCloseCorrelationToBenchmark(mostLiquidSelector.GetTableOfSelectedTickers(), ! "^GSPC",false, ! currentDate.AddDays(-this.numDaysForOptimizationPeriod), currentDate, ! this.numberOfEligibleTickers/2,false); ! ! ! SelectorByQuotationAtEachMarketDay quotedAtEachMarketDayFromLastSelection = ! new SelectorByQuotationAtEachMarketDay(byCorrelationToBenchmark.GetTableOfSelectedTickers(), false, currentDate.AddDays(-this.numDaysForOptimizationPeriod), currentDate, ! this.numberOfEligibleTickers/2, this.benchmark); ! return quotedAtEachMarketDayFromLastSelection.GetTableOfSelectedTickers(); } ! protected void addPVOGenomeToBestGenomes(Genome genome, DateTime firstOptimizationDate, DateTime secondOptimizationDate, *************** *** 324,327 **** --- 334,338 ---- this.maxLevelForOverboughtThreshold, this.divisorForThresholdComputation, + this.symmetricalThresholds, this.portfolioType); GeneticOptimizer GO = new GeneticOptimizer(this.iGenomeManager, |