如何根据价格在蜡烛中的位置为line.new定义上影线、下影线及实体对应颜色
问题分析与修正方案
首先得指出你代码里的几个核心逻辑错误,这些问题直接导致了需求无法实现:
UW = max(open, close) > high这个条件永远不可能成立——K线的high本身就是该周期内的最高价,实体顶部(max(open,close))必然≤high,所以红色永远不会被触发。LW = low < min(open, close)是在判断K线是否存在下影线,而不是当前价格处于下影线区域,逻辑完全偏离了你的需求。CandleBody = max(open, close) < min(open, close) and max(open, close) > min(open, close)是矛盾的——最大值不可能同时小于且大于最小值,这个条件永远不成立。
正确的区域判断逻辑
我们先明确蜡烛各区域的定义,再针对当前价格(这里默认用close,如果需要实时价格可直接沿用)做判断:
- 实体顶部:
bodyTop = math.max(open, close) - 实体底部:
bodyBottom = math.min(open, close) - 上影线区域:价格 > 实体顶部(即价格落在实体顶部到K线最高价之间)
- 下影线区域:价格 < 实体底部(即价格落在K线最低价到实体底部之间)
- 实体范围内:价格在实体底部和顶部之间(包含边界)
修正后的完整代码
//@version=5 indicator("Candle Zone Line Color", overlay=true) // 计算蜡烛实体的顶部与底部 bodyTop = math.max(open, close) bodyBottom = math.min(open, close) // 定义要判断的目标价格(这里用当前K线收盘价,可按需替换) targetPrice = close // 判断价格所处的蜡烛区域 inUpperWick = targetPrice > bodyTop inLowerWick = targetPrice < bodyBottom inBody = not inUpperWick and not inLowerWick // 显示开关输入 show_BTSL = input(true, title="Show Candle Color", type=input.bool) // 确定线条颜色 lineColor = show_BTSL ? inUpperWick ? color.red : inLowerWick ? color.green : color.blue : na // 示例:绘制一条跟随价格的水平线,颜色随区域变化 var line priceLine = na if barstate.islast if show_BTSL priceLine := line.new(bar_index - 20, targetPrice, bar_index, targetPrice, color=lineColor, width=2) else line.delete(priceLine)
代码说明
- 先计算实体的顶底值,这是区域判断的基础;
- 用
targetPrice对应你要判断的价格(如果是实时价格,直接用close即可,Pine Script会自动更新); - 通过三个布尔值明确价格所处的区域;
- 最后根据区域结果设置线条颜色,示例里绘制了一条跟随价格的水平线,你可以根据自己的需求调整
line.new的起点、终点等参数。
内容的提问来源于stack exchange,提问作者frien_dd
相关产品推荐
相关产品推荐

