using System; using System.Collections.Generic; using System.Text; using MarketData.MarketDataModel; using MarketData.DataAccess; using MarketData.Utils; using System.Linq; using MarketData.Helper; using MarketData.Numerical; namespace MarketData.Generator.Momentum { public class QualityIndicatorCandidate { public QualityIndicatorCandidate() { } //public QualityIndicatorCandidate(String symbol,double idIndicator,double score) //{ // Symbol=symbol; // IDIndicator=idIndicator; // Score=score; //} public String Symbol{get;set;} public double CumReturn252{get;set;} public double IDIndicator{get;set;} public double Score{get;set;} public int DayCount{get;set;} public double PE{get;set;} public double Beta{get;set;} public double Return1D{get;set;} } // ********************************************************************************************************* public class IDIndicator { private IDIndicator() { } //CountOf CountOf //Negative Positive Return Sign IDIndicator // 50 202 0.2 1 -60.31746032 // 100 152 0.2 1 -20.63492063 // 0 252 0.1 1 -100 // 0 252 0.2 1 -100 // The lower the IDIndicator the better // This calculator deviates from the original by using an exponential decay on the stream of returns such that weigh distant returns a bit less than current returns // and thereby attempt to give a more accurate picture of the quality of current returns. public static double Calculate(Prices prices) { double idIndicator=0.00; double cumulativeReturn=0.00; float[] returns=prices.GetReturns(); ExponentialDecay exponentialDecay=new ExponentialDecay(); exponentialDecay.Prime(returns,2.00); for(int index=0;index0.00 select value).Count(); double negativeCount=(from float value in returns where value<0.00 select value).Count(); for(int index=0;index0.00?1.00:-1.00; idIndicator=sign*((negativeCount/returns.Length)*100.00-(positiveCount/returns.Length)*100.00); return idIndicator; } } }