Pine Script跨周期MACD与Stoch指标获取及代码报错求助
Pine Script跨周期MACD与Stoch指标问题解决
问题1:MACD跨周期告警触发当前周期而非60分钟
原因
原代码中f_get_60_macd()函数仅返回参数列表,未在60分钟周期内实际计算MACD数据,导致request.security获取的不是目标周期的MACD指标值,而是当前周期的参数变量。
解决方法
重构函数逻辑,在函数内部完成MACD的计算,确保request.security能拉取到60分钟周期的真实MACD线、信号线和柱状值:
// 修正后的MACD计算函数 f_get_macd(src, fast_len, slow_len, signal_len) => [macdLine, signalLine, histLine] = ta.macd(src, fast_len, slow_len, signal_len) macd_already_up = (macdLine > signalLine and histLine > histLine[1]) or (macdLine > macdLine[1] and histLine > histLine[1]) macd_already_dn = (macdLine < signalLine and histLine < histLine[1]) or (macdLine > signalLine and histLine < histLine[1]) macd_trend_state = macd_already_up ? 1 : macd_already_dn ? -1 : 0 [macdLine, signalLine, histLine, macd_trend_state]
调用时传入配置好的输入参数,确保跨周期计算使用指定参数:
// 获取60分钟周期MACD数据 [macdLine60, signalLine60, histLine60, macd_trend_state_60] = request.security(syminfo.tickerid, "60", f_get_macd(close, fastMAlen, slowMAlen, signalmacdlen), barmerge.gaps_off, barmerge.lookahead_on)
问题2:跨周期获取Stoch的K、D值并联动输入参数
原因
原代码直接在request.security中调用ta.stoch,但ta.stoch仅输出原始随机值,未计算平滑后的K、D线,且未正确传递输入参数到目标周期。
解决方法
编写Stoch计算函数,在目标周期内完成K、D值的计算,确保输入参数联动生效:
// Stoch计算函数 f_get_stoch(src, rsi_len, stoch_len, smooth_k, smooth_d) => rsi_val = ta.rsi(src, rsi_len) stoch_val = ta.stoch(rsi_val, rsi_val, rsi_val, stoch_len) k_line = ta.sma(stoch_val, smooth_k) d_line = ta.sma(k_line, smooth_d) [k_line, d_line]
通过request.security获取目标周期的K、D值:
// 获取5分钟周期Stoch的K、D值 [k5, d5] = request.security(syminfo.tickerid, "5", f_get_stoch(stoch_src, lengthRSI, stoch_length, smoothK, smoothD), barmerge.gaps_off, barmerge.lookahead_on)
问题3:MACD函数语法错误修复
原因
- 重复定义
f_get_macd()函数 - 函数声明语法错误:函数定义行直接返回参数列表,未正确定义输入参数和缩进函数体
- 函数调用与定义不匹配:调用时传递参数,但函数未声明接收参数
解决方法
移除重复定义,修正函数语法,正确声明参数并缩进函数体(Pine Script要求函数体必须缩进):
// 修正后的MACD函数 fastMAlen = input.int(12, minval=1, title="MACD快线周期") slowMAlen = input.int(26, minval=1, title="MACD慢线周期") signalmacdlen = input.int(9, minval=1, title="MACD信号线周期") f_get_macd(src, fast_len, slow_len, signal_len) => [macdLine, signalLine, histLine] = ta.macd(src, fast_len, slow_len, signal_len) macd_already_up = (macdLine > signalLine and histLine > histLine[1]) or (macdLine > macdLine[1] and histLine > histLine[1]) macd_already_dn = (macdLine < signalLine and histLine < histLine[1]) or (macdLine > signalLine and histLine < histLine[1]) macd_trend_state = macd_already_up ? 1 : macd_already_dn ? -1 : 0 macd_trend_state
完整修正代码
//@version=5 indicator("跨周期MACD与Stoch指标", overlay=false) // ---------------------- MACD参数与函数 ---------------------- fastMAlen = input.int(12, minval=1, title="MACD快线周期") slowMAlen = input.int(26, minval=1, title="MACD慢线周期") signalmacdlen = input.int(9, minval=1, title="MACD信号线周期") // MACD计算函数 f_get_macd(src, fast_len, slow_len, signal_len) => [macdLine, signalLine, histLine] = ta.macd(src, fast_len, slow_len, signal_len) macd_already_up = (macdLine > signalLine and histLine > histLine[1]) or (macdLine > macdLine[1] and histLine > histLine[1]) macd_already_dn = (macdLine < signalLine and histLine < histLine[1]) or (macdLine > signalLine and histLine < histLine[1]) macd_trend_state = macd_already_up ? 1 : macd_already_dn ? -1 : 0 [macdLine, signalLine, histLine, macd_trend_state] // 获取60分钟周期MACD数据 [macdLine60, signalLine60, histLine60, macd_trend_state_60] = request.security(syminfo.tickerid, "60", f_get_macd(close, fastMAlen, slowMAlen, signalmacdlen), barmerge.gaps_off, barmerge.lookahead_on) // 60分钟MACD告警 if macd_trend_state_60 == 1 message = "60m MACD趋势向上 " + syminfo.ticker alert(message, alert.freq_once_per_bar_close) // 获取5分钟周期MACD趋势状态 macd_trend_state_5 = request.security(syminfo.tickerid, "5", f_get_macd(close, fastMAlen, slowMAlen, signalmacdlen)[3], barmerge.gaps_off) // ---------------------- Stoch参数与函数 ---------------------- stochGroup = "随机指标设置" stoch_length = input.int(14, title = 'K线周期', minval=1 , group = stochGroup) smoothK = input.int(3, 'K线平滑周期', group = stochGroup) smoothD = input.int(3, "D线平滑周期", group = stochGroup) OverBought = input.int(80, title="超买阈值", group = stochGroup) OverSold = input.int(20, title="超卖阈值", group = stochGroup) lengthRSI = input.int(14, "RSI周期", minval=1, group = stochGroup) stoch_src = input(close, title="RSI数据源", group = stochGroup) // Stoch计算函数 f_get_stoch(src, rsi_len, stoch_len, smooth_k, smooth_d) => rsi_val = ta.rsi(src, rsi_len) stoch_val = ta.stoch(rsi_val, rsi_val, rsi_val, stoch_len) k_line = ta.sma(stoch_val, smooth_k) d_line = ta.sma(k_line, smooth_d) [k_line, d_line] // 当前周期Stoch计算 [k, d] = f_get_stoch(stoch_src, lengthRSI, stoch_length, smoothK, smoothD) // 获取5分钟周期Stoch的K、D值 [k5, d5] = request.security(syminfo.tickerid, "5", f_get_stoch(stoch_src, lengthRSI, stoch_length, smoothK, smoothD), barmerge.gaps_off, barmerge.lookahead_on) // 绘制指标 plot(k, color=color.blue, title="Stoch K") plot(d, color=color.red, title="Stoch D") hline(OverBought, "超买", color=color.red) hline(OverSold, "超卖", color=color.green)
内容的提问来源于stack exchange,提问作者Juz
相关产品推荐
相关产品推荐

