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: