Combined Schaff Trend Cycle, RSI and Stochastic Indicator For ThinkOrSwim

petergluis

Active member
I combined Schaff Trend Cycle, RSI and Stochastic indictors into one. Enjoy your trading.


Ruby:
# Smoothed RSI2
# Pensar
#STC = Schaff Trend Cycle
#Schaff Trend Line = Used for quick up/down trend declaration
#Added DEMA, Breakout signals, and clouds 11/10/21 ~Confluence905
# StochasticFull code is from ThinkorSwim
# Modified by Peter Luis
# Modified on 03/03/2022

declare lower;
input period = 2;
input over_bought = 90;
input over_sold = 10;
input idata = close;
input averageType = AverageType.WILDERS;
input over_bought1 = 80;
input over_sold1 = 20;
input KPeriod =5;
input DPeriod = 3;
input priceH = high;
input priceL = low;
input priceC = close;
input slowing_period = 3;
input averageType1 = AverageType.SIMPLE;
input showBreakoutSignals = {default "No", "On FullK", "On FullD", "On FullK & FullD"};
input fastLength = 5;
input slowLength = 50;
input KPeriod1 = 10;
input DPeriod1 = 3;
input over_bought2 = 75;
input over_sold2 = 25;
input Zero_line = 50;
input averageTypeSTC = AverageType.WEIGHTED;
input sfastLength = 5;
input mfastLength = 10;


def NetChgAvg = MovingAverage(averageType, idata - idata[3], period);
def TotChgAvg = MovingAverage(averageType, AbsValue(idata - idata[3]), period);
def ChgRatio = if TotChgAvg != 0 then NetChgAvg / TotChgAvg else 0;

plot RSI = 50 * (ChgRatio + 1);
     RSI.DefineColor("OverBought", color.red);
     RSI.DefineColor("Normal", color.gray);
     RSI.DefineColor("OverSold", color.green);
     RSI.AssignValueColor(if RSI > over_Bought then RSI.color("OverBought")
                          else if RSI < over_Sold then RSI.color("OverSold")
                          else RSI.color("Normal"));
RSI.SetLineWeight(2);
plot OverSold = over_Sold1;
plot OverBought = over_Bought1;
     OverSold.SetDefaultColor(color.green);
     Oversold.setstyle(curve.short_dash);
     Oversold.setlineweight(1);
     OverBought.SetDefaultColor(color.red);
     OverBought.setstyle(curve.short_dash);
     Oversold.setlineweight(1);

AddCloud(if RSI > OverBought then RSI else double.nan, Overbought, color.red,color.red);
AddCloud(if RSI < OverSold then RSI else double.nan, OverSold, color.green,color.green);


def lowest_k = Lowest(priceL, KPeriod);
def c1 = priceC - lowest_k;
def c2 = Highest(priceH, KPeriod) - lowest_k;
def FastK = if c2 != 0 then c1 / c2 * 100 else 0;

plot FullK = MovingAverage(averageType1, FastK, slowing_period);
plot FullD = MovingAverage(averageType1, FullK, DPeriod);

plot OverBought1 = over_bought;
plot OverSold1 = over_sold;

def upK = FullK crosses above OverSold;
def upD = FullD crosses above OverSold;
def downK = FullK crosses below OverBought;
def downD = FullD crosses below OverBought;

plot UpSignal;
plot DownSignal;
switch (showBreakoutSignals) {
case "No":
    UpSignal = Double.NaN;
    DownSignal = Double.NaN;
case "On FullK":
    UpSignal = if upK then OverSold else Double.NaN;
    DownSignal = if downK then OverBought else Double.NaN;
case "On FullD":
    UpSignal = if upD then OverSold else Double.NaN;
    DownSignal = if downD then OverBought else Double.NaN;
case "On FullK & FullD":
    UpSignal = if upK or upD then OverSold else Double.NaN;
    DownSignal = if downK or downD then OverBought else Double.NaN;
}

UpSignal.setHiding(showBreakoutSignals == showBreakoutSignals."No");
DownSignal.setHiding(showBreakoutSignals == showBreakoutSignals."No");

FullK.SetDefaultColor(GetColor(1));
Fullk.SetLineWeight (2);
FullD.SetDefaultColor(GetColor(0));
FullD.SetLineWeight (2);
OverBought.SetDefaultColor(GetColor(1));
OverSold.SetDefaultColor(GetColor(1));
UpSignal.SetDefaultColor(Color.UPTICK);
UpSignal.SetPaintingStrategy(PaintingStrategy.ARROW_UP);
DownSignal.SetDefaultColor(Color.DOWNTICK);
DownSignal.SetPaintingStrategy(PaintingStrategy.ARROW_DOWN);

input STC_BreakoutSignals = {default "No", "Yes"};
input DEMA_BreakoutSignals = {default "No", "Yes"};

def macdTrend = MovingAverage(averageTypeSTC, close, fastLength) - MovingAverage(averageTypeSTC, close, slowLength);
def fastK1Trend = FastKCustom(macdTrend, KPeriod);
def fastD1Trend = MovingAverage(averageTypeSTC, fastK1Trend, DPeriod);
def fastK2Trend = FastKCustom(fastD1Trend, KPeriod);
plot STCTrend = MovingAverage(averageTypeSTC, fastK2Trend, DPeriod);
plot OverBought2 = over_bought;
plot OverSold2 = over_sold;
plot ZeroLine = Zero_line;

STCTrend.SetDefaultColor(GetColor(8));
OverBought.SetDefaultColor(Color.BLACK);
OverSold.SetDefaultColor(Color.BLACK);
STCTrend.DefineColor("Positive and Up", Color.UPTICK);
STCTrend.DefineColor("Negative and Down", Color.DOWNTICK);
STCTrend.AssignValueColor(if STCTrend >= STCTrend[1] then STCTrend.Color("Positive and Up") else STCTrend.Color("Negative and Down"));
STCTrend.SetLineWeight(2);

def STCb = STCTrend <= over_sold and STCTrend[1] <= over_sold and STCTrend[2] <= over_sold;
def STCBullish = STCb == 1 and STCTrend > STCTrend[1] and STCTrend [1] <= STCTrend[2];
plot UpsignalSTC = if STCBULLISH == 1 then STCTrend else Double.NaN;

UpsignalSTC.SetHiding(STC_BreakoutSignals == STC_BreakoutSignals."No");
UpsignalSTC.SetDefaultColor(Color.GREEN);
UpsignalSTC.SetPaintingStrategy(PaintingStrategy.ARROW_UP);

def STCbr = STCTrend >= over_bought and STCTrend[1] >= over_bought and STCTrend[2] >= over_bought;
def STCBearish = STCbr == 1 and STCTrend < STCTrend[1] and STCTrend[1] >= STCTrend[2];
plot DnSignalSTC = if STCBearish == 1 then STCTrend else Double.NaN;
DnSignalSTC.SetHiding(STC_BreakoutSignals == STC_BreakoutSignals."No");
DnSignalSTC.SetDefaultColor(Color.RED);
DnSignalSTC.SetPaintingStrategy(PaintingStrategy.ARROW_DOWN);

input price = close;
input priceType = PriceType.LAST;
def LP = Round(close(priceType = priceType), 2);
def emaPrice1 = ExpAverage(LP, sfastLength);
def emaEmaPrice1 = ExpAverage(emaPrice1, sfastLength);
def emaPrice2 = ExpAverage(LP, mfastLength);
def emaEmaPrice2 = ExpAverage(emaPrice2, mfastLength);
def DEMAfast = 2 * emaPrice1 - emaEmaPrice1;
def DEMAslow = 2 * emaPrice2 - emaEmaPrice2;
def AVG1 = DEMAfast;
def AVG2 = DEMAslow;
def Diff = DEMAfast - DEMAslow;

plot upsignalDEMA = ZeroLine;
upsignalDEMA.SetHiding(DEMA_BreakoutSignals == DEMA_BreakoutSignals."No");
upsignalDEMA.SetPaintingStrategy(PaintingStrategy.POINTS);
upsignalDEMA.DefineColor("Positive and Up", Color.LIGHT_GREEN);
upsignalDEMA.DefineColor("Positive and Down", Color.GREEN);
upsignalDEMA.DefineColor("Negative and Down", Color.LIGHT_RED);
upsignalDEMA.DefineColor("Negative and Up", Color.RED);
upsignalDEMA.SetLineWeight(2);
upsignalDEMA.AssignValueColor(if AVG1 >= AVG2 then upsignalDEMA.Color("Positive and Up") else upsignalDEMA.Color("Negative and Down"));
 
Last edited:
I combined MTF Schaff, RSI and Stochastic Indicator into one indicator. Enjoy your trading.


Ruby:
##Schaff Trend Cycle MTF
#edited by agirlhasnoname42
# Smoothed RSI2
# Pensar
# StochasticFull code is from ThinkorSwim
# Modified by Peter Luis
# Modified on 03/04/2022

declare lower;

input over_bought3 = 95;
input over_sold3 = 5;
input DefaultPeriod = AggregationPeriod.DAY;
input flength_d = 23;
input slength_d = 50;
input Kpd_d = 10;
input Dpd_d = 3;
input averageType_Default = AverageType.EXPONENTIAL;
input GreenPeriod = AggregationPeriod.DAY;
input flength_grn = 3;
input slength_grn = 90;
input Kpd_grn = 8;
input Dpd_grn = 2;
input RedPeriod = AggregationPeriod.DAY;
input flength_red = 10;
input slength_red = 20;
input Kpd_red = 6;
input Dpd_red = 2;
input period = 2;
input over_bought = 90;
input over_sold = 10;
input idata = close;
input averageType = AverageType.WILDERS;
input over_bought1 = 80;
input over_sold1 = 20;
input KPeriod = 5;
input DPeriod = 3;
input priceH = high;
input priceL = low;
input priceC = close;
input slowing_period = 3;
input YellowPeriod = AggregationPeriod.DAY;
input flength_ylw = 7;
input slength_ylw = 40;
input Kpd_ylw = 6;
input Dpd_ylw = 2;
input averageType_Green = AverageType.EXPONENTIAL;
input averageType_Yellow = AverageType.EXPONENTIAL;

def macd_d = MovingAverage(averageType_Default, close(Period = DefaultPeriod), flength_d) - MovingAverage(averageType_Default, close(Period = DefaultPeriod), slength_d);
def fastK_d = FastKCustom(macd_d, Kpd_d);
def fastD_d = MovingAverage(averageType_Default, fastK_d, Dpd_d);
def fastK2_d = FastKCustom(fastD_d, Kpd_d);
plot STC_d = MovingAverage(averageType_Default, fastK2_d, Dpd_d);
STC_d.SetDefaultColor(Color.LIGHT_GRAY);

def macd_grn = MovingAverage(averageType_Green, close(Period = GreenPeriod), flength_grn) - MovingAverage(averageType_Green, close(Period = GreenPeriod), slength_grn);
def fastK_grn = FastKCustom(macd_grn, Kpd_grn);
def fastD_grn = MovingAverage(averageType_Green, fastK_grn, Dpd_grn);
def fastK2_grn = FastKCustom(fastD_grn, Kpd_grn);
plot STC_grn = MovingAverage(averageType_Green, fastK2_grn, Dpd_grn);

STC_grn.SetDefaultColor(Color.DARK_GREEN);
STC_grn.SetLineWeight(2);

def macd_ylw = MovingAverage(averageType_Yellow, close(Period = YellowPeriod), flength_ylw) - MovingAverage(averageType_Yellow, close(Period = YellowPeriod), slength_ylw);
def fastK_ylw = FastKCustom(macd_ylw, Kpd_ylw);
def fastD_ylw = MovingAverage(averageType_Yellow, fastK_ylw, Dpd_ylw);
def fastK2_ylw = FastKCustom(fastD_ylw, Kpd_ylw);
plot STC_ylw = MovingAverage(averageType_Yellow, fastK2_ylw, Dpd_ylw);

STC_ylw.SetDefaultColor(Color.DARK_ORANGE);
STC_ylw.SetStyle(Curve.MEDIUM_DASH);
STC_ylw.SetLineWeight(2);

input averageType_Red = AverageType.EXPONENTIAL;
def macd_red = MovingAverage(averageType_Red, close(Period = RedPeriod), flength_red) - MovingAverage(averageType_Red, close(Period = RedPeriod), slength_red);
def fastK_red = FastKCustom(macd_red, Kpd_red);
def fastD_red = MovingAverage(averageType_Red, fastK_red, Dpd_red);
def fastK2_red = FastKCustom(fastD_red, Kpd_red);
plot STC_red = MovingAverage(averageType_Red, fastK2_red, Dpd_red);

STC_red.SetDefaultColor(Color.DARK_RED);
STC_red.SetLineWeight(2);

plot OverBought3 = over_bought3;
plot OverSold3 = over_sold3;

OverBought3.SetDefaultColor(GetColor(7));
OverSold3.SetDefaultColor(GetColor(7));


input averageType1 = AverageType.SIMPLE;
input showBreakoutSignals = {default "No", "On FullK", "On FullD", "On FullK & FullD"};


def NetChgAvg = MovingAverage(averageType, idata - idata[3], period);
def TotChgAvg = MovingAverage(averageType, AbsValue(idata - idata[3]), period);
def ChgRatio = if TotChgAvg != 0 then NetChgAvg / TotChgAvg else 0;

plot RSI = 50 * (ChgRatio + 1);
RSI.DefineColor("OverBought", Color.RED);
RSI.DefineColor("Normal", Color.GRAY);
RSI.DefineColor("OverSold", Color.GREEN);
RSI.AssignValueColor(if RSI > over_bought then RSI.Color("OverBought")
                          else if RSI < over_sold then RSI.Color("OverSold")
                          else RSI.Color("Normal"));
RSI.SetLineWeight(2);
plot OverSold = over_sold1;
plot OverBought = over_bought1;
OverSold.SetDefaultColor(Color.GREEN);
OverSold.SetStyle(Curve.SHORT_DASH);
OverSold.SetLineWeight(1);
OverBought.SetDefaultColor(Color.RED);
OverBought.SetStyle(Curve.SHORT_DASH);
OverSold.SetLineWeight(1);

AddCloud(if RSI > OverBought then RSI else Double.NaN, OverBought, Color.RED, Color.RED);
AddCloud(if RSI < OverSold then RSI else Double.NaN, OverSold, Color.GREEN, Color.GREEN);


def lowest_k = Lowest(priceL, KPeriod);
def c1 = priceC - lowest_k;
def c2 = Highest(priceH, KPeriod) - lowest_k;
def FastK = if c2 != 0 then c1 / c2 * 100 else 0;

plot FullK = MovingAverage(averageType1, FastK, slowing_period);
plot FullD = MovingAverage(averageType1, FullK, DPeriod);

plot OverBought1 = over_bought;
plot OverSold1 = over_sold;

def upK = FullK crosses above OverSold;
def upD = FullD crosses above OverSold;
def downK = FullK crosses below OverBought;
def downD = FullD crosses below OverBought;

plot UpSignal;
plot DownSignal;
switch (showBreakoutSignals) {
case "No":
    UpSignal = Double.NaN;
    DownSignal = Double.NaN;
case "On FullK":
    UpSignal = if upK then OverSold else Double.NaN;
    DownSignal = if downK then OverBought else Double.NaN;
case "On FullD":
    UpSignal = if upD then OverSold else Double.NaN;
    DownSignal = if downD then OverBought else Double.NaN;
case "On FullK & FullD":
    UpSignal = if upK or upD then OverSold else Double.NaN;
    DownSignal = if downK or downD then OverBought else Double.NaN;
}

UpSignal.SetHiding(showBreakoutSignals == showBreakoutSignals."No");
DownSignal.SetHiding(showBreakoutSignals == showBreakoutSignals."No");

FullK.SetDefaultColor(GetColor(1));
FullK.SetLineWeight (2);
FullD.SetDefaultColor(GetColor(0));
FullD.SetLineWeight (2);
OverBought.SetDefaultColor(GetColor(1));
OverSold.SetDefaultColor(GetColor(1));
UpSignal.SetDefaultColor(Color.UPTICK);
UpSignal.SetPaintingStrategy(PaintingStrategy.ARROW_UP);
DownSignal.SetDefaultColor(Color.DOWNTICK);
DownSignal.SetPaintingStrategy(PaintingStrategy.ARROW_DOWN);
 

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

Similar threads

Not the exact question you're looking for?

Start a new thread and receive assistance from our community.

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