// This work is licensed under a Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0) https://creativecommons.org/licenses/by-nc-sa/4.0/ // © LuxAlgo //@version=5 indicator("Nadaraya-Watson Envelope [LuxAlgo]",overlay=true,max_bars_back=1000,max_lines_count=500,max_labels_count=500) length = input.float(500,'Window Size',maxval=500,minval=0) h = input.float(8.,'Bandwidth') mult = input.float(3.) src = input.source(close,'Source') up_col = input.color(#39ff14,'Colors',inline='col') dn_col = input.color(#ff1100,'',inline='col') disclaimer = input(false, 'Hide Disclaimer') //---- n = bar_index var k = 2 var upper = array.new_line(0) var lower = array.new_line(0) lset(l,x1,y1,x2,y2,col)=> line.set_xy1(l,x1,y1) line.set_xy2(l,x2,y2) line.set_color(l,col) line.set_width(l,2) if barstate.isfirst for i = 0 to length/k-1 array.push(upper,line.new(na,na,na,na)) array.push(lower,line.new(na,na,na,na)) //---- line up = na line dn = na //---- cross_up = 0. cross_dn = 0. if barstate.islast y = array.new_float(0) sum_e = 0. for i = 0 to length-1 sum = 0. sumw = 0. for j = 0 to length-1 w = math.exp(-(math.pow(i-j,2)/(h*h*2))) sum += src[j]*w sumw += w y2 = sum/sumw sum_e += math.abs(src[i] - y2) array.push(y,y2) mae = sum_e/length*mult for i = 1 to length-1 y2 = array.get(y,i) y1 = array.get(y,i-1) up := array.get(upper,i/k) dn := array.get(lower,i/k) lset(up,n-i+1,y1 + mae,n-i,y2 + mae,up_col) lset(dn,n-i+1,y1 - mae,n-i,y2 - mae,dn_col) if src[i] > y1 + mae and src[i+1] < y1 + mae label.new(n-i,src[i],'▼',color=#00000000,style=label.style_label_down,textcolor=dn_col,textalign=text.align_center) if src[i] < y1 - mae and src[i+1] > y1 - mae label.new(n-i,src[i],'▲',color=#00000000,style=label.style_label_up,textcolor=up_col,textalign=text.align_center) cross_up := array.get(y,0) + mae cross_dn := array.get(y,0) - mae alertcondition(ta.crossover(src,cross_up),'Down','Down') alertcondition(ta.crossunder(src,cross_dn),'Up','Up') //---- var tb = table.new(position.top_right, 1, 1 , bgcolor = #35202b) if barstate.isfirst and not disclaimer table.cell(tb, 0, 0, 'Nadaraya-Watson Envelope [LUX] Repaints' , text_size = size.small , text_color = #cc2f3c) CM MACD //------New V2 Update 07-28-2021---------- //Thanks to @SKTennis for help in Updating code to V2 //Added Groups to Settings Pane. //Added Color Plots to Settings Pane //Switched MTF Logic to turn ON/OFF automatically w/ TradingView's Built in Feature //Updated Color Transparency plots to work in future update //Added Ability to Turn ON/OFF Show MacD & Signal Line //Added Ability to Turn ON/OFF Show Histogram //Added Ability to Change MACD Line Colors Based on Trend //Added Ability to Highlight Price Bars Based on Trend //Added Alerts to Settings Pane. //Customized how Alerts work. Must keep Checked in Settings Pane, and... //When you go to Alerts Panel, Change Symbol to Indicator (CM_Ult_MacD_MTF_V2) //Customized Alerts to Show Symbol, TimeFrame, Closing Price, MACD Crosses Up & MACD Crosses Down Signals in Alert //Alerts are Pre-Set to only Alert on Bar Close //------New V2.1 Update 08-03-2021---------- //Added back in ability to show Dots when MACD Crosses. //Added Ability to Change Plot Widths in Settings Pane //Added in Alert Feature where Cross Up if above 0 or cross down if below 0 (OFF By Default) user Request. @creid58 //FIXED - Plot Orders to Default what Plots are on top of each other //FIXED - Two of the histogrm colors were backwrds //------New V2.1 Update 12-07-2021---------- //Updated to PineScript V5 //------Minor Update 02-16-2022---------- //Per user request...Increased the Maxval for Signal Smoothing //Next Add in Plot Types to Settings Pane. //Next Add in more Moving Average types. //See Video for Detailed Overview //@version=5 indicator(title="_CM_MacD_Ult_MTF_V2.1", shorttitle="_CM_Ult_MacD_MTF_V2.1") //Plot Inputs res = input.timeframe("", "Indicator TimeFrame") fast_length = input.int(title="Fast Length", defval=12) slow_length = input.int(title="Slow Length", defval=26) src = input.source(title="Source", defval=close) signal_length = input.int(title="Signal Smoothing", minval = 1, maxval = 999, defval = 9) sma_source = input.string(title="Oscillator MA Type", defval="EMA", options=["SMA", "EMA"]) sma_signal = input.string(title="Signal Line MA Type", defval="EMA", options=["SMA", "EMA"]) // Show Plots T/F show_macd = input.bool(true, title="Show MACD Lines", group="Show Plots?", inline="SP10") show_macd_LW = input.int(3, minval=0, maxval=5, title = "MACD Width", group="Show Plots?", inline="SP11") show_signal_LW= input.int(2, minval=0, maxval=5, title = "Signal Width", group="Show Plots?", inline="SP11") show_Hist = input.bool(true, title="Show Histogram", group="Show Plots?", inline="SP20") show_hist_LW = input.int(5, minval=0, maxval=5, title = "-- Width", group="Show Plots?", inline="SP20") show_trend = input.bool(true, title = "Show MACD Lines w/ Trend Color", group="Show Plots?", inline="SP30") show_HB = input.bool(false, title="Show Highlight Price Bars", group="Show Plots?", inline="SP40") show_cross = input.bool(false, title = "Show BackGround on Cross", group="Show Plots?", inline="SP50") show_dots = input.bool(true, title = "Show Circle on Cross", group="Show Plots?", inline="SP60") show_dots_LW = input.int(5, minval=0, maxval=5, title = "-- Width", group="Show Plots?", inline="SP60") //show_trend = input(true, title = "Colors MACD Lines w/ Trend Color", group="Show Plots?", inline="SP5") // MACD Lines colors col_macd = input.color(#FF6D00, "MACD Line  ", group="Color Settings", inline="CS1") col_signal = input.color(#2962FF, "Signal Line  ", group="Color Settings", inline="CS1") col_trnd_Up = input.color(#4BAF4F, "Trend Up      ", group="Color Settings", inline="CS2") col_trnd_Dn = input.color(#B71D1C, "Trend Down    ", group="Color Settings", inline="CS2") // Histogram Colors col_grow_above = input.color(#26A69A, "Above   Grow", group="Histogram Colors", inline="Hist10") col_fall_above = input.color(#B2DFDB, "Fall", group="Histogram Colors", inline="Hist10") col_grow_below = input.color(#FF5252, "Below Grow", group="Histogram Colors", inline="Hist20") col_fall_below = input.color(#FFCDD2, "Fall", group="Histogram Colors", inline="Hist20") // Alerts T/F Inputs alert_Long = input.bool(true, title = "MACD Cross Up", group = "Alerts", inline="Alert10") alert_Short = input.bool(true, title = "MACD Cross Dn", group = "Alerts", inline="Alert10") alert_Long_A = input.bool(false, title = "MACD Cross Up & > 0", group = "Alerts", inline="Alert20") alert_Short_B = input.bool(false, title = "MACD Cross Dn & < 0", group = "Alerts", inline="Alert20") // Calculating fast_ma = request.security(syminfo.tickerid, res, sma_source == "SMA" ? ta.sma(src, fast_length) : ta.ema(src, fast_length)) slow_ma = request.security(syminfo.tickerid, res, sma_source == "SMA" ? ta.sma(src, slow_length) : ta.ema(src, slow_length)) macd = fast_ma - slow_ma signal = request.security(syminfo.tickerid, res, sma_signal == "SMA" ? ta.sma(macd, signal_length) : ta.ema(macd, signal_length)) hist = macd - signal // MACD Trend and Cross Up/Down conditions trend_up = macd > signal trend_dn = macd < signal cross_UP = signal[1] >= macd[1] and signal < macd cross_DN = signal[1] <= macd[1] and signal > macd cross_UP_A = (signal[1] >= macd[1] and signal < macd) and macd > 0 cross_DN_B = (signal[1] <= macd[1] and signal > macd) and macd < 0 // Condition that changes Color of MACD Line if Show Trend is turned on.. trend_col = show_trend and trend_up ? col_trnd_Up : trend_up ? col_macd : show_trend and trend_dn ? col_trnd_Dn: trend_dn ? col_macd : na //Var Statements for Histogram Color Change var bool histA_IsUp = false var bool histA_IsDown = false var bool histB_IsDown = false var bool histB_IsUp = false histA_IsUp := hist == hist[1] ? histA_IsUp[1] : hist > hist[1] and hist > 0 histA_IsDown := hist == hist[1] ? histA_IsDown[1] : hist < hist[1] and hist > 0 histB_IsDown := hist == hist[1] ? histB_IsDown[1] : hist < hist[1] and hist <= 0 histB_IsUp := hist == hist[1] ? histB_IsUp[1] : hist > hist[1] and hist <= 0 hist_col = histA_IsUp ? col_grow_above : histA_IsDown ? col_fall_above : histB_IsDown ? col_grow_below : histB_IsUp ? col_fall_below :color.silver // Plot Statements //Background Color bgcolor(show_cross and cross_UP ? col_trnd_Up : na, editable=false) bgcolor(show_cross and cross_DN ? col_trnd_Dn : na, editable=false) //Highlight Price Bars barcolor(show_HB and trend_up ? col_trnd_Up : na, title="Trend Up", offset = 0, editable=false) barcolor(show_HB and trend_dn ? col_trnd_Dn : na, title="Trend Dn", offset = 0, editable=false) //Regular Plots plot(show_Hist and hist ? hist : na, title="Histogram", style=plot.style_columns, color=color.new(hist_col ,0),linewidth=show_hist_LW) plot(show_macd and signal ? signal : na, title="Signal", color=color.new(col_signal, 0), style=plot.style_line ,linewidth=show_signal_LW) plot(show_macd and macd ? macd : na, title="MACD", color=color.new(trend_col, 0), style=plot.style_line ,linewidth=show_macd_LW) hline(0, title="0 Line", color=color.new(color.gray, 0), linestyle=hline.style_dashed, linewidth=1, editable=false) plot(show_dots and cross_UP ? macd : na, title="Dots", color=color.new(trend_col ,0), style=plot.style_circles, linewidth=show_dots_LW, editable=false) plot(show_dots and cross_DN ? macd : na, title="Dots", color=color.new(trend_col ,0), style=plot.style_circles, linewidth=show_dots_LW, editable=false) //Alerts if alert_Long and cross_UP alert("Symbol = (" + syminfo.tickerid + ") TimeFrame = (" + timeframe.period + ") Current Price (" + str.tostring(close) + ") MACD Crosses Up.", alert.freq_once_per_bar_close) if alert_Short and cross_DN alert("Symbol = (" + syminfo.tickerid + ") TimeFrame = (" + timeframe.period + ") Current Price (" + str.tostring(close) + ") MACD Crosses Down.", alert.freq_once_per_bar_close) //Alerts - Stricter Condition - Only Alerts When MACD Crosses UP & MACD > 0 -- Crosses Down & MACD < 0 if alert_Long_A and cross_UP_A alert("Symbol = (" + syminfo.tickerid + ") TimeFrame = (" + timeframe.period + ") Current Price (" + str.tostring(close) + ") MACD > 0 And Crosses Up.", alert.freq_once_per_bar_close) if alert_Short_B and cross_DN_B alert("Symbol = (" + syminfo.tickerid + ") TimeFrame = (" + timeframe.period + ") Current Price (" + str.tostring(close) + ") MACD < 0 And Crosses Down.", alert.freq_once_per_bar_close) //End Code