You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于全仓策略权益曲线评估的Pine Script动态仓位调整实现问题

Pine Script 动态仓位调整(基于权益曲线均线)的正确实现

现有代码问题说明

  • 利润计算逻辑错误:strategy.netprofit - strategy.netprofit[1]/strategy.netprofit[1] 中strategy.netprofit[1]/strategy.netprofit[1]恒等于1,无法正确计算单次交易利润
  • 时序计算错误:lastTradeProfit仅在仓位变化时赋值,其余周期为na值,直接计算sma(lastTradeProfit, 20)会得到无效结果
  • 逻辑冗余:同一个均线判断条件执行了两次,没有必要

正确实现方案

如果需要跟踪全仓模式下的模拟表现作为判断依据,不需要和实际策略仓位耦合,可以单独维护一条全仓模拟的权益曲线,再基于该曲线和均线的对比结果调整实际仓位,也支持叠加单次委托涨跌幅的规则。

完整可运行代码示例

//@version=5
strategy("全仓模拟动态仓位策略", overlay=true, initial_capital=10000, default_qty_type=strategy.cash, default_qty_value=10000, commission_type=strategy.commission.percent, commission_value=0.1)

// 可调整参数
equity_ma_length = input.int(20, title="权益曲线均线周期")
low_performance_position_rate = input.float(0.5, title="表现不佳时仓位比例", minval=0.1, maxval=1)
drawdown_limit = input.float(-5, title="单委托最大浮亏阈值(%)", step=0.5)
extra_reduce_rate = input.float(0.8, title="浮亏超标额外降仓比例", minval=0.5, maxval=1)

// 1. 模拟全仓运行的权益曲线(和实际仓位完全隔离)
var float simulated_full_equity = strategy.initial_capital
var float sim_entry_price = na
var int sim_position_side = 0 // 1=多头,-1=空头,0=空仓

// 你自己的开平仓信号(可替换为你的策略逻辑)
long_condition = ta.crossover(ta.sma(close, 5), ta.sma(close, 20))
short_condition = ta.crossunder(ta.sma(close, 5), ta.sma(close, 20))
close_condition = ta.crossunder(ta.sma(close, 5), ta.sma(close, 10)) or ta.crossover(ta.sma(close,5), ta.sma(close,10))

// 更新模拟全仓权益
if long_condition
    sim_position_side := 1
    sim_entry_price := close
if short_condition
    sim_position_side := -1
    sim_entry_price := close
if close_condition
    // 平仓时结算收益
    if sim_position_side == 1
        sim_return = (close - sim_entry_price) / sim_entry_price
    else
        sim_return = (sim_entry_price - close) / sim_entry_price
    simulated_full_equity := simulated_full_equity * (1 + sim_return)
    sim_position_side := 0
// 持仓时实时更新模拟权益
if sim_position_side != 0
    if sim_position_side == 1
        sim_current_return = (close - sim_entry_price) / sim_entry_price
    else
        sim_current_return = (sim_entry_price - close) / sim_entry_price
    simulated_full_equity := strategy.initial_capital * (1 + sim_current_return)

// 2. 计算模拟权益的均线,判断仓位系数
sim_equity_ma = ta.sma(simulated_full_equity, equity_ma_length)
position_coeff = 1.0
// 用上一根K线的值判断,避免未来函数
if simulated_full_equity[1] < sim_equity_ma[1]
    position_coeff := low_performance_position_rate

// 3. 可选:叠加单次委托涨跌幅调整逻辑
var float real_entry_price = na
if strategy.position_size != 0 and strategy.position_size[1] == 0
    real_entry_price := strategy.entry_price
// 计算当前实际持仓涨跌幅
current_position_return = na
if strategy.position_size != 0
    if strategy.position_size > 0
        current_position_return := (close - real_entry_price) / real_entry_price * 100
    else
        current_position_return := (real_entry_price - close) / real_entry_price * 100
// 浮亏超过阈值时额外降仓
if not na(current_position_return) and current_position_return < drawdown_limit
    position_coeff := position_coeff * extra_reduce_rate

// 4. 计算实际订单大小
order_size = strategy.initial_capital * position_coeff

// 执行交易
if long_condition
    strategy.entry("多单", strategy.long, qty=order_size)
if short_condition
    strategy.entry("空单", strategy.short, qty=order_size)
if close_condition
    strategy.close_all()

代码说明

  • 模拟全仓权益和实际仓位完全隔离,判断基准不受动态仓位的影响,符合需求要求
  • 所有判断均使用前一根K线的计算结果,不会引入未来函数导致回测失真
  • 支持自定义均线周期、降仓比例、浮亏阈值等参数,可直接适配不同的策略风格
  • 内置了单次委托涨跌幅的计算逻辑,可直接基于该值叠加额外的仓位调整规则

内容的提问来源于stack exchange,提问作者dorien

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 11:27:04