如何在价格首次站上Ichimoku Cloud时仅绘制一次向上箭头?
需求说明
希望在价格站上Ichimoku云(一目均衡表云层)时仅绘制一次向上箭头,箭头不会重复显示,直到下一次价格站上云的事件发生。
现有代码
//@version=5 indicator(title='My Ichimoku Cloud', shorttitle='Ichimoku', overlay=true) conversionPeriods = input.int(9, minval=1, title='Conversion Line Periods') basePeriods = input.int(26, minval=1, title='Base Line Periods') laggingSpan2Periods = input.int(52, minval=1, title='Lagging Span 2 Periods') displacement = input.int(26, minval=1, title='Displacement') donchian(len) => math.avg(ta.lowest(len), ta.highest(len)) conversionLine = donchian(conversionPeriods) baseLine = donchian(basePeriods) leadLine1 = math.avg(conversionLine, baseLine) leadLine2 = donchian(laggingSpan2Periods) plot(conversionLine, color=color.new(#00e5ff, 0), title='Conversion Line') plot(baseLine, color=color.new(color.orange, 0), title='Base Line') plot(close, offset=-displacement + 1, color=color.new(#459915, 0), title='Lagging Span', display=display.none) p1 = plot(leadLine1, offset=displacement - 1, color=color.new(color.green, 0), title='Lead 1', display=display.none) p2 = plot(leadLine2, offset=displacement - 1, color=color.new(color.red, 0), title='Lead 2', display=display.none) fill(p1, p2, color=leadLine1 > leadLine2 ? color.new(color.green, 90) : color.new(color.red, 90)) topOfCloudLine = float(na) priceAboveCloud = bool(na) if leadLine1 > leadLine2 topOfCloudLine := leadLine1 else if leadLine1 < leadLine2 topOfCloudLine := leadLine2 if close > topOfCloudLine priceAboveCloud := true plotshape(priceAboveCloud, style=shape.arrowup, location=location.abovebar, color=color.new(color.green, 0), size=size.tiny, offset = displacement + 1)
当前问题
现有代码会在价格处于云层上方的每一根K线都绘制向上箭头,无法实现“仅触发一次”的需求。
修改后的代码
//@version=5 indicator(title='My Ichimoku Cloud', shorttitle='Ichimoku', overlay=true) conversionPeriods = input.int(9, minval=1, title='转换线周期') basePeriods = input.int(26, minval=1, title='基准线周期') laggingSpan2Periods = input.int(52, minval=1, title='延迟线2周期') displacement = input.int(26, minval=1, title='偏移量') donchian(len) => math.avg(ta.lowest(len), ta.highest(len)) // 计算一目均衡表各线 conversionLine = donchian(conversionPeriods) baseLine = donchian(basePeriods) leadLine1 = math.avg(conversionLine, baseLine) leadLine2 = donchian(laggingSpan2Periods) // 绘制各线与云层 plot(conversionLine, color=color.new(#00e5ff, 0), title='转换线') plot(baseLine, color=color.new(color.orange, 0), title='基准线') plot(close, offset=-displacement + 1, color=color.new(#459915, 0), title='延迟线', display=display.none) p1 = plot(leadLine1, offset=displacement - 1, color=color.new(color.green, 0), title='领先线1', display=display.none) p2 = plot(leadLine2, offset=displacement - 1, color=color.new(color.red, 0), title='领先线2', display=display.none) fill(p1, p2, color=leadLine1 > leadLine2 ? color.new(color.green, 90) : color.new(color.red, 90)) // 确定云层顶部 topOfCloudLine = leadLine1 > leadLine2 ? leadLine1 : leadLine2 // 检测首次站上云层的信号:当前收盘价在云层上方,且前一根K线不在云层上方 priceCrossAboveCloud = close > topOfCloudLine and close[1] <= topOfCloudLine[1] // 仅在首次站上云层时绘制箭头 plotshape(priceCrossAboveCloud, style=shape.arrowup, location=location.abovebar, color=color.new(color.green, 0), size=size.tiny, offset = displacement + 1)
关键修改点
- 简化
topOfCloudLine的赋值逻辑,用三元运算符替代嵌套if,更简洁高效 - 新增
priceCrossAboveCloud变量,通过对比当前和前一根K线的收盘价与云层顶部的位置,判断是否为首次站上云层的时刻 - 修改
plotshape的触发条件为priceCrossAboveCloud,确保箭头仅在价格从云层下方突破到上方的那根K线显示,后续持续在云层上方时不再重复绘制
内容的提问来源于stack exchange,提问作者avereux
相关产品推荐
相关产品推荐

