#// This source code is subject to the terms of the Mozilla Public License 2.0
#// © fluxchart
#indicator("Bollinger Bands (Nadaraya Smoothed) | Flux Charts", overlay =
# Converted and mod by Sam4Cok@Samer800 - 11/2023
input src = hlc3;
input SmoothingFactor = 6.0; # "Smoothing Factor"
input BollingerMovAvgType = AverageType.SIMPLE;
input short_period = 20; # "Period"
input short_stdev = 3.0; # "Deviation"
input med_period = 75; # "Period"
input med_stdev = 4.0; # "Deviation"
input long_period = 100; # " Period"
input long_stdev = 4.25; # "Deviation"
input showSignals = yes; # "Labels"
input signalLookback = 3;
input plotsLines = yes; # "Plot Lines"
input showBand1 = yes; # "Level 1 Bands"
input showBand2 = yes; # "Level 2 Bands"
def na = Double.NaN;
def n_first = short_period;
def n_second = med_period;
def n_third = long_period;
DefineGlobalColor("up", CreateColor(41, 98, 255));
DefineGlobalColor("dn", CreateColor(233, 30, 99));
DefineGlobalColor("up1", CreateColor(0, 18, 68));
DefineGlobalColor("dn1", CreateColor(54, 5, 22));
DefineGlobalColor("up2", CreateColor(0, 38, 144));
DefineGlobalColor("dn2", CreateColor(100, 10, 41));
#bollingers(n, factor = 3) =>
script bollingers {
input src = hlc3;
input len = 20;
input factor = 3;
input MovAvg = AverageType.SIMPLE;
def Avg = MovingAverage(MovAvg, src, len);
def dev = factor * StDev(src, len);
def bolu = Avg + dev;
def bold = Avg - dev;
plot up = bolu;
plot dn = bold;
}
script nadaraya {
input src = hlc3;
input h = 6;
input n = 500;
def bar = AbsValue(BarNumber());
def den = 2 * Sqr(h);
def gk_sum = if Bar == 0 then
fold i = 0 to n with p do
p + Exp(- Sqr(i) / den) else gk_sum[1];
def smoothed = fold j = 0 to n with q do
q + src[j] * Exp(- Sqr(j) / den) / gk_sum;
plot out = smoothed;
}
def BOLU_FIRST = bollingers(src, n_first, short_stdev, BollingerMovAvgType).up;
def BOLD_FIRST = bollingers(src, n_first, short_stdev, BollingerMovAvgType).dn;
def BOLU_SECOND = bollingers(src, n_second, short_stdev, BollingerMovAvgType).up;
def BOLD_SECOND = bollingers(src, n_second, short_stdev, BollingerMovAvgType).dn;
def BOLU_THIRD = bollingers(src, n_third, med_stdev, BollingerMovAvgType).up;
def BOLD_THIRD = bollingers(src, n_third, med_stdev, BollingerMovAvgType).dn;
def BOLU_FOURTH = bollingers(src, n_third, long_stdev, BollingerMovAvgType).up;
def BOLD_FOURTH = bollingers(src, n_third, long_stdev, BollingerMovAvgType).dn;
def pivot_high = high < Highest(src, signalLookback);
def pivot_low = low > Lowest (src, signalLookback);
def n = 500;
def smoothed_bolu_1 = nadaraya(BOLU_FIRST, SmoothingFactor, n);
def smoothed_bold_1 = nadaraya(BOLD_FIRST, SmoothingFactor, n);
def smoothed_bolu_2 = nadaraya(BOLU_SECOND, SmoothingFactor, n);
def smoothed_bold_2 = nadaraya(BOLD_SECOND, SmoothingFactor, n);
def smoothed_bolu_3 = nadaraya(BOLU_THIRD, SmoothingFactor, n);
def smoothed_bold_3 = nadaraya(BOLD_THIRD, SmoothingFactor, n);
def smoothed_bolu_4 = nadaraya(BOLU_FOURTH, SmoothingFactor, n);
def smoothed_bold_4 = nadaraya(BOLD_FOURTH, SmoothingFactor, n);
def BOLU_FIRST_PLOT = smoothed_bolu_1;
def BOLD_FIRST_PLOT = smoothed_bold_1;
def BOLU_SECOND_PLOT = smoothed_bolu_2;
def BOLD_SECOND_PLOT = smoothed_bold_2;
def BOLU_THIRD_PLOT = smoothed_bolu_3;
def BOLD_THIRD_PLOT = smoothed_bold_3;
def BOLU_FOURTH_PLOT = smoothed_bolu_4;
def BOLD_FOURTH_PLOT = smoothed_bold_4;
plot bearLine = if plotsLines then BOLU_FIRST_PLOT else na;
plot bullLine = if plotsLines then BOLD_FIRST_PLOT else na;
bearLine.SetLineWeight(2);
bullLine.SetLineWeight(2);
bearLine.SetDefaultColor(GlobalColor("dn"));
bullLine.SetDefaultColor(GlobalColor("up"));
AddCloud(if showBand1 then BOLU_FIRST_PLOT else na, BOLU_SECOND_PLOT, GlobalColor("dn1"), GlobalColor("dn1"), yes);
AddCloud(if showBand1 then BOLD_FIRST_PLOT else na, BOLD_SECOND_PLOT, GlobalColor("up1"), GlobalColor("up1"), yes);
AddCloud(if showBand2 then BOLU_SECOND_PLOT else na, BOLU_THIRD_PLOT, GlobalColor("dn2"), GlobalColor("dn2"));
AddCloud(if showBand2 then BOLD_SECOND_PLOT else na, BOLD_THIRD_PLOT, GlobalColor("up2"), GlobalColor("up2"));
def upper_band_test = pivot_high and src crosses BOLU_FIRST_PLOT;
def lower_band_test = pivot_low and src crosses BOLD_FIRST_PLOT;
def cntUp = if upper_band_test then 0 else cntUp[1] + 1;
def cntDn = if lower_band_test then 0 else cntDn[1] + 1;
AddChartBubble(showSignals and cntUp == 2, high, "S", Color.RED);
AddChartBubble(showSignals and cntDn == 2, low, "B", Color.GREEN, no);
#-- END of CODE