Pine Script策略:记录绘制上次买卖后最高价功能异常求助
解决上次买卖后最高价的记录与绘制问题
我看了你的代码,核心问题出在maxSinceLastBuySell的计算逻辑上——你误用了highest(bar_index),这个函数返回的是K线索引的最大值,而非价格维度的历史高点,这直接导致绘制结果不符合预期。另外,你也没有在每次开仓时重置高点记录,没法准确追踪从开仓以来的最高价。
下面是修正后的完整代码,我会逐一解释关键优化点:
//@version=4 strategy(title="Max since last buy/sell", overlay=true, process_orders_on_close=true) // —————————— 状态 hasOpenTrade = strategy.opentrades != 0 notHasOpenTrade = strategy.opentrades == 0 isLong = strategy.position_size > 0 isShort = strategy.position_size < 0 // —————————— 变量 var float entryPrice = na var float maxSinceEntry = na // 用于记录开仓后的最高价 var int candle = na // 补全原代码未定义的变量 // —————————— 核心逻辑:更新开仓后的最高价 if notHasOpenTrade maxSinceEntry := na // 无持仓时重置为na else // 持仓时,持续更新为当前高点与历史记录的较大值 maxSinceEntry := max(maxSinceEntry, high) // —————————— 交易执行:开仓时初始化最高价记录 longCondition = crossover(sma(close, 14), sma(close, 28)) if (longCondition) entryPrice := close candle := 1 maxSinceEntry := high // 开多单时,初始最高价设为当前K线高点 strategy.entry("My Long Entry Id", strategy.long) shortCondition = crossunder(sma(close, 14), sma(close, 28)) if (shortCondition) entryPrice := close candle := 1 maxSinceEntry := high // 开空单时,同样初始最高价设为当前K线高点 strategy.entry("My Short Entry Id", strategy.short) // —————————— 调试绘图 plot(entryPrice, color = color.green, title="Entry Price") plot(candle, color = color.black, title="Entry Candle Marker") plot(maxSinceEntry, color = color.red, title="Max Since Last Entry", style=style.line)
关键优化说明:
- 变量初始化:用
var float maxSinceEntry = na定义一个持久化变量,确保不会在每个K线周期重复初始化,无持仓时重置为na,避免绘制多余的线条。 - 开仓时重置:每次开多/空单时,把
maxSinceEntry设为当前K线的高点,确保从开仓时刻开始追踪最高价。 - 持仓时更新:在有持仓的每个K线周期,用
max(maxSinceEntry, high)持续更新最高价,保证记录的是开仓以来的最高价格。 - 补全未定义变量:原代码中的
candle变量没有提前定义,这里补上var int candle = na避免编译报错。
这样修改后,红色线条就能准确绘制出上次开仓操作后的最高价,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Hugo
相关产品推荐
相关产品推荐

