
Author Message:
The following oscillator uses an adaptive moving average as an input for another RSI oscillator and aims to provide a way to minimize the impact of retracements over the oscillator output without introducing significant lag.
An additional trigger line is present in order to provide entry points from the crosses between the oscillator and the trigger line.
More details : https://www.tradingview.com/v/ZIO3hXCd/
CODE:
CSS:
# https://www.tradingview.com/v/ZIO3hXCd/
#// This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International
#// © LuxAlgo
#study("Rainbow Adaptive Rsi","RAR [LuxAlgo]")
# Converted by Sam4Cok@Samer800 - 08/2023
declare lower;
input colorBars = yes;
input length = 15; # "??Length"
input power = 1.0; # "??Power"
input src = close; # "??Source"
input ColorFill = yes; # "??Color Fill"
input showCrosses = yes; # "??Circles"
def na = Double.NaN;
def last = isNaN(close);
#//Rsi[------------
def ama;# = 0.
def diff = src - ama[1];
def rsi1 = rsi(Price = diff,Length = length);
def alpha = AbsValue(rsi1/100 - 0.5);
ama = CompoundValue(1, ama[1] + power(alpha,power) * (src - ama[1]), src);
def rsi = rsi(Price= ama, Length = length);
def len2 = floor(length/2);
def ema2 = ExpAverage(src,len2);
def rsi2 = rsi(Price = ema2,Length = length);
def trigger = ExpAverage(rsi2,len2);
#//Plots[--
plot A = rsi;
plot B = trigger;
A.AssignValueColor(CreateColor(255 - rsi * 2.0, rsi * 2.55, 0));
A.SetLineWeight(2);
B.AssignValueColor(CreateColor(255 - rsi * 2.0, rsi * 2.55, 0));
AddCloud(if !ColorFill then na else if A>80 then A else na, B, Color.GREEN);
AddCloud(if !ColorFill then na else if A<20 then B else na, A, Color.RED);
AddCloud(if !ColorFill then na else if A<=80 and A > 60 then A else na, B, Color.DARK_GREEN);
AddCloud(if !ColorFill then na else if A<=60 and A > 50 then A else na, B, Color.DARK_GREEN);
AddCloud(if !ColorFill then na else if A>=20 and A< 40 then B else na, A, Color.DARK_RED);
AddCloud(if !ColorFill then na else if A>=40 and A< 50 then B else na, A, Color.DARK_RED);
plot "80" = if last then na else 80;
plot "20" = if last then na else 20;
"80".SetDefaultColor(Color.GRAY);
"20".SetDefaultColor(Color.GRAY);
"80".SetStyle(Curve.MEDIUM_DASH);
"20".SetStyle(Curve.MEDIUM_DASH);
#-- Crosses
def cross = showCrosses and crosses(rsi,trigger);
plot CrossPoint = if cross then rsi else na;
CrossPoint.SetPaintingStrategy(PaintingStrategy.POINTS);
CrossPoint.AssignValueColor(CreateColor(255 - rsi * 2.0, rsi * 2.55, 0));
CrossPoint.SetLineWeight(3);
AssignPriceColor(if !colorBars then Color.CURRENT else
CreateColor(255 - rsi * 2.0, rsi * 2.55, 0));
#-- END of CPDE