EMA上下绘制更高高点/更低低点的Pine Script实现问题
解决Pine Script中基于EMA趋势跟踪动态最高/最低点的问题
问题分析
你当前的代码错误地将布尔序列aboveema/belowema传入ta.highest()/ta.lowest()的长度参数,而该参数要求是整数型的回溯周期数,无法识别布尔条件,因此无法实现“仅在EMA上方跟踪更高高点、EMA下方跟踪更低低点”的逻辑。
实现思路
要达成需求,我们需要:
- 用
var变量持久化存储当前趋势阶段的最高/最低值 - 跟踪趋势状态的切换(价格从EMA下方进入上方,或从上方进入下方),切换时重置对应跟踪值
- 在同一趋势状态内,持续更新最高/最低值,同时在突破新高/新低时重置跟踪起点
修正后的代码
//@version=5 indicator('Highest High, Lowest Low EMA', shorttitle='HHLL EMA', overlay=true) // 输入参数 maPer = input(20, title="EMA周期") topSrc = input(high, title="高点跟踪数据源") botSrc = input(low, title="低点跟踪数据源") // 计算EMA ema = ta.ema(close, maPer) // 判断当前趋势状态 aboveEma = close > ema belowEma = close < ema // 用var变量持久化跟踪当前趋势阶段的最高/最低值 var float currentTop = na var float currentBot = na // 趋势状态切换或突破新高/新低时重置并更新跟踪值 if aboveEma // 刚进入EMA上方趋势,或当前高点突破之前的跟踪高点时重置 if not aboveEma[1] or topSrc > currentTop currentTop := topSrc // 否则持续更新为当前阶段的最高值 else currentTop := math.max(currentTop, topSrc) else // 离开EMA上方趋势,清空跟踪值 currentTop := na if belowEma // 刚进入EMA下方趋势,或当前低点跌破之前的跟踪低点时重置 if not belowEma[1] or botSrc < currentBot currentBot := botSrc // 否则持续更新为当前阶段的最低值 else currentBot := math.min(currentBot, botSrc) else // 离开EMA下方趋势,清空跟踪值 currentBot := na // 绘图 plot(currentTop, 'Highest Band', color=#00ff00, linewidth=2) plot(currentBot, 'Lowest Band', color=#ff0000, linewidth=2) plot(ema, 'Moving Average', color=#00ffff, linewidth=1)
代码说明
- 趋势状态判断:用
aboveEma和belowEma标记当前K线是否收在EMA上下方 - 持久化跟踪变量:
var关键字确保currentTop和currentBot在K线周期内不会被自动重置,仅在指定条件下更新 - 更新逻辑:
- 首次进入EMA上方趋势,或当前高点突破之前跟踪的高点时,重置
currentTop为当前高点 - 在EMA上方趋势持续期间,每次取当前高点与
currentTop的最大值更新 - 离开EMA上方趋势时,将
currentTop设为na,停止绘图 - 低点跟踪逻辑与高点完全对称
- 首次进入EMA上方趋势,或当前高点突破之前跟踪的高点时,重置
- 突破重置:满足“突破新高/新低时重新计数”的需求,每次突破时会从当前K线开始重新跟踪后续的高点/低点
内容的提问来源于stack exchange,提问作者Manish
相关产品推荐
相关产品推荐

