CSA Trading Dashboard for ThinkorSwim

@diazlaz @pk1729 or anyone that is willing to help out...I found a Mobius version of PPO in my archives...I would like to replace the PPO in post #102 with the script below? Seems less volatile and might work better. Thanks.

Code:
# PPO
# Mobius
# V01.03.2014

declare lower;

input c = close;
input AvgType = AverageType.Simple;
input nFast = 8;
input nSlow = 13;
input nSmooth = 5;

plot PPO = ((MovingAverage(AverageType = AvgType, c, nFast) -
             MovingAverage(AverageType = AvgType, c, nSlow)) /
             MovingAverage(AverageType = AvgType, c, nSlow));
PPO.SetPaintingStrategy(PaintingStrategy.Histogram);
PPO.AssignValueColor(if PPO > 0
                     then color.green
                     else color.red);

plot smooth = MovingAverage(AverageType = AvgType, PPO, nSmooth);
smooth.SetPaintingStrategy(PaintingStrategy.Line);
smooth.SetDefaultColor(Color.Cyan);
# End Code PPO
Hi @HighBredCloud, so just to be clear you want to replace LINE #4 of the dashboard code above with this version of the PPO?
 
@diazlaz YES...I would like to have the Mobius histogram (dots) read by default...tomsk put in a lot of work into making multi average that can be selected under the PPO inputs...Is there a way where by default settings the Mobius histogram is displayed BUT you can still select other MA's from the list or is this just too much work because as @horserider mentioned that Mobius version uses the average...

IF that is the case...would it be easier to just add a line 6 to the code and have 2 PPO's in there for the user to select which they want to use...The Mobius verison or the Multi Average version? Because that would be the way to go IMO...Less work I would assume to create a separate line 6 than to trying to incorporate all the MA's into the Mobius version...IDK...

Whatever you do tho...can you please allow the users to change the colors of the dots and not just set them to dynamic colors...? IF you could please stick to the 4 color scheme as reflected in the original code that would be awesome...Thank you for helping me out with this.
 
For anyone that cares...The goal here with this indicator is for the end user to select and chose what dots they want to use...You don't need to use all 5 or 6 indicators...select and use the ones that you see fit...Different indicators are good for different methods of trading...When this CSA study was originally made...I really had no time to research what histograms to use for this study to be made...It was very short noticed...IF anyone has any other recommendation on what else would work good please don't hesitate to share...
 
I showed you already. Find the matching code and paste this over it.

def PpoEma = _signal;
def PPO_State = if _signal >= 0
then if _signal> _signal[1]
then PosUp
else PosDn
else if _signal < _signal[1]
then NegDn
else NegUp;
 
@horserider Alright...I will attempt what you shared...,however, I know there will be more issues as I ran into more problems with the parts in the code where I commented them out...In particular with the def...

I know this is easy for you...but I do not do this for a living...so bare with me. I am sure I will have more questions.
 
@HighBredCloud You are making a CSA which means that there will be a bug here and a bug there and if lucky, when it's all done, it will do what it should. A Combined Signal Approach requires much more than stitching code together. I tried to adjust one a while back and it seemed like for each thing I commented out, the editor would give me a RED error 200 rows down. I never did get it straight.
I do see 2 things that may help your effort. A Dynamic Line and ADSPD Labels & Studies. They'll be in new threads shortly.

:)🎄
Best of luck!
 
Last edited:
@markos The CSA study was already successfully done by @tomsk ...without any errors. I guess when a coder knows what they are doing anything is possible. I on the other hand will probably experience the issues you're referencing to. I have been watching this study today all day...AND what I really would want to see is perhaps another CSA study that works on higher time frames such as 30 min and up...Because quite frankly this version of CSA with the indicators that I have originally chosen keep on changing all the time on a 5 min or lower charts...while on some indicators such as FREMA on timeframes 30 min or less take forever to reflect the correct trend if the market is choppy.

I don't know what sort of indicators would work best based on what you have referenced before about the 5 different kinds of indicators...ONLY one that comes to mind is stochastic RSI...What would you recommend or would want to see? I'd like to test things out this time around on higher timeframe to see how things work first. I have no idea what the Dynamic Line is...is that a study? I guess I will see when you make the new thread.
 
@markos The CSA study was already successfully done by @tomsk ...without any errors. I guess when a coder knows what they are doing anything is possible. I on the other hand will probably experience the issues you're referencing to. I have been watching this study today all day...AND what I really would want to see is perhaps another CSA study that works on higher time frames such as 30 min and up...Because quite frankly this version of CSA with the indicators that I have originally chosen keep on changing all the time on a 5 min or lower charts...while on some indicators such as FREMA on timeframes 30 min or less take forever to reflect the correct trend if the market is choppy.

I don't know what sort of indicators would work best based on what you have referenced before about the 5 different kinds of indicators...ONLY one that comes to mind is stochastic RSI...What would you recommend or would want to see? I'd like to test things out this time around on higher timeframe to see how things work first. I have no idea what the Dynamic Line is...is that a study? I guess I will see when you make the new thread.
I've been on mobile most of the week. I'll throw out a few ideas over the weekend.

The Dynamic Line study was moved by @BenTen into an existing thread where it belongs.
More later when able..
 
@horserider dude...this is above my head...

Code:
# PPO
# Mobius
# V01.03.2014

#declare lower;

input c = close;
input AvgType = AverageType.SIMPLE;
input nFast = 8;
input nSlow = 13;
input nSmooth = 5;

plot PPO = ((MovingAverage(AverageType = AvgType, c, nFast) -
             MovingAverage(AverageType = AvgType, c, nSlow)) /
             MovingAverage(AverageType = AvgType, c, nSlow));
#PPO.SetPaintingStrategy(PaintingStrategy.HISTOGRAM);
#PPO.AssignValueColor(if PPO > 0
                     #then Color.GREEN
                     #else Color.RED);

#plot smooth = MovingAverage(AverageType = AvgType, PPO, nSmooth);
#smooth.SetPaintingStrategy(PaintingStrategy.LINE);
#smooth.SetDefaultColor(Color.CYAN);

#
#input PPOFastLength = 12;
#input PPOSlowLength = 26;
#input PPOSignalPeriod = 9;
#input price = close;
#input PPOMovingAverageType = {"Simple MA", default "Exponential MA", "Wilders Smoothing", "Weighted MA",
#"Hull MA", "Adaptive MA", "Triangular MA", "Variable MA", "Dema MA", "Tema MA", "EHMA", "THMA"};

#def periodOK = PPOFastLength < PPOSlowLength;
#AddLabel(!periodOK, "ERROR: PPOFastLength MUST be less than PPOSlowLength");



#def fast;
#def slow;
#def _ppo;
#def _signal;



def PpoEma = _signal;
def PPO_State = if _signal >= 0
then if _signal> _signal[1]
then PosUp
else PosDn
else if _signal < _signal[1]
then NegDn
else NegUp;
plot PPO_Dot = if IsNaN(close) then Double.NaN else -20;
PPO_Dot.SetPaintingStrategy(PaintingStrategy.POINTS);
PPO_Dot.SetLineWeight(DotSize);
PPO_Dot.DefineColor("Positive and Up", Color.GREEN);
PPO_Dot.DefineColor("Positive and Down", Color.DARK_GREEN);
PPO_Dot.DefineColor("Negative and Down", Color.RED);
PPO_Dot.DefineColor("Negative and Up", Color.DARK_RED);
PPO_Dot.AssignValueColor(if PPO_State == PosUp then PPO_Dot.Color("Positive and Up")
else if PPO_State == PosDn then PPO_Dot.Color("Positive and Down")
else if PPO_State == NegDn then PPO_Dot.Color("Negative and Down")
else PPO_Dot.Color("Negative and Up"));
AddChartBubble(!IsNaN(close[n1]) and IsNaN(close[n]), -20, "PPO", Color.YELLOW, yes);
# End Code PPO Multiple Moving Averages
 
@markos OK that's cool...anything that you can think of that would send good entry exit signals on higher timeframes...Something that even swing traders could benefit from would be key...I am thinking that IF done correctly one CSA could be used for entry and the other for exit...depending on the timeframes.
 
Highlight 313 to 321 then paste the code I gave you. So you are pasting 301 to 308 over 313 to 321. Make sure to then erase 301 to 308.
See how easy it is.;)
 
@horserider Yeah...that's what I did...I asked because your code had less lines than the original. Anyways...when I did that and set the settings to 8,13,5 I am still not getting the same results as the Mobius version even though both are now set to Simple MA...The only thing that comes to mind is the the 5 is some sort of smoothing factor for the cyan line...so then do I just leave the settings as 8 13 9? In any case even when I did that the data still does not match...What am I doing wrong?

from top to bottom

Mobius PPO
Original CSA
your code CSA with 8 13 5 setting Simple MA
your code CSA with 8 13 9 setting Simple MA


What else needs to be changed? Coding is definitely not easy...LOL...Thanks for your help.
 
@horserider I wanted to make the dots from the Mobius PPO Histogram posted in the pic above...

Code:
# PPO
# Mobius
# V01.03.2014

declare lower;

input c = close;
input AvgType = AverageType.Simple;
input nFast = 8;
input nSlow = 13;
input nSmooth = 5;

plot PPO = ((MovingAverage(AverageType = AvgType, c, nFast) -
             MovingAverage(AverageType = AvgType, c, nSlow)) /
             MovingAverage(AverageType = AvgType, c, nSlow));
PPO.SetPaintingStrategy(PaintingStrategy.Histogram);
PPO.AssignValueColor(if PPO > 0
                     then color.green
                     else color.red);

plot smooth = MovingAverage(AverageType = AvgType, PPO, nSmooth);
smooth.SetPaintingStrategy(PaintingStrategy.Line);
smooth.SetDefaultColor(Color.Cyan);
# End Code PPO
 
Code:
# CSA Trading Dashboard
# tomsk
# 11.15.2019

# V1.0 - 11.14.2019 - tomsk - Initial release of CSA Trading Dashboard
# V1.1 - 11.14.2019 - tomsk - Added bubbles to identify study being displayed
# V1.2 - 11.14.2019 - tomsk - Synthesized similar internal variables and minor edits
# V2.0 - 11.15.2019 - tomsk - Revamped coloring scheme to enable UI color customization

# This is a lower study represented by 5 dotted lines. Each line represents
# the “price performance” of the following five indicators
#
# Line 1: MACD with a more Normal Distribution
# Line 2: Stochastic Full Diff
# Line 3: FREMA
# Line 4: PPO MMA
# Line 5: Universal Oscillator
#
# Please note that each study was normalized to a standard form and uses a
# standardized coloring scheme defined separatelky under each sub indiocator
# that reflects the following states
#
# Positive and Up
# Positive and Down
# Negative and Down
# Negative and Up
#
# MACD FREMA already includes Ehlers Forward/Reverse EMA as that indicator
# is already represented in Line3. Since all we want to represent is the
# histogram, removed the Multi Moving Average Component from the MACD FREMA.
# Hence we are really left with the MACD with a more Normal Distribution
# study. Therefore, replaced Line 1 with MACD with a more Normal Distribution
# which is the basis of MACD FREMA

# Global Defs

input DotSize = 3;
input n = 3;

def n1 = n + 1;
def PosUp = 1; # Positive and Up
def PosDn = 2; # Positive and Down
def NegDn = 3; # Negative and Down
def NegUp = 4; # Negative and Up

# MACD with a more Normal Distribution
# Mobius
# V01.09.2015
#
# Plots a Gaussian distribution. If Normal Distribution is met, then at
# minimum, 68.2% of the close values should be inside a One Standard Deviation
# Envelope and 95.4% of the close values should be inside a 2 Standard
# Deviation Envelope.

declare lower;

input MACDFastLength = 12;
input MACDSlowLength = 26;
input MACDLength = 9;

# Four Pole Filter
script g{
input length = 4;
input betaDev = 2;
input price = OHLC4;
def c;
def w;
def beta;
def alpha;
def G;
c = price;
w = (2 * Double.Pi / length);
beta = (1 - Cos(w)) / (Power(1.414, 2.0 / betaDev) - 1 );
alpha = (-beta + Sqrt(beta * beta + 2 * beta));
G = Power(alpha, 4) * c +
4 * (1 – alpha) * G[1] – 6 * Power( 1 - alpha, 2 ) * G[2] +
4 * Power( 1 - alpha, 3 ) * G[3] - Power( 1 - alpha, 4 ) * G[4];
plot Line = G;
}
# Modified MACD
def MACD_Value = g(length = MACDFastLength) - g(length = MACDSlowLength);
def MACD_Avg = g(price = MACD_Value, length = MACDLength);
def MACD_Diff = MACD_Value - MACD_Avg;
def MACD_State = if MACD_Diff >= 0
then if MACD_Diff > MACD_Diff[1]
then PosUp
else PosDn
else if MACD_Diff < MACD_Diff[1]
then NegDn
else NegUp;
plot MACD_Dot = if IsNaN(close) then Double.NaN else 1;
MACD_Dot.SetPaintingStrategy(PaintingStrategy.POINTS);
MACD_Dot.SetLineWeight(DotSize);
MACD_Dot.DefineColor("Positive and Up", Color.GREEN);
MACD_Dot.DefineColor("Positive and Down", Color.DARK_GREEN);
MACD_Dot.DefineColor("Negative and Down", Color.RED);
MACD_Dot.DefineColor("Negative and Up", Color.DARK_RED);
MACD_Dot.AssignValueColor(if MACD_State == PosUp then MACD_Dot.Color("Positive and Up")
else if MACD_State == PosDn then MACD_Dot.Color("Positive and Down")
else if MACD_State == NegDn then MACD_Dot.Color("Negative and Down")
else MACD_Dot.Color("Negative and Up"));
AddChartBubble(!IsNaN(close[n1]) and IsNaN(close[n]), 1, "MACD", Color.Yellow, yes);
# End Code Modified MACD - Gaussian



# Stochastic Full Diff
# Extracted from Standard TOS Release

input priceH = high;
input priceL = low;
input priceC = close;
input kPeriod = 10;
input kSlowingPeriod = 3;
input dPeriod = 10;
input STOAverageType = AverageType.SIMPLE;

def Stochastic_Diff = reference StochasticFull(0, 0, kPeriod, dPeriod, priceH, priceL, priceC, kSlowingPeriod, STOAverageType).FullK -
reference StochasticFull(0, 0, kPeriod, dPeriod, priceH, priceL, priceC, kSlowingPeriod, STOAverageType).FullD;
def Stochastic_State = if Stochastic_Diff >= 0
then if Stochastic_Diff > Stochastic_Diff[1]
then PosUp
else PosDn
else if Stochastic_Diff < Stochastic_Diff[1]
then NegDn
else NegUp;
plot Stochastic_Dot = if IsNaN(close) then Double.NaN else 2;
Stochastic_Dot.SetPaintingStrategy(PaintingStrategy.POINTS);
Stochastic_Dot.SetLineWeight(DotSize);
Stochastic_Dot.DefineColor("Positive and Up", Color.GREEN);
Stochastic_Dot.DefineColor("Positive and Down", Color.DARK_GREEN);
Stochastic_Dot.DefineColor("Negative and Down", Color.RED);
Stochastic_Dot.DefineColor("Negative and Up", Color.DARK_RED);
Stochastic_Dot.AssignValueColor(if Stochastic_State == PosUp then Stochastic_Dot.Color("Positive and Up")
else if Stochastic_State == PosDn then Stochastic_Dot.Color("Positive and Down")
else if Stochastic_State == NegDn then Stochastic_Dot.Color("Negative and Down")
else Stochastic_Dot.Color("Negative and Up"));
AddChartBubble(!IsNaN(close[n1]) and IsNaN(close[n]), 2, "Stoch", Color.Yellow, yes);
# End Code Modified Stochastic Full Diff



# Forward / Reverse EMA
# (c) 2017 John F. Ehlers
# Ported to TOS 07.16.2017
# Mobius

# Inputs:
input AA = .1;

# Vars:
def CC;
def RE1;
def RE2;
def RE3;
def RE4;
def RE5;
def RE6;
def RE7;
def RE8;
def EMA;

CC = if CC[1] == 0 then .9 else 1 – AA;
EMA = AA * Close + CC * EMA[1];
RE1 = CC * EMA + EMA[1];
RE2 = Power(CC, 2) * RE1 + RE1[1];
RE3 = Power(CC, 4) * RE2 + RE2[1];
RE4 = Power(CC, 8) * RE3 + RE3[1];
RE5 = Power(CC, 16) * RE4 + RE4[1];
RE6 = Power(CC, 32) * RE5 + RE5[1];
RE7 = Power(CC, 64) * RE6 + RE6[1];
RE8 = Power(CC, 128) * RE7 + RE7[1];

def FREMA_Diff = EMA – AA * RE8;
def FREMA_State = if FREMA_Diff >= 0
then if FREMA_Diff > FREMA_Diff[1]
then PosUp
else PosDn
else if FREMA_Diff < FREMA_Diff[1]
then NegDn
else NegUp;
plot FREMA_Dot = if IsNaN(close) then Double.NaN else 3;
FREMA_Dot.SetPaintingStrategy(PaintingStrategy.POINTS);
FREMA_Dot.SetLineWeight(DotSize);
FREMA_Dot.DefineColor("Positive and Up", Color.GREEN);
FREMA_Dot.DefineColor("Positive and Down", Color.DARK_GREEN);
FREMA_Dot.DefineColor("Negative and Down", Color.RED);
FREMA_Dot.DefineColor("Negative and Up", Color.DARK_RED);
FREMA_Dot.AssignValueColor(if FREMA_State == PosUp then FREMA_Dot.Color("Positive and Up")
else if FREMA_State == PosDn then FREMA_Dot.Color("Positive and Down")
else if FREMA_State == NegDn then FREMA_Dot.Color("Negative and Down")
else FREMA_Dot.Color("Negative and Up"));
AddChartBubble(!IsNaN(close[n1]) and IsNaN(close[n]), 3, "FREMA", Color.Yellow, yes);
# End Code Ehlers Forward / Reverse EMA



# PPO Multiple Moving Averages
# Based on earlier PPO FREMAS code from netarchitect
# Revamped by tomsk
# 11.13.2019

# V11.11.2019 - tomsk - revamped netarchitect's base PPO code
# V11.13.2019 - tomsk - enhanced code structure, collapsed computation into a single switch

input PPOFastLength = 12;
input PPOSlowLength = 26;
input PPOSignalPeriod = 9;
input price = close;
input PPOMovingAverageType = {"Simple MA", default "Exponential MA", "Wilders Smoothing", "Weighted MA",
"Hull MA", "Adaptive MA", "Triangular MA", "Variable MA", "Dema MA", "Tema MA", "EHMA", "THMA"};

def periodOK = PPOFastLength < PPOSlowLength;
AddLabel(!periodOK, "ERROR: PPOFastLength MUST be less than PPOSlowLength");

def fast;
def slow;
def _ppo;
def _signal;

switch (PPOMovingAverageType) {
case "Simple MA":
fast = Average(price, PPOFastLength);
slow = Average(price, PPOSlowLength);
_ppo = if periodOK then ((fast - slow) / slow) * 100 else 0;
_signal = Average(_ppo, PPOSignalPeriod);

case "Exponential MA":
fast = ExpAverage(price, PPOFastLength);
slow = ExpAverage(price, PPOSlowLength);
_ppo = if periodOK then ((fast - slow) / slow) * 100 else 0;
_signal = ExpAverage(_ppo, PPOSignalPeriod);

case "Wilders Smoothing":
fast = WildersAverage(price, PPOFastLength);
slow = WildersAverage(price, PPOSlowLength);
_ppo = if periodOK then ((fast - slow) / slow) * 100 else 0;
_signal = WildersAverage(_ppo, PPOSignalPeriod);

case "Weighted MA":
fast = wma(price, PPOFastLength);
slow = wma(price, PPOSlowLength);
_ppo = if periodOK then ((fast - slow) / slow) * 100 else 0;
_signal = wma(_ppo, PPOSignalPeriod);

case "Hull MA":
fast = HullMovingAvg(price, PPOFastLength);
slow = HullMovingAvg(price, PPOSlowLength);
_ppo = if periodOK then ((fast - slow) / slow) * 100 else 0;
_signal = HullMovingAvg(_ppo, PPOSignalPeriod);

case "Adaptive MA":
fast = MovAvgAdaptive(price, PPOFastLength);
slow = MovAvgAdaptive(price, PPOSlowLength);
_ppo = if periodOK then ((fast - slow) / slow) * 100 else 0;
_signal = MovAvgAdaptive(_ppo, PPOSignalPeriod);

case "Triangular MA":
fast = MovAvgTriangular(price, PPOFastLength);
slow = MovAvgTriangular(price, PPOSlowLength);
_ppo = if periodOK then ((fast - slow) / slow) * 100 else 0;
_signal = MovAvgTriangular(_ppo, PPOSignalPeriod);

case "Variable MA":
fast = variableMA(price, PPOFastLength);
slow = variableMA(price, PPOSlowLength);
_ppo = if periodOK then ((fast - slow) / slow) * 100 else 0;
_signal = variableMA(_ppo, PPOSignalPeriod);

case "Dema MA":
fast = DEMA(price, PPOFastLength);
slow = DEMA(price, PPOSlowLength);
_ppo = if periodOK then ((fast - slow) / slow) * 100 else 0;
_signal = DEMA(_ppo, PPOSignalPeriod);

case "Tema MA":
fast = TEMA(price, PPOFastLength);
slow = TEMA(price, PPOSlowLength);
_ppo = if periodOK then ((fast - slow) / slow) * 100 else 0;
_signal = TEMA(_ppo, PPOSignalPeriod);

case EHMA:
fast = ExpAverage(2 * ExpAverage(price, PPOFastLength / 2) -
ExpAverage(price, PPOFastLength), Round(Sqrt(PPOFastLength)));
slow = ExpAverage(2 * ExpAverage(price, PPOSlowLength / 2) -
ExpAverage(price, PPOSlowLength), Round(Sqrt(PPOSlowLength)));
_ppo = if periodOK then ((fast - slow) / slow) * 100 else 0;
_signal = ExpAverage(2 * ExpAverage(_ppo, PPOSignalPeriod / 2) -
ExpAverage(_ppo, PPOSignalPeriod), Round(Sqrt(PPOSignalPeriod)));

case THMA:
fast = WMA(WMA(price, (PPOFastLength / 2) / 3) * 3 - WMA(price, (PPOFastLength / 2) / 2) -
WMA(price, (PPOFastLength / 2)), (PPOFastLength / 2));
slow = WMA(WMA(price, (PPOSlowLength / 2) / 3) * 3 - WMA(price, (PPOSlowLength / 2) / 2) -
WMA(price, (PPOSlowLength / 2)), (PPOSlowLength / 2));
_ppo = if periodOK then ((fast - slow) / slow) * 100 else 0;
_signal = WMA(WMA(_ppo, (PPOSignalPeriod / 2) / 3) * 3 - WMA(_ppo, (PPOSignalPeriod / 2) / 2) -
WMA(_ppo, (PPOSignalPeriod / 2)), (PPOSignalPeriod / 2));
}


def PPO_Diff = _ppo;
def PPO_State = if PPO_Diff >= 0
then if PPO_Diff > PPO_Diff[1]
then PosUp
else PosDn
else if PPO_Diff < PPO_Diff[1]
then NegDn
else NegUp;
plot PPO_Dot = if IsNaN(close) then Double.NaN else 4;
PPO_Dot.SetPaintingStrategy(PaintingStrategy.POINTS);
PPO_Dot.SetLineWeight(DotSize);
PPO_Dot.DefineColor("Positive and Up", Color.GREEN);
PPO_Dot.DefineColor("Positive and Down", Color.DARK_GREEN);
PPO_Dot.DefineColor("Negative and Down", Color.RED);
PPO_Dot.DefineColor("Negative and Up", Color.DARK_RED);
PPO_Dot.AssignValueColor(if PPO_State == PosUp then PPO_Dot.Color("Positive and Up")
else if PPO_State == PosDn then PPO_Dot.Color("Positive and Down")
else if PPO_State == NegDn then PPO_Dot.Color("Negative and Down")
else PPO_Dot.Color("Negative and Up"));
AddChartBubble(!IsNaN(close[n1]) and IsNaN(close[n]), 4, "PPO", Color.Yellow, yes);
# End Code PPO Multiple Moving Averages



# Ehlers Universal Oscillator
# LazyBear
# initial port by netarchitech
# 2019.11.05
# source: https://www.tradingview.com/script/ieFYbVdC-Ehlers-Universal-Oscillator-LazyBear/

input bandedge = 20;
input EUOLengthMA = 9;

def whitenoise = (close - close[2])/2;
def a1 = ExpAverage(-1.414 * 3.14159 / bandedge);
def b1 = 2.0 * a1 * cos(1.414 * 180 /bandedge);
def c2 = b1;
def c3 = -a1 * a1;
def c1 = 1 - c2 - c3;

def filt = c1 * (whitenoise + (whitenoise[1]))/2 + c2 * (filt[1]) + c3 * (filt[2]);
def filt1 = if totalsum(1) == 0 then 0
else if totalsum(1) == 2 then c2 * filt1[1]
else if totalsum(1) == 3 then c2 * filt1[1] + c3 * (filt1[2])
else filt;

def pk = if totalsum(1) == 2 then .0000001
else if absvalue(filt1) > pk[1] then absvalue(filt1)
else 0.991 * pk[1];
def denom = if pk == 0 then -1 else pk;
def euo = if denom == -1 then euo[1] else filt1/pk;
def euoMA = ExpAverage(euo, EUOLengthMA);
def Universal_Diff = euo;
def Universal_State = if Universal_Diff >= 0
then if Universal_Diff > Universal_Diff[1]
then PosUp
else PosDn
else if Universal_Diff < Universal_Diff[1]
then NegDn
else NegUp;
plot Universal_Dot = if IsNaN(close) then Double.NaN else 5;
Universal_Dot.SetPaintingStrategy(PaintingStrategy.POINTS);
Universal_Dot.SetLineWeight(DotSize);
Universal_Dot.DefineColor("Positive and Up", Color.GREEN);
Universal_Dot.DefineColor("Positive and Down", Color.DARK_GREEN);
Universal_Dot.DefineColor("Negative and Down", Color.RED);
Universal_Dot.DefineColor("Negative and Up", Color.DARK_RED);
Universal_Dot.AssignValueColor(if Universal_State == PosUp then Universal_Dot.Color("Positive and Up")
else if Universal_State == PosDn then Universal_Dot.Color("Positive and Down")
else if Universal_State == NegDn then Universal_Dot.Color("Negative and Down")
else Universal_Dot.Color("Negative and Up"));
AddChartBubble(!IsNaN(close[n1]) and IsNaN(close[n]), 5, "Univ Osc", Color.Yellow, yes);
# End Code Ehlers Universal Oscillator
# End CSA Trading Dashboard
 

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
609 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