Author Message:
Clear trend identification is an important aspect of finding the right side to trade, another is getting the best buying/selling price on a pullback, retracement or reversal. Triple Ehlers Market State can do both.
More Info : https://www.tradingview.com/v/6vcvpsLs/
CODE:
CSS:
# https://www.tradingview.com/v/6vcvpsLs/
#// This source code is subject to the terms of the Mozilla Public License 2.0 at
#//@Woody_Bearbash
#indicator('Triple Market State', 'Triple MS', false, format.price, 2)
# Converted by Sam4Cok@Samer800 - 09/2023
declare lower;
input Theme = {default "Classic", "Night", "Mono"};
input BarColoring = yes; # 'Bar coloring'
input source = close; # 'Source'
input SlowPeriod = 28; # 'Slow Period'
input SlowThreshold = 9;
input MediumPeriod = 18; # 'Medium Period'
input MediumThreshold = 15;
input FastPeriod = 9; # 'Fast Period'
input FastThreshold = 10;
input RecentTrendWeighting = yes; # "Shows on bars ONLY"
def na = Double.NaN;
def last = isNaN(close);
def M1 = Theme == Theme."Classic";
def M2 = Theme == Theme."Night";
def M3 = Theme == Theme."Mono";
def up_ = if M1 then 1 else if M2 then 2 else 3;
def dn_ = if M1 then -1 else if M2 then -2 else -3;
def md_ = if M1 then 11 else if M2 then 22 else 33;
DefineGlobalColor("bullc", CreateColor(65, 198, 7));
DefineGlobalColor("bearc", CreateColor(202, 6, 108));
DefineGlobalColor("consc", CreateColor(216, 131, 5));
DefineGlobalColor("dbullc", Color.DARK_GREEN);
DefineGlobalColor("dbearc", Color.DARK_RED);
DefineGlobalColor("bulla", CreateColor(205, 177, 78));
DefineGlobalColor("beara", CreateColor(192, 104, 227));
DefineGlobalColor("consa", CreateColor(46, 109, 128));
DefineGlobalColor("bullo", CreateColor(194, 189, 189));
DefineGlobalColor("bearo", CreateColor(49, 121, 245));
DefineGlobalColor("conso", CreateColor(216, 131, 5));
#// Functions ? ?
#cc(Series, Period) => // Correlation Cycle Function
script cc {
input Series = close;
input Perd = 14;
def PIx2 = 4.0 * ASin(1.0);
def len = Max(2, Perd);
def period = len;
def Rx = fold i = 0 to period with p do
p + Series[i];
def Ix = Rx;
def Rxx = fold i1 = 0 to period with p1 do
p1 + (Series[i1] * Series[i1]);
def Ixx = Rxx;
def Rxy = fold i2 = 0 to period with p2 do
p2 + (Series[i2] * Cos(PIx2 * i2 / period));
def Ixy = fold i3 = 0 to period with p3 do
p3 + (Series[i3] * -Sin(PIx2 * i3 / period));
def Ryy = fold i4 = 0 to period with p4 do
p4 + (Cos(PIx2 * i4 / period) * Cos(PIx2 * i4 / period));
def Iyy = fold i5 = 0 to period with p5 do
p5 + (-Sin(PIx2 * i5 / period) * -Sin(PIx2 * i5 / period));
def Ry = fold i6 = 0 to period with p6 do
p6 + (Cos(PIx2 * i6 / period));
def Iy = fold i7 = 0 to period with p7 do
p7 + (-Sin(PIx2 * i7 / period));
def real_1 = period * Rxx - Rx * Rx;
def real_2 = period * Ryy - Ry * Ry;
def real_3 = period * Rxy - Rx * Ry;
def realPart = if real_1 > 0.0 and real_2 > 0.0 then
(real_3) / Sqrt(real_1 * real_2) else realPart[1];
def imag_1 = period * Ixx - Ix * Ix;
def imag_2 = period * Iyy - Iy * Iy;
def imag_3 = period * Ixy - Ix * Iy;
def imagPart = if imag_1 > 0.0 and imag_2 > 0.0 then
(imag_3) / Sqrt(imag_1 * imag_2) else imagPart[1];
plot real = realPart;
plot imag = imagPart;
}
#cap(RealPart, ImaginaryPart) => // Correlation Angle Phasor Function
script cap {
input RealPart = 0;
input ImaginaryPart = 0;
def HALF_OF_PI = ASin(1.0);
def Rad = ATan(RealPart / ImaginaryPart) + HALF_OF_PI;
def DEG_IN_1_RADIAN = 90.0 / HALF_OF_PI;
def tempAngle = Rad * DEG_IN_1_RADIAN;
def angle;
def angle0 = if ImaginaryPart == 0.0 then 0.0 else tempAngle;
def angle1;
if ImaginaryPart > 0.0 {
angle1 = angle0 - 180.0;
} else {
angle1 = angle0;
}
angle = if angle1[1] > angle1 and angle1[1] - angle1 < 270.0 then
angle1[1] else angle1;
plot out = angle;
}
#mstate(Angle, Degrees) => // Market State Function
script mstate {
input Angle = close;
input Degrees = 45;
def thresholdInDegrees = Degrees;
def temp = AbsValue(Angle - Angle[1]) < thresholdInDegrees;
def state;
if Angle >= 0.0 and temp {
state = 1;
} else
if Angle < 0.0 and temp {
state = -1;
} else {
state = 0;#state[1];
}
plot out = state;
}
#// Correlation Cycle ? ?
def real1 = cc(source, SlowPeriod).real;
def imaginary1 = cc(source, SlowPeriod).imag;
def real2 = cc(source, MediumPeriod).real;
def imaginary2 = cc(source, MediumPeriod).imag;
def real3 = cc(source, FastPeriod).real;
def imaginary3 = cc(source, FastPeriod).imag;
#// Correlation Angle/Phasor ?
def angle1 = cap(real1, imaginary1);
def angle2 = cap(real2, imaginary2);
def angle3 = cap(real3, imaginary3);
#// Market State ?
def state1 = mstate(angle1, SlowThreshold);
def state2 = mstate(angle2, MediumThreshold);
def state3 = mstate(angle3, FastThreshold);
def colorMS1 = if state1 > 0.5 then up_ else
if state1 < -0.5 then dn_ else na;
def colorMS2 = if state2 > 0.5 then up_ else
if state2 < -0.5 then dn_ else na;
def colorMS3 = if state3 > 0.5 then up_ else
if state3 < -0.5 then dn_ else na;
def color1 = if state1 > 0.5 then up_ else
if state1 < -0.5 then dn_ else color1[1];
def color2 = if state2 > 0.5 then up_ else
if state2 < -0.5 then dn_ else color2[1];
def color3 = if state3 > 0.5 then up_ else
if state3 < -0.5 then dn_ else color3[1];
AddCloud(if colorMS1==1 then state1 else na, -state1,
GlobalColor("dbullc"), GlobalColor("dbullc"));
AddCloud(if colorMS1==2 then state1 else na, -state1,
GlobalColor("bulla"), GlobalColor("bulla"));
AddCloud(if colorMS1==3 then state1 else na, -state1,
GlobalColor("bullo"), GlobalColor("bullo"));
AddCloud(if colorMS1==-1 then state1 else na, -state1,
GlobalColor("dbearc"), GlobalColor("dbearc"));
AddCloud(if colorMS1==-2 then state1 else na, -state1,
GlobalColor("beara"), GlobalColor("beara"));
AddCloud(if colorMS1==-3 then state1 else na, -state1,
GlobalColor("bearo"), GlobalColor("bearo"));
plot Medium = if !last then -state2 else na; # 'State Medium'
plot Fast = if !last and state3 then -state3 else na; # 'State Fast'
Fast.SetLineWeight(2);
Medium.SetPaintingStrategy(PaintingStrategy.HISTOGRAM);
Fast.SetPaintingStrategy(PaintingStrategy.POINTS);
Medium.AssignValueColor(if color2==1 then GlobalColor("bullc") else
if color2==2 then GlobalColor("bulla") else
if color2==3 then GlobalColor("bullo") else
if color2==-1 then GlobalColor("bearc") else
if color2==-2 then GlobalColor("beara") else
if color2==-3 then GlobalColor("bearo") else Color.GRAY);
Fast.AssignValueColor(if color3==1 then Color.LIGHT_GREEN else
if color3==2 then GlobalColor("bulla") else
if color3==3 then GlobalColor("bullo") else
if color3==-1 then Color.PINK else
if color3==-2 then GlobalColor("beara") else
if color3==-3 then GlobalColor("bearo") else Color.GRAY);
plot SlowUp = if !last then state1 else na; # 'State Slow'
plot SlowDn = if !last then -state1 else na; # 'State Slow'
SlowUp.AssignValueColor(if color1==1 then GlobalColor("bullc") else
if color1==2 then GlobalColor("bulla") else
if color1==3 then GlobalColor("bullo") else
if color1==-1 then GlobalColor("bearc") else
if color1==-2 then GlobalColor("beara") else
if color1==-3 then GlobalColor("bearo") else Color.GRAY);
SlowDn.AssignValueColor(if color1==1 then GlobalColor("bullc") else
if color1==2 then GlobalColor("bulla") else
if color1==3 then GlobalColor("bullo") else
if color1==-1 then GlobalColor("bearc") else
if color1==-2 then GlobalColor("beara") else
if color1==-3 then GlobalColor("bearo") else Color.GRAY);
#// Bar Gates ?
def trend_slo = if state1 > 0.5 then 1 else
if state1 < -0.5 then -1 else
if state1 < 0.5 and state1 > -0.5 then 2 else trend_slo[1];
def trend_med = if state2 > 0.5 then 1 else
if state2 < -0.5 then -1 else
if state2 < 0.5 and state2 > -0.5 then 2 else trend_med[1];
def trend_fas = if state3 > 0.5 then 1 else
if state3 < -0.5 then -1 else
if state3 < 0.5 and state3 > -0.5 then 2 else trend_fas[1];
def trend_double = if trend_slo == 1 and trend_med == 1 or
trend_slo == 1 and trend_fas == 1 or
trend_med == 1 and trend_fas == 1 then 1 else
if trend_slo == -1 and trend_med == -1 or
trend_slo == -1 and trend_fas == -1 or
trend_med == -1 and trend_fas == -1 then -1 else trend_double[1];
#/ Parliament arrays ?
def sig_up = (if trend_slo == 1 then 1 else 0) +
(if trend_med == 1 then 1 else 0) +
(if trend_fas == 1 then 1 else 0) +
(if trend_double == 1 and RecentTrendWeighting then 1 else 0);
def sigSum_up = sig_up;
def sig_dn = (if trend_slo == -1 then 1 else 0) +
(if trend_med == -1 then 1 else 0) +
(if trend_fas == -1 then 1 else 0) +
(if trend_double == -1 and RecentTrendWeighting then 1 else 0);
def sigSum_dn = sig_dn;
def mid_signal = sigSum_up == sigSum_dn;
plot Retracement = if mid_signal then 0 else na; # 'Retracement'
Retracement.SetLineWeight(2);
Retracement.SetPaintingStrategy(PaintingStrategy.POINTS);
Retracement.AssignValueColor(if md_==11 then GlobalColor("consc") else
if md_==22 then GlobalColor("consa") else
if md_==33 then GlobalColor("conso") else Color.GRAY);
def bar_col = if sigSum_up > sigSum_dn then up_ else
if sigSum_up < sigSum_dn then dn_ else md_;
AssignPriceColor(if !BarColoring then Color.CURRENT else
if bar_col==11 then GlobalColor("consc") else
if bar_col==22 then GlobalColor("consa") else
if bar_col==33 then GlobalColor("conso") else
if bar_col==1 then GlobalColor("bullc") else
if bar_col==2 then GlobalColor("bulla") else
if bar_col==3 then GlobalColor("bullo") else
if bar_col==-1 then GlobalColor("bearc") else
if bar_col==-2 then GlobalColor("beara") else
if bar_col==-3 then GlobalColor("bearo") else Color.GRAY);
#-- END of CODE