TradingView Pine Script:金字塔加仓前校验前次入场价格问题求助
解决Pine Script金字塔加仓中前次入场价格无法保留的问题
嘿,我太懂你这个痛点了!在Pine Script里普通变量每次运行到新K线都会被重置,这就是为啥你的lastBuy每次都回到0的原因。别慌,用var关键字声明持久化变量就能搞定——它会在脚本运行全程保留变量值,不会随K线刷新重置。
下面给你一套完整的实现思路和代码示例:
核心要点
- 用
var声明需要跨K线保存的变量(比如前次买入价、加仓次数) - 设定加仓价格折扣阈值(比如比前次买入价低2%才加仓)
- 区分第一次买入和后续加仓的逻辑
- 平仓时重置持久化变量,为下一轮交易做准备
完整代码示例
//@version=5 strategy("金字塔加仓摊平策略", overlay=true, default_qty_type=strategy.cash, default_qty_value=10000, initial_capital=100000, commission_type=strategy.commission.percent, commission_value=0.1) // 输入参数 float discountPerc = input.float("加仓折扣百分比", title="加仓折扣百分比", defval=2.0, minval=0.1, maxval=10.0, tooltip="本次买入价需比前次低该百分比才允许加仓") int maxAddTimes = input.int("最大加仓次数", title="最大加仓次数", defval=3, minval=1, maxval=5) // 持久化变量:跨K线保留值 var float lastBuyPrice = na // 记录前次买入价格,初始为na表示未持仓 var int buyTimes = 0 // 记录已加仓次数 // 入场条件:第一次买入 或 满足折扣条件且未达最大加仓次数 enterCondition = na(lastBuyPrice) or (close <= lastBuyPrice * (1 - discountPerc/100) and buyTimes < maxAddTimes) // 买入逻辑 if (enterCondition) strategy.entry("Buy", strategy.long) // 更新持久化变量:记录当前买入价,加仓次数+1 lastBuyPrice = strategy.position_avg_price buyTimes += 1 label.new(bar_index, low, str.tostring(buyTimes) + "次买入", color=color.green, textcolor=color.white) // 平仓条件:这里用简单的止盈止损示例,你可以换成自己的逻辑 exitCondition = close >= lastBuyPrice * 1.05 or close <= lastBuyPrice * 0.95 if (exitCondition) strategy.close("Buy") // 重置持久化变量,准备下一轮交易 lastBuyPrice := na buyTimes := 0 // 图表上标记前次买入价 if not na(lastBuyPrice) line.new(bar_index, lastBuyPrice, bar_index+10, lastBuyPrice, color=color.red, width=2, style=line.style_dashed)
代码解释
- 持久化变量:
var float lastBuyPrice = na和var int buyTimes = 0这两个变量不会随K线刷新重置,会一直保存到脚本停止运行。 - 加仓条件校验:
close <= lastBuyPrice * (1 - discountPerc/100)确保本次买入价比前次低设定的百分比,同时限制了最大加仓次数避免过度加仓。 - 平仓重置:平仓时把
lastBuyPrice设回na,buyTimes设回0,这样下一次交易可以重新开始计数。 - 可视化标记:用虚线标记前次买入价,用标签显示加仓次数,方便在图表上观察策略执行情况。
你可以根据自己的需求调整入场、平仓条件,以及加仓的参数,核心就是用var来保留需要跨K线的状态变量~
内容的提问来源于stack exchange,提问作者rigide
相关产品推荐
相关产品推荐

