function Initialize() { IndicatorName = "HPIv2"; // Herrick Payoff Index (HPI) AddInput("Input", Inputs.Candle); PriceStudy = false; AddSeries("HPI", DrawAs.Line, Color.White, AxisType.ZeroBased); AddSeries("HPI_EMA1", DrawAs.Custom, Color.White, AxisType.ZeroBased); AddSeries("HPI_EMA2", DrawAs.Custom, Color.White, AxisType.ZeroBased); AddGlobalVariable("K1", Types.Double, 0.0); AddGlobalVariable("K2", Types.Double, 0.0); AddParameter("PointValue", 1); AddParameter("EMA1_Period", 5); AddParameter("EMA2_Period", 21); } function Evaluate() { // 11/12/2024 dev by Maks // Herrick Payoff Index (HPI) if (CurrentIndex < 1) { HPI = 0.0; HPI_EMA1[0] = HPI; K1 = 2.0/(EMA1_Period + 1.0); HPI_EMA2[0] = HPI; K2 = 2.0/(EMA2_Period + 1.0); } else { double m = (Input.High[ 0] + Input.Low[ 0]) / 2.0; double m1 = (Input.High[-1] + Input.Low[-1]) / 2.0; double i = Math.Abs(Input.OpenInterest[0]- Input.OpenInterest[-1]); double g = Math.Min(Input.OpenInterest[0], Input.OpenInterest[-1]); if (g > 0) HPI = (m - m1) * PointValue * Input.Volume[0] * (1.0 + i / g); else HPI = HPI[1]; // HPI /= 100; HPI_EMA1 = (1.0 - K1)*HPI_EMA1[-1] + K1*HPI[0]; HPI_EMA2 = (1.0 - K2)*HPI_EMA2[-1] + K2*HPI[0]; if (HPI > HPI_EMA2) HPI_EMA1.DrawChannel(HPI_EMA2, Color.Green, 50); else HPI_EMA1.DrawChannel(HPI_EMA2, Color.Red, 50); } }