SharkWaveTrend For ThinkOrSwim

Join useThinkScript to post your question to a community of 21,000+ developers and traders.

Hey @samer800

Related request from my earlier post of converting TraderOracle but this time for sharkwavetrend lower chart study. If it can be converted to ToS, it would be helpful to all as well. Link: https://www.tradingview.com/script/Rvl0takd-SharkWaveTrend/

Thanks in advance!
The upper study is the Trade Oracle.
https://usethinkscript.com/threads/traderoracle-method-for-thinkorswim.17127/

try this, I didn't test it live.

CSS:
#study(title = 'SharkWaveTrend', shorttitle = 'SharkWaveTrend')
# Converted by Sam4Cok@Samer800 - 12/2023
declare lower;
input colorBars = yes;
input vwapShow = no;#(true, title = 'Show Fast WT', type = input.bool)
input wtChannelLen = 9;#, title = 'WT Channel Length', type = input.integer)
input wtAverageLen = 12;#, title = 'WT Average Length', type = input.integer)
input wtMASource = hlc3;#, title = 'WT MA Source', type = input.source)
input wtMaLen = 3;#, title = 'WT MA Length', type = input.integer)
input obLevel = 53;#, title = 'WT Overbought Level 1', type = input.integer)
input osLevel = -53;#, title = 'WT Oversold Level 1', type = input.integer)
input wtShowDiv = yes;#(true, title = 'Show WT Regular Divergences', type = input.bool)
input wtShowHiddenDiv = no;#(false, title = 'Show WT Hidden Divergences', type = input.bool)
input showHiddenDiv_nl = yes;#(true, title = 'Not apply OB/OS Limits on Hidden Divergences', type = input.bool)
input wtDivOBLevel = 45;#, title = 'WT Bearish Divergence min', type = input.integer)
input wtDivOSLevel = -65;#, title = 'WT Bullish Divergence min', type = input.integer)
input wtDivOBLevel_addshow = yes;#(true, title = 'Show 2nd WT Regular Divergences', type = input.bool)
input wtDivOBLevel_add = 15;#, title = 'WT 2nd Bearish Divergence', type = input.integer)
input wtDivOSLevel_add = -40;#, title = 'WT 2nd Bullish Divergence 15 min', type = input.integer)
input rsiMFIShow = no;#(true, title = 'Show MFI', type = input.bool)
input rsiMFIperiod = 60;#,title = 'MFI Period', type = input.integer)
input rsiMFIMultiplier = 150;#, title = 'MFI Area multiplier', type = input.float)
input rsiMFIPosY = 2.5;#, title = 'MFI Area Y Pos', type = input.float)
input showRsiLine = no;    #(false, title = 'Show RSI', type = input.bool)
input rsiSRC = close;#(close, title = 'RSI Source', type = input.source)
input rsiLen = 14;#, title = 'RSI Length', type = input.integer)
#input rsiOversold = 30;#, title = 'RSI Oversold', minval = 50, maxval = 100, type = input.integer)
#input rsiOverbought = 60;#, title = 'RSI Overbought', minval = 0, maxval = 50, type = input.integer)
input rsiShowDiv = no;#(false, title = 'Show RSI Regular Divergences', type = input.bool)
input rsiShowHiddenDiv = no;#(false, title = 'Show RSI Hidden Divergences', type = input.bool)
input rsiDivOBLevel = 60;#, title = 'RSI Bearish Divergence min', type = input.integer)
input rsiDivOSLevel = 30;#, title = 'RSI Bullish Divergence min', type = input.integer)

input stochShow = no;#(true, title = 'Show Stochastic RSI', type = input.bool)
input stochUseLog = yes;#(true, title=' Use Log?', type = input.bool)
input stochAvg = no;#(false, title='Use Average of both K & D', type = input.bool)
input stochSRC = close;#(close, title = 'Stochastic RSI Source', type = input.source)
input stochLen = 14;#, title = 'Stochastic RSI Length', type = input.integer)
input stochRsiLen = 14;#, title = 'RSI Length ', type = input.integer)
input stochKSmooth = 3;#, title = 'Stochastic RSI K Smooth', type = input.integer)
input stochDSmooth = 3;#, title = 'Stochastic RSI D Smooth', type = input.integer)
input stochShowDiv = no;#(false, title = 'Show Stoch Regular Divergences', type = input.bool)
input stochShowHiddenDiv = no;#(false, title = 'Show Stoch Hidden Divergences', type = input.bool)
input rsiLengthInput = 14;#, minval=1, title="RSI Length", group="Shark")
input rsiSourceInput = close;#, "Source", group="Shark")
input length2 = 30;#, minval=1, group="Shark")
input src = close;#, title="Source", group="Shark")
input mult = 2.0;#, minval=0.001, maxval=50, title="StdDev", group="Shark")
input offset = 0;#, "Offset", minval = -500, maxval = 500, group="Shark")
input HighlightBreaches = yes;#, title="Highlight Oversold/Overbought", group="Shark")
input bApply25and75 = no;#, title="Apply 25/75 RSI rule", group="Shark")


def na = Double.NaN;
def last = IsNaN(close);
def pos = Double.POSITIVE_INFINITY;
def neg = Double.NEGATIVE_INFINITY;

DefineGlobalColor("intense_red", Color.RED);#CreateColor(255, 35, 35));
DefineGlobalColor("regular_red", Color.DARK_RED);#CreateColor(255, 82, 82));
DefineGlobalColor("intense_green", Color.GREEN);#CreateColor(0, 230, 118));
DefineGlobalColor("regular_green", Color.DARK_GREEN);#CreateColor(76, 175, 80));
DefineGlobalColor("wt1", CreateColor(217,205,205));
DefineGlobalColor("wt2", CreateColor(29, 63, 97));
#// } FUNCTIONS
#f_findDivs(src, topLimit, botLimit, useLimits) =>
script f_findDivs {
    input src = close;
    input topLimit = 70;
    input botLimit = 30;
    input useLimits = yes;
    def na = Double.NaN;
    def topfractal = src[4] < src[2] and src[3] < src[2] and src[2] > src[1] and src[2] > src[0];
    def botfractal = src[4] > src[2] and src[3] > src[2] and src[2] < src[1] and src[2] < src[0];
    def top_fractal = if isNaN(topfractal) then 0 else topfractal;
    def bot_fractal = if isNaN(botfractal) then 0 else botfractal;
    def fractalize  = if top_fractal then 1 else if bot_fractal then -1 else 0;
    def fractalTop = if fractalize > 0 and (if useLimits then src[2] >= topLimit else yes) then src[2] else na;
    def fractalBot = if fractalize < 0 and (if useLimits then src[2] <= botLimit else yes) then src[2] else na;
    def TopCond = if !IsNaN(fractalTop) and fractalTop then fractalTop else 0;
    def BotCond = if !IsNaN(fractalBot) and fractalBot then fractalBot else 0;
    def highPrev0;
    def highPrev1;
    def highPrice0;
    def highPrice1;
    if TopCond {
        highPrev1  = highPrev0[1];
        highPrev0  = src[2];
        highPrice1 = highPrice0[1];
        highPrice0 = high[2];
    } else {
        highPrev1  = highPrev1[1];
        highPrev0  = highPrev0[1];
        highPrice1 = highPrice1[1];
        highPrice0 = highPrice0[1];
    }
    def highPrev = highPrev1[2];#if highPrev1 != highPrev1[1] then highPrev1[1] else highPrev[1];
    def highPrice = highPrice1[2];#if highPrice1 != highPrice1[1] then highPrice1[1] else highPrice[1];
    def lowPrev0;
    def lowPrev1;
    def lowPrice0;
    def lowPrice1;
    if BotCond {
        lowPrev1  = lowPrev0[1];
        lowPrev0  = src[2];
        lowPrice1 = lowPrice0[1];
        lowPrice0 = low[2];
    } else {
        lowPrev1  = lowPrev1[1];
        lowPrev0  = lowPrev0[1];
        lowPrice1 = lowPrice1[1];
        lowPrice0 = lowPrice0[1];
    }
    def lowPrev = lowPrev1[2];#if lowPrev1 != lowPrev1[1] then lowPrev1[1] else lowPrev[1];
    def lowPrice = lowPrice1[2];#if lowPrice1 != lowPrice1[1] then lowPrice1[1] else lowPrice[1];
    def bearSignal = TopCond and high[2] > highPrice and src[2] < highPrev;
    def bullSignal = BotCond and low[2] < lowPrice and src[2] > lowPrev;
    def bearDivHidden = TopCond and high[2] < highPrice and src[2] > highPrev;
    def bullDivHidden = BotCond and low[2] > lowPrice and src[2] < lowPrev;
    plot top = if isNaN(TopCond) then 0 else TopCond;#fractalTop;
    plot bot = if isNaN(BotCond) then 0 else BotCond;#fractalBot;
    plot lowP = lowPrev;
    plot sigBear = if isNaN(bearSignal) then 0 else bearSignal;
    plot sigBull = if isNaN(bullSignal) then 0 else bullSignal;
    plot hidBear = if isNaN(bearDivHidden) then 0 else bearDivHidden;
    plot hidBull = if isNaN(bullDivHidden) then 0 else bullDivHidden;
}
#// Stochastic RSI
script f_stochrsi {
    input _src = close;
    input _stochlen = 14;
    input _rsilen = 14;
    input _smoothk = 3;
    input _smoothd = 3;
    input _log = yes;
    input _avg = no;
    def src = if _log then Log(_src) else _src;
    def rsi = RSI(Price = src, Length = _rsilen);
    def stoch = 100 * (rsi - Lowest(rsi, _stochlen)) / (Highest(rsi, _stochlen) - Lowest(rsi, _stochlen));
    def kk = Average(stoch, _smoothk);
    def d1 = Average(kk, _smoothd);
    def avg_1 = (kk + d1) / 2;
    def k = if _avg then avg_1 else kk;
    plot stochK = k;
    plot stochD = d1;
}
#/ RSI+MFI
script f_rsimfi {
    input _period = 60;
    input _multiplier = 150;
    input rsiMFIPosY = 2.5;
    def c = close;
    def o = open;
    def h = high;
    def l = low;
    def dif = (c - o) / (h - l);
    def diff = if !isNaN(dif) then dif else 0;
    def rsimfi = Average(diff * _multiplier, _period) - rsiMFIPosY;
    plot f_rsimfi = rsimfi;
}
#// WaveTrend
script f_wavetrend {
#def wt1 = f_wavetrend(wtMASource, wtChannelLen, wtAverageLen, wtMALen, obLevel, osLevel).wt_1;
    input wtMASource = close;
    input wtChannelLen = 9;
    input wtAverageLen = 12;
    input wtMALen = 3;
    input obLevel = 53;
    input osLevel = -53;
    def tfsrc = wtMASource;
    def esa = ExpAverage(tfsrc, wtChannelLen);
    def de = ExpAverage(AbsValue(tfsrc - esa), wtChannelLen);
    def ci = (tfsrc - esa) / (0.015 * de);
    def wt1 = ExpAverage(ci, wtAverageLen);
    def wt2 = Average(wt1, wtMALen);
    def wtVwap = wt1 - wt2;
    def wtOversold = wt2 <= osLevel;
    def wtOverbought = wt2 >= obLevel;
    def wtCross = Crosses(wt1, wt2, CrossingDirection.ANY);
    def wtCrossUp = (wt2 - wt1) <= 0;
    def wtCrossDown = (wt2 - wt1) >= 0;
    def wtCrosslast = Crosses(wt1[2], wt2[2], CrossingDirection.ANY);
    def wtCrossUplast = (wt2[2] - wt1[2]) <= 0;
    def wtCrossDownlast = (wt2[2] - wt1[2]) >= 0;
    plot wt_1 = wt1;
    plot wt_2 = wt2;
    plot wt_OS = wtOversold;
    plot wt_OB = wtOverbought;
    plot wt_cross = wtCross;
    plot wt_CrossUp = wtCrossUp;
    plot wt_CrossDn = wtCrossDown;
    plot wt_Vwap = wtVwap;
}
#// CALCULATE INDICATORS {
#// RSI
def rsi = RSI(Price = rsiSRC, Length = rsiLen);
#// RSI + MFI Area
def rsiMFI = f_rsimfi(rsiMFIperiod, rsiMFIMultiplier, rsiMFIPosY);
#// Calculates WaveTrend
def wt1 = f_wavetrend(wtMASource, wtChannelLen, wtAverageLen, wtMALen, obLevel, osLevel).wt_1;
def wt2 = f_wavetrend(wtMASource, wtChannelLen, wtAverageLen, wtMALen, obLevel, osLevel).wt_2;
def wtOversold = f_wavetrend(wtMASource, wtChannelLen, wtAverageLen, wtMALen, obLevel, osLevel).wt_OS;
def wtOverbought = f_wavetrend(wtMASource, wtChannelLen, wtAverageLen, wtMALen, obLevel, osLevel).wt_OB;
def wtCross = f_wavetrend(wtMASource, wtChannelLen, wtAverageLen, wtMALen, obLevel, osLevel).wt_cross;
def wtCrossUp = f_wavetrend(wtMASource, wtChannelLen, wtAverageLen, wtMALen, obLevel, osLevel).wt_CrossUp;
def wtCrossDown = f_wavetrend(wtMASource, wtChannelLen, wtAverageLen, wtMALen, obLevel, osLevel).wt_CrossDn;
def wtVwap = f_wavetrend(wtMASource, wtChannelLen, wtAverageLen, wtMALen, obLevel, osLevel).wt_Vwap;
#// Stochastic RSI
def stochK = f_stochrsi(stochSRC, stochLen, stochRsiLen, stochKSmooth, stochDSmooth, stochUseLog, stochAvg).stochK;
def stochD = f_stochrsi(stochSRC, stochLen, stochRsiLen, stochKSmooth, stochDSmooth, stochUseLog, stochAvg).stochD;
#// WT Divergences
def wtBearDiv = f_findDivs(wt2, wtDivOBLevel, wtDivOSLevel, yes).sigBear;
def wtBullDiv = f_findDivs(wt2, wtDivOBLevel, wtDivOSLevel, yes).sigBull;
def wtBearDivHidden = f_findDivs(wt2, wtDivOBLevel, wtDivOSLevel, yes).hidBear;
def wtBullDivHidden = f_findDivs(wt2, wtDivOBLevel, wtDivOSLevel, yes).hidBull;

def wtBearDiv_add = f_findDivs(wt2, wtDivOBLevel_add, wtDivOSLevel_add, yes).sigBear;
def wtBullDiv_add = f_findDivs(wt2, wtDivOBLevel_add, wtDivOSLevel_add, yes).sigBull;
def wtBearDivHidden_add = f_findDivs(wt2, wtDivOBLevel_add, wtDivOSLevel_add, yes).hidBear;
def wtBullDivHidden_add = f_findDivs(wt2, wtDivOBLevel_add, wtDivOSLevel_add, yes).hidBull;
def wtBearDivHidden_nl  = f_findDivs(wt2, 0, 0, no).hidBear;
def wtBullDivHidden_nl  = f_findDivs(wt2, 0, 0, no).hidBull;

def wtBearDivHidden_ = if showHiddenDiv_nl then wtBearDivHidden_nl else wtBearDivHidden;
def wtBullDivHidden_ = if showHiddenDiv_nl then wtBullDivHidden_nl else wtBullDivHidden;

def wtBearDivColor_add = (wtShowDiv and (wtDivOBLevel_addshow and wtBearDiv_add)) or (wtShowHiddenDiv and (wtDivOBLevel_addshow and wtBearDivHidden_add));# ? RED #9a0202 : na
def wtBullDivColor_add = (wtShowDiv and (wtDivOBLevel_addshow and wtBullDiv_add)) or (wtShowHiddenDiv and (wtDivOBLevel_addshow and wtBullDivHidden_add));# ? GREEN #1b5e20 : na

plot wtBearAdd = if wtBearDivColor_add then 103 else na;
plot wtBullAdd = if wtBullDivColor_add then -103 else na;
wtBearAdd.SetDefaultColor(Color.DARK_RED);
wtBullAdd.SetDefaultColor(Color.DARK_GREEN);
wtBearAdd.SetPaintingStrategy(PaintingStrategy.POINTS);
wtBullAdd.SetPaintingStrategy(PaintingStrategy.POINTS);

plot wtBearHid = if wtBearDivHidden_ then 103 else na;
plot wtBullHid = if wtBullDivHidden_ then -103 else na;
wtBearHid.SetDefaultColor(Color.DARK_RED);
wtBullHid.SetDefaultColor(Color.DARK_GREEN);
wtBearHid.SetPaintingStrategy(PaintingStrategy.POINTS);
wtBullHid.SetPaintingStrategy(PaintingStrategy.POINTS);

#// RSI Divergences
def rsiBearDiv = f_findDivs(rsi, rsiDivOBLevel, rsiDivOSLevel, yes).sigBear;
def rsiBullDiv = f_findDivs(rsi, rsiDivOBLevel, rsiDivOSLevel, yes).sigBull;
#// Stoch Divergences
def stochBearDiv = f_findDivs(stochK, 0, 0, no).sigBear;
def stochBullDiv = f_findDivs(stochK, 0, 0, no).sigBull;
def stochBearDivHidden = f_findDivs(stochK, 0, 0, no).hidBear;
def stochBullDivHidden = f_findDivs(stochK, 0, 0, no).hidBull;

def stochBearDivColor = (stochShowDiv and stochBearDiv) or (stochShowHiddenDiv and stochBearDivHidden);#red
def stochBullDivColor = (stochShowDiv and stochBullDiv) or (stochShowHiddenDiv and stochBullDivHidden);#green

plot StBearHid = if stochBearDivColor then 103 else na;
plot StBullHid = if stochBullDivColor then -103 else na;
StBearHid.SetDefaultColor(Color.DARK_RED);
StBullHid.SetDefaultColor(Color.DARK_GREEN);
stBearHid.SetPaintingStrategy(PaintingStrategy.POINTS);
stBullHid.SetPaintingStrategy(PaintingStrategy.POINTS);

#// Buy signal.
def buySignal = wtCross and wtCrossUp and wtOversold;

def buySignalDiv = (wtShowDiv and wtBullDiv) or
               (wtShowDiv and wtBullDiv_add) or
               (stochShowDiv and stochBullDiv) or
               (rsiShowDiv and rsiBullDiv);
#// Sell signal
def sellSignal = wtCross and wtCrossDown and wtOverbought;

def sellSignalDiv = (wtShowDiv and wtBearDiv) or
               (wtShowDiv and wtBearDiv_add) or
               (stochShowDiv and stochBearDiv) or
               (rsiShowDiv and rsiBearDiv);

#// } CALCULATE INDICATORS
#// WT Areas

plot wtWave1 = wt1;    # 'WT Wave 1'
plot wtWave2 = wt2;    # 'WT Wave 2'
wtWave1.SetDefaultColor(GlobalColor("wt1"));
wtWave2.SetDefaultColor(GlobalColor("wt2"));

AddCloud(wtWave1, 0, GlobalColor("wt1"), GlobalColor("wt1"));
AddCloud(wtWave1, 0, GlobalColor("wt1"), GlobalColor("wt1"));
AddCloud(wtWave1, 0, GlobalColor("wt1"), GlobalColor("wt1"));
AddCloud(wtWave2, 0, GlobalColor("wt2"), GlobalColor("wt2"));
AddCloud(wtWave2, 0, GlobalColor("wt2"), GlobalColor("wt2"));
AddCloud(wtWave2, 0, GlobalColor("wt2"), GlobalColor("wt2"));

# RSI
plot rsiLine = if showRsiLine then rsi - 50 else na;
rsiLine.SetDefaultColor(Color.YELLOW);
#/ VWAP
def vwapArea = if vwapShow then wtVwap else na;    # 'VWAP'
AddCloud(vwapArea, 0, Color.YELLOW, Color.YELLOW);
#// MFI AREA
def rsiMFIArea = if rsiMFIShow and !last then rsiMFI else na;#, style=plot.style_area, title='rsiMFI'
AddCloud(rsiMFIArea, 0, Color.GREEN, Color.RED);
# // Stoch RSI
plot stocKline = if stochShow then stochK - 50 else na;
plot stocDline = if stochShow then stochD - 50 else na;
stocKline.SetDefaultColor(Color.CYAN);
stocDline.SetDefaultColor(Color.DARK_ORANGE);
#--Sig
plot bSig = if buySignal then wt1 else na; # 'Buy circle'
plot sSig = if sellSignal then wt1 else na; # 'Sell circle'
bSig.SetPaintingStrategy(PaintingStrategy.SQUARES);
sSig.SetPaintingStrategy(PaintingStrategy.SQUARES);
bSig.SetDefaultColor(Color.GREEN);
sSig.SetDefaultColor(Color.RED);

def bSigDiv = buySignalDiv[-2];#, title = 'Divergence buy circle'
def sSigDiv = sellSignalDiv[-2];#, title = 'Divergence sell circle'

plot wbSigDiv = if sSigDiv then 103 else na;
plot wsSigDiv = if bSigDiv then -103 else na;
wbSigDiv.SetDefaultColor(Color.RED);
wsSigDiv.SetDefaultColor(Color.GREEN);
wbSigDiv.SetPaintingStrategy(PaintingStrategy.POINTS);
wsSigDiv.SetPaintingStrategy(PaintingStrategy.POINTS);

#-- Shark
def ema50  = ExpAverage(src, 50);
def ema200 = ExpAverage(src, 200);
def ema400 = ExpAverage(src, 400);
def ema800 = ExpAverage(src, 800);
def wapwap = Reference vwap().VWAP;

def bTouchedLine = (ema50<high and ema50>low) or (ema200<high and ema200>low) or (ema400<high and ema400>low) or (ema800<high and ema800>low) or (wapwap<high and wapwap>low);
#// RSI
def changRsiSrc = rsiSourceInput - rsiSourceInput[1];
def upTR = WildersAverage(max(changRsiSrc, 0), rsiLengthInput);
def downTR = WildersAverage(-min(changRsiSrc, 0), rsiLengthInput);
#def rsiM = if downTR == 0 then 100 else if upTR == 0 then 0 else 100 - (100 / (1 + upTR / downTR));
def rsiM = RSI(Price = rsiSourceInput, Length = rsiLengthInput);
def basis = Average(rsiM[offset], length2);
def dev = mult * stdev(rsiM[offset], length2);
def upper = basis + dev;
def lower = basis - dev;
def bBelow = rsiM < 26;
def bAbove = rsiM > 74;
def bBelow25;def bAbove75;
if !bApply25and75 {
    bBelow25 = yes;
    bAbove75 = yes;
    } else {
    bBelow25 = bBelow;
    bAbove75 = bAbove;
}
def b_color = if (rsiM > upper and bAbove75) then -1 else
              if (rsiM < lower and bBelow25) then  1 else 0;
def barCol;
if bTouchedLine and b_color == -1 {
    barCol = -2;
    } else
if bTouchedLine and b_color ==  1 {
    barCol = 2;
    } else {
    barCol = b_color;
}
def sigSharkUp1 = if barCol > 1 then pos else neg;
def sigSharkUp2 = if barCol > 0 then pos else neg;
def sigSharkDn1 = if barCol <-1 then pos else neg;
def sigSharkDn2 = if barCol < 0 then pos else neg;

AddCloud(sigSharkUp1, neg, Color.GREEN);
AddCloud(sigSharkUp2, neg, Color.DARK_GREEN);
AddCloud(sigSharkDn1, neg, Color.RED);
AddCloud(sigSharkDn2, neg, Color.DARK_RED);

AssignPriceColor(if !colorBars then Color.CURRENT else
                 if barCol ==  2 then GlobalColor("intense_green") else
                 if barCol ==  1 then GlobalColor("regular_green") else
                 if barCol == -1 then GlobalColor("regular_red") else
                 if barCol == -2 then GlobalColor("intense_red") else Color.GRAY);


#-- END of CODE
 
Last edited by a moderator:
try this, I didn't test it live.

CSS:
#study(title = 'SharkWaveTrend', shorttitle = 'SharkWaveTrend')
# Converted by Sam4Cok@Samer800 - 12/2023
declare lower;
input colorBars = yes;
input vwapShow = no;#(true, title = 'Show Fast WT', type = input.bool)
input wtChannelLen = 9;#, title = 'WT Channel Length', type = input.integer)
input wtAverageLen = 12;#, title = 'WT Average Length', type = input.integer)
input wtMASource = hlc3;#, title = 'WT MA Source', type = input.source)
input wtMaLen = 3;#, title = 'WT MA Length', type = input.integer)
input obLevel = 53;#, title = 'WT Overbought Level 1', type = input.integer)
input osLevel = -53;#, title = 'WT Oversold Level 1', type = input.integer)
input wtShowDiv = yes;#(true, title = 'Show WT Regular Divergences', type = input.bool)
input wtShowHiddenDiv = no;#(false, title = 'Show WT Hidden Divergences', type = input.bool)
input showHiddenDiv_nl = yes;#(true, title = 'Not apply OB/OS Limits on Hidden Divergences', type = input.bool)
input wtDivOBLevel = 45;#, title = 'WT Bearish Divergence min', type = input.integer)
input wtDivOSLevel = -65;#, title = 'WT Bullish Divergence min', type = input.integer)
input wtDivOBLevel_addshow = yes;#(true, title = 'Show 2nd WT Regular Divergences', type = input.bool)
input wtDivOBLevel_add = 15;#, title = 'WT 2nd Bearish Divergence', type = input.integer)
input wtDivOSLevel_add = -40;#, title = 'WT 2nd Bullish Divergence 15 min', type = input.integer)
input rsiMFIShow = no;#(true, title = 'Show MFI', type = input.bool)
input rsiMFIperiod = 60;#,title = 'MFI Period', type = input.integer)
input rsiMFIMultiplier = 150;#, title = 'MFI Area multiplier', type = input.float)
input rsiMFIPosY = 2.5;#, title = 'MFI Area Y Pos', type = input.float)
input showRsiLine = no;    #(false, title = 'Show RSI', type = input.bool)
input rsiSRC = close;#(close, title = 'RSI Source', type = input.source)
input rsiLen = 14;#, title = 'RSI Length', type = input.integer)
#input rsiOversold = 30;#, title = 'RSI Oversold', minval = 50, maxval = 100, type = input.integer)
#input rsiOverbought = 60;#, title = 'RSI Overbought', minval = 0, maxval = 50, type = input.integer)
input rsiShowDiv = no;#(false, title = 'Show RSI Regular Divergences', type = input.bool)
input rsiShowHiddenDiv = no;#(false, title = 'Show RSI Hidden Divergences', type = input.bool)
input rsiDivOBLevel = 60;#, title = 'RSI Bearish Divergence min', type = input.integer)
input rsiDivOSLevel = 30;#, title = 'RSI Bullish Divergence min', type = input.integer)

input stochShow = no;#(true, title = 'Show Stochastic RSI', type = input.bool)
input stochUseLog = yes;#(true, title=' Use Log?', type = input.bool)
input stochAvg = no;#(false, title='Use Average of both K & D', type = input.bool)
input stochSRC = close;#(close, title = 'Stochastic RSI Source', type = input.source)
input stochLen = 14;#, title = 'Stochastic RSI Length', type = input.integer)
input stochRsiLen = 14;#, title = 'RSI Length ', type = input.integer)
input stochKSmooth = 3;#, title = 'Stochastic RSI K Smooth', type = input.integer)
input stochDSmooth = 3;#, title = 'Stochastic RSI D Smooth', type = input.integer)
input stochShowDiv = no;#(false, title = 'Show Stoch Regular Divergences', type = input.bool)
input stochShowHiddenDiv = no;#(false, title = 'Show Stoch Hidden Divergences', type = input.bool)
input rsiLengthInput = 14;#, minval=1, title="RSI Length", group="Shark")
input rsiSourceInput = close;#, "Source", group="Shark")
input length2 = 30;#, minval=1, group="Shark")
input src = close;#, title="Source", group="Shark")
input mult = 2.0;#, minval=0.001, maxval=50, title="StdDev", group="Shark")
input offset = 0;#, "Offset", minval = -500, maxval = 500, group="Shark")
input HighlightBreaches = yes;#, title="Highlight Oversold/Overbought", group="Shark")
input bApply25and75 = no;#, title="Apply 25/75 RSI rule", group="Shark")


def na = Double.NaN;
def last = IsNaN(close);
def pos = Double.POSITIVE_INFINITY;
def neg = Double.NEGATIVE_INFINITY;

DefineGlobalColor("intense_red", Color.RED);#CreateColor(255, 35, 35));
DefineGlobalColor("regular_red", Color.DARK_RED);#CreateColor(255, 82, 82));
DefineGlobalColor("intense_green", Color.GREEN);#CreateColor(0, 230, 118));
DefineGlobalColor("regular_green", Color.DARK_GREEN);#CreateColor(76, 175, 80));
DefineGlobalColor("wt1", CreateColor(217,205,205));
DefineGlobalColor("wt2", CreateColor(29, 63, 97));
#// } FUNCTIONS
#f_findDivs(src, topLimit, botLimit, useLimits) =>
script f_findDivs {
    input src = close;
    input topLimit = 70;
    input botLimit = 30;
    input useLimits = yes;
    def na = Double.NaN;
    def topfractal = src[4] < src[2] and src[3] < src[2] and src[2] > src[1] and src[2] > src[0];
    def botfractal = src[4] > src[2] and src[3] > src[2] and src[2] < src[1] and src[2] < src[0];
    def top_fractal = if isNaN(topfractal) then 0 else topfractal;
    def bot_fractal = if isNaN(botfractal) then 0 else botfractal;
    def fractalize  = if top_fractal then 1 else if bot_fractal then -1 else 0;
    def fractalTop = if fractalize > 0 and (if useLimits then src[2] >= topLimit else yes) then src[2] else na;
    def fractalBot = if fractalize < 0 and (if useLimits then src[2] <= botLimit else yes) then src[2] else na;
    def TopCond = if !IsNaN(fractalTop) and fractalTop then fractalTop else 0;
    def BotCond = if !IsNaN(fractalBot) and fractalBot then fractalBot else 0;
    def highPrev0;
    def highPrev1;
    def highPrice0;
    def highPrice1;
    if TopCond {
        highPrev1  = highPrev0[1];
        highPrev0  = src[2];
        highPrice1 = highPrice0[1];
        highPrice0 = high[2];
    } else {
        highPrev1  = highPrev1[1];
        highPrev0  = highPrev0[1];
        highPrice1 = highPrice1[1];
        highPrice0 = highPrice0[1];
    }
    def highPrev = highPrev1[2];#if highPrev1 != highPrev1[1] then highPrev1[1] else highPrev[1];
    def highPrice = highPrice1[2];#if highPrice1 != highPrice1[1] then highPrice1[1] else highPrice[1];
    def lowPrev0;
    def lowPrev1;
    def lowPrice0;
    def lowPrice1;
    if BotCond {
        lowPrev1  = lowPrev0[1];
        lowPrev0  = src[2];
        lowPrice1 = lowPrice0[1];
        lowPrice0 = low[2];
    } else {
        lowPrev1  = lowPrev1[1];
        lowPrev0  = lowPrev0[1];
        lowPrice1 = lowPrice1[1];
        lowPrice0 = lowPrice0[1];
    }
    def lowPrev = lowPrev1[2];#if lowPrev1 != lowPrev1[1] then lowPrev1[1] else lowPrev[1];
    def lowPrice = lowPrice1[2];#if lowPrice1 != lowPrice1[1] then lowPrice1[1] else lowPrice[1];
    def bearSignal = TopCond and high[2] > highPrice and src[2] < highPrev;
    def bullSignal = BotCond and low[2] < lowPrice and src[2] > lowPrev;
    def bearDivHidden = TopCond and high[2] < highPrice and src[2] > highPrev;
    def bullDivHidden = BotCond and low[2] > lowPrice and src[2] < lowPrev;
    plot top = if isNaN(TopCond) then 0 else TopCond;#fractalTop;
    plot bot = if isNaN(BotCond) then 0 else BotCond;#fractalBot;
    plot lowP = lowPrev;
    plot sigBear = if isNaN(bearSignal) then 0 else bearSignal;
    plot sigBull = if isNaN(bullSignal) then 0 else bullSignal;
    plot hidBear = if isNaN(bearDivHidden) then 0 else bearDivHidden;
    plot hidBull = if isNaN(bullDivHidden) then 0 else bullDivHidden;
}
#// Stochastic RSI
script f_stochrsi {
    input _src = close;
    input _stochlen = 14;
    input _rsilen = 14;
    input _smoothk = 3;
    input _smoothd = 3;
    input _log = yes;
    input _avg = no;
    def src = if _log then Log(_src) else _src;
    def rsi = RSI(Price = src, Length = _rsilen);
    def stoch = 100 * (rsi - Lowest(rsi, _stochlen)) / (Highest(rsi, _stochlen) - Lowest(rsi, _stochlen));
    def kk = Average(stoch, _smoothk);
    def d1 = Average(kk, _smoothd);
    def avg_1 = (kk + d1) / 2;
    def k = if _avg then avg_1 else kk;
    plot stochK = k;
    plot stochD = d1;
}
#/ RSI+MFI
script f_rsimfi {
    input _period = 60;
    input _multiplier = 150;
    input rsiMFIPosY = 2.5;
    def c = close;
    def o = open;
    def h = high;
    def l = low;
    def dif = (c - o) / (h - l);
    def diff = if !isNaN(dif) then dif else 0;
    def rsimfi = Average(diff * _multiplier, _period) - rsiMFIPosY;
    plot f_rsimfi = rsimfi;
}
#// WaveTrend
script f_wavetrend {
#def wt1 = f_wavetrend(wtMASource, wtChannelLen, wtAverageLen, wtMALen, obLevel, osLevel).wt_1;
    input wtMASource = close;
    input wtChannelLen = 9;
    input wtAverageLen = 12;
    input wtMALen = 3;
    input obLevel = 53;
    input osLevel = -53;
    def tfsrc = wtMASource;
    def esa = ExpAverage(tfsrc, wtChannelLen);
    def de = ExpAverage(AbsValue(tfsrc - esa), wtChannelLen);
    def ci = (tfsrc - esa) / (0.015 * de);
    def wt1 = ExpAverage(ci, wtAverageLen);
    def wt2 = Average(wt1, wtMALen);
    def wtVwap = wt1 - wt2;
    def wtOversold = wt2 <= osLevel;
    def wtOverbought = wt2 >= obLevel;
    def wtCross = Crosses(wt1, wt2, CrossingDirection.ANY);
    def wtCrossUp = (wt2 - wt1) <= 0;
    def wtCrossDown = (wt2 - wt1) >= 0;
    def wtCrosslast = Crosses(wt1[2], wt2[2], CrossingDirection.ANY);
    def wtCrossUplast = (wt2[2] - wt1[2]) <= 0;
    def wtCrossDownlast = (wt2[2] - wt1[2]) >= 0;
    plot wt_1 = wt1;
    plot wt_2 = wt2;
    plot wt_OS = wtOversold;
    plot wt_OB = wtOverbought;
    plot wt_cross = wtCross;
    plot wt_CrossUp = wtCrossUp;
    plot wt_CrossDn = wtCrossDown;
    plot wt_Vwap = wtVwap;
}
#// CALCULATE INDICATORS {
#// RSI
def rsi = RSI(Price = rsiSRC, Length = rsiLen);
#// RSI + MFI Area
def rsiMFI = f_rsimfi(rsiMFIperiod, rsiMFIMultiplier, rsiMFIPosY);
#// Calculates WaveTrend
def wt1 = f_wavetrend(wtMASource, wtChannelLen, wtAverageLen, wtMALen, obLevel, osLevel).wt_1;
def wt2 = f_wavetrend(wtMASource, wtChannelLen, wtAverageLen, wtMALen, obLevel, osLevel).wt_2;
def wtOversold = f_wavetrend(wtMASource, wtChannelLen, wtAverageLen, wtMALen, obLevel, osLevel).wt_OS;
def wtOverbought = f_wavetrend(wtMASource, wtChannelLen, wtAverageLen, wtMALen, obLevel, osLevel).wt_OB;
def wtCross = f_wavetrend(wtMASource, wtChannelLen, wtAverageLen, wtMALen, obLevel, osLevel).wt_cross;
def wtCrossUp = f_wavetrend(wtMASource, wtChannelLen, wtAverageLen, wtMALen, obLevel, osLevel).wt_CrossUp;
def wtCrossDown = f_wavetrend(wtMASource, wtChannelLen, wtAverageLen, wtMALen, obLevel, osLevel).wt_CrossDn;
def wtVwap = f_wavetrend(wtMASource, wtChannelLen, wtAverageLen, wtMALen, obLevel, osLevel).wt_Vwap;
#// Stochastic RSI
def stochK = f_stochrsi(stochSRC, stochLen, stochRsiLen, stochKSmooth, stochDSmooth, stochUseLog, stochAvg).stochK;
def stochD = f_stochrsi(stochSRC, stochLen, stochRsiLen, stochKSmooth, stochDSmooth, stochUseLog, stochAvg).stochD;
#// WT Divergences
def wtBearDiv = f_findDivs(wt2, wtDivOBLevel, wtDivOSLevel, yes).sigBear;
def wtBullDiv = f_findDivs(wt2, wtDivOBLevel, wtDivOSLevel, yes).sigBull;
def wtBearDivHidden = f_findDivs(wt2, wtDivOBLevel, wtDivOSLevel, yes).hidBear;
def wtBullDivHidden = f_findDivs(wt2, wtDivOBLevel, wtDivOSLevel, yes).hidBull;

def wtBearDiv_add = f_findDivs(wt2, wtDivOBLevel_add, wtDivOSLevel_add, yes).sigBear;
def wtBullDiv_add = f_findDivs(wt2, wtDivOBLevel_add, wtDivOSLevel_add, yes).sigBull;
def wtBearDivHidden_add = f_findDivs(wt2, wtDivOBLevel_add, wtDivOSLevel_add, yes).hidBear;
def wtBullDivHidden_add = f_findDivs(wt2, wtDivOBLevel_add, wtDivOSLevel_add, yes).hidBull;
def wtBearDivHidden_nl  = f_findDivs(wt2, 0, 0, no).hidBear;
def wtBullDivHidden_nl  = f_findDivs(wt2, 0, 0, no).hidBull;

def wtBearDivHidden_ = if showHiddenDiv_nl then wtBearDivHidden_nl else wtBearDivHidden;
def wtBullDivHidden_ = if showHiddenDiv_nl then wtBullDivHidden_nl else wtBullDivHidden;

def wtBearDivColor_add = (wtShowDiv and (wtDivOBLevel_addshow and wtBearDiv_add)) or (wtShowHiddenDiv and (wtDivOBLevel_addshow and wtBearDivHidden_add));# ? RED #9a0202 : na
def wtBullDivColor_add = (wtShowDiv and (wtDivOBLevel_addshow and wtBullDiv_add)) or (wtShowHiddenDiv and (wtDivOBLevel_addshow and wtBullDivHidden_add));# ? GREEN #1b5e20 : na

plot wtBearAdd = if wtBearDivColor_add then 103 else na;
plot wtBullAdd = if wtBullDivColor_add then -103 else na;
wtBearAdd.SetDefaultColor(Color.DARK_RED);
wtBullAdd.SetDefaultColor(Color.DARK_GREEN);
wtBearAdd.SetPaintingStrategy(PaintingStrategy.POINTS);
wtBullAdd.SetPaintingStrategy(PaintingStrategy.POINTS);

plot wtBearHid = if wtBearDivHidden_ then 103 else na;
plot wtBullHid = if wtBullDivHidden_ then -103 else na;
wtBearHid.SetDefaultColor(Color.DARK_RED);
wtBullHid.SetDefaultColor(Color.DARK_GREEN);
wtBearHid.SetPaintingStrategy(PaintingStrategy.POINTS);
wtBullHid.SetPaintingStrategy(PaintingStrategy.POINTS);

#// RSI Divergences
def rsiBearDiv = f_findDivs(rsi, rsiDivOBLevel, rsiDivOSLevel, yes).sigBear;
def rsiBullDiv = f_findDivs(rsi, rsiDivOBLevel, rsiDivOSLevel, yes).sigBull;
#// Stoch Divergences
def stochBearDiv = f_findDivs(stochK, 0, 0, no).sigBear;
def stochBullDiv = f_findDivs(stochK, 0, 0, no).sigBull;
def stochBearDivHidden = f_findDivs(stochK, 0, 0, no).hidBear;
def stochBullDivHidden = f_findDivs(stochK, 0, 0, no).hidBull;

def stochBearDivColor = (stochShowDiv and stochBearDiv) or (stochShowHiddenDiv and stochBearDivHidden);#red
def stochBullDivColor = (stochShowDiv and stochBullDiv) or (stochShowHiddenDiv and stochBullDivHidden);#green

plot StBearHid = if stochBearDivColor then 103 else na;
plot StBullHid = if stochBullDivColor then -103 else na;
StBearHid.SetDefaultColor(Color.DARK_RED);
StBullHid.SetDefaultColor(Color.DARK_GREEN);
stBearHid.SetPaintingStrategy(PaintingStrategy.POINTS);
stBullHid.SetPaintingStrategy(PaintingStrategy.POINTS);

#// Buy signal.
def buySignal = wtCross and wtCrossUp and wtOversold;

def buySignalDiv = (wtShowDiv and wtBullDiv) or
               (wtShowDiv and wtBullDiv_add) or
               (stochShowDiv and stochBullDiv) or
               (rsiShowDiv and rsiBullDiv);
#// Sell signal
def sellSignal = wtCross and wtCrossDown and wtOverbought;

def sellSignalDiv = (wtShowDiv and wtBearDiv) or
               (wtShowDiv and wtBearDiv_add) or
               (stochShowDiv and stochBearDiv) or
               (rsiShowDiv and rsiBearDiv);

#// } CALCULATE INDICATORS
#// WT Areas

plot wtWave1 = wt1;    # 'WT Wave 1'
plot wtWave2 = wt2;    # 'WT Wave 2'
wtWave1.SetDefaultColor(GlobalColor("wt1"));
wtWave2.SetDefaultColor(GlobalColor("wt2"));

AddCloud(wtWave1, 0, GlobalColor("wt1"), GlobalColor("wt1"));
AddCloud(wtWave1, 0, GlobalColor("wt1"), GlobalColor("wt1"));
AddCloud(wtWave1, 0, GlobalColor("wt1"), GlobalColor("wt1"));
AddCloud(wtWave2, 0, GlobalColor("wt2"), GlobalColor("wt2"));
AddCloud(wtWave2, 0, GlobalColor("wt2"), GlobalColor("wt2"));
AddCloud(wtWave2, 0, GlobalColor("wt2"), GlobalColor("wt2"));

# RSI
plot rsiLine = if showRsiLine then rsi - 50 else na;
rsiLine.SetDefaultColor(Color.YELLOW);
#/ VWAP
def vwapArea = if vwapShow then wtVwap else na;    # 'VWAP'
AddCloud(vwapArea, 0, Color.YELLOW, Color.YELLOW);
#// MFI AREA
def rsiMFIArea = if rsiMFIShow and !last then rsiMFI else na;#, style=plot.style_area, title='rsiMFI'
AddCloud(rsiMFIArea, 0, Color.GREEN, Color.RED);
# // Stoch RSI
plot stocKline = if stochShow then stochK - 50 else na;
plot stocDline = if stochShow then stochD - 50 else na;
stocKline.SetDefaultColor(Color.CYAN);
stocDline.SetDefaultColor(Color.DARK_ORANGE);
#--Sig
plot bSig = if buySignal then wt1 else na; # 'Buy circle'
plot sSig = if sellSignal then wt1 else na; # 'Sell circle'
bSig.SetPaintingStrategy(PaintingStrategy.SQUARES);
sSig.SetPaintingStrategy(PaintingStrategy.SQUARES);
bSig.SetDefaultColor(Color.GREEN);
sSig.SetDefaultColor(Color.RED);

def bSigDiv = buySignalDiv[-2];#, title = 'Divergence buy circle'
def sSigDiv = sellSignalDiv[-2];#, title = 'Divergence sell circle'

plot wbSigDiv = if sSigDiv then 103 else na;
plot wsSigDiv = if bSigDiv then -103 else na;
wbSigDiv.SetDefaultColor(Color.RED);
wsSigDiv.SetDefaultColor(Color.GREEN);
wbSigDiv.SetPaintingStrategy(PaintingStrategy.POINTS);
wsSigDiv.SetPaintingStrategy(PaintingStrategy.POINTS);

#-- Shark
def ema50  = ExpAverage(src, 50);
def ema200 = ExpAverage(src, 200);
def ema400 = ExpAverage(src, 400);
def ema800 = ExpAverage(src, 800);
def wapwap = Reference vwap().VWAP;

def bTouchedLine = (ema50<high and ema50>low) or (ema200<high and ema200>low) or (ema400<high and ema400>low) or (ema800<high and ema800>low) or (wapwap<high and wapwap>low);
#// RSI
def changRsiSrc = rsiSourceInput - rsiSourceInput[1];
def upTR = WildersAverage(max(changRsiSrc, 0), rsiLengthInput);
def downTR = WildersAverage(-min(changRsiSrc, 0), rsiLengthInput);
#def rsiM = if downTR == 0 then 100 else if upTR == 0 then 0 else 100 - (100 / (1 + upTR / downTR));
def rsiM = RSI(Price = rsiSourceInput, Length = rsiLengthInput);
def basis = Average(rsiM[offset], length2);
def dev = mult * stdev(rsiM[offset], length2);
def upper = basis + dev;
def lower = basis - dev;
def bBelow = rsiM < 26;
def bAbove = rsiM > 74;
def bBelow25;def bAbove75;
if !bApply25and75 {
    bBelow25 = yes;
    bAbove75 = yes;
    } else {
    bBelow25 = bBelow;
    bAbove75 = bAbove;
}
def b_color = if (rsiM > upper and bAbove75) then -1 else
              if (rsiM < lower and bBelow25) then  1 else 0;
def barCol;
if bTouchedLine and b_color == -1 {
    barCol = -2;
    } else
if bTouchedLine and b_color ==  1 {
    barCol = 2;
    } else {
    barCol = b_color;
}
def sigSharkUp1 = if barCol > 1 then pos else neg;
def sigSharkUp2 = if barCol > 0 then pos else neg;
def sigSharkDn1 = if barCol <-1 then pos else neg;
def sigSharkDn2 = if barCol < 0 then pos else neg;

AddCloud(sigSharkUp1, neg, Color.GREEN);
AddCloud(sigSharkUp2, neg, Color.DARK_GREEN);
AddCloud(sigSharkDn1, neg, Color.RED);
AddCloud(sigSharkDn2, neg, Color.DARK_RED);

AssignPriceColor(if !colorBars then Color.CURRENT else
                 if barCol ==  2 then GlobalColor("intense_green") else
                 if barCol ==  1 then GlobalColor("regular_green") else
                 if barCol == -1 then GlobalColor("regular_red") else
                 if barCol == -2 then GlobalColor("intense_red") else Color.GRAY);


#-- END of CODE
Thank you @samer800 !! I'll try it.
 
Anyway to make a watchlist column for this? More specifically, for when the line crosses above and below the yellow line. Somebody should make diagrams on how some of these indicators work or make videos. Otherwise, you might be guessing when to use the indicator for bullish entries or bearish entries.
 
Anyway to make a watchlist column for this? More specifically, for when the line crosses above and below the yellow line. Somebody should make diagrams on how some of these indicators work or make videos. Otherwise, you might be guessing when to use the indicator for bullish entries or bearish entries.
There are many videos by TraderOracle youtuber who created all these indicators.
 
Any way to convert this script he uses in conjunction with the shark wave? I tried learning this coding stuff, but never caught on. I wrote some very minor changes to some, but can't do these massive conversions of Tradeview code.
https://www.tradingview.com/script/yE35zW1B-TraderOracle-Method/

check the below:
TradeOracle
https://usethinkscript.com/threads/traderoracle-method-for-thinkorswim.17127/

SharkWave:
https://usethinkscript.com/threads/sharkwavetrend-for-thinkorswim.17331/
 
Last edited by a moderator:
try this, I didn't test it live.

CSS:
#study(title = 'SharkWaveTrend', shorttitle = 'SharkWaveTrend')
# Converted by Sam4Cok@Samer800 - 12/2023
declare lower;
input colorBars = yes;
input vwapShow = no;#(true, title = 'Show Fast WT', type = input.bool)
input wtChannelLen = 9;#, title = 'WT Channel Length', type = input.integer)
input wtAverageLen = 12;#, title = 'WT Average Length', type = input.integer)
input wtMASource = hlc3;#, title = 'WT MA Source', type = input.source)
input wtMaLen = 3;#, title = 'WT MA Length', type = input.integer)
input obLevel = 53;#, title = 'WT Overbought Level 1', type = input.integer)
input osLevel = -53;#, title = 'WT Oversold Level 1', type = input.integer)
input wtShowDiv = yes;#(true, title = 'Show WT Regular Divergences', type = input.bool)
input wtShowHiddenDiv = no;#(false, title = 'Show WT Hidden Divergences', type = input.bool)
input showHiddenDiv_nl = yes;#(true, title = 'Not apply OB/OS Limits on Hidden Divergences', type = input.bool)
input wtDivOBLevel = 45;#, title = 'WT Bearish Divergence min', type = input.integer)
input wtDivOSLevel = -65;#, title = 'WT Bullish Divergence min', type = input.integer)
input wtDivOBLevel_addshow = yes;#(true, title = 'Show 2nd WT Regular Divergences', type = input.bool)
input wtDivOBLevel_add = 15;#, title = 'WT 2nd Bearish Divergence', type = input.integer)
input wtDivOSLevel_add = -40;#, title = 'WT 2nd Bullish Divergence 15 min', type = input.integer)
input rsiMFIShow = no;#(true, title = 'Show MFI', type = input.bool)
input rsiMFIperiod = 60;#,title = 'MFI Period', type = input.integer)
input rsiMFIMultiplier = 150;#, title = 'MFI Area multiplier', type = input.float)
input rsiMFIPosY = 2.5;#, title = 'MFI Area Y Pos', type = input.float)
input showRsiLine = no;    #(false, title = 'Show RSI', type = input.bool)
input rsiSRC = close;#(close, title = 'RSI Source', type = input.source)
input rsiLen = 14;#, title = 'RSI Length', type = input.integer)
#input rsiOversold = 30;#, title = 'RSI Oversold', minval = 50, maxval = 100, type = input.integer)
#input rsiOverbought = 60;#, title = 'RSI Overbought', minval = 0, maxval = 50, type = input.integer)
input rsiShowDiv = no;#(false, title = 'Show RSI Regular Divergences', type = input.bool)
input rsiShowHiddenDiv = no;#(false, title = 'Show RSI Hidden Divergences', type = input.bool)
input rsiDivOBLevel = 60;#, title = 'RSI Bearish Divergence min', type = input.integer)
input rsiDivOSLevel = 30;#, title = 'RSI Bullish Divergence min', type = input.integer)

input stochShow = no;#(true, title = 'Show Stochastic RSI', type = input.bool)
input stochUseLog = yes;#(true, title=' Use Log?', type = input.bool)
input stochAvg = no;#(false, title='Use Average of both K & D', type = input.bool)
input stochSRC = close;#(close, title = 'Stochastic RSI Source', type = input.source)
input stochLen = 14;#, title = 'Stochastic RSI Length', type = input.integer)
input stochRsiLen = 14;#, title = 'RSI Length ', type = input.integer)
input stochKSmooth = 3;#, title = 'Stochastic RSI K Smooth', type = input.integer)
input stochDSmooth = 3;#, title = 'Stochastic RSI D Smooth', type = input.integer)
input stochShowDiv = no;#(false, title = 'Show Stoch Regular Divergences', type = input.bool)
input stochShowHiddenDiv = no;#(false, title = 'Show Stoch Hidden Divergences', type = input.bool)
input rsiLengthInput = 14;#, minval=1, title="RSI Length", group="Shark")
input rsiSourceInput = close;#, "Source", group="Shark")
input length2 = 30;#, minval=1, group="Shark")
input src = close;#, title="Source", group="Shark")
input mult = 2.0;#, minval=0.001, maxval=50, title="StdDev", group="Shark")
input offset = 0;#, "Offset", minval = -500, maxval = 500, group="Shark")
input HighlightBreaches = yes;#, title="Highlight Oversold/Overbought", group="Shark")
input bApply25and75 = no;#, title="Apply 25/75 RSI rule", group="Shark")


def na = Double.NaN;
def last = IsNaN(close);
def pos = Double.POSITIVE_INFINITY;
def neg = Double.NEGATIVE_INFINITY;

DefineGlobalColor("intense_red", Color.RED);#CreateColor(255, 35, 35));
DefineGlobalColor("regular_red", Color.DARK_RED);#CreateColor(255, 82, 82));
DefineGlobalColor("intense_green", Color.GREEN);#CreateColor(0, 230, 118));
DefineGlobalColor("regular_green", Color.DARK_GREEN);#CreateColor(76, 175, 80));
DefineGlobalColor("wt1", CreateColor(217,205,205));
DefineGlobalColor("wt2", CreateColor(29, 63, 97));
#// } FUNCTIONS
#f_findDivs(src, topLimit, botLimit, useLimits) =>
script f_findDivs {
    input src = close;
    input topLimit = 70;
    input botLimit = 30;
    input useLimits = yes;
    def na = Double.NaN;
    def topfractal = src[4] < src[2] and src[3] < src[2] and src[2] > src[1] and src[2] > src[0];
    def botfractal = src[4] > src[2] and src[3] > src[2] and src[2] < src[1] and src[2] < src[0];
    def top_fractal = if isNaN(topfractal) then 0 else topfractal;
    def bot_fractal = if isNaN(botfractal) then 0 else botfractal;
    def fractalize  = if top_fractal then 1 else if bot_fractal then -1 else 0;
    def fractalTop = if fractalize > 0 and (if useLimits then src[2] >= topLimit else yes) then src[2] else na;
    def fractalBot = if fractalize < 0 and (if useLimits then src[2] <= botLimit else yes) then src[2] else na;
    def TopCond = if !IsNaN(fractalTop) and fractalTop then fractalTop else 0;
    def BotCond = if !IsNaN(fractalBot) and fractalBot then fractalBot else 0;
    def highPrev0;
    def highPrev1;
    def highPrice0;
    def highPrice1;
    if TopCond {
        highPrev1  = highPrev0[1];
        highPrev0  = src[2];
        highPrice1 = highPrice0[1];
        highPrice0 = high[2];
    } else {
        highPrev1  = highPrev1[1];
        highPrev0  = highPrev0[1];
        highPrice1 = highPrice1[1];
        highPrice0 = highPrice0[1];
    }
    def highPrev = highPrev1[2];#if highPrev1 != highPrev1[1] then highPrev1[1] else highPrev[1];
    def highPrice = highPrice1[2];#if highPrice1 != highPrice1[1] then highPrice1[1] else highPrice[1];
    def lowPrev0;
    def lowPrev1;
    def lowPrice0;
    def lowPrice1;
    if BotCond {
        lowPrev1  = lowPrev0[1];
        lowPrev0  = src[2];
        lowPrice1 = lowPrice0[1];
        lowPrice0 = low[2];
    } else {
        lowPrev1  = lowPrev1[1];
        lowPrev0  = lowPrev0[1];
        lowPrice1 = lowPrice1[1];
        lowPrice0 = lowPrice0[1];
    }
    def lowPrev = lowPrev1[2];#if lowPrev1 != lowPrev1[1] then lowPrev1[1] else lowPrev[1];
    def lowPrice = lowPrice1[2];#if lowPrice1 != lowPrice1[1] then lowPrice1[1] else lowPrice[1];
    def bearSignal = TopCond and high[2] > highPrice and src[2] < highPrev;
    def bullSignal = BotCond and low[2] < lowPrice and src[2] > lowPrev;
    def bearDivHidden = TopCond and high[2] < highPrice and src[2] > highPrev;
    def bullDivHidden = BotCond and low[2] > lowPrice and src[2] < lowPrev;
    plot top = if isNaN(TopCond) then 0 else TopCond;#fractalTop;
    plot bot = if isNaN(BotCond) then 0 else BotCond;#fractalBot;
    plot lowP = lowPrev;
    plot sigBear = if isNaN(bearSignal) then 0 else bearSignal;
    plot sigBull = if isNaN(bullSignal) then 0 else bullSignal;
    plot hidBear = if isNaN(bearDivHidden) then 0 else bearDivHidden;
    plot hidBull = if isNaN(bullDivHidden) then 0 else bullDivHidden;
}
#// Stochastic RSI
script f_stochrsi {
    input _src = close;
    input _stochlen = 14;
    input _rsilen = 14;
    input _smoothk = 3;
    input _smoothd = 3;
    input _log = yes;
    input _avg = no;
    def src = if _log then Log(_src) else _src;
    def rsi = RSI(Price = src, Length = _rsilen);
    def stoch = 100 * (rsi - Lowest(rsi, _stochlen)) / (Highest(rsi, _stochlen) - Lowest(rsi, _stochlen));
    def kk = Average(stoch, _smoothk);
    def d1 = Average(kk, _smoothd);
    def avg_1 = (kk + d1) / 2;
    def k = if _avg then avg_1 else kk;
    plot stochK = k;
    plot stochD = d1;
}
#/ RSI+MFI
script f_rsimfi {
    input _period = 60;
    input _multiplier = 150;
    input rsiMFIPosY = 2.5;
    def c = close;
    def o = open;
    def h = high;
    def l = low;
    def dif = (c - o) / (h - l);
    def diff = if !isNaN(dif) then dif else 0;
    def rsimfi = Average(diff * _multiplier, _period) - rsiMFIPosY;
    plot f_rsimfi = rsimfi;
}
#// WaveTrend
script f_wavetrend {
#def wt1 = f_wavetrend(wtMASource, wtChannelLen, wtAverageLen, wtMALen, obLevel, osLevel).wt_1;
    input wtMASource = close;
    input wtChannelLen = 9;
    input wtAverageLen = 12;
    input wtMALen = 3;
    input obLevel = 53;
    input osLevel = -53;
    def tfsrc = wtMASource;
    def esa = ExpAverage(tfsrc, wtChannelLen);
    def de = ExpAverage(AbsValue(tfsrc - esa), wtChannelLen);
    def ci = (tfsrc - esa) / (0.015 * de);
    def wt1 = ExpAverage(ci, wtAverageLen);
    def wt2 = Average(wt1, wtMALen);
    def wtVwap = wt1 - wt2;
    def wtOversold = wt2 <= osLevel;
    def wtOverbought = wt2 >= obLevel;
    def wtCross = Crosses(wt1, wt2, CrossingDirection.ANY);
    def wtCrossUp = (wt2 - wt1) <= 0;
    def wtCrossDown = (wt2 - wt1) >= 0;
    def wtCrosslast = Crosses(wt1[2], wt2[2], CrossingDirection.ANY);
    def wtCrossUplast = (wt2[2] - wt1[2]) <= 0;
    def wtCrossDownlast = (wt2[2] - wt1[2]) >= 0;
    plot wt_1 = wt1;
    plot wt_2 = wt2;
    plot wt_OS = wtOversold;
    plot wt_OB = wtOverbought;
    plot wt_cross = wtCross;
    plot wt_CrossUp = wtCrossUp;
    plot wt_CrossDn = wtCrossDown;
    plot wt_Vwap = wtVwap;
}
#// CALCULATE INDICATORS {
#// RSI
def rsi = RSI(Price = rsiSRC, Length = rsiLen);
#// RSI + MFI Area
def rsiMFI = f_rsimfi(rsiMFIperiod, rsiMFIMultiplier, rsiMFIPosY);
#// Calculates WaveTrend
def wt1 = f_wavetrend(wtMASource, wtChannelLen, wtAverageLen, wtMALen, obLevel, osLevel).wt_1;
def wt2 = f_wavetrend(wtMASource, wtChannelLen, wtAverageLen, wtMALen, obLevel, osLevel).wt_2;
def wtOversold = f_wavetrend(wtMASource, wtChannelLen, wtAverageLen, wtMALen, obLevel, osLevel).wt_OS;
def wtOverbought = f_wavetrend(wtMASource, wtChannelLen, wtAverageLen, wtMALen, obLevel, osLevel).wt_OB;
def wtCross = f_wavetrend(wtMASource, wtChannelLen, wtAverageLen, wtMALen, obLevel, osLevel).wt_cross;
def wtCrossUp = f_wavetrend(wtMASource, wtChannelLen, wtAverageLen, wtMALen, obLevel, osLevel).wt_CrossUp;
def wtCrossDown = f_wavetrend(wtMASource, wtChannelLen, wtAverageLen, wtMALen, obLevel, osLevel).wt_CrossDn;
def wtVwap = f_wavetrend(wtMASource, wtChannelLen, wtAverageLen, wtMALen, obLevel, osLevel).wt_Vwap;
#// Stochastic RSI
def stochK = f_stochrsi(stochSRC, stochLen, stochRsiLen, stochKSmooth, stochDSmooth, stochUseLog, stochAvg).stochK;
def stochD = f_stochrsi(stochSRC, stochLen, stochRsiLen, stochKSmooth, stochDSmooth, stochUseLog, stochAvg).stochD;
#// WT Divergences
def wtBearDiv = f_findDivs(wt2, wtDivOBLevel, wtDivOSLevel, yes).sigBear;
def wtBullDiv = f_findDivs(wt2, wtDivOBLevel, wtDivOSLevel, yes).sigBull;
def wtBearDivHidden = f_findDivs(wt2, wtDivOBLevel, wtDivOSLevel, yes).hidBear;
def wtBullDivHidden = f_findDivs(wt2, wtDivOBLevel, wtDivOSLevel, yes).hidBull;

def wtBearDiv_add = f_findDivs(wt2, wtDivOBLevel_add, wtDivOSLevel_add, yes).sigBear;
def wtBullDiv_add = f_findDivs(wt2, wtDivOBLevel_add, wtDivOSLevel_add, yes).sigBull;
def wtBearDivHidden_add = f_findDivs(wt2, wtDivOBLevel_add, wtDivOSLevel_add, yes).hidBear;
def wtBullDivHidden_add = f_findDivs(wt2, wtDivOBLevel_add, wtDivOSLevel_add, yes).hidBull;
def wtBearDivHidden_nl  = f_findDivs(wt2, 0, 0, no).hidBear;
def wtBullDivHidden_nl  = f_findDivs(wt2, 0, 0, no).hidBull;

def wtBearDivHidden_ = if showHiddenDiv_nl then wtBearDivHidden_nl else wtBearDivHidden;
def wtBullDivHidden_ = if showHiddenDiv_nl then wtBullDivHidden_nl else wtBullDivHidden;

def wtBearDivColor_add = (wtShowDiv and (wtDivOBLevel_addshow and wtBearDiv_add)) or (wtShowHiddenDiv and (wtDivOBLevel_addshow and wtBearDivHidden_add));# ? RED #9a0202 : na
def wtBullDivColor_add = (wtShowDiv and (wtDivOBLevel_addshow and wtBullDiv_add)) or (wtShowHiddenDiv and (wtDivOBLevel_addshow and wtBullDivHidden_add));# ? GREEN #1b5e20 : na

plot wtBearAdd = if wtBearDivColor_add then 103 else na;
plot wtBullAdd = if wtBullDivColor_add then -103 else na;
wtBearAdd.SetDefaultColor(Color.DARK_RED);
wtBullAdd.SetDefaultColor(Color.DARK_GREEN);
wtBearAdd.SetPaintingStrategy(PaintingStrategy.POINTS);
wtBullAdd.SetPaintingStrategy(PaintingStrategy.POINTS);

plot wtBearHid = if wtBearDivHidden_ then 103 else na;
plot wtBullHid = if wtBullDivHidden_ then -103 else na;
wtBearHid.SetDefaultColor(Color.DARK_RED);
wtBullHid.SetDefaultColor(Color.DARK_GREEN);
wtBearHid.SetPaintingStrategy(PaintingStrategy.POINTS);
wtBullHid.SetPaintingStrategy(PaintingStrategy.POINTS);

#// RSI Divergences
def rsiBearDiv = f_findDivs(rsi, rsiDivOBLevel, rsiDivOSLevel, yes).sigBear;
def rsiBullDiv = f_findDivs(rsi, rsiDivOBLevel, rsiDivOSLevel, yes).sigBull;
#// Stoch Divergences
def stochBearDiv = f_findDivs(stochK, 0, 0, no).sigBear;
def stochBullDiv = f_findDivs(stochK, 0, 0, no).sigBull;
def stochBearDivHidden = f_findDivs(stochK, 0, 0, no).hidBear;
def stochBullDivHidden = f_findDivs(stochK, 0, 0, no).hidBull;

def stochBearDivColor = (stochShowDiv and stochBearDiv) or (stochShowHiddenDiv and stochBearDivHidden);#red
def stochBullDivColor = (stochShowDiv and stochBullDiv) or (stochShowHiddenDiv and stochBullDivHidden);#green

plot StBearHid = if stochBearDivColor then 103 else na;
plot StBullHid = if stochBullDivColor then -103 else na;
StBearHid.SetDefaultColor(Color.DARK_RED);
StBullHid.SetDefaultColor(Color.DARK_GREEN);
stBearHid.SetPaintingStrategy(PaintingStrategy.POINTS);
stBullHid.SetPaintingStrategy(PaintingStrategy.POINTS);

#// Buy signal.
def buySignal = wtCross and wtCrossUp and wtOversold;

def buySignalDiv = (wtShowDiv and wtBullDiv) or
               (wtShowDiv and wtBullDiv_add) or
               (stochShowDiv and stochBullDiv) or
               (rsiShowDiv and rsiBullDiv);
#// Sell signal
def sellSignal = wtCross and wtCrossDown and wtOverbought;

def sellSignalDiv = (wtShowDiv and wtBearDiv) or
               (wtShowDiv and wtBearDiv_add) or
               (stochShowDiv and stochBearDiv) or
               (rsiShowDiv and rsiBearDiv);

#// } CALCULATE INDICATORS
#// WT Areas

plot wtWave1 = wt1;    # 'WT Wave 1'
plot wtWave2 = wt2;    # 'WT Wave 2'
wtWave1.SetDefaultColor(GlobalColor("wt1"));
wtWave2.SetDefaultColor(GlobalColor("wt2"));

AddCloud(wtWave1, 0, GlobalColor("wt1"), GlobalColor("wt1"));
AddCloud(wtWave1, 0, GlobalColor("wt1"), GlobalColor("wt1"));
AddCloud(wtWave1, 0, GlobalColor("wt1"), GlobalColor("wt1"));
AddCloud(wtWave2, 0, GlobalColor("wt2"), GlobalColor("wt2"));
AddCloud(wtWave2, 0, GlobalColor("wt2"), GlobalColor("wt2"));
AddCloud(wtWave2, 0, GlobalColor("wt2"), GlobalColor("wt2"));

# RSI
plot rsiLine = if showRsiLine then rsi - 50 else na;
rsiLine.SetDefaultColor(Color.YELLOW);
#/ VWAP
def vwapArea = if vwapShow then wtVwap else na;    # 'VWAP'
AddCloud(vwapArea, 0, Color.YELLOW, Color.YELLOW);
#// MFI AREA
def rsiMFIArea = if rsiMFIShow and !last then rsiMFI else na;#, style=plot.style_area, title='rsiMFI'
AddCloud(rsiMFIArea, 0, Color.GREEN, Color.RED);
# // Stoch RSI
plot stocKline = if stochShow then stochK - 50 else na;
plot stocDline = if stochShow then stochD - 50 else na;
stocKline.SetDefaultColor(Color.CYAN);
stocDline.SetDefaultColor(Color.DARK_ORANGE);
#--Sig
plot bSig = if buySignal then wt1 else na; # 'Buy circle'
plot sSig = if sellSignal then wt1 else na; # 'Sell circle'
bSig.SetPaintingStrategy(PaintingStrategy.SQUARES);
sSig.SetPaintingStrategy(PaintingStrategy.SQUARES);
bSig.SetDefaultColor(Color.GREEN);
sSig.SetDefaultColor(Color.RED);

def bSigDiv = buySignalDiv[-2];#, title = 'Divergence buy circle'
def sSigDiv = sellSignalDiv[-2];#, title = 'Divergence sell circle'

plot wbSigDiv = if sSigDiv then 103 else na;
plot wsSigDiv = if bSigDiv then -103 else na;
wbSigDiv.SetDefaultColor(Color.RED);
wsSigDiv.SetDefaultColor(Color.GREEN);
wbSigDiv.SetPaintingStrategy(PaintingStrategy.POINTS);
wsSigDiv.SetPaintingStrategy(PaintingStrategy.POINTS);

#-- Shark
def ema50  = ExpAverage(src, 50);
def ema200 = ExpAverage(src, 200);
def ema400 = ExpAverage(src, 400);
def ema800 = ExpAverage(src, 800);
def wapwap = Reference vwap().VWAP;

def bTouchedLine = (ema50<high and ema50>low) or (ema200<high and ema200>low) or (ema400<high and ema400>low) or (ema800<high and ema800>low) or (wapwap<high and wapwap>low);
#// RSI
def changRsiSrc = rsiSourceInput - rsiSourceInput[1];
def upTR = WildersAverage(max(changRsiSrc, 0), rsiLengthInput);
def downTR = WildersAverage(-min(changRsiSrc, 0), rsiLengthInput);
#def rsiM = if downTR == 0 then 100 else if upTR == 0 then 0 else 100 - (100 / (1 + upTR / downTR));
def rsiM = RSI(Price = rsiSourceInput, Length = rsiLengthInput);
def basis = Average(rsiM[offset], length2);
def dev = mult * stdev(rsiM[offset], length2);
def upper = basis + dev;
def lower = basis - dev;
def bBelow = rsiM < 26;
def bAbove = rsiM > 74;
def bBelow25;def bAbove75;
if !bApply25and75 {
    bBelow25 = yes;
    bAbove75 = yes;
    } else {
    bBelow25 = bBelow;
    bAbove75 = bAbove;
}
def b_color = if (rsiM > upper and bAbove75) then -1 else
              if (rsiM < lower and bBelow25) then  1 else 0;
def barCol;
if bTouchedLine and b_color == -1 {
    barCol = -2;
    } else
if bTouchedLine and b_color ==  1 {
    barCol = 2;
    } else {
    barCol = b_color;
}
def sigSharkUp1 = if barCol > 1 then pos else neg;
def sigSharkUp2 = if barCol > 0 then pos else neg;
def sigSharkDn1 = if barCol <-1 then pos else neg;
def sigSharkDn2 = if barCol < 0 then pos else neg;

AddCloud(sigSharkUp1, neg, Color.GREEN);
AddCloud(sigSharkUp2, neg, Color.DARK_GREEN);
AddCloud(sigSharkDn1, neg, Color.RED);
AddCloud(sigSharkDn2, neg, Color.DARK_RED);

AssignPriceColor(if !colorBars then Color.CURRENT else
                 if barCol ==  2 then GlobalColor("intense_green") else
                 if barCol ==  1 then GlobalColor("regular_green") else
                 if barCol == -1 then GlobalColor("regular_red") else
                 if barCol == -2 then GlobalColor("intense_red") else Color.GRAY);


#-- END of CODE
Hi Samer 800. I looked around for your other post on adding the Shark Wave to the upper chart but I didnt see one. Can you help? Many thanks
 
Hi Samer 800. I looked around for your other post on adding the Shark Wave to the upper chart but I didnt see one. Can you help? Many thanks
Hi Samer. I copied this script to one of my charts. I also have added your lower script to my chart, but I dont see any sharks in the upper chart. I appreciate your help.
 

Attachments

  • IMG_6666.jpg
    IMG_6666.jpg
    531.1 KB · Views: 398
Gentlemen, this is very interesting but the people who click on it will likely have no context as to what is a "shark wave" or why you want to convert it to Thinkscript....

Other than that if you are happy and know the capabilities and limitations of this thing that's the most important thing.
 
try this, I didn't test it live.

CSS:
#study(title = 'SharkWaveTrend', shorttitle = 'SharkWaveTrend')
# Converted by Sam4Cok@Samer800 - 12/2023
declare lower;
input colorBars = yes;
input vwapShow = no;#(true, title = 'Show Fast WT', type = input.bool)
input wtChannelLen = 9;#, title = 'WT Channel Length', type = input.integer)
input wtAverageLen = 12;#, title = 'WT Average Length', type = input.integer)
input wtMASource = hlc3;#, title = 'WT MA Source', type = input.source)
input wtMaLen = 3;#, title = 'WT MA Length', type = input.integer)
input obLevel = 53;#, title = 'WT Overbought Level 1', type = input.integer)
input osLevel = -53;#, title = 'WT Oversold Level 1', type = input.integer)
input wtShowDiv = yes;#(true, title = 'Show WT Regular Divergences', type = input.bool)
input wtShowHiddenDiv = no;#(false, title = 'Show WT Hidden Divergences', type = input.bool)
input showHiddenDiv_nl = yes;#(true, title = 'Not apply OB/OS Limits on Hidden Divergences', type = input.bool)
input wtDivOBLevel = 45;#, title = 'WT Bearish Divergence min', type = input.integer)
input wtDivOSLevel = -65;#, title = 'WT Bullish Divergence min', type = input.integer)
input wtDivOBLevel_addshow = yes;#(true, title = 'Show 2nd WT Regular Divergences', type = input.bool)
input wtDivOBLevel_add = 15;#, title = 'WT 2nd Bearish Divergence', type = input.integer)
input wtDivOSLevel_add = -40;#, title = 'WT 2nd Bullish Divergence 15 min', type = input.integer)
input rsiMFIShow = no;#(true, title = 'Show MFI', type = input.bool)
input rsiMFIperiod = 60;#,title = 'MFI Period', type = input.integer)
input rsiMFIMultiplier = 150;#, title = 'MFI Area multiplier', type = input.float)
input rsiMFIPosY = 2.5;#, title = 'MFI Area Y Pos', type = input.float)
input showRsiLine = no;    #(false, title = 'Show RSI', type = input.bool)
input rsiSRC = close;#(close, title = 'RSI Source', type = input.source)
input rsiLen = 14;#, title = 'RSI Length', type = input.integer)
#input rsiOversold = 30;#, title = 'RSI Oversold', minval = 50, maxval = 100, type = input.integer)
#input rsiOverbought = 60;#, title = 'RSI Overbought', minval = 0, maxval = 50, type = input.integer)
input rsiShowDiv = no;#(false, title = 'Show RSI Regular Divergences', type = input.bool)
input rsiShowHiddenDiv = no;#(false, title = 'Show RSI Hidden Divergences', type = input.bool)
input rsiDivOBLevel = 60;#, title = 'RSI Bearish Divergence min', type = input.integer)
input rsiDivOSLevel = 30;#, title = 'RSI Bullish Divergence min', type = input.integer)

input stochShow = no;#(true, title = 'Show Stochastic RSI', type = input.bool)
input stochUseLog = yes;#(true, title=' Use Log?', type = input.bool)
input stochAvg = no;#(false, title='Use Average of both K & D', type = input.bool)
input stochSRC = close;#(close, title = 'Stochastic RSI Source', type = input.source)
input stochLen = 14;#, title = 'Stochastic RSI Length', type = input.integer)
input stochRsiLen = 14;#, title = 'RSI Length ', type = input.integer)
input stochKSmooth = 3;#, title = 'Stochastic RSI K Smooth', type = input.integer)
input stochDSmooth = 3;#, title = 'Stochastic RSI D Smooth', type = input.integer)
input stochShowDiv = no;#(false, title = 'Show Stoch Regular Divergences', type = input.bool)
input stochShowHiddenDiv = no;#(false, title = 'Show Stoch Hidden Divergences', type = input.bool)
input rsiLengthInput = 14;#, minval=1, title="RSI Length", group="Shark")
input rsiSourceInput = close;#, "Source", group="Shark")
input length2 = 30;#, minval=1, group="Shark")
input src = close;#, title="Source", group="Shark")
input mult = 2.0;#, minval=0.001, maxval=50, title="StdDev", group="Shark")
input offset = 0;#, "Offset", minval = -500, maxval = 500, group="Shark")
input HighlightBreaches = yes;#, title="Highlight Oversold/Overbought", group="Shark")
input bApply25and75 = no;#, title="Apply 25/75 RSI rule", group="Shark")


def na = Double.NaN;
def last = IsNaN(close);
def pos = Double.POSITIVE_INFINITY;
def neg = Double.NEGATIVE_INFINITY;

DefineGlobalColor("intense_red", Color.RED);#CreateColor(255, 35, 35));
DefineGlobalColor("regular_red", Color.DARK_RED);#CreateColor(255, 82, 82));
DefineGlobalColor("intense_green", Color.GREEN);#CreateColor(0, 230, 118));
DefineGlobalColor("regular_green", Color.DARK_GREEN);#CreateColor(76, 175, 80));
DefineGlobalColor("wt1", CreateColor(217,205,205));
DefineGlobalColor("wt2", CreateColor(29, 63, 97));
#// } FUNCTIONS
#f_findDivs(src, topLimit, botLimit, useLimits) =>
script f_findDivs {
    input src = close;
    input topLimit = 70;
    input botLimit = 30;
    input useLimits = yes;
    def na = Double.NaN;
    def topfractal = src[4] < src[2] and src[3] < src[2] and src[2] > src[1] and src[2] > src[0];
    def botfractal = src[4] > src[2] and src[3] > src[2] and src[2] < src[1] and src[2] < src[0];
    def top_fractal = if isNaN(topfractal) then 0 else topfractal;
    def bot_fractal = if isNaN(botfractal) then 0 else botfractal;
    def fractalize  = if top_fractal then 1 else if bot_fractal then -1 else 0;
    def fractalTop = if fractalize > 0 and (if useLimits then src[2] >= topLimit else yes) then src[2] else na;
    def fractalBot = if fractalize < 0 and (if useLimits then src[2] <= botLimit else yes) then src[2] else na;
    def TopCond = if !IsNaN(fractalTop) and fractalTop then fractalTop else 0;
    def BotCond = if !IsNaN(fractalBot) and fractalBot then fractalBot else 0;
    def highPrev0;
    def highPrev1;
    def highPrice0;
    def highPrice1;
    if TopCond {
        highPrev1  = highPrev0[1];
        highPrev0  = src[2];
        highPrice1 = highPrice0[1];
        highPrice0 = high[2];
    } else {
        highPrev1  = highPrev1[1];
        highPrev0  = highPrev0[1];
        highPrice1 = highPrice1[1];
        highPrice0 = highPrice0[1];
    }
    def highPrev = highPrev1[2];#if highPrev1 != highPrev1[1] then highPrev1[1] else highPrev[1];
    def highPrice = highPrice1[2];#if highPrice1 != highPrice1[1] then highPrice1[1] else highPrice[1];
    def lowPrev0;
    def lowPrev1;
    def lowPrice0;
    def lowPrice1;
    if BotCond {
        lowPrev1  = lowPrev0[1];
        lowPrev0  = src[2];
        lowPrice1 = lowPrice0[1];
        lowPrice0 = low[2];
    } else {
        lowPrev1  = lowPrev1[1];
        lowPrev0  = lowPrev0[1];
        lowPrice1 = lowPrice1[1];
        lowPrice0 = lowPrice0[1];
    }
    def lowPrev = lowPrev1[2];#if lowPrev1 != lowPrev1[1] then lowPrev1[1] else lowPrev[1];
    def lowPrice = lowPrice1[2];#if lowPrice1 != lowPrice1[1] then lowPrice1[1] else lowPrice[1];
    def bearSignal = TopCond and high[2] > highPrice and src[2] < highPrev;
    def bullSignal = BotCond and low[2] < lowPrice and src[2] > lowPrev;
    def bearDivHidden = TopCond and high[2] < highPrice and src[2] > highPrev;
    def bullDivHidden = BotCond and low[2] > lowPrice and src[2] < lowPrev;
    plot top = if isNaN(TopCond) then 0 else TopCond;#fractalTop;
    plot bot = if isNaN(BotCond) then 0 else BotCond;#fractalBot;
    plot lowP = lowPrev;
    plot sigBear = if isNaN(bearSignal) then 0 else bearSignal;
    plot sigBull = if isNaN(bullSignal) then 0 else bullSignal;
    plot hidBear = if isNaN(bearDivHidden) then 0 else bearDivHidden;
    plot hidBull = if isNaN(bullDivHidden) then 0 else bullDivHidden;
}
#// Stochastic RSI
script f_stochrsi {
    input _src = close;
    input _stochlen = 14;
    input _rsilen = 14;
    input _smoothk = 3;
    input _smoothd = 3;
    input _log = yes;
    input _avg = no;
    def src = if _log then Log(_src) else _src;
    def rsi = RSI(Price = src, Length = _rsilen);
    def stoch = 100 * (rsi - Lowest(rsi, _stochlen)) / (Highest(rsi, _stochlen) - Lowest(rsi, _stochlen));
    def kk = Average(stoch, _smoothk);
    def d1 = Average(kk, _smoothd);
    def avg_1 = (kk + d1) / 2;
    def k = if _avg then avg_1 else kk;
    plot stochK = k;
    plot stochD = d1;
}
#/ RSI+MFI
script f_rsimfi {
    input _period = 60;
    input _multiplier = 150;
    input rsiMFIPosY = 2.5;
    def c = close;
    def o = open;
    def h = high;
    def l = low;
    def dif = (c - o) / (h - l);
    def diff = if !isNaN(dif) then dif else 0;
    def rsimfi = Average(diff * _multiplier, _period) - rsiMFIPosY;
    plot f_rsimfi = rsimfi;
}
#// WaveTrend
script f_wavetrend {
#def wt1 = f_wavetrend(wtMASource, wtChannelLen, wtAverageLen, wtMALen, obLevel, osLevel).wt_1;
    input wtMASource = close;
    input wtChannelLen = 9;
    input wtAverageLen = 12;
    input wtMALen = 3;
    input obLevel = 53;
    input osLevel = -53;
    def tfsrc = wtMASource;
    def esa = ExpAverage(tfsrc, wtChannelLen);
    def de = ExpAverage(AbsValue(tfsrc - esa), wtChannelLen);
    def ci = (tfsrc - esa) / (0.015 * de);
    def wt1 = ExpAverage(ci, wtAverageLen);
    def wt2 = Average(wt1, wtMALen);
    def wtVwap = wt1 - wt2;
    def wtOversold = wt2 <= osLevel;
    def wtOverbought = wt2 >= obLevel;
    def wtCross = Crosses(wt1, wt2, CrossingDirection.ANY);
    def wtCrossUp = (wt2 - wt1) <= 0;
    def wtCrossDown = (wt2 - wt1) >= 0;
    def wtCrosslast = Crosses(wt1[2], wt2[2], CrossingDirection.ANY);
    def wtCrossUplast = (wt2[2] - wt1[2]) <= 0;
    def wtCrossDownlast = (wt2[2] - wt1[2]) >= 0;
    plot wt_1 = wt1;
    plot wt_2 = wt2;
    plot wt_OS = wtOversold;
    plot wt_OB = wtOverbought;
    plot wt_cross = wtCross;
    plot wt_CrossUp = wtCrossUp;
    plot wt_CrossDn = wtCrossDown;
    plot wt_Vwap = wtVwap;
}
#// CALCULATE INDICATORS {
#// RSI
def rsi = RSI(Price = rsiSRC, Length = rsiLen);
#// RSI + MFI Area
def rsiMFI = f_rsimfi(rsiMFIperiod, rsiMFIMultiplier, rsiMFIPosY);
#// Calculates WaveTrend
def wt1 = f_wavetrend(wtMASource, wtChannelLen, wtAverageLen, wtMALen, obLevel, osLevel).wt_1;
def wt2 = f_wavetrend(wtMASource, wtChannelLen, wtAverageLen, wtMALen, obLevel, osLevel).wt_2;
def wtOversold = f_wavetrend(wtMASource, wtChannelLen, wtAverageLen, wtMALen, obLevel, osLevel).wt_OS;
def wtOverbought = f_wavetrend(wtMASource, wtChannelLen, wtAverageLen, wtMALen, obLevel, osLevel).wt_OB;
def wtCross = f_wavetrend(wtMASource, wtChannelLen, wtAverageLen, wtMALen, obLevel, osLevel).wt_cross;
def wtCrossUp = f_wavetrend(wtMASource, wtChannelLen, wtAverageLen, wtMALen, obLevel, osLevel).wt_CrossUp;
def wtCrossDown = f_wavetrend(wtMASource, wtChannelLen, wtAverageLen, wtMALen, obLevel, osLevel).wt_CrossDn;
def wtVwap = f_wavetrend(wtMASource, wtChannelLen, wtAverageLen, wtMALen, obLevel, osLevel).wt_Vwap;
#// Stochastic RSI
def stochK = f_stochrsi(stochSRC, stochLen, stochRsiLen, stochKSmooth, stochDSmooth, stochUseLog, stochAvg).stochK;
def stochD = f_stochrsi(stochSRC, stochLen, stochRsiLen, stochKSmooth, stochDSmooth, stochUseLog, stochAvg).stochD;
#// WT Divergences
def wtBearDiv = f_findDivs(wt2, wtDivOBLevel, wtDivOSLevel, yes).sigBear;
def wtBullDiv = f_findDivs(wt2, wtDivOBLevel, wtDivOSLevel, yes).sigBull;
def wtBearDivHidden = f_findDivs(wt2, wtDivOBLevel, wtDivOSLevel, yes).hidBear;
def wtBullDivHidden = f_findDivs(wt2, wtDivOBLevel, wtDivOSLevel, yes).hidBull;

def wtBearDiv_add = f_findDivs(wt2, wtDivOBLevel_add, wtDivOSLevel_add, yes).sigBear;
def wtBullDiv_add = f_findDivs(wt2, wtDivOBLevel_add, wtDivOSLevel_add, yes).sigBull;
def wtBearDivHidden_add = f_findDivs(wt2, wtDivOBLevel_add, wtDivOSLevel_add, yes).hidBear;
def wtBullDivHidden_add = f_findDivs(wt2, wtDivOBLevel_add, wtDivOSLevel_add, yes).hidBull;
def wtBearDivHidden_nl  = f_findDivs(wt2, 0, 0, no).hidBear;
def wtBullDivHidden_nl  = f_findDivs(wt2, 0, 0, no).hidBull;

def wtBearDivHidden_ = if showHiddenDiv_nl then wtBearDivHidden_nl else wtBearDivHidden;
def wtBullDivHidden_ = if showHiddenDiv_nl then wtBullDivHidden_nl else wtBullDivHidden;

def wtBearDivColor_add = (wtShowDiv and (wtDivOBLevel_addshow and wtBearDiv_add)) or (wtShowHiddenDiv and (wtDivOBLevel_addshow and wtBearDivHidden_add));# ? RED #9a0202 : na
def wtBullDivColor_add = (wtShowDiv and (wtDivOBLevel_addshow and wtBullDiv_add)) or (wtShowHiddenDiv and (wtDivOBLevel_addshow and wtBullDivHidden_add));# ? GREEN #1b5e20 : na

plot wtBearAdd = if wtBearDivColor_add then 103 else na;
plot wtBullAdd = if wtBullDivColor_add then -103 else na;
wtBearAdd.SetDefaultColor(Color.DARK_RED);
wtBullAdd.SetDefaultColor(Color.DARK_GREEN);
wtBearAdd.SetPaintingStrategy(PaintingStrategy.POINTS);
wtBullAdd.SetPaintingStrategy(PaintingStrategy.POINTS);

plot wtBearHid = if wtBearDivHidden_ then 103 else na;
plot wtBullHid = if wtBullDivHidden_ then -103 else na;
wtBearHid.SetDefaultColor(Color.DARK_RED);
wtBullHid.SetDefaultColor(Color.DARK_GREEN);
wtBearHid.SetPaintingStrategy(PaintingStrategy.POINTS);
wtBullHid.SetPaintingStrategy(PaintingStrategy.POINTS);

#// RSI Divergences
def rsiBearDiv = f_findDivs(rsi, rsiDivOBLevel, rsiDivOSLevel, yes).sigBear;
def rsiBullDiv = f_findDivs(rsi, rsiDivOBLevel, rsiDivOSLevel, yes).sigBull;
#// Stoch Divergences
def stochBearDiv = f_findDivs(stochK, 0, 0, no).sigBear;
def stochBullDiv = f_findDivs(stochK, 0, 0, no).sigBull;
def stochBearDivHidden = f_findDivs(stochK, 0, 0, no).hidBear;
def stochBullDivHidden = f_findDivs(stochK, 0, 0, no).hidBull;

def stochBearDivColor = (stochShowDiv and stochBearDiv) or (stochShowHiddenDiv and stochBearDivHidden);#red
def stochBullDivColor = (stochShowDiv and stochBullDiv) or (stochShowHiddenDiv and stochBullDivHidden);#green

plot StBearHid = if stochBearDivColor then 103 else na;
plot StBullHid = if stochBullDivColor then -103 else na;
StBearHid.SetDefaultColor(Color.DARK_RED);
StBullHid.SetDefaultColor(Color.DARK_GREEN);
stBearHid.SetPaintingStrategy(PaintingStrategy.POINTS);
stBullHid.SetPaintingStrategy(PaintingStrategy.POINTS);

#// Buy signal.
def buySignal = wtCross and wtCrossUp and wtOversold;

def buySignalDiv = (wtShowDiv and wtBullDiv) or
               (wtShowDiv and wtBullDiv_add) or
               (stochShowDiv and stochBullDiv) or
               (rsiShowDiv and rsiBullDiv);
#// Sell signal
def sellSignal = wtCross and wtCrossDown and wtOverbought;

def sellSignalDiv = (wtShowDiv and wtBearDiv) or
               (wtShowDiv and wtBearDiv_add) or
               (stochShowDiv and stochBearDiv) or
               (rsiShowDiv and rsiBearDiv);

#// } CALCULATE INDICATORS
#// WT Areas

plot wtWave1 = wt1;    # 'WT Wave 1'
plot wtWave2 = wt2;    # 'WT Wave 2'
wtWave1.SetDefaultColor(GlobalColor("wt1"));
wtWave2.SetDefaultColor(GlobalColor("wt2"));

AddCloud(wtWave1, 0, GlobalColor("wt1"), GlobalColor("wt1"));
AddCloud(wtWave1, 0, GlobalColor("wt1"), GlobalColor("wt1"));
AddCloud(wtWave1, 0, GlobalColor("wt1"), GlobalColor("wt1"));
AddCloud(wtWave2, 0, GlobalColor("wt2"), GlobalColor("wt2"));
AddCloud(wtWave2, 0, GlobalColor("wt2"), GlobalColor("wt2"));
AddCloud(wtWave2, 0, GlobalColor("wt2"), GlobalColor("wt2"));

# RSI
plot rsiLine = if showRsiLine then rsi - 50 else na;
rsiLine.SetDefaultColor(Color.YELLOW);
#/ VWAP
def vwapArea = if vwapShow then wtVwap else na;    # 'VWAP'
AddCloud(vwapArea, 0, Color.YELLOW, Color.YELLOW);
#// MFI AREA
def rsiMFIArea = if rsiMFIShow and !last then rsiMFI else na;#, style=plot.style_area, title='rsiMFI'
AddCloud(rsiMFIArea, 0, Color.GREEN, Color.RED);
# // Stoch RSI
plot stocKline = if stochShow then stochK - 50 else na;
plot stocDline = if stochShow then stochD - 50 else na;
stocKline.SetDefaultColor(Color.CYAN);
stocDline.SetDefaultColor(Color.DARK_ORANGE);
#--Sig
plot bSig = if buySignal then wt1 else na; # 'Buy circle'
plot sSig = if sellSignal then wt1 else na; # 'Sell circle'
bSig.SetPaintingStrategy(PaintingStrategy.SQUARES);
sSig.SetPaintingStrategy(PaintingStrategy.SQUARES);
bSig.SetDefaultColor(Color.GREEN);
sSig.SetDefaultColor(Color.RED);

def bSigDiv = buySignalDiv[-2];#, title = 'Divergence buy circle'
def sSigDiv = sellSignalDiv[-2];#, title = 'Divergence sell circle'

plot wbSigDiv = if sSigDiv then 103 else na;
plot wsSigDiv = if bSigDiv then -103 else na;
wbSigDiv.SetDefaultColor(Color.RED);
wsSigDiv.SetDefaultColor(Color.GREEN);
wbSigDiv.SetPaintingStrategy(PaintingStrategy.POINTS);
wsSigDiv.SetPaintingStrategy(PaintingStrategy.POINTS);

#-- Shark
def ema50  = ExpAverage(src, 50);
def ema200 = ExpAverage(src, 200);
def ema400 = ExpAverage(src, 400);
def ema800 = ExpAverage(src, 800);
def wapwap = Reference vwap().VWAP;

def bTouchedLine = (ema50<high and ema50>low) or (ema200<high and ema200>low) or (ema400<high and ema400>low) or (ema800<high and ema800>low) or (wapwap<high and wapwap>low);
#// RSI
def changRsiSrc = rsiSourceInput - rsiSourceInput[1];
def upTR = WildersAverage(max(changRsiSrc, 0), rsiLengthInput);
def downTR = WildersAverage(-min(changRsiSrc, 0), rsiLengthInput);
#def rsiM = if downTR == 0 then 100 else if upTR == 0 then 0 else 100 - (100 / (1 + upTR / downTR));
def rsiM = RSI(Price = rsiSourceInput, Length = rsiLengthInput);
def basis = Average(rsiM[offset], length2);
def dev = mult * stdev(rsiM[offset], length2);
def upper = basis + dev;
def lower = basis - dev;
def bBelow = rsiM < 26;
def bAbove = rsiM > 74;
def bBelow25;def bAbove75;
if !bApply25and75 {
    bBelow25 = yes;
    bAbove75 = yes;
    } else {
    bBelow25 = bBelow;
    bAbove75 = bAbove;
}
def b_color = if (rsiM > upper and bAbove75) then -1 else
              if (rsiM < lower and bBelow25) then  1 else 0;
def barCol;
if bTouchedLine and b_color == -1 {
    barCol = -2;
    } else
if bTouchedLine and b_color ==  1 {
    barCol = 2;
    } else {
    barCol = b_color;
}
def sigSharkUp1 = if barCol > 1 then pos else neg;
def sigSharkUp2 = if barCol > 0 then pos else neg;
def sigSharkDn1 = if barCol <-1 then pos else neg;
def sigSharkDn2 = if barCol < 0 then pos else neg;

AddCloud(sigSharkUp1, neg, Color.GREEN);
AddCloud(sigSharkUp2, neg, Color.DARK_GREEN);
AddCloud(sigSharkDn1, neg, Color.RED);
AddCloud(sigSharkDn2, neg, Color.DARK_RED);

AssignPriceColor(if !colorBars then Color.CURRENT else
                 if barCol ==  2 then GlobalColor("intense_green") else
                 if barCol ==  1 then GlobalColor("regular_green") else
                 if barCol == -1 then GlobalColor("regular_red") else
                 if barCol == -2 then GlobalColor("intense_red") else Color.GRAY);


#-- END of CODE

wedges =stingrays? ha ha...many thanks
I'm trying to get the wedges down. They seem to work pretty well. If you line everything up this looks like it will work extremely well. I'm trying to figure out the "V" I'm suspecting the green is long and the red is short. I'm going to live test this over the next few months. I also use the MACD as an additional indicator which seems to work well in initial observations.
 
How can I scan for wtWave1 when it is over or under 60? I removed a lot of the code and it still says it's too complex.
 
There are many videos by TraderOracle youtuber who created all these indicators.
He has this for Thinkscript? I thought he only did Tradeview. Where are his ToS scripts for a watchlist because I didn't see any. If you could watch list this that would be great.
 
Last edited by a moderator:
For those interested, here's a link to TradeOracle's video with his explanation to his indicator the "SharkWaveTrend." He likes to use this in conjunction with the "TO Method."
Okay to this gentlemen is made his YouTube channel and indicators for his own children to follow and makes the videos public to the community. I like his overall philosophy. Big if true.
 
Okay to this gentlemen is made his YouTube channel and indicators for his own children to follow and makes the videos public to the community. I like his overall philosophy. Big if true.
Yup, unfortunately Trade Oracle Youtuber has terminal cancer, he has published all his TV scripts on google drive for all community for free.
 
I tweaked the Sharkwave code so that it shows the cloud when the wave is above/below 60/-60 and again at 80/-80. Here is my version of the lower one.
1702494071380.png


Code:
#study(title = 'SharkWaveTrend', shorttitle = 'SharkWaveTrend')
# Converted by Sam4Cok@Samer800 - 12/2023
# Revised with OB/OS cloud colors by Chewie
declare lower;
input colorBars = no;
input vwapShow = no;#(true, title = 'Show Fast WT', type = input.bool)
input wtChannelLen = 9;#, title = 'WT Channel Length', type = input.integer)
input wtAverageLen = 12;#, title = 'WT Average Length', type = input.integer)
input wtMASource = hlc3;#, title = 'WT MA Source', type = input.source)
input wtMaLen = 3;#, title = 'WT MA Length', type = input.integer)
input obLevel = 53;#, title = 'WT Overbought Level 1', type = input.integer)
input osLevel = -53;#, title = 'WT Oversold Level 1', type = input.integer)
input wtShowDiv = yes;#(true, title = 'Show WT Regular Divergences', type = input.bool)
input wtShowHiddenDiv = no;#(false, title = 'Show WT Hidden Divergences', type = input.bool)
input showHiddenDiv_nl = yes;#(true, title = 'Not apply OB/OS Limits on Hidden Divergences', type = input.bool)
input wtDivOBLevel = 45;#, title = 'WT Bearish Divergence min', type = input.integer)
input wtDivOSLevel = -65;#, title = 'WT Bullish Divergence min', type = input.integer)
input wtDivOBLevel_addshow = yes;#(true, title = 'Show 2nd WT Regular Divergences', type = input.bool)
input wtDivOBLevel_add = 15;#, title = 'WT 2nd Bearish Divergence', type = input.integer)
input wtDivOSLevel_add = -40;#, title = 'WT 2nd Bullish Divergence 15 min', type = input.integer)
input rsiMFIShow = no;#(true, title = 'Show MFI', type = input.bool)
input rsiMFIperiod = 60;#,title = 'MFI Period', type = input.integer)
input rsiMFIMultiplier = 150;#, title = 'MFI Area multiplier', type = input.float)
input rsiMFIPosY = 2.5;#, title = 'MFI Area Y Pos', type = input.float)
input showRsiLine = no;    #(false, title = 'Show RSI', type = input.bool)
input rsiSRC = close;#(close, title = 'RSI Source', type = input.source)
input rsiLen = 12;#, title = 'RSI Length', type = input.integer)
#input rsiOversold = 30;#, title = 'RSI Oversold', minval = 50, maxval = 100, type = input.integer)
#input rsiOverbought = 60;#, title = 'RSI Overbought', minval = 0, maxval = 50, type = input.integer)
input rsiShowDiv = yes;#(false, title = 'Show RSI Regular Divergences', type = input.bool)
input rsiShowHiddenDiv = no;#(false, title = 'Show RSI Hidden Divergences', type = input.bool)
input rsiDivOBLevel = 60;#, title = 'RSI Bearish Divergence min', type = input.integer)
input rsiDivOSLevel = 30;#, title = 'RSI Bullish Divergence min', type = input.integer)

input stochShow = no;#(true, title = 'Show Stochastic RSI', type = input.bool)
input stochUseLog = yes;#(true, title=' Use Log?', type = input.bool)
input stochAvg = no;#(false, title='Use Average of both K & D', type = input.bool)
input stochSRC = close;#(close, title = 'Stochastic RSI Source', type = input.source)
input stochLen = 14;#, title = 'Stochastic RSI Length', type = input.integer)
input stochRsiLen = 14;#, title = 'RSI Length ', type = input.integer)
input stochKSmooth = 3;#, title = 'Stochastic RSI K Smooth', type = input.integer)
input stochDSmooth = 3;#, title = 'Stochastic RSI D Smooth', type = input.integer)
input stochShowDiv = yes;#(false, title = 'Show Stoch Regular Divergences', type = input.bool)
input stochShowHiddenDiv = no;#(false, title = 'Show Stoch Hidden Divergences', type = input.bool)
input rsiLengthInput = 12;#, minval=1, title="RSI Length", group="Shark")
input rsiSourceInput = close;#, "Source", group="Shark")
input length2 = 30;#, minval=1, group="Shark")
input src = close;#, title="Source", group="Shark")
input mult = 2.0;#, minval=0.001, maxval=50, title="StdDev", group="Shark")
input offset = 0;#, "Offset", minval = -500, maxval = 500, group="Shark")
input HighlightBreaches = yes;#, title="Highlight Oversold/Overbought", group="Shark")
input bApply25and75 = no;#, title="Apply 25/75 RSI rule", group="Shark")


def na = Double.NaN;
def last = IsNaN(close);
def pos = Double.POSITIVE_INFINITY;
def neg = Double.NEGATIVE_INFINITY;

DefineGlobalColor("intense_red", Color.RED);#CreateColor(255, 35, 35));
DefineGlobalColor("regular_red", Color.DARK_RED);#CreateColor(255, 82, 82));
DefineGlobalColor("intense_green", Color.GREEN);#CreateColor(0, 230, 118));
DefineGlobalColor("regular_green", Color.DARK_GREEN);#CreateColor(76, 175, 80));
#DefineGlobalColor("wt1", CreateColor(217,205,205));
DefineGlobalColor("wt1", color.white);
DefineGlobalColor("wt2", CreateColor(51, 153, 255));
#DefineGlobalColor("wt2", CreateColor(29, 63, 97));
#// } FUNCTIONS
#f_findDivs(src, topLimit, botLimit, useLimits) =>
script f_findDivs {
    input src = close;
    input topLimit = 70;
    input botLimit = 30;
    input useLimits = yes;
    def na = Double.NaN;
    def topfractal = src[4] < src[2] and src[3] < src[2] and src[2] > src[1] and src[2] > src[0];
    def botfractal = src[4] > src[2] and src[3] > src[2] and src[2] < src[1] and src[2] < src[0];
    def top_fractal = if isNaN(topfractal) then 0 else topfractal;
    def bot_fractal = if isNaN(botfractal) then 0 else botfractal;
    def fractalize  = if top_fractal then 1 else if bot_fractal then -1 else 0;
    def fractalTop = if fractalize > 0 and (if useLimits then src[2] >= topLimit else yes) then src[2] else na;
    def fractalBot = if fractalize < 0 and (if useLimits then src[2] <= botLimit else yes) then src[2] else na;
    def TopCond = if !IsNaN(fractalTop) and fractalTop then fractalTop else 0;
    def BotCond = if !IsNaN(fractalBot) and fractalBot then fractalBot else 0;
    def highPrev0;
    def highPrev1;
    def highPrice0;
    def highPrice1;
    if TopCond {
        highPrev1  = highPrev0[1];
        highPrev0  = src[2];
        highPrice1 = highPrice0[1];
        highPrice0 = high[2];
    } else {
        highPrev1  = highPrev1[1];
        highPrev0  = highPrev0[1];
        highPrice1 = highPrice1[1];
        highPrice0 = highPrice0[1];
    }
    def highPrev = highPrev1[2];#if highPrev1 != highPrev1[1] then highPrev1[1] else highPrev[1];
    def highPrice = highPrice1[2];#if highPrice1 != highPrice1[1] then highPrice1[1] else highPrice[1];
    def lowPrev0;
    def lowPrev1;
    def lowPrice0;
    def lowPrice1;
    if BotCond {
        lowPrev1  = lowPrev0[1];
        lowPrev0  = src[2];
        lowPrice1 = lowPrice0[1];
        lowPrice0 = low[2];
    } else {
        lowPrev1  = lowPrev1[1];
        lowPrev0  = lowPrev0[1];
        lowPrice1 = lowPrice1[1];
        lowPrice0 = lowPrice0[1];
    }
    def lowPrev = lowPrev1[2];#if lowPrev1 != lowPrev1[1] then lowPrev1[1] else lowPrev[1];
    def lowPrice = lowPrice1[2];#if lowPrice1 != lowPrice1[1] then lowPrice1[1] else lowPrice[1];
    def bearSignal = TopCond and high[2] > highPrice and src[2] < highPrev;
    def bullSignal = BotCond and low[2] < lowPrice and src[2] > lowPrev;
    def bearDivHidden = TopCond and high[2] < highPrice and src[2] > highPrev;
    def bullDivHidden = BotCond and low[2] > lowPrice and src[2] < lowPrev;
    plot top = if isNaN(TopCond) then 0 else TopCond;#fractalTop;
    plot bot = if isNaN(BotCond) then 0 else BotCond;#fractalBot;
    plot lowP = lowPrev;
    plot sigBear = if isNaN(bearSignal) then 0 else bearSignal;
    plot sigBull = if isNaN(bullSignal) then 0 else bullSignal;
    plot hidBear = if isNaN(bearDivHidden) then 0 else bearDivHidden;
    plot hidBull = if isNaN(bullDivHidden) then 0 else bullDivHidden;
}
#// Stochastic RSI
script f_stochrsi {
    input _src = close;
    input _stochlen = 14;
    input _rsilen = 14;
    input _smoothk = 3;
    input _smoothd = 3;
    input _log = yes;
    input _avg = no;
    def src = if _log then Log(_src) else _src;
    def rsi = RSI(Price = src, Length = _rsilen);
    def stoch = 100 * (rsi - Lowest(rsi, _stochlen)) / (Highest(rsi, _stochlen) - Lowest(rsi, _stochlen));
    def kk = Average(stoch, _smoothk);
    def d1 = Average(kk, _smoothd);
    def avg_1 = (kk + d1) / 2;
    def k = if _avg then avg_1 else kk;
    plot stochK = k;
    plot stochD = d1;
}
#/ RSI+MFI
script f_rsimfi {
    input _period = 60;
    input _multiplier = 150;
    input rsiMFIPosY = 2.5;
    def c = close;
    def o = open;
    def h = high;
    def l = low;
    def dif = (c - o) / (h - l);
    def diff = if !isNaN(dif) then dif else 0;
    def rsimfi = Average(diff * _multiplier, _period) - rsiMFIPosY;
    plot f_rsimfi = rsimfi;
}
#// WaveTrend
script f_wavetrend {
#def wt1 = f_wavetrend(wtMASource, wtChannelLen, wtAverageLen, wtMALen, obLevel, osLevel).wt_1;
    input wtMASource = close;
    input wtChannelLen = 9;
    input wtAverageLen = 12;
    input wtMALen = 3;
    input obLevel = 53;
    input osLevel = -53;
    def tfsrc = wtMASource;
    def esa = ExpAverage(tfsrc, wtChannelLen);
    def de = ExpAverage(AbsValue(tfsrc - esa), wtChannelLen);
    def ci = (tfsrc - esa) / (0.015 * de);
    def wt1 = ExpAverage(ci, wtAverageLen);
    def wt2 = Average(wt1, wtMALen);
    def wtVwap = wt1 - wt2;
    def wtOversold = wt2 <= osLevel;
    def wtOverbought = wt2 >= obLevel;
    def wtCross = Crosses(wt1, wt2, CrossingDirection.ANY);
    def wtCrossUp = (wt2 - wt1) <= 0;
    def wtCrossDown = (wt2 - wt1) >= 0;
    def wtCrosslast = Crosses(wt1[2], wt2[2], CrossingDirection.ANY);
    def wtCrossUplast = (wt2[2] - wt1[2]) <= 0;
    def wtCrossDownlast = (wt2[2] - wt1[2]) >= 0;
    plot wt_1 = wt1;
    plot wt_2 = wt2;
    plot wt_OS = wtOversold;
    plot wt_OB = wtOverbought;
    plot wt_cross = wtCross;
    plot wt_CrossUp = wtCrossUp;
    plot wt_CrossDn = wtCrossDown;
    plot wt_Vwap = wtVwap;
}
#// CALCULATE INDICATORS {
#// RSI
def rsi = RSI(Price = rsiSRC, Length = rsiLen);
#// RSI + MFI Area
def rsiMFI = f_rsimfi(rsiMFIperiod, rsiMFIMultiplier, rsiMFIPosY);
#// Calculates WaveTrend
def wt1 = f_wavetrend(wtMASource, wtChannelLen, wtAverageLen, wtMALen, obLevel, osLevel).wt_1;
def wt2 = f_wavetrend(wtMASource, wtChannelLen, wtAverageLen, wtMALen, obLevel, osLevel).wt_2;
def wtOversold = f_wavetrend(wtMASource, wtChannelLen, wtAverageLen, wtMALen, obLevel, osLevel).wt_OS;
def wtOverbought = f_wavetrend(wtMASource, wtChannelLen, wtAverageLen, wtMALen, obLevel, osLevel).wt_OB;
def wtCross = f_wavetrend(wtMASource, wtChannelLen, wtAverageLen, wtMALen, obLevel, osLevel).wt_cross;
def wtCrossUp = f_wavetrend(wtMASource, wtChannelLen, wtAverageLen, wtMALen, obLevel, osLevel).wt_CrossUp;
def wtCrossDown = f_wavetrend(wtMASource, wtChannelLen, wtAverageLen, wtMALen, obLevel, osLevel).wt_CrossDn;
def wtVwap = f_wavetrend(wtMASource, wtChannelLen, wtAverageLen, wtMALen, obLevel, osLevel).wt_Vwap;
#// Stochastic RSI
def stochK = f_stochrsi(stochSRC, stochLen, stochRsiLen, stochKSmooth, stochDSmooth, stochUseLog, stochAvg).stochK;
def stochD = f_stochrsi(stochSRC, stochLen, stochRsiLen, stochKSmooth, stochDSmooth, stochUseLog, stochAvg).stochD;
#// WT Divergences
def wtBearDiv = f_findDivs(wt2, wtDivOBLevel, wtDivOSLevel, yes).sigBear;
def wtBullDiv = f_findDivs(wt2, wtDivOBLevel, wtDivOSLevel, yes).sigBull;
def wtBearDivHidden = f_findDivs(wt2, wtDivOBLevel, wtDivOSLevel, yes).hidBear;
def wtBullDivHidden = f_findDivs(wt2, wtDivOBLevel, wtDivOSLevel, yes).hidBull;

def wtBearDiv_add = f_findDivs(wt2, wtDivOBLevel_add, wtDivOSLevel_add, yes).sigBear;
def wtBullDiv_add = f_findDivs(wt2, wtDivOBLevel_add, wtDivOSLevel_add, yes).sigBull;
def wtBearDivHidden_add = f_findDivs(wt2, wtDivOBLevel_add, wtDivOSLevel_add, yes).hidBear;
def wtBullDivHidden_add = f_findDivs(wt2, wtDivOBLevel_add, wtDivOSLevel_add, yes).hidBull;
def wtBearDivHidden_nl  = f_findDivs(wt2, 0, 0, no).hidBear;
def wtBullDivHidden_nl  = f_findDivs(wt2, 0, 0, no).hidBull;

def wtBearDivHidden_ = if showHiddenDiv_nl then wtBearDivHidden_nl else wtBearDivHidden;
def wtBullDivHidden_ = if showHiddenDiv_nl then wtBullDivHidden_nl else wtBullDivHidden;

def wtBearDivColor_add = (wtShowDiv and (wtDivOBLevel_addshow and wtBearDiv_add)) or (wtShowHiddenDiv and (wtDivOBLevel_addshow and wtBearDivHidden_add));# ? RED #9a0202 : na
def wtBullDivColor_add = (wtShowDiv and (wtDivOBLevel_addshow and wtBullDiv_add)) or (wtShowHiddenDiv and (wtDivOBLevel_addshow and wtBullDivHidden_add));# ? GREEN #1b5e20 : na

plot wtBearAdd = if wtBearDivColor_add then 103 else na;
plot wtBullAdd = if wtBullDivColor_add then -103 else na;
wtBearAdd.SetDefaultColor(Color.DARK_RED);
wtBullAdd.SetDefaultColor(Color.DARK_GREEN);
wtBearAdd.SetPaintingStrategy(PaintingStrategy.POINTS);
wtBullAdd.SetPaintingStrategy(PaintingStrategy.POINTS);

plot wtBearHid = if wtBearDivHidden_ then 103 else na;
plot wtBullHid = if wtBullDivHidden_ then -103 else na;
wtBearHid.SetDefaultColor(Color.DARK_RED);
wtBullHid.SetDefaultColor(Color.DARK_GREEN);
wtBearHid.SetPaintingStrategy(PaintingStrategy.POINTS);
wtBullHid.SetPaintingStrategy(PaintingStrategy.POINTS);

#// RSI Divergences
def rsiBearDiv = f_findDivs(rsi, rsiDivOBLevel, rsiDivOSLevel, yes).sigBear;
def rsiBullDiv = f_findDivs(rsi, rsiDivOBLevel, rsiDivOSLevel, yes).sigBull;
#// Stoch Divergences
def stochBearDiv = f_findDivs(stochK, 0, 0, no).sigBear;
def stochBullDiv = f_findDivs(stochK, 0, 0, no).sigBull;
def stochBearDivHidden = f_findDivs(stochK, 0, 0, no).hidBear;
def stochBullDivHidden = f_findDivs(stochK, 0, 0, no).hidBull;

def stochBearDivColor = (stochShowDiv and stochBearDiv) or (stochShowHiddenDiv and stochBearDivHidden);#red
def stochBullDivColor = (stochShowDiv and stochBullDiv) or (stochShowHiddenDiv and stochBullDivHidden);#green

plot StBearHid = if stochBearDivColor then 103 else na;
plot StBullHid = if stochBullDivColor then -103 else na;
StBearHid.SetDefaultColor(Color.DARK_RED);
StBullHid.SetDefaultColor(Color.DARK_GREEN);
stBearHid.SetPaintingStrategy(PaintingStrategy.POINTS);
stBullHid.SetPaintingStrategy(PaintingStrategy.POINTS);

#// Buy signal.
def buySignal = wtCross and wtCrossUp and wtOversold;

def buySignalDiv = (wtShowDiv and wtBullDiv) or
               (wtShowDiv and wtBullDiv_add) or
               (stochShowDiv and stochBullDiv) or
               (rsiShowDiv and rsiBullDiv);
#// Sell signal
def sellSignal = wtCross and wtCrossDown and wtOverbought;

def sellSignalDiv = (wtShowDiv and wtBearDiv) or
               (wtShowDiv and wtBearDiv_add) or
               (stochShowDiv and stochBearDiv) or
               (rsiShowDiv and rsiBearDiv);

#// } CALCULATE INDICATORS
#// WT Areas

plot wtWave1 = wt1;    # 'WT Wave 1'
plot wtWave2 = wt2;    # 'WT Wave 2'
wtWave1.AssignValueColor(if wtWave1 > wtWave2  then color.green else if wtWave1  < wtWave2  then color.red else Color.white);
#wtWave1.SetDefaultColor(GlobalColor("wt1"));
wtWave2.SetDefaultColor(GlobalColor("wt2"));

#AddCloud(wtWave1, 0, GlobalColor("wt1"), GlobalColor("wt1"));
#AddCloud(wtWave1, 0, GlobalColor("wt1"), GlobalColor("wt1"));
#AddCloud(wtWave1, 0, GlobalColor("wt1"), GlobalColor("wt1"));
#AddCloud(wtWave2, 0, GlobalColor("wt2"), GlobalColor("wt2"));
#AddCloud(wtWave2, 0, GlobalColor("wt2"), GlobalColor("wt2"));
#AddCloud(wtWave2, 0, GlobalColor("wt2"), GlobalColor("wt2"));

# RSI
plot rsiLine = if showRsiLine then rsi - 50 else na;
rsiLine.SetDefaultColor(Color.YELLOW);
#/ VWAP
def vwapArea = if vwapShow then wtVwap else na;    # 'VWAP'
AddCloud(vwapArea, 0, Color.YELLOW, Color.YELLOW);
#// MFI AREA
def rsiMFIArea = if rsiMFIShow and !last then rsiMFI else na;#, style=plot.style_area, title='rsiMFI'
AddCloud(rsiMFIArea, 0, Color.GREEN, Color.RED);
# // Stoch RSI
plot stocKline = if stochShow then stochK - 50 else na;
plot stocDline = if stochShow then stochD - 50 else na;
stocKline.SetDefaultColor(Color.CYAN);
stocDline.SetDefaultColor(Color.DARK_ORANGE);
#--Sig
plot bSig = if buySignal then wt1 else na; # 'Buy circle'
plot sSig = if sellSignal then wt1 else na; # 'Sell circle'
bSig.SetPaintingStrategy(PaintingStrategy.SQUARES);
sSig.SetPaintingStrategy(PaintingStrategy.SQUARES);
bSig.SetDefaultColor(Color.GREEN);
sSig.SetDefaultColor(Color.RED);

def bSigDiv = buySignalDiv[-2];#, title = 'Divergence buy circle'
def sSigDiv = sellSignalDiv[-2];#, title = 'Divergence sell circle'

plot wbSigDiv = if sSigDiv then 103 else na;
plot wsSigDiv = if bSigDiv then -103 else na;
wbSigDiv.SetDefaultColor(Color.RED);
wsSigDiv.SetDefaultColor(Color.GREEN);
wbSigDiv.SetPaintingStrategy(PaintingStrategy.POINTS);
wsSigDiv.SetPaintingStrategy(PaintingStrategy.POINTS);

#-- Shark
def ema50  = ExpAverage(src, 50);
def ema200 = ExpAverage(src, 200);
def ema400 = ExpAverage(src, 400);
def ema800 = ExpAverage(src, 800);
def wapwap = Reference vwap().VWAP;

def bTouchedLine = (ema50<high and ema50>low) or (ema200<high and ema200>low) or (ema400<high and ema400>low) or (ema800<high and ema800>low) or (wapwap<high and wapwap>low);
#// RSI
def changRsiSrc = rsiSourceInput - rsiSourceInput[1];
def upTR = WildersAverage(max(changRsiSrc, 0), rsiLengthInput);
def downTR = WildersAverage(-min(changRsiSrc, 0), rsiLengthInput);
#def rsiM = if downTR == 0 then 100 else if upTR == 0 then 0 else 100 - (100 / (1 + upTR / downTR));
def rsiM = RSI(Price = rsiSourceInput, Length = rsiLengthInput);
def basis = Average(rsiM[offset], length2);
def dev = mult * stdev(rsiM[offset], length2);
def upper = basis + dev;
def lower = basis - dev;
def bBelow = rsiM < 26;
def bAbove = rsiM > 74;
def bBelow25;def bAbove75;
if !bApply25and75 {
    bBelow25 = yes;
    bAbove75 = yes;
    } else {
    bBelow25 = bBelow;
    bAbove75 = bAbove;
}
def b_color = if (rsiM > upper and bAbove75) then -1 else
              if (rsiM < lower and bBelow25) then  1 else 0;
def barCol;
if bTouchedLine and b_color == -1 {
    barCol = -2;
    } else
if bTouchedLine and b_color ==  1 {
    barCol = 2;
    } else {
    barCol = b_color;
}
def sigSharkUp1 = if barCol > 1 then pos else neg;
def sigSharkUp2 = if barCol > 0 then pos else neg;
def sigSharkDn1 = if barCol <-1 then pos else neg;
def sigSharkDn2 = if barCol < 0 then pos else neg;

def Sob1 = if wt1 > 60 then pos else neg;
def Sob2 = if wt1 > 80 then pos else neg;
def Sos1 = if wt1 < -60 then pos else neg;
def Sos2 = if wt1 < -80 then pos else neg;
AddCloud(Sob1, neg, Color.DARK_red);
AddCloud(Sob2, neg, Color.DARK_red);
AddCloud(Sos1, neg, Color.DARK_GREEN);
AddCloud(Sos2, neg, Color.DARK_GREEN);

#AddCloud(sigSharkUp1, neg, Color.GREEN);
#AddCloud(sigSharkUp2, neg, Color.DARK_GREEN);
#AddCloud(sigSharkDn1, neg, Color.RED);
#AddCloud(sigSharkDn2, neg, Color.DARK_RED);

AssignPriceColor(if !colorBars then Color.CURRENT else
                 if barCol ==  2 then GlobalColor("intense_green") else
                 if barCol ==  1 then GlobalColor("regular_green") else
                 if barCol == -1 then GlobalColor("regular_red") else
                 if barCol == -2 then GlobalColor("intense_red") else Color.GRAY);

plot z = 0;
plot os1 = 60;
plot os2 = 80;
plot ob1 = -60;
plot ob2 = -80;
z.SetDefaultColor(Color.yellow);
os1.SetDefaultColor(Color.red);
os2.SetDefaultColor(Color.red);
ob1.SetDefaultColor(Color.GREEN);
ob2.SetDefaultColor(Color.GREEN);

#-- END of CODE
 

Similar threads

Not the exact question you're looking for?

Start a new thread and receive assistance from our community.

87k+ Posts
511 Online
Create Post

Similar threads

Similar threads

The Market Trading Game Changer

Join 2,500+ subscribers inside the useThinkScript VIP Membership Club
  • Exclusive indicators
  • Proven strategies & setups
  • Private Discord community
  • ‘Buy The Dip’ signal alerts
  • Exclusive members-only content
  • Add-ons and resources
  • 1 full year of unlimited support

Frequently Asked Questions

What is useThinkScript?

useThinkScript is the #1 community of stock market investors using indicators and other tools to power their trading strategies. Traders of all skill levels use our forums to learn about scripting and indicators, help each other, and discover new ways to gain an edge in the markets.

How do I get started?

We get it. Our forum can be intimidating, if not overwhelming. With thousands of topics, tens of thousands of posts, our community has created an incredibly deep knowledge base for stock traders. No one can ever exhaust every resource provided on our site.

If you are new, or just looking for guidance, here are some helpful links to get you started.

What are the benefits of VIP Membership?
VIP members get exclusive access to these proven and tested premium indicators: Buy the Dip, Advanced Market Moves 2.0, Take Profit, and Volatility Trading Range. In addition, VIP members get access to over 50 VIP-only custom indicators, add-ons, and strategies, private VIP-only forums, private Discord channel to discuss trades and strategies in real-time, customer support, trade alerts, and much more. Learn all about VIP membership here.
How can I access the premium indicators?
To access the premium indicators, which are plug and play ready, sign up for VIP membership here.
Back
Top