function Initialize() { IndicatorName = "RSIOMA"; PriceStudy = false; AddInput("Input", Inputs.Candle); AddSeries("RSIOMA", DrawAs.Custom, Color.Red, true, Axes.New); AddSeries("SignalLine", DrawAs.Line, Color.Magenta, true); AddLevel(0, Color.Magenta, LineStyles.Dot, 1, "SignalLine"); AddLevel(0, Color.Magenta, LineStyles.DashBig, 1, "SignalLine"); AddLevel(0, Color.Magenta, LineStyles.DashBig, 1, "SignalLine"); AddParameter("EMA_Period", 21); AddParameter("RSI_Period", 14); AddParameter("Signal_Period", 21); AddParameter("MidLevel", 0); AddParameter("Lvl", 30); AddParameter("Histogramma", 1); // 1 = Histogramma; any other = line AddSeries("_EMA", DrawAs.Line, Color.Black, false); AddSeries("RSI_PosBuffer", DrawAs.Line, Color.Red, false); AddSeries("RSI_NegBuffer", DrawAs.Line, Color.Red, false); AddSeries("MidLevelSerie", DrawAs.Custom, Color.Green, true); AddGlobalVariable("K", Types.Double, 0.0); AddGlobalVariable("KSignal", Types.Double, 0.0); } function Evaluate() { //2023.08.07 dev by Maks MidLevelSerie[0] = (double)MidLevel; if (CurrentIndex < 1) { _EMA[0] = Input.Close[0]; K = 2.0/(EMA_Period + 1.0); RSI_PosBuffer = 0.0; RSI_NegBuffer = 0.0; RSIOMA = (double)MidLevel; SignalLine = RSIOMA; KSignal = 2.0/(Signal_Period + 1.0); } else { _EMA = (1.0 - K)*_EMA[-1] + K*Input.Close[0]; if (true) { //RSI double sump = 0.0; double sumn = 0.0; double rel = _EMA[0] - _EMA[-1]; if (rel > 0) sump = rel; else sumn =-rel; double positive = (RSI_PosBuffer[-1]*(RSI_Period - 1.0) + sump)/RSI_Period; double negative = (RSI_NegBuffer[-1]*(RSI_Period - 1.0) + sumn)/RSI_Period; RSI_PosBuffer = positive; RSI_NegBuffer = negative; if (negative == 0.0) RSIOMA = (double)MidLevel; else RSIOMA = 50.0 + MidLevel - 100.0 / (1.0 + positive/negative); } if (RSIOMA > MidLevel ) { if (RSIOMA > MidLevel + Lvl) if (Histogramma == 1) RSIOMA.DrawHistogram(MidLevelSerie, Color.LawnGreen, Line.Solid, 1, Color.LawnGreen, 100); else RSIOMA.DrawLine(Color.LawnGreen, Line.Solid, 1); else if (Histogramma == 1) RSIOMA.DrawHistogram(MidLevelSerie, Color.ForestGreen, Line.Solid, 1, Color.ForestGreen, 100); else RSIOMA.DrawLine(Color.ForestGreen, Line.Solid, 1); } else { if (RSIOMA < MidLevel - Lvl) if (Histogramma == 1) RSIOMA.DrawHistogram(MidLevelSerie, Color.DeepPink, Line.Solid, 1, Color.DeepPink, 100); else RSIOMA.DrawLine(Color.DeepPink, Line.Solid, 1); else if (Histogramma == 1) RSIOMA.DrawHistogram(MidLevelSerie, Color.Purple, Line.Solid, 1, Color.Purple, 100); else RSIOMA.DrawLine(Color.Purple, Line.Solid, 1); } SignalLine = (1.0 - KSignal)*SignalLine[-1] + KSignal*RSIOMA[0]; Levels[0].Level = MidLevel; Levels[1].Level = MidLevel + Lvl; Levels[2].Level = MidLevel - Lvl; } }