如何在Pine Script中实现有限Fisher Transform的完整多时间框架代码?
多时间框架适配Limited Fisher Transform的实现方案
核心思路是利用Pine Script的request.security()函数,在指定的更高时间框架上完整计算Fisher Transform的所有输出(y、t、f),再将这些值对齐到当前时间框架,后续的计算、绘图和信号标记全部基于这些多时间框架的结果。
步骤1:封装Fisher核心函数
先把你的f_fisher()函数封装成可返回多值的结构,确保内部逻辑包含y、t、f的完整计算:
f_fisher(src, length) => // 这里替换成你已实现的Limited Fisher计算逻辑 highest_high = ta.highest(src, length) lowest_low = ta.lowest(src, length) y = 0.66 * ((src - lowest_low) / (highest_high - lowest_low) - 0.5) + 0.67 * nz(y[1]) y = ta.clamp(y, -0.999, 0.999) f = 0.5 * math.log((1 + y) / (1 - y)) + 0.5 * nz(f[1]) t = ta.sma(f, 9) [y, t, f] // 返回三个核心计算值
步骤2:获取多时间框架的Fisher结果
通过request.security()在目标时间框架上执行函数,拿到对齐到当前K线的多时间框架数据:
//@version=5 indicator("MTF Limited Fisher Transform", overlay=false) // 可配置参数 fisher_length = input.int(10, "Fisher计算周期") higher_tf = input.timeframe("D", "多时间框架选择") // 获取当前时间框架的Fisher值(可选,用于对比) [current_y, current_t, current_f] = f_fisher(close, fisher_length) // 关键:获取多时间框架的y、t、f [mtf_y, mtf_t, mtf_f] = request.security(syminfo.tickerid, higher_tf, f_fisher(close, fisher_length))
步骤3:适配后续计算逻辑
所有原来基于当前时间框架y、t、f的判断,直接替换为多时间框架的变量即可:
// 示例:基于多时间框架的交叉信号判断 bullish_signal = mtf_f crossabove mtf_t bearish_signal = mtf_f crossunder mtf_t // 示例:基于mtf_y的阈值过滤(如果原逻辑有) filtered_bullish = bullish_signal and mtf_y > -0.8
步骤4:绘图与信号标记
直接使用多时间框架的变量完成绘图和信号标记,信号会自动对齐到当前时间框架的K线:
// 绘图:区分当前和多时间框架的Fisher线 plot(current_f, color=color.gray, title="当前时间框架Fisher", linewidth=1) plot(mtf_f, color=color.blue, title="多时间框架Fisher", linewidth=2) plot(mtf_t, color=color.red, title="多时间框架触发线", linewidth=2, style=plot.style_dashed) // 买卖信号标记 plotshape(filtered_bullish, title="多时间框架买入信号", location=location.belowbar, color=color.green, style=shape.triangleup, size=size.small) plotshape(bearish_signal, title="多时间框架卖出信号", location=location.abovebar, color=color.red, style=shape.triangledown, size=size.small)
关键注意点
request.security()会自动处理多时间框架内的历史依赖(比如函数里的nz(y[1])),不需要修改函数内部逻辑。- 如果需要在主图叠加信号,把
indicator()的overlay参数设为true即可。 - 若原逻辑有动态周期或其他参数,只需把参数传入
request.security()内的f_fisher()调用即可。
内容的提问来源于stack exchange,提问作者Demented
相关产品推荐
相关产品推荐

