"$d_web"'CompLangs/PineScript/TradingView auto fib extension.txt" www.BillHowell.ca 16Mar2021 copy from standard PineScript library //@version=4 study("Auto Fib Extension", overlay=true) depth = input(title="Depth", type=input.integer, defval=10, minval=1, inline = "Pivots") reverse = input(false, "Reverse") var extendLeft = input(false, "Extend Left    |    Extend Right", inline = "Extend Lines") var extendRight = input(true, "", inline = "Extend Lines") var extending = extend.none if extendLeft and extendRight extending := extend.both if extendLeft and not extendRight extending := extend.left if not extendLeft and extendRight extending := extend.right prices = input(true, "Show Prices") levels = input(true, "Show Levels", inline = "Levels") levelsFormat = input("Values", "", options = ["Values", "Percent"], inline = "Levels") labelsPosition = input("Left", "Labels Position", options = ["Left", "Right"]) var float upperThreshold = 0.236 var float lowerThreshold = 1.0 var line lineLastHL = na var line lineLastLH = na var line lineLast = na var float iLastH = 0 var float iLastL = 0 var float pLastH = 0 var float pLastL = 0 var float[] iPivotsH = array.new_float() var float[] iPivotsL = array.new_float() var float[] pPivotsH = array.new_float() var float[] pPivotsL = array.new_float() var isHighLast = false var float startPrice = na var float endPrice = na var float diff = na pivots(src, length, isHigh) => l2 = length * 2 c = nz(src[length]) ok = true for i = 0 to l2 if isHigh and src[i] > c ok := false if not isHigh and src[i] < c ok := false if ok [bar_index[length], c] else [int(na), float(na)] [iH, pH] = pivots(high, depth / 2, true) [iL, pL] = pivots(low, depth / 2, false) countPivotsH = array.size(iPivotsH) countPivotsL = array.size(iPivotsL) if countPivotsH > 0 and countPivotsL > 0 iLastH := array.get(iPivotsH, countPivotsH-1) iLastL := array.get(iPivotsL, countPivotsL-1) isHighLast := iLastH > iLastL iLastH := 1 if isHighLast if not na(iH) pLastH := array.get(pPivotsH, countPivotsH-1) if pH > pLastH array.set(iPivotsH, countPivotsH-1, iH) array.set(pPivotsH, countPivotsH-1, pH) iH := na else if not na(iL) pLastL := array.get(pPivotsL, countPivotsL-1) if pL < pLastL array.set(iPivotsL, countPivotsL-1, iL) array.set(pPivotsL, countPivotsL-1, pL) iL := na if not na(iH) array.push(iPivotsH, iH) array.push(pPivotsH, pH) if not na(iL) array.push(iPivotsL, iL) array.push(pPivotsL, pL) pPivotsHCopy = array.copy(pPivotsH) pPivotsLCopy = array.copy(pPivotsL) iPivotsHCopy = array.copy(iPivotsH) iPivotsLCopy = array.copy(iPivotsL) if barstate.islast for j = bar_index to 0 if array.size(iPivotsHCopy) == 0 or array.size(iPivotsLCopy) == 0 break iLastH := array.pop(iPivotsHCopy) iLastL := array.pop(iPivotsLCopy) pLastH := array.pop(pPivotsHCopy) pLastL := array.pop(pPivotsLCopy) iPrevPivot = 0.0 pPrevPivot = 0.0 isHighLast := iLastH > iLastL if isHighLast for i = array.size(iPivotsHCopy)-1 to 0 if i < 0 break else if array.get(iPivotsHCopy, i) < iLastL break if array.get(pPivotsHCopy, i) > pLastH iLastH := array.pop(iPivotsHCopy) pLastH := array.pop(pPivotsHCopy) else array.remove(iPivotsHCopy, i) array.remove(pPivotsHCopy, i) else for i = array.size(iPivotsLCopy)-1 to 0 if i < 0 break else if array.get(iPivotsLCopy, i) < iLastH break if array.get(pPivotsLCopy, i) < pLastL iLastL := array.pop(iPivotsLCopy) pLastL := array.pop(pPivotsLCopy) else array.remove(iPivotsLCopy, i) array.remove(pPivotsLCopy, i) if array.size(iPivotsHCopy) == 0 or array.size(iPivotsLCopy) == 0 break isHighLast := iLastH > iLastL if isHighLast iPrevPivot := array.get(iPivotsHCopy, array.size(iPivotsHCopy)-1) pPrevPivot := array.get(pPivotsHCopy, array.size(iPivotsHCopy)-1) else iPrevPivot := array.get(iPivotsLCopy, array.size(iPivotsLCopy)-1) pPrevPivot := array.get(pPivotsLCopy, array.size(iPivotsLCopy)-1) if isHighLast startPrice := pPrevPivot endPrice := pLastL diff := abs(startPrice - endPrice) if pLastH > endPrice + diff * lowerThreshold or pLastH < endPrice + diff * upperThreshold array.push(iPivotsLCopy, iLastL) array.push(pPivotsLCopy, pLastL) continue line.delete(lineLastHL) line.delete(lineLastLH) line.delete(lineLast) lineLastHL := line.new(int(iPrevPivot), pPrevPivot, int(iLastL), pLastL, color=color.red, width=1, style=line.style_dashed) lineLastLH := line.new(int(iLastL), pLastL, int(iLastH), pLastH, color=color.green, width=1, style=line.style_dashed) lineLast := lineLastLH else startPrice := pPrevPivot endPrice := pLastH diff := abs(startPrice - endPrice) if pLastL < endPrice - diff * lowerThreshold or pLastL > endPrice - diff * upperThreshold array.push(iPivotsHCopy, iLastH) array.push(pPivotsHCopy, pLastH) continue line.delete(lineLastHL) line.delete(lineLastLH) line.delete(lineLast) lineLastLH := line.new(int(iPrevPivot), pPrevPivot, int(iLastH), pLastH, color=color.red, width=1, style=line.style_dashed) lineLastHL := line.new(int(iLastH), pLastH, int(iLastL), pLastL, color=color.green, width=1, style=line.style_dashed) lineLast := lineLastHL break _draw_line(price, col) => var id = line.new(0, price, 0, price, color=col, width=1, extend=extending) if not na(lineLast) line.set_xy1(id, line.get_x1(lineLast), price) line.set_xy2(id, line.get_x2(lineLast), price) _draw_label(price, txt, txtColor) => if not na(price) x = labelsPosition == "Left" ? line.get_x1(lineLast) : not extendRight ? line.get_x2(lineLast) : bar_index labelStyle = labelsPosition == "Left" ? label.style_label_right : label.style_label_left align = labelsPosition == "Left" ? text.align_right : text.align_left labelsAlignStrLeft = txt + '\n ‏ ‏ ‏ ‏ ‏ ‏ ‏ ‏ ‏ ‏ ‏ ‏ ‏ ‏ ‏ ‏ ‏ ‏ ‏ ‏ ‏ ‏ ‏ ‏ ‏ ‏ ‏ ‏ ‏ ‏ ‏ ‏ ‏ ‏ ‏ \n' labelsAlignStrRight = ' ' + txt + '\n ‏ ‏ ‏ ‏ ‏ ‏ ‏ ‏ ‏ ‏ ‏ ‏ ‏ ‏ ‏ ‏ ‏ ‏ ‏ ‏ ‏ ‏ ‏ ‏ ‏ ‏ ‏ ‏ ‏ ‏ ‏ ‏ ‏ ‏ ‏ \n' labelsAlignStr = labelsPosition == "Left" ? labelsAlignStrLeft : labelsAlignStrRight var id = label.new(x=x, y=price, text=labelsAlignStr, textcolor=txtColor, style=labelStyle, textalign=align, color=#00000000) label.set_xy(id, x, price) label.set_text(id, labelsAlignStr) label.set_textcolor(id, txtColor) _wrap(txt) => "(" + tostring(txt, "#.##") + ")" _label_txt(level, price) => if not na(price) l = levelsFormat == "Values" ? tostring(level) : tostring(level * 100) + "%" (levels ? l : "") + (prices ? _wrap(price) : "") _crossing_level(sr, r) => (r > sr and r < sr[1]) or (r < sr and r > sr[1]) diff := (isHighLast ? -1 : 1) * abs(startPrice - endPrice) offset = isHighLast ? line.get_y1(lineLastLH) - line.get_y2(lineLastLH) : line.get_y1(lineLastHL) - line.get_y2(lineLastHL) offset := (isHighLast ? -1 : 1) * abs(offset) processLevel(show, value, colorL) => float m = value r = (endPrice - offset) + ((reverse ? -1 : 1) * diff * m) if show _draw_line(r, colorL) _draw_label(r, _label_txt(m, r), colorL) if _crossing_level(close, r) alert("Autofib: " + syminfo.ticker + " crossing level " + tostring(value)) show_0 = input(true, "", inline = "Level0") value_0 = input(0, "", inline = "Level0") color_0 = input(#787b86, "", inline = "Level0") processLevel(show_0, value_0, color_0) show_0_236 = input(true, "", inline = "Level0") value_0_236 = input(0.236, "", inline = "Level0") color_0_236 = input(#f44336, "", inline = "Level0") processLevel(show_0_236, value_0_236, color_0_236) show_0_382 = input(true, "", inline = "Level1") value_0_382 = input(0.382, "", inline = "Level1") color_0_382 = input(#81c784, "", inline = "Level1") processLevel(show_0_382, value_0_382, color_0_382) show_0_5 = input(true, "", inline = "Level1") value_0_5 = input(0.5, "", inline = "Level1") color_0_5 = input(#4caf50, "", inline = "Level1") processLevel(show_0_5, value_0_5, color_0_5) show_0_618 = input(true, "", inline = "Level2") value_0_618 = input(0.618, "", inline = "Level2") color_0_618 = input(#009688, "", inline = "Level2") processLevel(show_0_618, value_0_618, color_0_618) show_0_65 = input(false, "", inline = "Level2") value_0_65 = input(0.65, "", inline = "Level2") color_0_65 = input(#009688, "", inline = "Level2") processLevel(show_0_65, value_0_65, color_0_65) show_0_786 = input(true, "", inline = "Level3") value_0_786 = input(0.786, "", inline = "Level3") color_0_786 = input(#64b5f6, "", inline = "Level3") processLevel(show_0_786, value_0_786, color_0_786) show_1 = input(true, "", inline = "Level3") value_1 = input(1, "", inline = "Level3") color_1 = input(#787b86, "", inline = "Level3") processLevel(show_1, value_1, color_1) show_1_272 = input(false, "", inline = "Level4") value_1_272 = input(1.272, "", inline = "Level4") color_1_272 = input(#81c784, "", inline = "Level4") processLevel(show_1_272, value_1_272, color_1_272) show_1_414 = input(false, "", inline = "Level4") value_1_414 = input(1.414, "", inline = "Level4") color_1_414 = input(#f44336, "", inline = "Level4") processLevel(show_1_414, value_1_414, color_1_414) show_1_618 = input(true, "", inline = "Level5") value_1_618 = input(1.618, "", inline = "Level5") color_1_618 = input(#2196f3, "", inline = "Level5") processLevel(show_1_618, value_1_618, color_1_618) show_1_65 = input(false, "", inline = "Level5") value_1_65 = input(1.65, "", inline = "Level5") color_1_65 = input(#2196f3, "", inline = "Level5") processLevel(show_1_65, value_1_65, color_1_65) show_2_618 = input(true, "", inline = "Level6") value_2_618 = input(2.618, "", inline = "Level6") color_2_618 = input(#f44336, "", inline = "Level6") processLevel(show_2_618, value_2_618, color_2_618) show_2_65 = input(false, "", inline = "Level6") value_2_65 = input(2.65, "", inline = "Level6") color_2_65 = input(#f44336, "", inline = "Level6") processLevel(show_2_65, value_2_65, color_2_65) show_3_618 = input(true, "", inline = "Level7") value_3_618 = input(3.618, "", inline = "Level7") color_3_618 = input(#9c27b0, "", inline = "Level7") processLevel(show_3_618, value_3_618, color_3_618) show_3_65 = input(false, "", inline = "Level7") value_3_65 = input(3.65, "", inline = "Level7") color_3_65 = input(#9c27b0, "", inline = "Level7") processLevel(show_3_65, value_3_65, color_3_65) show_4_236 = input(true, "", inline = "Level8") value_4_236 = input(4.236, "", inline = "Level8") color_4_236 = input(#e91e63, "", inline = "Level8") processLevel(show_4_236, value_4_236, color_4_236) show_4_618 = input(false, "", inline = "Level8") value_4_618 = input(4.618, "", inline = "Level8") color_4_618 = input(#81c784, "", inline = "Level8") processLevel(show_4_618, value_4_618, color_4_618) show_neg_0_236 = input(false, "", inline = "Level9") value_neg_0_236 = input(-0.236, "", inline = "Level9") color_neg_0_236 = input(#f44336, "", inline = "Level9") processLevel(show_neg_0_236, value_neg_0_236, color_neg_0_236) show_neg_0_382 = input(false, "", inline = "Level9") value_neg_0_382 = input(-0.382, "", inline = "Level9") color_neg_0_382 = input(#81c784, "", inline = "Level9") processLevel(show_neg_0_382, value_neg_0_382, color_neg_0_382) show_neg_0_618 = input(false, "", inline = "Level10") value_neg_0_618 = input(-0.618, "", inline = "Level10") color_neg_0_618 = input(#009688, "", inline = "Level10") processLevel(show_neg_0_618, value_neg_0_618, color_neg_0_618) show_neg_0_65 = input(false, "", inline = "Level10") value_neg_0_65 = input(-0.65, "", inline = "Level10") color_neg_0_65 = input(#009688, "", inline = "Level10") processLevel(show_neg_0_65, value_neg_0_65, color_neg_0_65)