protected override void CalculateFor(int current) { HistoricalPriceVolumeEntry entry = HistoricalData.Items[current]; // int current = i + 1; DateTime date = entry.Date; // int back = current - Period; // back = back < 0 ? 0 : back; // List<HistoricalPriceVolumeEntry> range = HistoricalData.GetPrevAsList(current, BeginCalculationOffset); List <HistoricalPriceVolumeEntry> range = GetPrevRange(); int dayHigh = IndicatorUtils.GetHighestId(range.Select(e => e.High)); // int daysSinceHigh = range.Count - dayHigh; decimal aroonUp = 100 * (BeginCalculationOffset - dayHigh) / (decimal)BeginCalculationOffset; int dayLow = IndicatorUtils.GetLowestId(range.Select(e => e.Low)); // int daysSinceLow = range.Count - dayLow; decimal aroonDown = 100 * (BeginCalculationOffset - dayLow) / (decimal)BeginCalculationOffset; // Debug.WriteLine(""); // Debug.WriteLine($"Date: {date.ToString("d")}"); // Debug.WriteLine($"Up: {aroonUp}"); // Debug.WriteLine($"Down: {aroonDown}"); _upItems.Add(new TechnicalIndicatorItem(date, aroonUp)); _downItems.Add(new TechnicalIndicatorItem(date, aroonDown)); }
public void Calculate(HistoricalPriceVolume data) { List <HistoricalPriceVolumeEntry> graph = data.Items; for (int i = Period; i < graph.Count; i++) { HistoricalPriceVolumeEntry entry = graph[i]; int current = i + 1; DateTime date = entry.Date; int back = current - Period; back = back < 0 ? 0 : back; List <HistoricalPriceVolumeEntry> range = graph.GetRange(i - Period, Period + 1); int dayHigh = IndicatorUtils.GetHighestId(range.Select(e => e.High)); int daysSinceHigh = range.Count - dayHigh; decimal aroonUp = 100 * (Period - daysSinceHigh) / (decimal)Period; int dayLow = IndicatorUtils.GetLowestId(range.Select(e => e.Low)); int daysSinceLow = range.Count - dayLow; decimal aroonDown = 100 * (Period - daysSinceLow) / (decimal)Period; Debug.WriteLine(""); Debug.WriteLine($"Date: {date.ToString("d")}"); Debug.WriteLine($"Up: {aroonUp}"); Debug.WriteLine($"Down: {aroonDown}"); AroonGraph.Add(date, new[] { aroonUp, aroonDown }); } }
/// <summary> /// Gets the value. /// </summary> /// <returns></returns> public override IEnumerable <double> Update(Period period, bool normalize = true) { var ma_20 = Ma20.Update(period, false).First(); var two_std_dev = 2 * IndicatorUtils.StandardDeviation(Ma20.Periods.Select(p => p.Close)); var upperBand = period.Close + two_std_dev; var lowerBand = period.Close - two_std_dev; Value = new double[3] { upperBand, ma_20, lowerBand }; return(normalize ? Value.Select(v => Normalizers.Price.Normalize(v)) : Value); }
/// <summary> /// Gets the value. /// </summary> /// <returns></returns> protected override double AveragePeriods() { if (Periods.Count < Size) { return(0.0); } var period = Periods.Last(); if (PreviousEMA == 0.0) { PreviousEMA = base.AveragePeriods(); } PreviousEMA = IndicatorUtils.EMA(period.Close, PreviousEMA, Multiplier); return(PreviousEMA); }
/// <summary> /// Gets the value. /// </summary> /// <returns></returns> public override IEnumerable <double> Update(Period period, bool normalize = true) { var adx = 0.0; var plusDI = 0.0; var minusDI = 0.0; if (PreviousPeriod != null) { var upMove = period.High - PreviousPeriod.High; var downMove = period.Low - PreviousPeriod.Low; var plusDM = upMove > downMove && upMove > 0.0 ? upMove : 0.0; var minusDM = downMove > upMove && downMove > 0.0 ? downMove : 0.0; var atr = Atr.Update(period).First(); var plusDMOverATR = atr != 0.0 ? plusDM / atr : 0.0; var minusDMOverATR = atr != 0.0 ? minusDM / atr : 0.0; PreviousEMAPlusDI = IndicatorUtils.EMA(plusDMOverATR, PreviousEMAPlusDI, Multiplier); PreviousEMAMinusDI = IndicatorUtils.EMA(minusDMOverATR, PreviousEMAMinusDI, Multiplier); plusDI = 100 * PreviousEMAPlusDI; minusDI = 100 * PreviousEMAMinusDI; var val = (plusDI + minusDI) != 0.0 ? Math.Abs((plusDI - minusDI) / (plusDI + minusDI)) : 0.0; PreviousEmaADX = IndicatorUtils.EMA(val, PreviousEmaADX, Multiplier); adx = 100 * PreviousEmaADX; } PreviousPeriod = period; Value = new double[3] { adx, plusDI, minusDI }; return(normalize ? Value.Select(v => Normalizers.DMI.Normalize(v)) : Value); }