如何为基于line.new的Fourier价格外推指标创建颜色切换警报?
解决Fourier Extrapolator of Price指标的颜色切换警报问题
原指标通过line.new直接绘制颜色,但没有保留趋势状态,无法直接触发颜色切换警报。核心思路是提取指标的趋势判断逻辑,保存历史趋势状态,检测状态切换时触发警报。
修改后的完整代码
// This source code is subject to the terms of the Mozilla Public License 2. at https://mozilla.org/MPL/2./ // © loxx // 新增警报功能 //@version=5 indicator("Fourier Extrapolator of Price [Loxx] + Alert", shorttitle = "FEP [Loxx] + Alert", overlay = true, max_lines_count = 500) greencolor = #2DD204 redcolor = #D2042D src = input.source(open, "Source") npast = input.int(400, "Past Bars", maxval = 500) nharm = input.int(20, "Harmonic Period", minval = 1) frqtol = input.float(0.0001, "Frequency Tolerance") // 封装xm数组计算逻辑为函数 f_calculate_xm() => x = array.new<float>(npast, 0.) xm = array.new<float>(npast, 0.) av = 0. for i = 0 to npast - 1 array.set(x, i, nz(src[i])) av += array.get(x, i) av /= npast for i = 0 to npast - 1 array.set(xm, i, av) beta = 0. alpha = 0. w = 0., m= 0., a= 0., b= 0. z = array.new<float>(npast, 0.) for harm = 1 to nharm alpha := 0. beta := 2. array.set(z, 0, array.get(x, 0) - array.get(xm, 0)) while math.abs(alpha - beta) > frqtol alpha := beta array.set(z, 1, array.get(x, 1) - array.get(xm, 1) + alpha * array.get(z, 0)) num = array.get(z, 0) * array.get(z, 1) den = array.get(z, 0) * array.get(z, 0) for i = 2 to npast - 1 array.set(z, i, array.get(x, i) - array.get(xm, i) + alpha * array.get(z, i - 1) - array.get(z, i - 2)) num += array.get(z, i - 1) * (array.get(z, i) + array.get(z, i - 2)) den += array.get(z, i - 1) * array.get(z, i - 1) beta := num / den w := math.acos(beta / 2.) Sc = 0., Ss = 0., Scc = 0. Sss = 0., Scs = 0., Sx = 0. Sxc = 0., Sxs = 0., den = 0. n = npast for i = 0 to npast - 1 c = math.cos(w * i) s = math.sin(w * i) dx = array.get(x, i) - array.get(xm, i) Sc += c Ss += s Scc += c * c Sss += s * s Sx += dx Sxc += dx * c Sxs += dx * s Sc /= n Ss /= n Scc /= n Sss /= n Scs /= n Sx /= n Sxc /= n Sxs /= n if (w == 0.) m := Sx a := 0. b := 0. else den := math.pow(Scs - Sc * Ss, 2) - (Scc - Sc * Sc) * (Sss - Ss * Ss) a := ((Sxs - Sx * Ss) * (Scs - Sc * Ss) - (Sxc - Sx * Sc) * (Sss - Ss * Ss)) / den b := ((Sxc - Sx * Sc) * (Scs - Sc * Ss) - (Sxs - Sx * Ss) * (Scc - Sc * Sc)) / den m := Sx - a * Sc - b * Ss for i = 0 to npast - 1 array.set(xm, i, array.get(xm, i) + m + a * math.cos(w * i) + b * math.sin(w * i)) xm // 计算xm数组 xm = f_calculate_xm() // 获取最近两个点的数值 current_val = array.get(xm, 0) prev_val = array.get(xm, 1) // 标记当前趋势:1=绿色(上升),0=红色(下降) current_trend = current_val > prev_val ? 1 : 0 // 保存上一根K线的趋势状态(var关键字确保仅初始化一次) var int prev_trend = na // 检测趋势切换:当前与上一次趋势不同,且上一次状态有效 trend_switch = prev_trend != current_trend and not na(prev_trend) // 设置警报触发条件 alertcondition(trend_switch, title="FEP 颜色切换警报", message="Fourier Extrapolator of Price 指标颜色发生切换!") // 保留原指标的画线逻辑 if barstate.islast for i = 0 to array.size(xm) - 1 colorout = i < array.size(xm)-2 ? array.get(xm, i) > array.get(xm, i + 1) ? greencolor : redcolor : na line1 = line.new(bar_index - i + 1, array.get(xm, i), bar_index - i, array.get(xm, i), width=6, color=colorout, style=line.style_solid) // 更新历史趋势状态 prev_trend := current_trend
关键修改说明
- 封装计算逻辑:把原代码中计算xm数组的核心逻辑封装成函数,方便获取计算结果用于趋势判断。
- 提取趋势状态:通过对比最近两个点的数值,判断当前是绿色上升趋势还是红色下降趋势。
- 保存历史状态:用
var定义变量保存上一根K线的趋势状态,避免每次K线更新都重置。 - 触发警报:当趋势状态发生切换时,通过
alertcondition触发警报,你可以在TradingView的警报设置中配置通知方式。
修改后的指标完全保留原功能,同时新增颜色切换警报触发能力。
内容的提问来源于stack exchange,提问作者Stan George
相关产品推荐
相关产品推荐

