Pine Script用数组循环重构斐波那契指标仅生成单条线问题求解
问题根因
你当前的问题核心是f_drawLabel和f_drawLine函数内部使用了var修饰的单个标签/线条对象,var变量只会在脚本加载时初始化1次,循环多次调用函数时始终操作同一个对象,每次调用都会覆盖上一次的属性设置,所以最后只会保留最后一次循环(对应1.0档位)的配置。
解决方案
采用数组存储每个斐波那契档位对应的标签和线条对象,初始化时一次性创建对应数量的对象,后续更新时直接修改数组中对应索引的对象属性即可,无需删除重建,完全符合性能要求。
修改后的完整代码
//@version=4 study("Auto Fibonacci Retracement v2 arrays", overlay = true, max_bars_back = 5000) max_bars_back(time, 5000) // ————— Color constants var color C_BULL = color.blue var color C_BEAR = color.red var color C_BLACK = color.black var color C_GRAY = color.gray var color C_GREEN = color.green var color C_RED = color.red var color C_INVISIBLE = color.new(color.black, 100) // } // —————————— Inputs { int i_lookback = input(500, "Lookback") // } // —————————— Functions { // ————— Function which calculates Fibonacci Retracement levels f_fibonacci(_isReversed, _highest, _lowest, _n) => _isReversed ? (_highest - _lowest) * _n + _lowest : _highest - (_highest - _lowest) * _n // } // —————————— 预初始化对象数组 { float[] fibRatios = array.from(0.000, 0.236, 0.382, 0.500, 0.618, 0.786, 0.886, 1.000) var int fibCount = array.size(fibRatios) // 预创建对应数量的标签和线条对象,仅初始化1次 var label[] fibLabels = array.new_label(fibCount) var line[] fibLines = array.new_line(fibCount) // 初始化空对象 for i = 0 to fibCount - 1 array.set(fibLabels, i, label.new(na, na, na, xloc.bar_index, yloc.price, color(na), label.style_label_left, na, size.normal, text.align_center, "")) array.set(fibLines, i, line.new(na, na, na, na, xloc.bar_index, extend.none, color(na), line.style_solid, 2)) // } // —————————— Calculations { fibHighest = highest(i_lookback) fibLowest = lowest(i_lookback) fibHighestBars = highestbars(high, i_lookback) fibLowestBars = lowestbars(low, i_lookback) fibIsReversed = fibHighestBars < fibLowestBars fibStartIndex = (fibLowestBars < fibHighestBars ? bar_index[-fibLowestBars] : bar_index[-fibHighestBars]) // } // —————————— 批量更新绘图对象属性 { if barstate.islast for int i = 0 to fibCount - 1 float ratio = array.get(fibRatios, i) float fX = f_fibonacci(fibIsReversed, fibHighest, fibLowest, ratio) color fXColor = color.blue // 按索引更新对应档位的标签 label currLbl = array.get(fibLabels, i) label.set_xy(currLbl, bar_index, fX) label.set_text(currLbl, tostring(ratio, "#.###") + " (" + tostring(fX, "#.########") + ")") label.set_color(currLbl, C_INVISIBLE) label.set_textcolor(currLbl, fXColor) // 按索引更新对应档位的线条 line currLn = array.get(fibLines, i) line.set_xy1(currLn, fibStartIndex, fX) line.set_xy2(currLn, bar_index, fX) line.set_color(currLn, fXColor) // }
核心修改说明
- 移除了原有的单对象绘图函数,改为全局预初始化和斐波那契档位数量一致的标签、线条对象数组,仅在脚本加载时创建一次,无额外性能开销
- 每次新K线生成触发
barstate.islast时,遍历数组按索引更新对应档位的对象属性,不会出现覆盖问题 - 全程没有使用
delete操作,完全符合要求,所有对象都可以自动更新最新的斐波那契数值
内容的提问来源于stack exchange,提问作者nop
相关产品推荐
相关产品推荐

