Author Message:
Composite Trend Oscillator operates as an oscillator based on the concept of a moving average ribbon. It utilizes up to 32 filters with progressively longer periods to assess trend direction and strength. Embedded within this indicator is an alternative view that utilizes the separation of the ribbon filaments to assess volatility. Both versions are excellent candidates for trend and momentum, both offering visualization of polarity, directional coloring, and filter crossings. Anyone who has former experience using RSI or stochastics may have ease of understanding applying this to their chart.
CODE - May face slowness when upload the indicator:
CSS:
# https://www.tradingview.com/v/oRG4yOuS/
#// This Source Code Form is subject to the terms of the Attribution-NonCommercial-ShareAlike
#// © ChartPrime
#indicator("Composite Trend Oscillator [ChartPrime]", precision=0, timeframe='', timeframe_gaps = true)
# Converted by Sam4Cok@Samer800 - 03/2024
declare lower;
script PhiSmoother {
input Source = close;
input length = 10;
input Phase = 3.7;
def pi = Double.Pi;
def SQRT_PIx2 = Sqrt(2.0 * pi);
def MULTIPLIER = -0.5 / 0.93;
def sma2 = Average(Source, 2);
def length_2 = length * 0.52353;
def W = fold i = 0 to length with p do
p + sma2[i] * if ((i + Phase - length_2) * MULTIPLIER) < 0.0 then
(1.0 - ((Exp(Power(((i + Phase - length_2) * MULTIPLIER), 2) * -0.5)
* -0.39894228) * (1.0 / (0.2316419 * AbsValue(((i + Phase - length_2) * MULTIPLIER)) + 1.0)) *
( 0.319381530 + (1.0 / (0.2316419 * AbsValue(((i + Phase - length_2) * MULTIPLIER)) + 1.0)) *
(-0.356563782 + (1.0 / (0.2316419 * AbsValue(((i + Phase - length_2) * MULTIPLIER)) + 1.0)) *
( 1.781477937 + (1.0 / (0.2316419 * AbsValue(((i + Phase - length_2) * MULTIPLIER)) + 1.0)) *
(-1.821255978 + (1.0 / (0.2316419 * AbsValue(((i + Phase - length_2) * MULTIPLIER)) + 1.0))
* 1.330274429)))) + 1.011)) / SQRT_PIx2 else
(((Exp(Power(((i + Phase - length_2) * MULTIPLIER), 2) * -0.5)
* -0.39894228) * (1.0 / (0.2316419 * AbsValue(((i + Phase - length_2) * MULTIPLIER)) + 1.0)) *
( 0.31938153 + (1.0 / (0.2316419 * AbsValue(((i + Phase - length_2) * MULTIPLIER)) + 1.0)) *
(-0.356563782 + (1.0 / (0.2316419 * AbsValue(((i + Phase - length_2) * MULTIPLIER)) + 1.0)) *
( 1.781477937 + (1.0 / (0.2316419 * AbsValue(((i + Phase - length_2) * MULTIPLIER)) + 1.0)) *
(-1.821255978 + (1.0 / (0.2316419 * AbsValue(((i + Phase - length_2) * MULTIPLIER)) + 1.0))
* 1.330274429)))) + 1.011)) / SQRT_PIx2;
def E = fold j = 0 to length with q do
q + if ((j + Phase - length_2) * MULTIPLIER) < 0.0 then
(1.0 - ((Exp(Power(((j + Phase - length_2) * MULTIPLIER), 2) * -0.5)
* -0.39894228) * (1.0 / (0.2316419 * AbsValue(((j + Phase - length_2) * MULTIPLIER)) + 1.0)) *
( 0.31938153 + (1.0 / (0.2316419 * AbsValue(((j + Phase - length_2) * MULTIPLIER)) + 1.0)) *
(-0.356563782 + (1.0 / (0.2316419 * AbsValue(((j + Phase - length_2) * MULTIPLIER)) + 1.0)) *
( 1.781477937 + (1.0 / (0.2316419 * AbsValue(((j + Phase - length_2) * MULTIPLIER)) + 1.0)) *
(-1.821255978 + (1.0 / (0.2316419 * AbsValue(((j + Phase - length_2) * MULTIPLIER)) + 1.0))
* 1.330274429)))) + 1.011)) / SQRT_PIx2 else
(((Exp(Power(((j + Phase - length_2) * MULTIPLIER), 2) * -0.5)
* -0.39894228) * (1.0 / (0.2316419 * AbsValue(((j + Phase - length_2) * MULTIPLIER)) + 1.0)) *
( 0.31938153 + (1.0 / (0.2316419 * AbsValue(((j + Phase - length_2) * MULTIPLIER)) + 1.0)) *
(-0.356563782 + (1.0 / (0.2316419 * AbsValue(((j + Phase - length_2) * MULTIPLIER)) + 1.0)) *
( 1.781477937 + (1.0 / (0.2316419 * AbsValue(((j + Phase - length_2) * MULTIPLIER)) + 1.0)) *
(-1.821255978 + (1.0 / (0.2316419 * AbsValue(((j + Phase - length_2) * MULTIPLIER)) + 1.0))
* 1.330274429)))) + 1.011)) / SQRT_PIx2;
def PhiSmoother = W / E;
plot out = PhiSmoother;
}
script filter {
input source = close;
input length = 10;
input phase = 3.7;
input filterType = "PhiSmoother";
input rank = 0;
input trimUp = 0;
input trimDn = 0;
def phiFilter = PhiSmoother(source, length, phase);
def filter = if filterType== "EMA" then ExpAverage(source, length) else
if filterType== "DEMA" then DEMA(source, length) else
if filterType== "TEMA" then TEMA(source, length) else
if filterType== "WMA" then WMA(source, length) else
if filterType== "SMA" then Average(source, length) else phiFilter;
def return = if length > 1 and !isNaN(filter) then filter else source;
def cond = (rank >= trimUp) and ((32 - rank) >= trimDn);
plot out = if cond then return else 0;
}
#Hint CompositeClusterMode: Trend Strength visualizes the directionality of the filter cluster. Volatility weights the score to the bandwidth of the cluster.
#hint ClusterFilter: Choose a filter to build the moving average cluster with.
#Hint PhiSmootherPhase: This allows for subtle adjustment (tweaking) of the phase/lag for PhiSmoother.
#Hint ClusterDispersion: Choose the separation between the moving averages in the cluster.
#Hint upper_trim: Adjusts the shortest period of the moving averages. Increasing the upper value reduces sensitivity.
#Hint lower_trim: Adjusts the longest period of the moving averages. Increasing the lower value heightens sensitivity.
#Hint signal_length: Period of the momentum signal plot.
#Hint transition_easing: Adjust the sensitivity to ranging conditions.
input timeframe = {Default "Chart", "Custom"};
input customTimeframe = AggregationPeriod.FIFTEEN_MIN;
input price = FundamentalType.CLOSE; # "Source"
input CompositeClusterMode = {default "Trend Strength", "Volatility"}; # "Composite Cluster Mode"
input ClusterFilter = {default "PhiSmoother", "EMA", "DEMA", "TEMA", "WMA", "SMA"}; # "Cluster Filter"
input PhiSmootherPhase = 3.7; # "???PhiSmoother Phase"
input ClusterDispersion = 3; # "Cluster Dispersion"
input upper_trim = 0; # "Cluster Trim - Upper:"
input lower_trim = 0; # "??Lower:"
input PostSmoothFilter = {default "PhiSmoother", "EMA", "DEMA", "TEMA", "WMA", "SMA"}; # "PostSmooth - Filter:"
input PostSmoothLength = 1; #, "??Length:", group=output, inline="post", minval=1, tooltip="Period of the clu
input signal_filter = {default "PhiSmoother", "EMA", "DEMA", "TEMA", "WMA", "SMA"}; #]"Signal - Filter:"
input signal_length = 20; #, "??Length:"
input upperLevel = 75.00; #, "Levels - Upper:",
input lowerLevel = -75.00; #, "??Lower:"
input candle_color = no; # "Candle Coloring"
input transition_easing = 50.0; #, "Transition Easing"
def source;
Switch (timeframe) {
Case "Custom" : source = Fundamental(FundamentalType = price, Period = customTimeframe);
Default : source = Fundamental(FundamentalType = price);
}
def na = Double.NaN;
def last = IsNaN(close);
def Phase = PhiSmootherPhase;
def spacing = Min(Max(ClusterDispersion, 1), 10);
def VOLATILITY_MODE_ON = CompositeClusterMode == CompositeClusterMode."Volatility";
def upper = Min(Max(upper_trim, 0), 31);
def lower = Min(Max(lower_trim, 0), 31);
def trimUp = if (upper + lower) > 31 then if upper > lower then upper - lower else upper else upper;
def trimDn = if (upper + lower) > 31 then if upper > lower then lower else lower - upper else lower;
#-- Colors
DefineGlobalColor("rising_bullish", CreateColor(255, 204, 0)); # "Bullish Color"
DefineGlobalColor("falling_bullish", CreateColor(253, 240, 185)); # "bull")
DefineGlobalColor("falling_bearish", CreateColor(85, 0, 204)); # "bear"
DefineGlobalColor("rising_bearish", CreateColor(181, 128, 255)); #"bear"
script z {
input cluster = close;
def pos = Double.POSITIVE_INFINITY;
def cond = cluster <= 0;
def z = if cond then pos else cluster;
plot out = z;
}
script getScore {
input vv = 0;
input v0 = 0;
input v1 = 0;
input v2 = 0;
input v3 = 0;
input v4 = 0;
input v5 = 0;
input v6 = 0;
input v7 = 0;
input v8 = 0;
input v9 = 0;
input v10 = 0;
input v11 = 0;
input v12 = 0;
input v13 = 0;
input v14 = 0;
input v15 = 0;
input v16 = 0;
input v17 = 0;
input v18 = 0;
input v19 = 0;
input v20 = 0;
input v21 = 0;
input v22 = 0;
input v23 = 0;
input v24 = 0;
input v25 = 0;
input v26 = 0;
input v27 = 0;
input v28 = 0;
input v29 = 0;
input v30 = 0;
input v31 = 0;
input v32 = 0;
input i = 0;
def r0 = (if i == 0 or v0 == 0 then 0 else (if vv > v0 then (if i < 0 then 1 else -1) else (if i < 0 then -1 else 1)));
def r1 = r0 + (if i == 1 or v1 == 0 then 0 else (if vv > v1 then (if i < 1 then 1 else -1) else (if i < 1 then -1 else 1)));
def r2 = r1 + (if i == 2 or v2 == 0 then 0 else (if vv > v2 then (if i < 2 then 1 else -1) else (if i < 2 then -1 else 1)));
def r3 = r2 + (if i == 3 or v3 == 0 then 0 else (if vv > v3 then (if i < 3 then 1 else -1) else (if i < 3 then -1 else 1)));
def r4 = r3 + (if i == 4 or v4 == 0 then 0 else (if vv > v4 then (if i < 4 then 1 else -1) else (if i < 4 then -1 else 1)));
def r5 = r4 + (if i == 5 or v5 == 0 then 0 else (if vv > v5 then (if i < 5 then 1 else -1) else (if i < 5 then -1 else 1)));
def r6 = r5 + (if i == 6 or v6 == 0 then 0 else (if vv > v6 then (if i < 6 then 1 else -1) else (if i < 6 then -1 else 1)));
def r7 = r6 + (if i == 7 or v7 == 0 then 0 else (if vv > v7 then (if i < 7 then 1 else -1) else (if i < 7 then -1 else 1)));
def r8 = r7 + (if i == 8 or v8 == 0 then 0 else (if vv > v8 then (if i < 8 then 1 else -1) else (if i < 8 then -1 else 1)));
def r9 = r8 + (if i == 9 or v9 == 0 then 0 else (if vv > v9 then (if i < 9 then 1 else -1) else (if i < 9 then -1 else 1)));
def r10 = r9 + (if i == 10 or v10 == 0 then 0 else (if vv > v10 then (if i < 10 then 1 else -1) else (if i < 10 then -1 else 1)));
def r11 = r10+ (if i == 11 or v11 == 0 then 0 else (if vv > v11 then (if i < 11 then 1 else -1) else (if i < 11 then -1 else 1)));
def r12 = r11+ (if i == 12 or v12 == 0 then 0 else (if vv > v12 then (if i < 12 then 1 else -1) else (if i < 12 then -1 else 1)));
def r13 = r12+ (if i == 13 or v13 == 0 then 0 else (if vv > v13 then (if i < 13 then 1 else -1) else (if i < 13 then -1 else 1)));
def r14 = r13+ (if i == 14 or v14 == 0 then 0 else (if vv > v14 then (if i < 14 then 1 else -1) else (if i < 14 then -1 else 1)));
def r15 = r14+ (if i == 15 or v15 == 0 then 0 else (if vv > v15 then (if i < 15 then 1 else -1) else (if i < 15 then -1 else 1)));
def r16 = r15+ (if i == 16 or v16 == 0 then 0 else (if vv > v16 then (if i < 16 then 1 else -1) else (if i < 16 then -1 else 1)));
def r17 = r16+ (if i == 17 or v17 == 0 then 0 else (if vv > v17 then (if i < 17 then 1 else -1) else (if i < 17 then -1 else 1)));
def r18 = r17+ (if i == 18 or v18 == 0 then 0 else (if vv > v18 then (if i < 18 then 1 else -1) else (if i < 18 then -1 else 1)));
def r19 = r18+ (if i == 19 or v19 == 0 then 0 else (if vv > v19 then (if i < 19 then 1 else -1) else (if i < 19 then -1 else 1)));
def r20 = r19+ (if i == 20 or v20 == 0 then 0 else (if vv > v20 then (if i < 20 then 1 else -1) else (if i < 20 then -1 else 1)));
def r21 = r20+ (if i == 21 or v21 == 0 then 0 else (if vv > v21 then (if i < 21 then 1 else -1) else (if i < 21 then -1 else 1)));
def r22 = r21+ (if i == 22 or v22 == 0 then 0 else (if vv > v22 then (if i < 22 then 1 else -1) else (if i < 22 then -1 else 1)));
def r23 = r22+ (if i == 23 or v23 == 0 then 0 else (if vv > v23 then (if i < 23 then 1 else -1) else (if i < 23 then -1 else 1)));
def r24 = r23+ (if i == 24 or v24 == 0 then 0 else (if vv > v24 then (if i < 24 then 1 else -1) else (if i < 24 then -1 else 1)));
def r25 = r24+ (if i == 25 or v25 == 0 then 0 else (if vv > v25 then (if i < 25 then 1 else -1) else (if i < 25 then -1 else 1)));
def r26 = r25+ (if i == 26 or v26 == 0 then 0 else (if vv > v26 then (if i < 26 then 1 else -1) else (if i < 26 then -1 else 1)));
def r27 = r26+ (if i == 27 or v27 == 0 then 0 else (if vv > v27 then (if i < 27 then 1 else -1) else (if i < 27 then -1 else 1)));
def r28 = r27+ (if i == 28 or v28 == 0 then 0 else (if vv > v28 then (if i < 28 then 1 else -1) else (if i < 28 then -1 else 1)));
def r29 = r28+ (if i == 29 or v29 == 0 then 0 else (if vv > v29 then (if i < 29 then 1 else -1) else (if i < 29 then -1 else 1)));
def r30 = r29+ (if i == 30 or v30 == 0 then 0 else (if vv > v30 then (if i < 30 then 1 else -1) else (if i < 30 then -1 else 1)));
def r31 = r30+ (if i == 31 or v31 == 0 then 0 else (if vv > v31 then (if i < 31 then 1 else -1) else (if i < 31 then -1 else 1)));
def r32 = r31+ (if i == 32 or v32 == 0 then 0 else (if vv > v32 then (if i < 32 then 1 else -1) else (if i < 32 then -1 else 1)));
plot result = if IsNaN(r32) then 0 else if vv == 0 then 0 else r32;
}
def cluste0 = if trimUp > 0 then 0 else source;
def cluste1 = filter(source, 1 * spacing, phase, ClusterFilter, 1, trimUp, trimDn);
def cluste2 = filter(source, 2 * spacing, phase, ClusterFilter, 2, trimUp, trimDn);
def cluste3 = filter(source, 3 * spacing, phase, ClusterFilter, 3, trimUp, trimDn);
def cluste4 = filter(source, 4 * spacing, phase, ClusterFilter, 4, trimUp, trimDn);
def cluste5 = filter(source, 5 * spacing, phase, ClusterFilter, 5, trimUp, trimDn);
def cluste6 = filter(source, 6 * spacing, phase, ClusterFilter, 6, trimUp, trimDn);
def cluste7 = filter(source, 7 * spacing, phase, ClusterFilter, 7, trimUp, trimDn);
def cluste8 = filter(source, 8 * spacing, phase, ClusterFilter, 8, trimUp, trimDn);
def cluste9 = filter(source, 9 * spacing, phase, ClusterFilter, 9, trimUp, trimDn);
def cluste10 = filter(source, 10 * spacing, phase, ClusterFilter, 10, trimUp, trimDn);
def cluste11 = filter(source, 11 * spacing, phase, ClusterFilter, 11, trimUp, trimDn);
def cluste12 = filter(source, 12 * spacing, phase, ClusterFilter, 12, trimUp, trimDn);
def cluste13 = filter(source, 13 * spacing, phase, ClusterFilter, 13, trimUp, trimDn);
def cluste14 = filter(source, 14 * spacing, phase, ClusterFilter, 14, trimUp, trimDn);
def cluste15 = filter(source, 15 * spacing, phase, ClusterFilter, 15, trimUp, trimDn);
def cluste16 = filter(source, 16 * spacing, phase, ClusterFilter, 16, trimUp, trimDn);
def cluste17 = filter(source, 17 * spacing, phase, ClusterFilter, 17, trimUp, trimDn);
def cluste18 = filter(source, 18 * spacing, phase, ClusterFilter, 18, trimUp, trimDn);
def cluste19 = filter(source, 19 * spacing, phase, ClusterFilter, 19, trimUp, trimDn);
def cluste20 = filter(source, 20 * spacing, phase, ClusterFilter, 20, trimUp, trimDn);
def cluste21 = filter(source, 21 * spacing, phase, ClusterFilter, 21, trimUp, trimDn);
def cluste22 = filter(source, 22 * spacing, phase, ClusterFilter, 22, trimUp, trimDn);
def cluste23 = filter(source, 23 * spacing, phase, ClusterFilter, 23, trimUp, trimDn);
def cluste24 = filter(source, 24 * spacing, phase, ClusterFilter, 24, trimUp, trimDn);
def cluste25 = filter(source, 25 * spacing, phase, ClusterFilter, 25, trimUp, trimDn);
def cluste26 = filter(source, 26 * spacing, phase, ClusterFilter, 26, trimUp, trimDn);
def cluste27 = filter(source, 27 * spacing, phase, ClusterFilter, 27, trimUp, trimDn);
def cluste28 = filter(source, 28 * spacing, phase, ClusterFilter, 28, trimUp, trimDn);
def cluste29 = filter(source, 29 * spacing, phase, ClusterFilter, 29, trimUp, trimDn);
def cluste30 = filter(source, 30 * spacing, phase, ClusterFilter, 30, trimUp, trimDn);
def cluste31 = filter(source, 31 * spacing, phase, ClusterFilter, 31, trimUp, trimDn);
def cluste32 = filter(source, 32 * spacing, phase, ClusterFilter, 32, trimUp, trimDn);
def cluster0 = (cluste0);
def cluster1 = (cluste1);
def cluster2 = (cluste2);
def cluster3 = (cluste3);
def cluster4 = (cluste4);
def cluster5 = (cluste5);
def cluster6 = (cluste6);
def cluster7 = (cluste7);
def cluster8 = (cluste8);
def cluster9 = (cluste9);
def cluster10 = (cluste10);
def cluster11 = (cluste11);
def cluster12 = (cluste12);
def cluster13 = (cluste13);
def cluster14 = (cluste14);
def cluster15 = (cluste15);
def cluster16 = (cluste16);
def cluster17 = (cluste17);
def cluster18 = (cluste18);
def cluster19 = (cluste19);
def cluster20 = (cluste20);
def cluster21 = (cluste21);
def cluster22 = (cluste22);
def cluster23 = (cluste23);
def cluster24 = (cluste24);
def cluster25 = (cluste25);
def cluster26 = (cluste26);
def cluster27 = (cluste27);
def cluster28 = (cluste28);
def cluster29 = (cluste29);
def cluster30 = (cluste30);
def cluster31 = (cluste31);
def cluster32 = (cluste32);
def luster0 = z(cluster0);
def luster1 = z(cluster1);
def luster2 = z(cluster2);
def luster3 = z(cluster3);
def luster4 = z(cluster4);
def luster5 = z(cluster5);
def luster6 = z(cluster6);
def luster7 = z(cluster7);
def luster8 = z(cluster8);
def luster9 = z(cluster9);
def luster10 = z(cluster10);
def luster11 = z(cluster11);
def luster12 = z(cluster12);
def luster13 = z(cluster13);
def luster14 = z(cluster14);
def luster15 = z(cluster15);
def luster16 = z(cluster16);
def luster17 = z(cluster17);
def luster18 = z(cluster18);
def luster19 = z(cluster19);
def luster20 = z(cluster20);
def luster21 = z(cluster21);
def luster22 = z(cluster22);
def luster23 = z(cluster23);
def luster24 = z(cluster24);
def luster25 = z(cluster25);
def luster26 = z(cluster26);
def luster27 = z(cluster27);
def luster28 = z(cluster28);
def luster29 = z(cluster29);
def luster30 = z(cluster30);
def luster31 = z(cluster31);
def luster32 = z(cluster32);
def score0 = getScore(cluster0 , cluster0 , cluster1 , cluster2 , cluster3 , cluster4 , cluster5 , cluster6 , cluster7 ,
cluster8 , cluster9 , cluster10, cluster11, cluster12, cluster13, cluster14, cluster15, cluster16,
cluster17, cluster18, cluster19, cluster20, cluster21, cluster22, cluster23, cluster24, cluster25,
cluster26, cluster27, cluster28, cluster29, cluster30, cluster31, cluster32, 0);
def score1 = getScore(cluster1 , cluster0 , cluster1 , cluster2 , cluster3 , cluster4 , cluster5 , cluster6 , cluster7 ,
cluster8 , cluster9 , cluster10, cluster11, cluster12, cluster13, cluster14, cluster15, cluster16,
cluster17, cluster18, cluster19, cluster20, cluster21, cluster22, cluster23, cluster24, cluster25,
cluster26, cluster27, cluster28, cluster29, cluster30, cluster31, cluster32, 1);
def score2 = getScore(cluster2 , cluster0 , cluster1 , cluster2 , cluster3 , cluster4 , cluster5 , cluster6 , cluster7 ,
cluster8 , cluster9 , cluster10, cluster11, cluster12, cluster13, cluster14, cluster15, cluster16,
cluster17, cluster18, cluster19, cluster20, cluster21, cluster22, cluster23, cluster24, cluster25,
cluster26, cluster27, cluster28, cluster29, cluster30, cluster31, cluster32, 2);
def score3 = getScore(cluster3 , cluster0 , cluster1 , cluster2 , cluster3 , cluster4 , cluster5 , cluster6 , cluster7 ,
cluster8 , cluster9 , cluster10, cluster11, cluster12, cluster13, cluster14, cluster15, cluster16,
cluster17, cluster18, cluster19, cluster20, cluster21, cluster22, cluster23, cluster24, cluster25,
cluster26, cluster27, cluster28, cluster29, cluster30, cluster31, cluster32, 3);
def score4 = getScore(cluster4 , cluster0 , cluster1 , cluster2 , cluster3 , cluster4 , cluster5 , cluster6 , cluster7 ,
cluster8 , cluster9 , cluster10, cluster11, cluster12, cluster13, cluster14, cluster15, cluster16,
cluster17, cluster18, cluster19, cluster20, cluster21, cluster22, cluster23, cluster24, cluster25,
cluster26, cluster27, cluster28, cluster29, cluster30, cluster31, cluster32, 4);
def score5 = getScore(cluster5 , cluster0 , cluster1 , cluster2 , cluster3 , cluster4 , cluster5 , cluster6 , cluster7 ,
cluster8 , cluster9 , cluster10, cluster11, cluster12, cluster13, cluster14, cluster15, cluster16,
cluster17, cluster18, cluster19, cluster20, cluster21, cluster22, cluster23, cluster24, cluster25,
cluster26, cluster27, cluster28, cluster29, cluster30, cluster31, cluster32, 5);
def score6 = getScore(cluster6 , cluster0 , cluster1 , cluster2 , cluster3 , cluster4 , cluster5 , cluster6 , cluster7 ,
cluster8 , cluster9 , cluster10, cluster11, cluster12, cluster13, cluster14, cluster15, cluster16,
cluster17, cluster18, cluster19, cluster20, cluster21, cluster22, cluster23, cluster24, cluster25,
cluster26, cluster27, cluster28, cluster29, cluster30, cluster31, cluster32, 6);
def score7 = getScore(cluster7 , cluster0 , cluster1 , cluster2 , cluster3 , cluster4 , cluster5 , cluster6 , cluster7 ,
cluster8 , cluster9 , cluster10, cluster11, cluster12, cluster13, cluster14, cluster15, cluster16,
cluster17, cluster18, cluster19, cluster20, cluster21, cluster22, cluster23, cluster24, cluster25,
cluster26, cluster27, cluster28, cluster29, cluster30, cluster31, cluster32, 7);
def score8 = getScore(cluster8 , cluster0 , cluster1 , cluster2 , cluster3 , cluster4 , cluster5 , cluster6 , cluster7 ,
cluster8 , cluster9 , cluster10, cluster11, cluster12, cluster13, cluster14, cluster15, cluster16,
cluster17, cluster18, cluster19, cluster20, cluster21, cluster22, cluster23, cluster24, cluster25,
cluster26, cluster27, cluster28, cluster29, cluster30, cluster31, cluster32, 8);
def score9 = getScore(cluster9 , cluster0 , cluster1 , cluster2 , cluster3 , cluster4 , cluster5 , cluster6 , cluster7 ,
cluster8 , cluster9 , cluster10, cluster11, cluster12, cluster13, cluster14, cluster15, cluster16,
cluster17, cluster18, cluster19, cluster20, cluster21, cluster22, cluster23, cluster24, cluster25,
cluster26, cluster27, cluster28, cluster29, cluster30, cluster31, cluster32, 9);
def score10 = getScore(cluster10, cluster0 , cluster1 , cluster2 , cluster3 , cluster4 , cluster5 , cluster6 , cluster7 ,
cluster8 , cluster9 , cluster10, cluster11, cluster12, cluster13, cluster14, cluster15, cluster16,
cluster17, cluster18, cluster19, cluster20, cluster21, cluster22, cluster23, cluster24, cluster25,
cluster26, cluster27, cluster28, cluster29, cluster30, cluster31, cluster32, 10);
def score11 = getScore(cluster11, cluster0 , cluster1 , cluster2 , cluster3 , cluster4 , cluster5 , cluster6 , cluster7 ,
cluster8 , cluster9 , cluster10, cluster11, cluster12, cluster13, cluster14, cluster15, cluster16,
cluster17, cluster18, cluster19, cluster20, cluster21, cluster22, cluster23, cluster24, cluster25,
cluster26, cluster27, cluster28, cluster29, cluster30, cluster31, cluster32, 11);
def score12 = getScore(cluster12, cluster0 , cluster1 , cluster2 , cluster3 , cluster4 , cluster5 , cluster6 , cluster7 ,
cluster8 , cluster9 , cluster10, cluster11, cluster12, cluster13, cluster14, cluster15, cluster16,
cluster17, cluster18, cluster19, cluster20, cluster21, cluster22, cluster23, cluster24, cluster25,
cluster26, cluster27, cluster28, cluster29, cluster30, cluster31, cluster32, 12);
def score13 = getScore(cluster13, cluster0 , cluster1 , cluster2 , cluster3 , cluster4 , cluster5 , cluster6 , cluster7 ,
cluster8 , cluster9 , cluster10, cluster11, cluster12, cluster13, cluster14, cluster15, cluster16,
cluster17, cluster18, cluster19, cluster20, cluster21, cluster22, cluster23, cluster24, cluster25,
cluster26, cluster27, cluster28, cluster29, cluster30, cluster31, cluster32, 13);
def score14 = getScore(cluster14, cluster0 , cluster1 , cluster2 , cluster3 , cluster4 , cluster5 , cluster6 , cluster7 ,
cluster8 , cluster9 , cluster10, cluster11, cluster12, cluster13, cluster14, cluster15, cluster16,
cluster17, cluster18, cluster19, cluster20, cluster21, cluster22, cluster23, cluster24, cluster25,
cluster26, cluster27, cluster28, cluster29, cluster30, cluster31, cluster32, 14);
def score15 = getScore(cluster15, cluster0 , cluster1 , cluster2 , cluster3 , cluster4 , cluster5 , cluster6 , cluster7 ,
cluster8 , cluster9 , cluster10, cluster11, cluster12, cluster13, cluster14, cluster15, cluster16,
cluster17, cluster18, cluster19, cluster20, cluster21, cluster22, cluster23, cluster24, cluster25,
cluster26, cluster27, cluster28, cluster29, cluster30, cluster31, cluster32, 15);
def score16 = getScore(cluster16, cluster0 , cluster1 , cluster2 , cluster3 , cluster4 , cluster5 , cluster6 , cluster7 ,
cluster8 , cluster9 , cluster10, cluster11, cluster12, cluster13, cluster14, cluster15, cluster16,
cluster17, cluster18, cluster19, cluster20, cluster21, cluster22, cluster23, cluster24, cluster25,
cluster26, cluster27, cluster28, cluster29, cluster30, cluster31, cluster32, 16);
def score17 = getScore(cluster17, cluster0 , cluster1 , cluster2 , cluster3 , cluster4 , cluster5 , cluster6 , cluster7 ,
cluster8 , cluster9 , cluster10, cluster11, cluster12, cluster13, cluster14, cluster15, cluster16,
cluster17, cluster18, cluster19, cluster20, cluster21, cluster22, cluster23, cluster24, cluster25,
cluster26, cluster27, cluster28, cluster29, cluster30, cluster31, cluster32, 17);
def score18 = getScore(cluster18, cluster0 , cluster1 , cluster2 , cluster3 , cluster4 , cluster5 , cluster6 , cluster7 ,
cluster8 , cluster9 , cluster10, cluster11, cluster12, cluster13, cluster14, cluster15, cluster16,
cluster17, cluster18, cluster19, cluster20, cluster21, cluster22, cluster23, cluster24, cluster25,
cluster26, cluster27, cluster28, cluster29, cluster30, cluster31, cluster32, 18);
def score19 = getScore(cluster19, cluster0 , cluster1 , cluster2 , cluster3 , cluster4 , cluster5 , cluster6 , cluster7 ,
cluster8 , cluster9 , cluster10, cluster11, cluster12, cluster13, cluster14, cluster15, cluster16,
cluster17, cluster18, cluster19, cluster20, cluster21, cluster22, cluster23, cluster24, cluster25,
cluster26, cluster27, cluster28, cluster29, cluster30, cluster31, cluster32, 19);
def score20 = getScore(cluster20, cluster0 , cluster1 , cluster2 , cluster3 , cluster4 , cluster5 , cluster6 , cluster7 ,
cluster8 , cluster9 , cluster10, cluster11, cluster12, cluster13, cluster14, cluster15, cluster16,
cluster17, cluster18, cluster19, cluster20, cluster21, cluster22, cluster23, cluster24, cluster25,
cluster26, cluster27, cluster28, cluster29, cluster30, cluster31, cluster32, 20);
def score21 = getScore(cluster21, cluster0 , cluster1 , cluster2 , cluster3 , cluster4 , cluster5 , cluster6 , cluster7 ,
cluster8 , cluster9 , cluster10, cluster11, cluster12, cluster13, cluster14, cluster15, cluster16,
cluster17, cluster18, cluster19, cluster20, cluster21, cluster22, cluster23, cluster24, cluster25,
cluster26, cluster27, cluster28, cluster29, cluster30, cluster31, cluster32, 21);
def score22 = getScore(cluster22, cluster0 , cluster1 , cluster2 , cluster3 , cluster4 , cluster5 , cluster6 , cluster7 ,
cluster8 , cluster9 , cluster10, cluster11, cluster12, cluster13, cluster14, cluster15, cluster16,
cluster17, cluster18, cluster19, cluster20, cluster21, cluster22, cluster23, cluster24, cluster25,
cluster26, cluster27, cluster28, cluster29, cluster30, cluster31, cluster32, 22);
def score23 = getScore(cluster23, cluster0 , cluster1 , cluster2 , cluster3 , cluster4 , cluster5 , cluster6 , cluster7 ,
cluster8 , cluster9 , cluster10, cluster11, cluster12, cluster13, cluster14, cluster15, cluster16,
cluster17, cluster18, cluster19, cluster20, cluster21, cluster22, cluster23, cluster24, cluster25,
cluster26, cluster27, cluster28, cluster29, cluster30, cluster31, cluster32, 23);
def score24 = getScore(cluster24, cluster0 , cluster1 , cluster2 , cluster3 , cluster4 , cluster5 , cluster6 , cluster7 ,
cluster8 , cluster9 , cluster10, cluster11, cluster12, cluster13, cluster14, cluster15, cluster16,
cluster17, cluster18, cluster19, cluster20, cluster21, cluster22, cluster23, cluster24, cluster25,
cluster26, cluster27, cluster28, cluster29, cluster30, cluster31, cluster32, 24);
def score25 = getScore(cluster25, cluster0 , cluster1 , cluster2 , cluster3 , cluster4 , cluster5 , cluster6 , cluster7 ,
cluster8 , cluster9 , cluster10, cluster11, cluster12, cluster13, cluster14, cluster15, cluster16,
cluster17, cluster18, cluster19, cluster20, cluster21, cluster22, cluster23, cluster24, cluster25,
cluster26, cluster27, cluster28, cluster29, cluster30, cluster31, cluster32, 25);
def score26 = getScore(cluster26, cluster0 , cluster1 , cluster2 , cluster3 , cluster4 , cluster5 , cluster6 , cluster7 ,
cluster8 , cluster9 , cluster10, cluster11, cluster12, cluster13, cluster14, cluster15, cluster16,
cluster17, cluster18, cluster19, cluster20, cluster21, cluster22, cluster23, cluster24, cluster25,
cluster26, cluster27, cluster28, cluster29, cluster30, cluster31, cluster32, 26);
def score27 = getScore(cluster27, cluster0 , cluster1 , cluster2 , cluster3 , cluster4 , cluster5 , cluster6 , cluster7 ,
cluster8 , cluster9 , cluster10, cluster11, cluster12, cluster13, cluster14, cluster15, cluster16,
cluster17, cluster18, cluster19, cluster20, cluster21, cluster22, cluster23, cluster24, cluster25,
cluster26, cluster27, cluster28, cluster29, cluster30, cluster31, cluster32, 27);
def score28 = getScore(cluster28, cluster0 , cluster1 , cluster2 , cluster3 , cluster4 , cluster5 , cluster6 , cluster7 ,
cluster8 , cluster9 , cluster10, cluster11, cluster12, cluster13, cluster14, cluster15, cluster16,
cluster17, cluster18, cluster19, cluster20, cluster21, cluster22, cluster23, cluster24, cluster25,
cluster26, cluster27, cluster28, cluster29, cluster30, cluster31, cluster32, 28);
def score29 = getScore(cluster29, cluster0 , cluster1 , cluster2 , cluster3 , cluster4 , cluster5 , cluster6 , cluster7 ,
cluster8 , cluster9 , cluster10, cluster11, cluster12, cluster13, cluster14, cluster15, cluster16,
cluster17, cluster18, cluster19, cluster20, cluster21, cluster22, cluster23, cluster24, cluster25,
cluster26, cluster27, cluster28, cluster29, cluster30, cluster31, cluster32, 29);
def score30 = getScore(cluster30, cluster0 , cluster1 , cluster2 , cluster3 , cluster4 , cluster5 , cluster6 , cluster7 ,
cluster8 , cluster9 , cluster10, cluster11, cluster12, cluster13, cluster14, cluster15, cluster16,
cluster17, cluster18, cluster19, cluster20, cluster21, cluster22, cluster23, cluster24, cluster25,
cluster26, cluster27, cluster28, cluster29, cluster30, cluster31, cluster32, 30);
def score31 = getScore(cluster31, cluster0 , cluster1 , cluster2 , cluster3 , cluster4 , cluster5 , cluster6 , cluster7 ,
cluster8 , cluster9 , cluster10, cluster11, cluster12, cluster13, cluster14, cluster15, cluster16,
cluster17, cluster18, cluster19, cluster20, cluster21, cluster22, cluster23, cluster24, cluster25,
cluster26, cluster27, cluster28, cluster29, cluster30, cluster31, cluster32, 31);
def score32 = getScore(cluster32, cluster0 , cluster1 , cluster2 , cluster3 , cluster4 , cluster5 , cluster6 , cluster7 ,
cluster8 , cluster9 , cluster10, cluster11, cluster12, cluster13, cluster14, cluster15, cluster16,
cluster17, cluster18, cluster19, cluster20, cluster21, cluster22, cluster23, cluster24, cluster25,
cluster26, cluster27, cluster28, cluster29, cluster30, cluster31, cluster32, 32);
def max1 = Max(cluster0, Max(cluster1, Max(cluster2, Max(cluster3, Max(cluster4, Max(cluster5, Max(cluster6, cluster7)))))));
def max2 = Max(cluster8, Max(cluster9, Max(cluster10,Max(cluster11,Max(cluster12,Max(cluster13,Max(cluster14, cluster15)))))));
def max3 = Max(cluster16,Max(cluster17,Max(cluster18,Max(cluster19,Max(cluster20,Max(cluster21,Max(cluster22, cluster23)))))));
def max4 = Max(cluster24,Max(cluster25,Max(cluster26,Max(cluster27,Max(cluster28,Max(cluster29,Max(cluster30, cluster31)))))));
def max5 = Max(cluster32,Max(max1, Max(max2, Max(max3, max4))));
def min1 = Min(luster0, Min(luster1, Min(luster2, Min(luster3, Min(luster4, Min(luster5, Min(luster6, luster7)))))));
def min2 = Min(luster8, Min(luster9, Min(luster10,Min(luster11,Min(luster12,Min(luster13,Min(luster14, luster15)))))));
def min3 = Min(luster16,Min(luster17,Min(luster18,Min(luster19,Min(luster20,Min(luster21,Min(luster22, luster23)))))));
def min4 = Min(luster24,Min(luster25,Min(luster26,Min(luster27,Min(luster28,Min(luster29,Min(luster30, luster31)))))));
def min5 = Min(luster32,Min(min1, Min(min2, Min(min3, min4))));
def ribbon_max = max5;
def ribbon_min = min5;
def ribbon_width = ribbon_max - ribbon_min;
def avg = (ribbon_max + ribbon_min) / 2;
def ribbon_Avg = (ribbon_width / avg);
def rib_Avg = if IsNaN(ribbon_Avg) then 0 else ribbon_Avg;
def ribbon_rank = if VOLATILITY_MODE_ON then rib_Avg else 1;
def avgNetScore1 = score0 + score1 + score2 + score3 + score4 + score5 + score6 + score7 + score8 + score9 + score10 + score11;
def avgNetScore2 = score12 + score13 + score14 + score15 + score16 + score17 + score18 + score19 + score20 + score21 + score22;
def avgNetScore3 = score23 + score24 + score25 + score26 + score27 + score28 + score29 + score30 + score31 + score32;
def score = avgNetScore1 + avgNetScore2 + avgNetScore3;
def NetSco1 = !cluster0 + !cluster1 + !cluster2 + !cluster3 + !cluster4 + !cluster5 + !cluster6 + !cluster7 + !cluster8 + !cluster9;
def NetSco2 = !cluster10+ !cluster11+ !cluster12+ !cluster13+ !cluster14+ !cluster15+ !cluster16+ !cluster17+ !cluster18+ !cluster19;
def NetSco3 = !cluster20+ !cluster21+ !cluster22+ !cluster23+ !cluster24+ !cluster25+ !cluster26+ !cluster27+ !cluster28+ !cluster29;
def value = 32 - (NetSco1 + NetSco2 + NetSco3 + !cluster30 + !cluster31 + !cluster32);
def avgNetScore = score / (value + 1);
def netScore = ((avgNetScore + value) / (value * 2.0) - 0.5) * 200.0;
def net_score = filter(netScore * ribbon_rank, PostSmoothLength, 3.7, PostSmoothFilter);
def avg_net_score = Average(net_score, 2);
def signal_value = if signal_length < 2 then na else filter(avg_net_score, signal_length, 3.7, signal_filter);
#-- Colors
def bar = AbsValue(BarNumber());
def delta = net_score - If(IsNaN(net_score[1]), net_score, net_score[1]);
def bullish = if delta >= 0.0 then 3 else 2;
def bearish = if delta > 0.0 then -2 else -3;
def transit = if net_score > 0.0 then (if delta >= 0.0 then 1 else -1)
else (if delta >= 0.0 then -1 else 1);
def easing = 0.01 * transition_easing;
def absVal = if bar > 0 then absVal[1] + Sqr(AbsValue(net_score)) else 1;
def crm = AbsValue(net_score)*100 + easing * Sqrt(absVal / (bar + 1 ));
def crms = if IsNaN(crm) then 0 else if crm > 100 then 100 else if crm < 0 then 0 else crm;
def grad;
if VOLATILITY_MODE_ON {
grad = if net_score > 0.0 then
if transition_easing > 0.0 then 5 else bullish else
if transition_easing > 0.0 then -5 else bearish;
} else {
grad = if net_score > 0.0 then
if transition_easing > 0.0 then 4 else bullish else
if transition_easing > 0.0 then -4 else bearish;
}
def col = if IsNaN(net_score) then 0 else if net_score > 100 then 100 else if net_score < -100 then -100 else net_score;
def col1 = if col > upperLevel then 100 else if col < lowerLevel then 100 else absValue(col); #if col > 0 then col else -col;
def nCol = 100 - col1;
def eCol = col1 * 2.54 + nCol;
def nCrms = 100 - crms;
def eCrms = crms * 2.54 + nCrms;
#-- plots
plot SignalLine = if last then na else signal_value;
plot ScoreLine = if last then na else net_score;
plot top = if last or VOLATILITY_MODE_ON then na else 100.0; # "Top"
plot upperLvl = if last or VOLATILITY_MODE_ON then na else upperLevel; # "+Level", rising_bullish, hline.style_dotted, 2)
plot Center = if last then na else 0;
plot lowerLvl = if last or VOLATILITY_MODE_ON then na else lowerLevel; # "+Level", falling_bearish, hline.style_dotted, 2)
plot bottom = if last or VOLATILITY_MODE_ON then na else -100.0; # "Bottom"
ScoreLine.AssignValueColor(if grad == 5 then CreateColor(nCrms, eCrms, nCrms) else
if grad == 4 then CreateColor(nCol, eCol, eCol) else
if grad ==-5 then CreateColor(eCrms, nCrms, nCrms) else
if grad ==-4 then CreateColor(eCol, nCol, eCol) else
if grad == 3 then GlobalColor("rising_bullish") else
if grad == 2 then GlobalColor("falling_bullish") else
if grad ==-3 then GlobalColor("falling_bearish") else
if grad ==-2 then GlobalColor("rising_bearish") else Color.GRAY);
ScoreLine.SetLineWeight(2);
SignalLine.AssignValueColor(if transition_easing > 0 then Color.DARK_ORANGE else Color.DOWNTICK);
top.SetDefaultColor(Color.RED);
Center.SetDefaultColor(Color.GRAY);
bottom.SetDefaultColor(Color.GREEN);
upperLvl.SetStyle(Curve.SHORT_DASH);
upperLvl.SetDefaultColor(Color.RED);
lowerLvl.SetStyle(Curve.SHORT_DASH);
lowerLvl.SetDefaultColor(Color.GREEN);
AddCloud(top, top - (top - upperLvl)/2, Color.DARK_RED);
AddCloud(lowerLvl - (lowerLvl - bottom)/2, bottom, Color.DARK_GREEN);
DefineGlobalColor("rising_transition", CreateColor(149, 152, 161)); # "range"
DefineGlobalColor("falling_transition", CreateColor(204, 204, 204)); # "range"
AssignPriceColor(if !candle_color then Color.CURRENT else
if grad == 5 then CreateColor(nCrms, eCrms, nCrms) else
if grad == 4 then CreateColor(nCol, eCol, eCol) else
if grad ==-5 then CreateColor(eCrms, nCrms, nCrms) else
if grad ==-4 then CreateColor(eCol, nCol, eCol) else
if grad == 3 then GlobalColor("rising_bullish") else
if grad == 2 then GlobalColor("falling_bullish") else
if grad ==-3 then GlobalColor("falling_bearish") else
if grad ==-2 then GlobalColor("rising_bearish") else Color.GRAY);
#-- END of CODE