private List <double> ValuesOfType(SupportAndResistanceValueType type) { IEnumerable <double> values = Values.Where(value => value.Type == type).Select(v => v.Value); List <double> resuList; switch (type) { case SupportAndResistanceValueType.MajorSupport: case SupportAndResistanceValueType.GapSupport: resuList = values.OrderByDescending(d => d).ToList(); break; case SupportAndResistanceValueType.MajorResistance: case SupportAndResistanceValueType.GapResistance: resuList = values.OrderBy(d => d).ToList(); break; default: throw new ArgumentOutOfRangeException("type"); } return(resuList); }
public SupportAndResistanceValue(double value, DateTime date, SupportAndResistanceValueType type) { Value = value; Date = date; Type = type; }
public SupportAndResistance GetSupportAndResistance(double?currentPriceParam = null, double?percentRangeParam = null) { double percentRange = currentPriceParam ?? 0.4; double currentPrice = percentRangeParam ?? _data.Close.Last(); Tuple <int, double> highMax = _data.High.MaximumAndIndex(); Tuple <int, double> lowMin = _data.Low.MinimumAndIndex(); double increment; List <double> priceChainResult = GeneratePriceChain(highMax.Item2, lowMin.Item2, out increment); List <double> volumeProfileResult = VolumeAddition(priceChainResult); priceChainResult.RemoveAt(priceChainResult.Count - 1); List <double> priceChain = priceChainResult.ToList(), volumeProfile = volumeProfileResult.ToList(); List <SupportAndResistanceValue> srValues = FindGaps(ref volumeProfile, ref priceChain); PriceBounds bounds = UpAndDownPrice(highMax.Item2, lowMin.Item2, percentRange, currentPrice); List <double> localPrices; List <double> localVolume; SRpoints(bounds.UpPrice, bounds.DownPrice, priceChain, volumeProfile, increment, SRPointsLocalization.TwoLocal, out localPrices, out localVolume); List <double> idenSR = IdenticalVolumeFilter(ref localPrices, ref localVolume); double priceRangeStdDev = _data.GetPriceRangeStdDev(); //////////////////////////////////// // SRLocalHighFilter mat lab method List <Tuple <int, double> > srPoints = ApplyLocalFilters(localPrices, idenSR, priceRangeStdDev); //global max is always resistence, and global min is always support if (srPoints.All(i => !i.Item2.Equals(highMax.Item2))) { srPoints.Add(highMax); } if (srPoints.All(i => !i.Item2.Equals(lowMin.Item2))) { srPoints.Add(lowMin); } //////////////////////////////////// CrossOverFilter(ref srPoints); //////////////////////////////////// // TODO: consider move to FindGaps IEnumerable <SupportAndResistanceValue> gaps = PartialGap(priceRangeStdDev); srValues.AddRange(gaps); //////////////////////////////////// srValues.AddRange(srPoints.Select((d, i) => { DateTime date = _data.Date[d.Item1]; SupportAndResistanceValueType type = d.Item2 >= currentPrice ? SupportAndResistanceValueType.MajorResistance : SupportAndResistanceValueType.MajorSupport; SupportAndResistanceValue srVal = new SupportAndResistanceValue(d.Item2, date, type); return(srVal); })); SupportAndResistance result = new SupportAndResistance(srValues); return(result); }