Untitled
unknown
plain_text
2 years ago
19 kB
112
Indexable
//@version=5 indicator(title="MA Ribbon R5.2 + Support Resistance", overlay=true) // --- Script 1: MA Ribbon R5.2 by JustUncleL --- // Use Alternate Anchor TF for MAs anchor = input.int(0, minval=0, title='Set to an Anchor TimeFrame in mins (0=none, 1D=1440, 1W=7200)') showRibbon = input(false, title='Show Ribbon If Chart TF Greater Than Anchor TF') // Fast MA - type, length fastType = input.string(defval='EMA', title='Fast MA Type: ', options=['SMA', 'EMA', 'WMA', 'VWMA', 'SMMA', 'DEMA', 'TEMA', 'LAGMA', 'LINREG', 'HullMA', 'ZEMA', 'TMA', 'SSMA']) fastLen = input.int(defval=5, title='Fast MA - Length', minval=1) fastGamma = input(defval=0.33, title='Fast MA - Gamma for LAGMA') // Medium MA - type, length mediumType = input.string(defval='EMA', title='Medium MA Type: ', options=['SMA', 'EMA', 'WMA', 'VWMA', 'SMMA', 'DEMA', 'TEMA', 'LAGMA', 'LINREG', 'HullMA', 'ZEMA', 'TMA', 'SSMA']) mediumLen = input.int(defval=1, title='Medium MA - Length (1=disabled)', minval=1) mediumGamma = input(defval=0.55, title='Medium MA - Gamma for LAGMA') // Slow MA - type, length slowType = input.string(defval='EMA', title='Slow MA Type: ', options=['SMA', 'EMA', 'WMA', 'VWMA', 'SMMA', 'DEMA', 'TEMA', 'LAGMA', 'LINREG', 'HullMA', 'ZEMA', 'TMA', 'SSMA']) slowLen = input.int(defval=22, title='Slow MA - Length', minval=2) slowGamma = input(defval=0.77, title='Slow MA - Gamma for LAGMA') // ma_src = input(close, title='MA Source') sBars = input(false, title='Show Coloured Bars') uGrabClr = input(false, title='Use Grab Bar 6-tone Colours, instead of Standard 3-tone') uOpen = input(false, title='Candles must open and close outside ribbon Colouring') // ShowMACross = input(false, title='Show MA Cross Alerts') // ShowSwing = input(false, title='Show Swing Alerts') rFilter = input(false, title='Filter Swing Alerts to Ribbon Colour') dFilter = input(false, title='Filter Swing Alerts to Fast MA Directional Slope') // // - INPUTS END // Constants colours that include fully non-transparent option. green100 = #008000FF lime100 = #00FF00FF red100 = #FF0000FF blue100 = #0000FFFF aqua100 = #00FFFFFF darkred100 = #8B0000FF gray100 = #808080FF // - FUNCTIONS // - variant(type, src, len, gamma) // Returns MA input selection variant, default to SMA if blank or typo. // SuperSmoother filter // © 2013 John F. Ehlers variant_supersmoother(src, len) => a1 = math.exp(-1.414 * 3.14159 / len) b1 = 2 * a1 * math.cos(1.414 * 3.14159 / len) c2 = b1 c3 = -a1 * a1 c1 = 1 - c2 - c3 v9 = 0.0 v9 := c1 * (src + nz(src[1])) / 2 + c2 * nz(v9[1]) + c3 * nz(v9[2]) v9 variant_smoothed(src, len) => v5 = 0.0 sma_1 = ta.sma(src, len) v5 := na(v5[1]) ? sma_1 : (v5[1] * (len - 1) + src) / len v5 variant_zerolagema(src, len) => xLag = (len - 1) / 2 xEMA = src + src - src[xLag] v10 = ta.ema(xEMA, len) v10 variant_doubleema(src, len) => v2 = ta.ema(src, len) v6 = 2 * v2 - ta.ema(v2, len) v6 variant_tripleema(src, len) => v2 = ta.ema(src, len) v7 = 3 * (v2 - ta.ema(v2, len)) + ta.ema(ta.ema(v2, len), len) // Triple Exponential v7 //calc Laguerre variant_lag(p, g) => L0 = 0.0 L1 = 0.0 L2 = 0.0 L3 = 0.0 L0 := (1 - g) * p + g * nz(L0[1]) L1 := -g * L0 + nz(L0[1]) + g * nz(L1[1]) L2 := -g * L1 + nz(L1[1]) + g * nz(L2[1]) L3 := -g * L2 + nz(L2[1]) + g * nz(L3[1]) f = (L0 + 2 * L1 + 2 * L2 + L3) / 6 f // return variant, defaults to SMA variant(type, src, len, g) => result = src if len > 1 ema_1 = ta.ema(src, len) wma_1 = ta.wma(src, len) vwma_1 = ta.vwma(src, len) variant_smoothed__1 = variant_smoothed(src, len) variant_doubleema__1 = variant_doubleema(src, len) variant_tripleema__1 = variant_tripleema(src, len) variant_lag__1 = variant_lag(src, g) linreg_1 = ta.linreg(src, len, 0) wma_2 = ta.wma(src, len / 2) wma_3 = ta.wma(src, len) wma_4 = ta.wma(2 * wma_2 - wma_3, math.round(math.sqrt(len))) variant_supersmoother__1 = variant_supersmoother(src, len) variant_zerolagema__1 = variant_zerolagema(src, len) sma_1 = ta.sma(src, len) sma_2 = ta.sma(sma_1, len) sma_3 = ta.sma(src, len) result := type == 'EMA' ? ema_1 : type == 'WMA' ? wma_1 : type == 'VWMA' ? vwma_1 : type == 'SMMA' ? variant_smoothed__1 : type == 'DEMA' ? variant_doubleema__1 : type == 'TEMA' ? variant_tripleema__1 : type == 'LAGMA' ? variant_lag__1 : type == 'LINREG' ? linreg_1 : type == 'HullMA' ? wma_4 : type == 'SSMA' ? variant_supersmoother__1 : type == 'ZEMA' ? variant_zerolagema__1 : type == 'TMA' ? sma_2 : sma_3 result //end if result // - /variant // - FUNCTIONS END // Make sure we have minimum channel spread. LengthSlow_ = slowLen //fastType==slowType?(slowLen-slowLen)<1?slowLen+1:slowLen : slowLen //what is the 1st Anchor (normally current chart TF) currentTFmins = timeframe.isintraday ? timeframe.multiplier : timeframe.isdaily ? timeframe.multiplier * 1440 : timeframe.isweekly ? timeframe.multiplier * 7200 : timeframe.ismonthly ? timeframe.multiplier * 30240 : timeframe.multiplier // function to caculate multiplier from anchor time frame (TF is in mins) multAnchor(anchor) => mult = 1 if timeframe.isintraday mult := anchor > 0 ? timeframe.multiplier <= 0 ? 1 : timeframe.multiplier >= anchor ? 1 : math.round(anchor / timeframe.multiplier) : 1 mult else mult := anchor > 0 ? timeframe.isdaily ? anchor <= 1440 ? 1 : math.round(anchor / 1440) : timeframe.isweekly ? anchor <= 7200 ? 1 : math.round(anchor / 7200) : timeframe.ismonthly ? anchor <= 30240 ? 1 : math.round(anchor / 30240) : 1 : 1 mult //end if mult // get multipliers for each time frame mult = multAnchor(anchor) // Adjust MA lengths with Anchor multiplier LengthFast = mult == 1 ? fastLen : fastLen * mult LengthMedium = mult == 1 ? mediumLen : mediumLen * mult LengthSlow = mult == 1 ? LengthSlow_ : LengthSlow_ * mult //plotshape(interval,location=location.bottom) // Get the two MAs fastMA = variant(fastType, ma_src, LengthFast, fastGamma) slowMA = variant(slowType, ma_src, LengthSlow, slowGamma) variant__1 = variant(mediumType, ma_src, LengthMedium, mediumGamma) mediumMA = mediumLen == 1 ? na : variant__1 showRibbonFlag = showRibbon or anchor == 0 or currentTFmins <= anchor fDirection = 0 sDirection = 0 //mDirection = 0 fDirection := hlc3 > fastMA ? 1 : hlc3 < fastMA ? -1 : nz(fDirection[1], 1) sDirection := hlc3 > slowMA ? 1 : hlc3 < slowMA ? -1 : nz(sDirection[1], 1) //mDirection := LengthMedium==1 ? na : hlc3 > mediumMA ? 1 : hlc3 < mediumMA ? -1 : nz(mDirection[1],1) //Plot the Ribbon fastMA_ = plot(showRibbonFlag ? fastMA : na, color=fDirection == 1 ? color.green : color.red, style=plot.style_line, join=true, linewidth=1, title='Fast MA', transp=20) slowMA_ = plot(showRibbonFlag ? slowMA : na, color=sDirection == 1 ? color.green : color.red, style=plot.style_line, join=true, linewidth=1, title='Slow MA', transp=20) plot(showRibbonFlag ? mediumMA : na, color=sDirection == 1 ? color.green : color.red, style=plot.style_circles, join=true, linewidth=1, title='Medium MA', transp=20) fcolor = fastMA > slowMA ? color.green : color.red fill(fastMA_, slowMA_, color=fcolor, title='Ribbon Fill', transp=80) // Colour bars according to the close position relative to the MA selected // Or Grab candle colour code bars according to the close position relative to the MA selected grabcol = uGrabClr ? close >= open ? hlc3 > fastMA and hlc3 > slowMA and (not uOpen or open > fastMA and open > slowMA) ? lime100 : hlc3 < fastMA and hlc3 < slowMA and (not uOpen or open < fastMA and open < slowMA) ? red100 : aqua100 : hlc3 > fastMA and hlc3 > slowMA and (not uOpen or open > fastMA and open > slowMA) ? green100 : hlc3 < fastMA and hlc3 < slowMA and (not uOpen or open < fastMA and open < slowMA) ? darkred100 : blue100 : na grabcol := uGrabClr ? grabcol : hlc3 > fastMA and hlc3 > slowMA and (not uOpen or open > fastMA and open > slowMA) ? lime100 : hlc3 < fastMA and hlc3 < slowMA and (not uOpen or open < fastMA and open < slowMA) ? red100 : gray100 barcolor(showRibbonFlag and sBars and not ShowMACross ? grabcol : na, title='Bar Colours') // Generate Alert Arrows // buy = 0 sell = 0 buyT = 0 sellT = 0 // Generate signal by Candle Colour buy := grabcol == lime100 or grabcol == green100 ? nz(buy[1]) + 1 : 0 sell := grabcol == red100 or grabcol == darkred100 ? nz(sell[1]) + 1 : 0 // Trend Filter falling_1 = ta.falling(fastMA, 2) buyT := buy == 0 ? 0 : rFilter and fastMA < slowMA or dFilter and falling_1 ? 0 : nz(buyT[1]) + 1 rising_1 = ta.rising(fastMA, 2) sellT := sell == 0 ? 0 : rFilter and fastMA > slowMA or dFilter and rising_1 ? 0 : nz(sellT[1]) + 1 // Exit conditions exitbuy = nz(buyT[1]) > 0 and buyT == 0 exitsell = nz(sellT[1]) > 0 and sellT == 0 // plotarrow(showRibbonFlag and ShowSwing and buyT == 1 ? 1 : na, title='BUY Swing Arrow', colorup=color.new(color.lime, 20), maxheight=60, minheight=50) plotarrow(showRibbonFlag and ShowSwing and sellT == 1 ? -1 : na, title='SELL Swing Arrow', colordown=color.new(color.red, 20), maxheight=60, minheight=50) // plotshape(showRibbonFlag and ShowSwing and exitbuy, title='BUY Exit', style=shape.xcross, location=location.belowbar, color=color.new(color.gray, 0), text='Exit\nBuy', offset=0) plotshape(showRibbonFlag and ShowSwing and exitsell, title='Sell Exit', style=shape.xcross, location=location.abovebar, color=color.new(color.gray, 0), text='Exit\nSell', offset=0) // MA trend bar color TrendingUp = fastMA > slowMA TrendingDown = fastMA < slowMA barcolor(showRibbonFlag and sBars and ShowMACross ? TrendingUp ? color.green : TrendingDown ? color.red : color.blue : na) // MA cross alert MAcrossing = ta.cross(fastMA, slowMA) ? fastMA : na plot(showRibbonFlag and ShowMACross ? MAcrossing : na, style=plot.style_cross, linewidth=4, color=color.new(color.black, 0)) // MA cross background color alert Uptrend = TrendingUp and TrendingDown[1] Downtrend = TrendingDown and TrendingUp[1] bgcolor(showRibbonFlag and ShowMACross ? Uptrend ? color.green : Downtrend ? color.red : na : na, transp=50) // Buy and sell alert XBuy = 0 XBuy := nz(XBuy[1]) XSell = 0 XSell := nz(XSell[1]) XBuy := TrendingUp and close > close[1] ? XBuy + 1 : TrendingDown or XBuy == 0 ? 0 : XBuy + 1 XSell := TrendingDown and close < close[1] ? XSell + 1 : TrendingUp or XSell == 0 ? 0 : XSell + 1 plotshape(showRibbonFlag and ShowMACross and XBuy == 1 ? close : na, color=color.new(color.black, 0), style=shape.triangleup, text='XBuy', location=location.bottom, size=size.small) plotshape(showRibbonFlag and ShowMACross and XSell == 1 ? close : na, color=color.new(color.black, 0), style=shape.triangledown, text='XSell', location=location.top, size=size.small) // //plotshape(showRibbonFlag and ShowMACross and exitbuy, title='BUY Exit', style=shape.xcross, location=location.belowbar, color=gray, text="Exit\nBuy", offset=0,transp=0) //plotshape(showRibbonFlag and ShowMACross and exitsell, title='Sell Exit', style=shape.xcross, location=location.abovebar, color=gray, text="Exit\nSell", offset=0,transp=0) // Generate Alarms alertcondition(showRibbonFlag and buyT == 1, title='BUY Alert', message='BUY') alertcondition(showRibbonFlag and sellT == 1, title='SELL Alert', message='SELL') alertcondition(showRibbonFlag and XBuy == 1, title='X BUY Alert', message='X BUY') alertcondition(showRibbonFlag and XSell == 1, title='X SELL Alert', message='X SELL') alertcondition(showRibbonFlag and exitbuy, title='BUY Exit Alert', message='ExitBuy') alertcondition(showRibbonFlag and exitsell, title='SELL Exit Alert', message='ExitSell') //eof // --- Script 2: Support Reistance - Dynamic v2 --- prd = input.int(defval=10, title='Pivot Period', minval=4, maxval=30, group='Setup') ppsrc = input.string(defval='High/Low', title='Source', options=['High/Low', 'Close/Open'], group='Setup') maxnumpp = input.int(defval=20, title=' Maximum Number of Pivot', minval=5, maxval=100, group='Setup') ChannelW = input.int(defval=10, title='Maximum Channel Width %', minval=1, group='Setup') maxnumsr = input.int(defval=5, title=' Maximum Number of S/R', minval=1, maxval=10, group='Setup') min_strength = input.int(defval=2, title=' Minimum Strength', minval=1, maxval=10, group='Setup') labelloc = input.int(defval=20, title='Label Location', group='Colors', tooltip='Positive numbers reference future bars, negative numbers reference histical bars') linestyle = input.string(defval='Dashed', title='Line Style', options=['Solid', 'Dotted', 'Dashed'], group='Colors') linewidth = input.int(defval=2, title='Line Width', minval=1, maxval=4, group='Colors') resistancecolor = input.color(defval=color.red, title='Resistance Color', group='Colors') supportcolor = input.color(defval=color.lime, title='Support Color', group='Colors') showpp = input(false, title='Show Point Points') float src1 = ppsrc == 'High/Low' ? high : math.max(close, open) float src2 = ppsrc == 'High/Low' ? low : math.min(close, open) float ph = ta.pivothigh(src1, prd, prd) float pl = ta.pivotlow(src2, prd, prd) plotshape(ph and showpp, text='H', style=shape.labeldown, color=na, textcolor=color.new(color.red, 0), location=location.abovebar, offset=-prd) plotshape(pl and showpp, text='L', style=shape.labelup, color=na, textcolor=color.new(color.lime, 0), location=location.belowbar, offset=-prd) Lstyle = linestyle == 'Dashed' ? line.style_dashed : linestyle == 'Solid' ? line.style_solid : line.style_dotted //calculate maximum S/R channel zone width prdhighest = ta.highest(300) prdlowest = ta.lowest(300) cwidth = (prdhighest - prdlowest) * ChannelW / 100 var pivotvals = array.new_float(0) if ph or pl array.unshift(pivotvals, ph ? ph : pl) if array.size(pivotvals) > maxnumpp // limit the array size array.pop(pivotvals) get_sr_vals(ind) => float lo = array.get(pivotvals, ind) float hi = lo int numpp = 0 for y = 0 to array.size(pivotvals) - 1 by 1 float cpp = array.get(pivotvals, y) float wdth = cpp <= lo ? hi - cpp : cpp - lo if wdth <= cwidth // fits the max channel width? if cpp <= hi lo := math.min(lo, cpp) else hi := math.max(hi, cpp) numpp += 1 numpp [hi, lo, numpp] var sr_up_level = array.new_float(0) var sr_dn_level = array.new_float(0) sr_strength = array.new_float(0) find_loc(strength) => ret = array.size(sr_strength) for i = ret > 0 ? array.size(sr_strength) - 1 : na to 0 by 1 if strength <= array.get(sr_strength, i) break ret := i ret ret check_sr(hi, lo, strength) => ret = true for i = 0 to array.size(sr_up_level) > 0 ? array.size(sr_up_level) - 1 : na by 1 //included? if array.get(sr_up_level, i) >= lo and array.get(sr_up_level, i) <= hi or array.get(sr_dn_level, i) >= lo and array.get(sr_dn_level, i) <= hi if strength >= array.get(sr_strength, i) array.remove(sr_strength, i) array.remove(sr_up_level, i) array.remove(sr_dn_level, i) ret else ret := false ret break ret var sr_lines = array.new_line(11, na) var sr_labels = array.new_label(11, na) for x = 1 to 10 by 1 rate = 100 * (label.get_y(array.get(sr_labels, x)) - close) / close label.set_text(array.get(sr_labels, x), text=str.tostring(label.get_y(array.get(sr_labels, x))) + '(' + str.tostring(rate, '#.##') + '%)') label.set_x(array.get(sr_labels, x), x=bar_index + labelloc) label.set_color(array.get(sr_labels, x), color=label.get_y(array.get(sr_labels, x)) >= close ? color.red : color.lime) label.set_textcolor(array.get(sr_labels, x), textcolor=label.get_y(array.get(sr_labels, x)) >= close ? color.white : color.black) label.set_style(array.get(sr_labels, x), style=label.get_y(array.get(sr_labels, x)) >= close ? label.style_label_down : label.style_label_up) line.set_color(array.get(sr_lines, x), color=line.get_y1(array.get(sr_lines, x)) >= close ? resistancecolor : supportcolor) if ph or pl //because of new calculation, remove old S/R levels array.clear(sr_up_level) array.clear(sr_dn_level) array.clear(sr_strength) //find S/R zones for x = 0 to array.size(pivotvals) - 1 by 1 [hi, lo, strength] = get_sr_vals(x) if check_sr(hi, lo, strength) loc = find_loc(strength) // if strength is in first maxnumsr sr then insert it to the arrays if loc < maxnumsr and strength >= min_strength array.insert(sr_strength, loc, strength) array.insert(sr_up_level, loc, hi) array.insert(sr_dn_level, loc, lo) // keep size of the arrays = 5 if array.size(sr_strength) > maxnumsr array.pop(sr_strength) array.pop(sr_up_level) array.pop(sr_dn_level) for x = 1 to 10 by 1 line.delete(array.get(sr_lines, x)) label.delete(array.get(sr_labels, x)) for x = 0 to array.size(sr_up_level) > 0 ? array.size(sr_up_level) - 1 : na by 1 float mid = math.round_to_mintick((array.get(sr_up_level, x) + array.get(sr_dn_level, x)) / 2) rate = 100 * (mid - close) / close array.set(sr_labels, x + 1, label.new(x=bar_index + labelloc, y=mid, text=str.tostring(mid) + '(' + str.tostring(rate, '#.##') + '%)', color=mid >= close ? color.red : color.lime, textcolor=mid >= close ? color.white : color.black, style=mid >= close ? label.style_label_down : label.style_label_up)) array.set(sr_lines, x + 1, line.new(x1=bar_index, y1=mid, x2=bar_index - 1, y2=mid, extend=extend.both, color=mid >= close ? resistancecolor : supportcolor, style=Lstyle, width=linewidth)) f_crossed_over() => ret = false for x = 0 to array.size(sr_up_level) > 0 ? array.size(sr_up_level) - 1 : na by 1 float mid = math.round_to_mintick((array.get(sr_up_level, x) + array.get(sr_dn_level, x)) / 2) if close[1] <= mid and close > mid ret := true ret ret f_crossed_under() => ret = false for x = 0 to array.size(sr_up_level) > 0 ? array.size(sr_up_level) - 1 : na by 1 float mid = math.round_to_mintick((array.get(sr_up_level, x) + array.get(sr_dn_level, x)) / 2) if close[1] >= mid and close < mid ret := true ret ret alertcondition(f_crossed_over(), title='Resistance Broken', message='Resistance Broken') alertcondition(f_crossed_under(), title='Support Broken', message='Support Broken') // End of the combined script
Editor is loading...
Leave a Comment