TradingView研究脚本实现strategy.position_avg_price及部分平仓计算优化
研究脚本端实现
strategy.position_avg_price等效能力的优化方案 核心改造逻辑
原有逻辑的核心缺陷是平仓环节直接重置两个累计变量,仅能适配全仓一次性平仓的场景。要支持部分平仓的计算,需基于持仓成本的本质规则调整分支逻辑,整体规则和TradingView内置strategy.position_avg_price的底层计算逻辑对齐:
- 加仓环节:保持原有累加逻辑,每次触发开仓时,累计总持仓数量、累计对应投入的总成本,平均持仓价=累计总成本/总持仓数量,这个公式对首次开仓、分批补仓场景均成立。
- 平仓环节:修改原清零逻辑为按平仓比例同步扣减持仓量与对应成本。由于平仓操作不会改变剩余持仓的单位成本,仅需按当次平仓的数量,从总持仓量中扣减对应份额,再按当前平均价计算当次平仓对应的成本额,从累计总成本中同步扣减即可。仅当剩余持仓量趋近于0时,才重置两个累计变量,避免浮点误差导致的数值残留。
可配置的优化实现步骤
- 增加平仓比例配置项,适配不同程度的部分平仓需求,避免写死全仓平仓的逻辑
- 拆分开仓、平仓的独立分支,避免平仓逻辑误触发重置状态
- 增加浮点精度边界判断,当扣减后的剩余持仓量小于1e-5量级时,直接将累计变量置0,避免绘制的成本线出现微小的残留偏差
- 保持所有计算的实时性,基于当前K线的close价格同步计算,避免策略引擎带来的警报延迟
优化后的完整参考代码
//@version=5 indicator("无延迟持仓平均价计算", overlay=true) // 基础参数配置 order_size = input(50, title="单次开仓投入金额") close_ratio = input.float(1.0, title="单次平仓比例", minval=0.1, maxval=1.0, step=0.1) // 状态累计变量(跨K线保留) var total_qty = 0.0 var total_cost = 0.0 // 实时计算平均持仓价 avg_position_price = total_qty > 1e-5 ? total_cost / total_qty : na // 开仓逻辑分支(替换为自身实际入场条件) if <你的入场触发条件> add_qty = order_size / close total_qty := total_qty + add_qty total_cost := total_cost + order_size // 平仓逻辑分支(替换为自身实际平仓条件) if <你的平仓触发条件> and total_qty > 1e-5 close_qty = total_qty * close_ratio // 扣减对应持仓与成本 total_qty := total_qty - close_qty total_cost := total_cost - (close_qty * avg_position_price) // 持仓完全清空的边界重置 if total_qty < 1e-5 total_qty := 0.0 total_cost := 0.0 // 绘制平均成本线 plot(avg_position_price, color=color.lime, linewidth=4, title="持仓平均成本线")
适配注意事项
- 该逻辑仅适配单向持仓场景,如果需要同时跟踪多、空双向的持仓成本,需要为多、空方向分别维护一套独立的累计持仓量、累计成本变量,避免不同方向的成本混算导致的计算偏差。
- 由于该计算完全在study脚本内完成,不依赖策略引擎的运行时数据,触发警报时可直接读取当前实时计算的平均价数值,不会出现策略类脚本常见的警报延迟、数值不同步的问题。
- 计算规则和TradingView内置
strategy.position_avg_price完全对齐:多次开仓的成本累加、部分平仓的成本扣减逻辑和内置函数的运算规则一致,不会出现和策略回测数值的偏差。
内容的提问来源于stack exchange,提问作者gus_dev
相关产品推荐
相关产品推荐

