"SuperComboBullBear" and Linus's Supertrend For ThinkOrSwim

those are profit and loss bubbles. On renko bars they are inaccurate since they are showing on the opening of the renko bars and not on the closing, which is misleading. Any way to alter the code so it can be accurate? I'm willing to put in the work but dont know how to code. If someone could point me to some resources I would be glad to start
 

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

those are profit and loss bubbles. On renko bars they are inaccurate since they are showing on the opening of the renko bars and not on the closing, which is misleading. Any way to alter the code so it can be accurate? I'm willing to put in the work but dont know how to code. If someone could point me to some resources I would be glad to start
Some TOS features simply don't play well with any type of Range Bars... Like any study that uses secondary aggregation, among others... Not much we can do about that, unfortunately...
 
Linus has a few really nice supertrend scripts in the ThinkScript_Cloud. Here are 2 I found useful:

Code:
## START STUDY
## SuperCombo Bull/Bear Indicator
## linus, 2014-07-24, v0.1

#hint: SuperTrend of price, RSI and Ultimate Oscillator, combined with Chandelier stops.

## Signal inputs:
input paintBars = {OFF, default DIR, STR};
input signals = {OFF, default ALL, ST, CS, RSI, UO};
input strength = {"1", "2", default "3", "4"};
input showLabel = Yes;
input showBubbles = Yes;
input showPrompt = Yes;

## SuperTrend of Price inputs:
input stATRMult = 3.5;
input stATRLength = 22;
input stATRType = AverageType.WILDERS;
input stPivot = hl2;

## Chandelier Stop inputs:
input csPeriod = 15;
input csATRLength = 5;
input csATRMult = 3.0;  
input csATRType = AverageType.SIMPLE;
input csShift = 1;
input csHideOpposite = Yes;

## SuperTrend of RSI inputs:
input rsiLength = 14;
input rsiPrice = close;
input rsiSmooth = 2;
input rsiSmoothType = AverageType.SIMPLE;
input rsiATRMult = 2.3;
input rsiATRLength = 25;
input rsiATRType = AverageType.WILDERS;

## SuperTrend of Ultimate Oscillator inputs:
input uoFastLen = 7;
input uoMedLen = 14;
input uoSlowLen = 28;
input uoATRMult = 2.8;
input uoATRLength = 3;
input uoATRType = AverageType.SIMPLE;

########################################
## SuperTrend of Price

def stATR = MovingAverage(stATRType, TrueRange(high, close, low), stATRLength) * stATRMult;

def stUp = stPivot + stATR;
def stDn = stPivot - stATR;

def rStTrend = compoundValue(1,
    if rStTrend[1] > 0 then
        if close < Max(stDn[1], rStTrend[1]) then -stUp
        else Max(stDn, rStTrend[1])
    else if rStTrend[1] < 0 then
        if close > Min(stUp[1], AbsValue(rStTrend[1])) then stDn
        else -Min(stUp, AbsValue(rStTrend[1]))
    else rStTrend[1]
, stPivot);

plot StTrend = if Sign(rStTrend) == Sign(rStTrend[1]) then absValue(rStTrend) else Double.NaN;
StTrend.DefineColor("Up", Color.CYAN);
StTrend.DefineColor("Dn", Color.MAGENTA);
StTrend.AssignValueColor(if rStTrend > 0 then StTrend.Color("Up") else StTrend.Color("Dn"));
StTrend.HideBubble();
StTrend.SetLineWeight(3);

########################################
## Chandelier_Stops

def csATR = MovingAverage(csATRType, TrueRange(high, close, low), csATRLength) * csATRMult;

def smax = Lowest(low, csPeriod)[csShift] + csATR[csShift];
def smin = Highest(high, csPeriod)[csShift] - csATR[csShift];

def rCSTrend = compoundValue(1, if close > smax[1] then 1 else if close < smin[1] then -1 else rCSTrend[1], 0);

def rUB = compoundValue(1, if rCSTrend > 0 then if smax > rUB[1] then smax else rUB[1] else if rCSTrend < 0 then if smax < rUB[1] then smax else rUB[1] else rUB[1], high);

def rLB = compoundValue(1, if rCSTrend < 0 then if smin < rLB[1] then smin else rLB[1] else if rCSTrend > 0 then if smin > rLB[1] then smin else rLB[1] else rLB[1], low);

plot UB = if !csHideOpposite or rCSTrend < 0 then rUB else Double.NaN;
UB.SetDefaultColor(Color.MAGENTA);
UB.SetLineWeight(3);
UB.SetStyle(Curve.SHORT_DASH);
UB.HideBubble();

plot LB = if !csHideOpposite or rCSTrend > 0 then rLB else Double.NaN;
LB.SetDefaultColor(Color.CYAN);
LB.SetLineWeight(3);
LB.SetStyle(Curve.SHORT_DASH);
LB.HideBubble();

########################################
## SuperTrend of RSI

def avgDif = WildersAverage(AbsValue(rsiPrice - rsiPrice[1]), rsiLength);
def RSI = MovingAverage(rsiSmoothType, 50 * ((if avgDif != 0 then WildersAverage(rsiPrice - rsiPrice[1], rsiLength) / avgDif else 0) + 1), rsiSmooth);

def rsiATR = MovingAverage(rsiATRType, TrueRange(Highest(RSI, ceil(rsiATRMult)), RSI, Lowest(RSI, ceil(rsiATRMult))), rsiATRLength) * rsiATRMult;
def rsiUp = RSI + rsiATR;
def rsiDn = RSI - rsiATR;

def rRSITrend = compoundValue(1,
    if rRSITrend[1] > 0 then
        if RSI < Max(rsiDn[1], rRSITrend[1]) then -rsiUp
        else Max(rsiDn, rRSITrend[1])
    else if rRSITrend[1] < 0 then
        if RSI > Min(rsiUp[1], AbsValue(rRSITrend[1])) then rsiDn
        else -Min(rsiUp, AbsValue(rRSITrend[1]))
    else rRSITrend[1]
, RSI);

########################################
## SuperTrend of Ultimate Oscillator

def TR = TrueRange(high, close, low);
def BP = close - Min(close[1], low);
def nFast = (uoSlowLen / uoFastLen);
def nMed = (uoSlowLen / uoMedLen);
def trFast = sum(TR, uoFastLen);
def trMed = sum(TR, uoMedLen);
def trSlow = sum(TR, uoSlowLen);

def UO = 100 * (((if trFast != 0 then (sum(BP, uoFastLen) / trFast) * nFast else 0)
    +  (if trMed != 0 then (sum(BP, uoMedLen) / trMed) * nMed else 0)
    + (if trSlow != 0 then (sum(BP, uoSlowLen) / sum(TR, uoSlowLen)) else 0))
/ (nFast + nMed + 1));

def uoATR = MovingAverage(uoATRType, TrueRange(Highest(UO, ceil(uoATRMult)), UO, Lowest(UO, ceil(uoATRMult))), uoATRLength) * uoATRMult;
def uoUp = UO + uoATR;
def uoDn = UO - uoATR;

def rUOTrend = compoundValue(1,
    if rUOTrend[1] > 0 then
        if UO < Max(uoDn[1], rUOTrend[1]) then -uoUp
        else Max(uoDn, rUOTrend[1])
    else if rUOTrend[1] < 0 then
        if UO > Min(uoUp[1], AbsValue(rUOTrend[1])) then uoDn
        else -Min(uoUp, AbsValue(rUOTrend[1]))
    else rUOTrend[1]
, UO);

########################################
## Signals

def orderDir;
def p;
def sumUp = (rStTrend > 0) + (rCSTrend > 0) + (rRSITrend > 0) + (rUOTrend > 0);
def sumDn = (rStTrend < 0) + (rCSTrend < 0) + (rRSITrend < 0) + (rUOTrend < 0);

switch (signals) {
case OFF:
    orderDir = 0;
    p = 0;
case ALL:
    orderDir = compoundValue(1, if sumUp >= strength+1 then 1 else if sumDn >= strength+1 then -1 else orderDir[1], 0);
    p = if showPrompt then 1 else 0;
case ST:
    orderDir = rStTrend;
    p = if showPrompt then 2 else 0;
case CS:
    orderDir = rCSTrend;
    p = if showPrompt then 3 else 0;
case RSI:
    orderDir = rRSITrend;
    p = if showPrompt then 4 else 0;
case UO:
    orderDir = rUOTrend;
    p = if showPrompt then 5 else 0;
}

def isOrder = orderDir crosses 0;

def orderCount = compoundValue(1, if isNaN(isOrder) then 0 else if isOrder then orderCount[1] + 1 else orderCount[1], 0);

def noBar = isNaN(open[-1]);

def orderPrice = if isOrder then if noBar then close else open[-1] else orderPrice[1];
def profitLoss = if !isOrder or orderCount == 1 then 0 else if orderDir > 0 then orderPrice[1] - orderPrice else if orderDir < 0 then orderPrice - orderPrice[1] else 0;
def profitLossSum = compoundValue(1, if isNaN(isOrder) then 0 else if isOrder then profitLossSum[1] + profitLoss else profitLossSum[1], 0);

AddLabel(signals and showLabel, (if p==1 then "ALL: " else if p==2 then "ST: " else if p==3 then "CS: " else if p==4 then "RSI: " else if p==5 then "UO: " else "") + orderCount + " orders | P/L " + AsDollars((profitLossSum / tickSize()) * tickValue()), if profitLossSum > 0 then Color.GREEN else if profitLossSum < 0 then Color.RED else Color.GRAY);

AddChartBubble(signals and showBubbles and isOrder and orderDir > 0, low, profitLoss, if noBar then Color.LIGHT_GRAY else Color.GREEN, 0);
AddChartBubble(signals and showBubbles and isOrder and orderDir < 0, high, profitLoss, if noBar then Color.GRAY else Color.RED, 1);

AssignPriceColor(if !paintBars then Color.CURRENT
else if paintBars == paintBars.DIR then
    if orderDir > 0 then
        if rSTTrend < 0 or rCSTrend < 0 then Color.DARK_ORANGE
        else Color.UPTICK
    else if orderDir < 0 then
        if rSTTrend > 0 or rCSTrend > 0 then Color.YELLOW
        else Color.DOWNTICK
    else Color.GRAY
else if sumUp >= strength+1 then Color.UPTICK
else if sumDn >= strength+1 then Color.DOWNTICK
else if sumUp > sumDn then Color.YELLOW
else if sumDn > sumUp then Color.DARK_ORANGE
else Color.GRAY);

## END STUDY

mNnhh2X.png


Supertrend - #hint: Alternative SuperTrend algorithm.

UNk7a5L.png


When you go into the properties, you'll notice how you can change the movingavg type from Simple, Exponential, Wilders, Hull, and Weighted. I'm still trying to figure out which would be best for these.

Contrary to what many think, I actually like using ATR trailing stop-esque indicators for both entry and management of a trade. These both might even work well together if you use one as an entry and the other to manage. I'm thinking this might work very well with AMM (Advanced Market Moves) indicator. Maybe use that as entry, and these as management. We should mix and match to see what is most effective.

Would appreciate your feedback after testing.
I really like this study and use it regularly. I tried creating a scanner for it when it's in an uptrend based off of the rStTrend setting the color to Blue or Purple based on Up or Down Trend. So I tried to plot Uptrend and Downtrend based on the color setting and i'm getting an error in ToS everytime I try to add the study as a Scan stating that "UpTrend" is true as below. The error forces me to restart ToS, which is something I haven't experienced until this. Can you help me out with how to set up a scan for this?

plot UpTrend = if rStTrend > 0 then 1 else 0;
plot DownTrend = if rStTrend < 0 then 1 else 0;
UpTrend.Hide();
DownTrend.Hide();
 
@Mightymorphinchris Most SuperTrend and the Trend Reversal indicators cannot be used in the scanner. To the follow-up question that all posters ask when told, 'No, it can't be done': No it can't be modified so it can be done.
 
@Os1rix Supertrends repaint. You can search this forum and read all about Supertrend repainting for more info.

That said, I do use Supertrends for what they were meant for: to confirm stocks with long-term up-trending momentum.
It is just the last candle that can not be relied upon.
 
OK thanks for the reply.
I have been using a similar indicator, but not quite sure what each indicator represents on this one. Can someone be so kind as to describe what I am looking at?
ie..
solid lines
dotted lines
I am assuming green candles is an uptrend and red down trend but we have yellow and orange as well.
Also is has what appears to be profit and loss bubbles.

i think orange is for the change from down to up on the smaller trend. then green or red for the big one
 
Hi Ben
on this supercombo
I am trying to figure out the significance of the orange and yellow candles. in the script it reads:

AssignPriceColor(if !paintBars then Color.CURRENT

else if paintBars == paintBars.DIR then

if orderDir > 0 then

if rSTTrend < 0 or rCSTrend < 0 then Color.DARK_ORANGE

else Color.UPTICK

else if orderDir < 0 then

if rSTTrend > 0 or rCSTrend > 0 then Color.YELLOW

else Color.DOWNTICK

else Color.GRAY

else if sumUp >= strength+1 then Color.UPTICK

else if sumDn >= strength+1 then Color.DOWNTICK

else if sumUp > sumDn then Color.YELLOW

else if sumDn > sumUp then Color.DARK_ORANGE

else Color.GRAY);
So do the orange candles represent no trend and the yellow slight trend?
i think orange is for the change from down to up on the smaller trend. then green or red for the big one
 
@Germanjosh What I think you are asking:
If the supertrend (rStTrend ) is greater than zero (cyan dots) AND close is crossing above the supertrend?

I don't do alerts myself but try adding this line to the bottom of your study:
Ruby:
Alert(rStTrend > 0 and close crosses above rStTrend , "Cyan Dots Crossed", Alert.Bar, Sound.Bell);
 
@Germanjosh What I think you are asking:
If the supertrend (rStTrend ) is greater than zero (cyan dots) AND close is crossing above the supertrend?

I don't do alerts myself but try adding this line to the bottom of your study:
Ruby:
Alert(rStTrend > 0 and close crosses above rStTrend , "Cyan Dots Crossed", Alert.Bar, Sound.Bell);
I added the above change under the bottom of the script, and hit apply.

when I go to edit the script, there is an alert tab at the bottom with the above condition.

however, it didn’t sound off when the green candle stick closed above the dotted line

I think I missed up though. Referencing the first picture on the first page. There is an orange candle stick that is crossing above the purple dotted line.

I would like to create an alert that signals that crossing

https://ibb.co/cTMggsB
 
Last edited:
@Germanjosh
Updated code below. However, I would not recommend any strategy that is attempting to go long on a downtrend.
Ruby:
Alert(rStTrend < 0 and close crosses above rStTrend , "Magenta Dots Crossed", Alert.Bar, Sound.Bell);
 
Linus has a few really nice supertrend scripts in the ThinkScript_Cloud. Here are 2 I found useful:

Code:
## START STUDY
## SuperCombo Bull/Bear Indicator
## linus, 2014-07-24, v0.1

#hint: SuperTrend of price, RSI and Ultimate Oscillator, combined with Chandelier stops.

## Signal inputs:
input paintBars = {OFF, default DIR, STR};
input signals = {OFF, default ALL, ST, CS, RSI, UO};
input strength = {"1", "2", default "3", "4"};
input showLabel = Yes;
input showBubbles = Yes;
input showPrompt = Yes;

## SuperTrend of Price inputs:
input stATRMult = 3.5;
input stATRLength = 22;
input stATRType = AverageType.WILDERS;
input stPivot = hl2;

## Chandelier Stop inputs:
input csPeriod = 15;
input csATRLength = 5;
input csATRMult = 3.0;  
input csATRType = AverageType.SIMPLE;
input csShift = 1;
input csHideOpposite = Yes;

## SuperTrend of RSI inputs:
input rsiLength = 14;
input rsiPrice = close;
input rsiSmooth = 2;
input rsiSmoothType = AverageType.SIMPLE;
input rsiATRMult = 2.3;
input rsiATRLength = 25;
input rsiATRType = AverageType.WILDERS;

## SuperTrend of Ultimate Oscillator inputs:
input uoFastLen = 7;
input uoMedLen = 14;
input uoSlowLen = 28;
input uoATRMult = 2.8;
input uoATRLength = 3;
input uoATRType = AverageType.SIMPLE;

########################################
## SuperTrend of Price

def stATR = MovingAverage(stATRType, TrueRange(high, close, low), stATRLength) * stATRMult;

def stUp = stPivot + stATR;
def stDn = stPivot - stATR;

def rStTrend = compoundValue(1,
    if rStTrend[1] > 0 then
        if close < Max(stDn[1], rStTrend[1]) then -stUp
        else Max(stDn, rStTrend[1])
    else if rStTrend[1] < 0 then
        if close > Min(stUp[1], AbsValue(rStTrend[1])) then stDn
        else -Min(stUp, AbsValue(rStTrend[1]))
    else rStTrend[1]
, stPivot);

plot StTrend = if Sign(rStTrend) == Sign(rStTrend[1]) then absValue(rStTrend) else Double.NaN;
StTrend.DefineColor("Up", Color.CYAN);
StTrend.DefineColor("Dn", Color.MAGENTA);
StTrend.AssignValueColor(if rStTrend > 0 then StTrend.Color("Up") else StTrend.Color("Dn"));
StTrend.HideBubble();
StTrend.SetLineWeight(3);

########################################
## Chandelier_Stops

def csATR = MovingAverage(csATRType, TrueRange(high, close, low), csATRLength) * csATRMult;

def smax = Lowest(low, csPeriod)[csShift] + csATR[csShift];
def smin = Highest(high, csPeriod)[csShift] - csATR[csShift];

def rCSTrend = compoundValue(1, if close > smax[1] then 1 else if close < smin[1] then -1 else rCSTrend[1], 0);

def rUB = compoundValue(1, if rCSTrend > 0 then if smax > rUB[1] then smax else rUB[1] else if rCSTrend < 0 then if smax < rUB[1] then smax else rUB[1] else rUB[1], high);

def rLB = compoundValue(1, if rCSTrend < 0 then if smin < rLB[1] then smin else rLB[1] else if rCSTrend > 0 then if smin > rLB[1] then smin else rLB[1] else rLB[1], low);

plot UB = if !csHideOpposite or rCSTrend < 0 then rUB else Double.NaN;
UB.SetDefaultColor(Color.MAGENTA);
UB.SetLineWeight(3);
UB.SetStyle(Curve.SHORT_DASH);
UB.HideBubble();

plot LB = if !csHideOpposite or rCSTrend > 0 then rLB else Double.NaN;
LB.SetDefaultColor(Color.CYAN);
LB.SetLineWeight(3);
LB.SetStyle(Curve.SHORT_DASH);
LB.HideBubble();

########################################
## SuperTrend of RSI

def avgDif = WildersAverage(AbsValue(rsiPrice - rsiPrice[1]), rsiLength);
def RSI = MovingAverage(rsiSmoothType, 50 * ((if avgDif != 0 then WildersAverage(rsiPrice - rsiPrice[1], rsiLength) / avgDif else 0) + 1), rsiSmooth);

def rsiATR = MovingAverage(rsiATRType, TrueRange(Highest(RSI, ceil(rsiATRMult)), RSI, Lowest(RSI, ceil(rsiATRMult))), rsiATRLength) * rsiATRMult;
def rsiUp = RSI + rsiATR;
def rsiDn = RSI - rsiATR;

def rRSITrend = compoundValue(1,
    if rRSITrend[1] > 0 then
        if RSI < Max(rsiDn[1], rRSITrend[1]) then -rsiUp
        else Max(rsiDn, rRSITrend[1])
    else if rRSITrend[1] < 0 then
        if RSI > Min(rsiUp[1], AbsValue(rRSITrend[1])) then rsiDn
        else -Min(rsiUp, AbsValue(rRSITrend[1]))
    else rRSITrend[1]
, RSI);

########################################
## SuperTrend of Ultimate Oscillator

def TR = TrueRange(high, close, low);
def BP = close - Min(close[1], low);
def nFast = (uoSlowLen / uoFastLen);
def nMed = (uoSlowLen / uoMedLen);
def trFast = sum(TR, uoFastLen);
def trMed = sum(TR, uoMedLen);
def trSlow = sum(TR, uoSlowLen);

def UO = 100 * (((if trFast != 0 then (sum(BP, uoFastLen) / trFast) * nFast else 0)
    +  (if trMed != 0 then (sum(BP, uoMedLen) / trMed) * nMed else 0)
    + (if trSlow != 0 then (sum(BP, uoSlowLen) / sum(TR, uoSlowLen)) else 0))
/ (nFast + nMed + 1));

def uoATR = MovingAverage(uoATRType, TrueRange(Highest(UO, ceil(uoATRMult)), UO, Lowest(UO, ceil(uoATRMult))), uoATRLength) * uoATRMult;
def uoUp = UO + uoATR;
def uoDn = UO - uoATR;

def rUOTrend = compoundValue(1,
    if rUOTrend[1] > 0 then
        if UO < Max(uoDn[1], rUOTrend[1]) then -uoUp
        else Max(uoDn, rUOTrend[1])
    else if rUOTrend[1] < 0 then
        if UO > Min(uoUp[1], AbsValue(rUOTrend[1])) then uoDn
        else -Min(uoUp, AbsValue(rUOTrend[1]))
    else rUOTrend[1]
, UO);

########################################
## Signals

def orderDir;
def p;
def sumUp = (rStTrend > 0) + (rCSTrend > 0) + (rRSITrend > 0) + (rUOTrend > 0);
def sumDn = (rStTrend < 0) + (rCSTrend < 0) + (rRSITrend < 0) + (rUOTrend < 0);

switch (signals) {
case OFF:
    orderDir = 0;
    p = 0;
case ALL:
    orderDir = compoundValue(1, if sumUp >= strength+1 then 1 else if sumDn >= strength+1 then -1 else orderDir[1], 0);
    p = if showPrompt then 1 else 0;
case ST:
    orderDir = rStTrend;
    p = if showPrompt then 2 else 0;
case CS:
    orderDir = rCSTrend;
    p = if showPrompt then 3 else 0;
case RSI:
    orderDir = rRSITrend;
    p = if showPrompt then 4 else 0;
case UO:
    orderDir = rUOTrend;
    p = if showPrompt then 5 else 0;
}

def isOrder = orderDir crosses 0;

def orderCount = compoundValue(1, if isNaN(isOrder) then 0 else if isOrder then orderCount[1] + 1 else orderCount[1], 0);

def noBar = isNaN(open[-1]);

def orderPrice = if isOrder then if noBar then close else open[-1] else orderPrice[1];
def profitLoss = if !isOrder or orderCount == 1 then 0 else if orderDir > 0 then orderPrice[1] - orderPrice else if orderDir < 0 then orderPrice - orderPrice[1] else 0;
def profitLossSum = compoundValue(1, if isNaN(isOrder) then 0 else if isOrder then profitLossSum[1] + profitLoss else profitLossSum[1], 0);

AddLabel(signals and showLabel, (if p==1 then "ALL: " else if p==2 then "ST: " else if p==3 then "CS: " else if p==4 then "RSI: " else if p==5 then "UO: " else "") + orderCount + " orders | P/L " + AsDollars((profitLossSum / tickSize()) * tickValue()), if profitLossSum > 0 then Color.GREEN else if profitLossSum < 0 then Color.RED else Color.GRAY);

AddChartBubble(signals and showBubbles and isOrder and orderDir > 0, low, profitLoss, if noBar then Color.LIGHT_GRAY else Color.GREEN, 0);
AddChartBubble(signals and showBubbles and isOrder and orderDir < 0, high, profitLoss, if noBar then Color.GRAY else Color.RED, 1);

AssignPriceColor(if !paintBars then Color.CURRENT
else if paintBars == paintBars.DIR then
    if orderDir > 0 then
        if rSTTrend < 0 or rCSTrend < 0 then Color.DARK_ORANGE
        else Color.UPTICK
    else if orderDir < 0 then
        if rSTTrend > 0 or rCSTrend > 0 then Color.YELLOW
        else Color.DOWNTICK
    else Color.GRAY
else if sumUp >= strength+1 then Color.UPTICK
else if sumDn >= strength+1 then Color.DOWNTICK
else if sumUp > sumDn then Color.YELLOW
else if sumDn > sumUp then Color.DARK_ORANGE
else Color.GRAY);

## END STUDY

mNnhh2X.png


Supertrend - #hint: Alternative SuperTrend algorithm.

UNk7a5L.png


When you go into the properties, you'll notice how you can change the movingavg type from Simple, Exponential, Wilders, Hull, and Weighted. I'm still trying to figure out which would be best for these.

Contrary to what many think, I actually like using ATR trailing stop-esque indicators for both entry and management of a trade. These both might even work well together if you use one as an entry and the other to manage. I'm thinking this might work very well with AMM (Advanced Market Moves) indicator. Maybe use that as entry, and these as management. We should mix and match to see what is most effective.

Would appreciate your feedback after testing.
It would be cool to create a simplified version of this indicator that removes the chandelier stops, removes bubbles, and replaces the Ultimate Oscillator with the TMO (True Momentum Oscillator).
 
Linus has a few really nice supertrend scripts in the ThinkScript_Cloud. Here are 2 I found useful:

Code:
## START STUDY
## SuperCombo Bull/Bear Indicator
## linus, 2014-07-24, v0.1

#hint: SuperTrend of price, RSI and Ultimate Oscillator, combined with Chandelier stops.

## Signal inputs:
input paintBars = {OFF, default DIR, STR};
input signals = {OFF, default ALL, ST, CS, RSI, UO};
input strength = {"1", "2", default "3", "4"};
input showLabel = Yes;
input showBubbles = Yes;
input showPrompt = Yes;

## SuperTrend of Price inputs:
input stATRMult = 3.5;
input stATRLength = 22;
input stATRType = AverageType.WILDERS;
input stPivot = hl2;

## Chandelier Stop inputs:
input csPeriod = 15;
input csATRLength = 5;
input csATRMult = 3.0;  
input csATRType = AverageType.SIMPLE;
input csShift = 1;
input csHideOpposite = Yes;

## SuperTrend of RSI inputs:
input rsiLength = 14;
input rsiPrice = close;
input rsiSmooth = 2;
input rsiSmoothType = AverageType.SIMPLE;
input rsiATRMult = 2.3;
input rsiATRLength = 25;
input rsiATRType = AverageType.WILDERS;

## SuperTrend of Ultimate Oscillator inputs:
input uoFastLen = 7;
input uoMedLen = 14;
input uoSlowLen = 28;
input uoATRMult = 2.8;
input uoATRLength = 3;
input uoATRType = AverageType.SIMPLE;

########################################
## SuperTrend of Price

def stATR = MovingAverage(stATRType, TrueRange(high, close, low), stATRLength) * stATRMult;

def stUp = stPivot + stATR;
def stDn = stPivot - stATR;

def rStTrend = compoundValue(1,
    if rStTrend[1] > 0 then
        if close < Max(stDn[1], rStTrend[1]) then -stUp
        else Max(stDn, rStTrend[1])
    else if rStTrend[1] < 0 then
        if close > Min(stUp[1], AbsValue(rStTrend[1])) then stDn
        else -Min(stUp, AbsValue(rStTrend[1]))
    else rStTrend[1]
, stPivot);

plot StTrend = if Sign(rStTrend) == Sign(rStTrend[1]) then absValue(rStTrend) else Double.NaN;
StTrend.DefineColor("Up", Color.CYAN);
StTrend.DefineColor("Dn", Color.MAGENTA);
StTrend.AssignValueColor(if rStTrend > 0 then StTrend.Color("Up") else StTrend.Color("Dn"));
StTrend.HideBubble();
StTrend.SetLineWeight(3);

########################################
## Chandelier_Stops

def csATR = MovingAverage(csATRType, TrueRange(high, close, low), csATRLength) * csATRMult;

def smax = Lowest(low, csPeriod)[csShift] + csATR[csShift];
def smin = Highest(high, csPeriod)[csShift] - csATR[csShift];

def rCSTrend = compoundValue(1, if close > smax[1] then 1 else if close < smin[1] then -1 else rCSTrend[1], 0);

def rUB = compoundValue(1, if rCSTrend > 0 then if smax > rUB[1] then smax else rUB[1] else if rCSTrend < 0 then if smax < rUB[1] then smax else rUB[1] else rUB[1], high);

def rLB = compoundValue(1, if rCSTrend < 0 then if smin < rLB[1] then smin else rLB[1] else if rCSTrend > 0 then if smin > rLB[1] then smin else rLB[1] else rLB[1], low);

plot UB = if !csHideOpposite or rCSTrend < 0 then rUB else Double.NaN;
UB.SetDefaultColor(Color.MAGENTA);
UB.SetLineWeight(3);
UB.SetStyle(Curve.SHORT_DASH);
UB.HideBubble();

plot LB = if !csHideOpposite or rCSTrend > 0 then rLB else Double.NaN;
LB.SetDefaultColor(Color.CYAN);
LB.SetLineWeight(3);
LB.SetStyle(Curve.SHORT_DASH);
LB.HideBubble();

########################################
## SuperTrend of RSI

def avgDif = WildersAverage(AbsValue(rsiPrice - rsiPrice[1]), rsiLength);
def RSI = MovingAverage(rsiSmoothType, 50 * ((if avgDif != 0 then WildersAverage(rsiPrice - rsiPrice[1], rsiLength) / avgDif else 0) + 1), rsiSmooth);

def rsiATR = MovingAverage(rsiATRType, TrueRange(Highest(RSI, ceil(rsiATRMult)), RSI, Lowest(RSI, ceil(rsiATRMult))), rsiATRLength) * rsiATRMult;
def rsiUp = RSI + rsiATR;
def rsiDn = RSI - rsiATR;

def rRSITrend = compoundValue(1,
    if rRSITrend[1] > 0 then
        if RSI < Max(rsiDn[1], rRSITrend[1]) then -rsiUp
        else Max(rsiDn, rRSITrend[1])
    else if rRSITrend[1] < 0 then
        if RSI > Min(rsiUp[1], AbsValue(rRSITrend[1])) then rsiDn
        else -Min(rsiUp, AbsValue(rRSITrend[1]))
    else rRSITrend[1]
, RSI);

########################################
## SuperTrend of Ultimate Oscillator

def TR = TrueRange(high, close, low);
def BP = close - Min(close[1], low);
def nFast = (uoSlowLen / uoFastLen);
def nMed = (uoSlowLen / uoMedLen);
def trFast = sum(TR, uoFastLen);
def trMed = sum(TR, uoMedLen);
def trSlow = sum(TR, uoSlowLen);

def UO = 100 * (((if trFast != 0 then (sum(BP, uoFastLen) / trFast) * nFast else 0)
    +  (if trMed != 0 then (sum(BP, uoMedLen) / trMed) * nMed else 0)
    + (if trSlow != 0 then (sum(BP, uoSlowLen) / sum(TR, uoSlowLen)) else 0))
/ (nFast + nMed + 1));

def uoATR = MovingAverage(uoATRType, TrueRange(Highest(UO, ceil(uoATRMult)), UO, Lowest(UO, ceil(uoATRMult))), uoATRLength) * uoATRMult;
def uoUp = UO + uoATR;
def uoDn = UO - uoATR;

def rUOTrend = compoundValue(1,
    if rUOTrend[1] > 0 then
        if UO < Max(uoDn[1], rUOTrend[1]) then -uoUp
        else Max(uoDn, rUOTrend[1])
    else if rUOTrend[1] < 0 then
        if UO > Min(uoUp[1], AbsValue(rUOTrend[1])) then uoDn
        else -Min(uoUp, AbsValue(rUOTrend[1]))
    else rUOTrend[1]
, UO);

########################################
## Signals

def orderDir;
def p;
def sumUp = (rStTrend > 0) + (rCSTrend > 0) + (rRSITrend > 0) + (rUOTrend > 0);
def sumDn = (rStTrend < 0) + (rCSTrend < 0) + (rRSITrend < 0) + (rUOTrend < 0);

switch (signals) {
case OFF:
    orderDir = 0;
    p = 0;
case ALL:
    orderDir = compoundValue(1, if sumUp >= strength+1 then 1 else if sumDn >= strength+1 then -1 else orderDir[1], 0);
    p = if showPrompt then 1 else 0;
case ST:
    orderDir = rStTrend;
    p = if showPrompt then 2 else 0;
case CS:
    orderDir = rCSTrend;
    p = if showPrompt then 3 else 0;
case RSI:
    orderDir = rRSITrend;
    p = if showPrompt then 4 else 0;
case UO:
    orderDir = rUOTrend;
    p = if showPrompt then 5 else 0;
}

def isOrder = orderDir crosses 0;

def orderCount = compoundValue(1, if isNaN(isOrder) then 0 else if isOrder then orderCount[1] + 1 else orderCount[1], 0);

def noBar = isNaN(open[-1]);

def orderPrice = if isOrder then if noBar then close else open[-1] else orderPrice[1];
def profitLoss = if !isOrder or orderCount == 1 then 0 else if orderDir > 0 then orderPrice[1] - orderPrice else if orderDir < 0 then orderPrice - orderPrice[1] else 0;
def profitLossSum = compoundValue(1, if isNaN(isOrder) then 0 else if isOrder then profitLossSum[1] + profitLoss else profitLossSum[1], 0);

AddLabel(signals and showLabel, (if p==1 then "ALL: " else if p==2 then "ST: " else if p==3 then "CS: " else if p==4 then "RSI: " else if p==5 then "UO: " else "") + orderCount + " orders | P/L " + AsDollars((profitLossSum / tickSize()) * tickValue()), if profitLossSum > 0 then Color.GREEN else if profitLossSum < 0 then Color.RED else Color.GRAY);

AddChartBubble(signals and showBubbles and isOrder and orderDir > 0, low, profitLoss, if noBar then Color.LIGHT_GRAY else Color.GREEN, 0);
AddChartBubble(signals and showBubbles and isOrder and orderDir < 0, high, profitLoss, if noBar then Color.GRAY else Color.RED, 1);

AssignPriceColor(if !paintBars then Color.CURRENT
else if paintBars == paintBars.DIR then
    if orderDir > 0 then
        if rSTTrend < 0 or rCSTrend < 0 then Color.DARK_ORANGE
        else Color.UPTICK
    else if orderDir < 0 then
        if rSTTrend > 0 or rCSTrend > 0 then Color.YELLOW
        else Color.DOWNTICK
    else Color.GRAY
else if sumUp >= strength+1 then Color.UPTICK
else if sumDn >= strength+1 then Color.DOWNTICK
else if sumUp > sumDn then Color.YELLOW
else if sumDn > sumUp then Color.DARK_ORANGE
else Color.GRAY);

## END STUDY

mNnhh2X.png


Supertrend - #hint: Alternative SuperTrend algorithm.

UNk7a5L.png


When you go into the properties, you'll notice how you can change the movingavg type from Simple, Exponential, Wilders, Hull, and Weighted. I'm still trying to figure out which would be best for these.

Contrary to what many think, I actually like using ATR trailing stop-esque indicators for both entry and management of a trade. These both might even work well together if you use one as an entry and the other to manage. I'm thinking this might work very well with AMM (Advanced Market Moves) indicator. Maybe use that as entry, and these as management. We should mix and match to see what is most effective.

Would appreciate your feedback after testing.
Thank you so much for your work on this. How in the world do I get the "Supertrend - #hint: Alternative SuperTrend algorithm"???

I have played around with it but am unable to figure out what to delete. From those bottom two charts, it looks far preferable to me, much less noise and demonstrates what I would like to see. Thank you so much in advance
 
Thank you so much for your work on this. How in the world do I get the "Supertrend - #hint: Alternative SuperTrend algorithm"???

I have played around with it but am unable to figure out what to delete. From those bottom two charts, it looks far preferable to me, much less noise and demonstrates what I would like to see. Thank you so much in advance
Did you know that clicking on a member's avatar will allow you to see when a member was last seen on the uTS forum? @Shinthus has not been seen in a while. :(
 
Here is a watchlist column that will match the color of the last bar in case anyone wants to use it.
(that is, the color that is applied using the studies "directional" color assignment"

# START STUDY
## SuperCombo Bull/Bear Indicator
## linus, 2014-07-24, v0.1

#hint: SuperTrend of price, RSI and Ultimate Oscillator, combined with Chandelier stops.

## Signal inputs:
input paintBars = {OFF, default DIR, STR};
input signals = {OFF, default ALL, ST, CS, RSI, UO};
input strength = {"1", "2", default "3", "4"};
input showLabel = Yes;
input showBubbles = Yes;
input showPrompt = Yes;

## SuperTrend of Price inputs:
input stATRMult = 3.5;
input stATRLength = 22;
input stATRType = AverageType.WILDERS;
input stPivot = hl2;

## Chandelier Stop inputs:
input csPeriod = 15;
input csATRLength = 5;
input csATRMult = 3.0;
input csATRType = AverageType.SIMPLE;
input csShift = 1;
input csHideOpposite = Yes;

## SuperTrend of RSI inputs:
input rsiLength = 14;
input rsiPrice = close;
input rsiSmooth = 2;
input rsiSmoothType = AverageType.SIMPLE;
input rsiATRMult = 2.3;
input rsiATRLength = 25;
input rsiATRType = AverageType.WILDERS;

## SuperTrend of Ultimate Oscillator inputs:
input uoFastLen = 7;
input uoMedLen = 14;
input uoSlowLen = 28;
input uoATRMult = 2.8;
input uoATRLength = 3;
input uoATRType = AverageType.SIMPLE;

########################################
## SuperTrend of Price

def stATR = MovingAverage(stATRType, TrueRange(high, close, low), stATRLength) * stATRMult;

def stUp = stPivot + stATR;
def stDn = stPivot - stATR;

def rStTrend = compoundValue(1,
if rStTrend[1] > 0 then
if close < Max(stDn[1], rStTrend[1]) then -stUp
else Max(stDn, rStTrend[1])
else if rStTrend[1] < 0 then
if close > Min(stUp[1], AbsValue(rStTrend[1])) then stDn
else -Min(stUp, AbsValue(rStTrend[1]))
else rStTrend[1]
, stPivot);

plot StTrend = if Sign(rStTrend) == Sign(rStTrend[1]) then absValue(rStTrend) else Double.NaN;
StTrend.DefineColor("Up", Color.CYAN);
StTrend.DefineColor("Dn", Color.MAGENTA);
StTrend.AssignValueColor(if rStTrend > 0 then StTrend.Color("Up") else StTrend.Color("Dn"));
StTrend.HideBubble();
StTrend.SetLineWeight(3);

########################################
## Chandelier_Stops

def csATR = MovingAverage(csATRType, TrueRange(high, close, low), csATRLength) * csATRMult;

def smax = Lowest(low, csPeriod)[csShift] + csATR[csShift];
def smin = Highest(high, csPeriod)[csShift] - csATR[csShift];

def rCSTrend = compoundValue(1, if close > smax[1] then 1 else if close < smin[1] then -1 else rCSTrend[1], 0);

def rUB = compoundValue(1, if rCSTrend > 0 then if smax > rUB[1] then smax else rUB[1] else if rCSTrend < 0 then if smax < rUB[1] then smax else rUB[1] else rUB[1], high);

def rLB = compoundValue(1, if rCSTrend < 0 then if smin < rLB[1] then smin else rLB[1] else if rCSTrend > 0 then if smin > rLB[1] then smin else rLB[1] else rLB[1], low);

def UB = if !csHideOpposite or rCSTrend < 0 then rUB else Double.NaN;

def LB = if !csHideOpposite or rCSTrend > 0 then rLB else Double.NaN;

########################################
## SuperTrend of RSI

def avgDif = WildersAverage(AbsValue(rsiPrice - rsiPrice[1]), rsiLength);
def RSI = MovingAverage(rsiSmoothType, 50 * ((if avgDif != 0 then WildersAverage(rsiPrice - rsiPrice[1], rsiLength) / avgDif else 0) + 1), rsiSmooth);

def rsiATR = MovingAverage(rsiATRType, TrueRange(Highest(RSI, ceil(rsiATRMult)), RSI, Lowest(RSI, ceil(rsiATRMult))), rsiATRLength) * rsiATRMult;
def rsiUp = RSI + rsiATR;
def rsiDn = RSI - rsiATR;

def rRSITrend = compoundValue(1,
if rRSITrend[1] > 0 then
if RSI < Max(rsiDn[1], rRSITrend[1]) then -rsiUp
else Max(rsiDn, rRSITrend[1])
else if rRSITrend[1] < 0 then
if RSI > Min(rsiUp[1], AbsValue(rRSITrend[1])) then rsiDn
else -Min(rsiUp, AbsValue(rRSITrend[1]))
else rRSITrend[1]
, RSI);

########################################
## SuperTrend of Ultimate Oscillator

def TR = TrueRange(high, close, low);
def BP = close - Min(close[1], low);
def nFast = (uoSlowLen / uoFastLen);
def nMed = (uoSlowLen / uoMedLen);
def trFast = sum(TR, uoFastLen);
def trMed = sum(TR, uoMedLen);
def trSlow = sum(TR, uoSlowLen);

def UO = 100 * (((if trFast != 0 then (sum(BP, uoFastLen) / trFast) * nFast else 0)
+ (if trMed != 0 then (sum(BP, uoMedLen) / trMed) * nMed else 0)
+ (if trSlow != 0 then (sum(BP, uoSlowLen) / sum(TR, uoSlowLen)) else 0))
/ (nFast + nMed + 1));

def uoATR = MovingAverage(uoATRType, TrueRange(Highest(UO, ceil(uoATRMult)), UO, Lowest(UO, ceil(uoATRMult))), uoATRLength) * uoATRMult;
def uoUp = UO + uoATR;
def uoDn = UO - uoATR;

def rUOTrend = compoundValue(1,
if rUOTrend[1] > 0 then
if UO < Max(uoDn[1], rUOTrend[1]) then -uoUp
else Max(uoDn, rUOTrend[1])
else if rUOTrend[1] < 0 then
if UO > Min(uoUp[1], AbsValue(rUOTrend[1])) then uoDn
else -Min(uoUp, AbsValue(rUOTrend[1]))
else rUOTrend[1]
, UO);

########################################

## Signals

def orderDir;
def sumUp = (rStTrend > 0) + (rCSTrend > 0) + (rRSITrend > 0) + (rUOTrend > 0);
def sumDn = (rStTrend < 0) + (rCSTrend < 0) + (rRSITrend < 0) + (rUOTrend < 0);

switch (signals) {
case OFF:
orderDir = 0;
case ALL:
orderDir = compoundValue(1, if sumUp >= strength+1 then 1 else if sumDn >= strength+1 then -1 else orderDir[1], 0);
case ST:
orderDir = rStTrend;
case CS:
orderDir = rCSTrend;
case RSI:
orderDir = rRSITrend;
case UO:
orderDir = rUOTrend;
}

AssignBackgroundColor(if !paintBars then Color.CURRENT
else if paintBars == paintBars.DIR then
if orderDir > 0 then
if rSTTrend < 0 or rCSTrend < 0 then Color.DARK_ORANGE
else Color.UPTICK
else if orderDir < 0 then
if rSTTrend > 0 or rCSTrend > 0 then Color.YELLOW
else Color.DOWNTICK
else Color.GRAY
else if sumUp >= strength+1 then Color.UPTICK
else if sumDn >= strength+1 then Color.DOWNTICK
else if sumUp > sumDn then Color.YELLOW
else if sumDn > sumUp then Color.DARK_ORANGE
else Color.GRAY);


## END STUDY
 

Similar threads

Not the exact question you're looking for?

Start a new thread and receive assistance from our community.

87k+ Posts
483 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