Pine Script实现权益曲线下穿SMA时暂停交易并跟踪模拟权益的咨询
Pine Script权益曲线过滤与动态仓位调整实现方案
核心功能实现思路
实现的核心逻辑是分离满额运行的模拟权益计算和实际交易逻辑,不能直接用Pine Script自带的strategy.equity作为判断依据,否则暂停交易后自带权益数据会停止更新,无法跟踪满额运行的走势:
- 先声明独立的模拟权益变量,初始值等于策略初始资金:
var float sim_equity = strategy.initial_capital - 不管实际是否下单,只要原策略触发开平仓信号,就按照100%仓位的规则更新模拟权益,同步扣除手续费、滑点等成本,保证数据和满额运行的结果完全一致
- 计算模拟权益的10周期SMA:
sim_equity_sma = ta.sma(sim_equity, 10) - 定义交易开关变量:
trade_enabled = sim_equity > sim_equity_sma,当开关为false时跳过所有下单、警报逻辑,但模拟权益的更新逻辑保持正常运行,即可持续跟踪后续上穿的触发节点
现有代码优化建议
你当前的实现有两个明显缺陷:一是直接用strategy.equity计算仓位,当你调低仓位或暂停交易时,自带的权益数据就不是满额运行的结果,后续的均线计算都会出现偏差;二是用strategy.netprofit差值计算单次交易利润,容易受加仓减仓、手续费核算逻辑的影响出现误差,也没法直接获取订单涨跌幅。
订单涨跌幅获取示例
// 存储开仓价格 var float entry_price = na // 存储单次交易涨跌幅 float trade_return = na // 开仓时记录开仓均价 if (strategy.position_size != 0 and strategy.position_size[1] == 0) entry_price := strategy.position_avg_price // 平仓时计算本次交易涨跌幅 if (strategy.position_size == 0 and strategy.position_size[1] != 0) // 正数为盈利,负数为亏损,可直接用于后续仓位调整逻辑 trade_return := (close / entry_price) - 1
结合权益曲线过滤的动态仓位实现示例
// 初始化满额运行模拟权益 var float sim_equity = strategy.initial_capital // 计算模拟权益10周期SMA sim_equity_sma = ta.sma(sim_equity, 10) // 交易允许开关 trade_enabled = sim_equity > sim_equity_sma // 原策略开仓信号示例,替换为你自己的信号逻辑即可 if (long_condition) // 不管实际是否开仓,先更新模拟权益(对齐100%仓位的收益) sim_equity := sim_equity * (close / close[1]) * (1 - strategy.commission_value) // 仅开关开启时执行实际下单 if (trade_enabled) // 动态仓位规则可自定义,示例为权益高于均线满仓,低于均线半仓 order_size = sim_equity > sim_equity_sma ? sim_equity / close : 0.5 * sim_equity / close strategy.entry("long", strategy.long, qty=order_size) // 平仓信号逻辑 if (close_condition or (not trade_enabled and strategy.position_size > 0)) // 同步更新模拟权益 sim_equity := sim_equity * (close / close[1]) * (1 - strategy.commission_value) strategy.close("long")
注意事项
- 模拟权益的更新规则要和你原本100%仓位运行的策略完全对齐,包括杠杆、手续费、滑点、持仓周期的设置,避免出现数据偏差
- 警报逻辑仅在
trade_enabled为true时触发即可,下穿期间直接跳过警报代码段 - 如果是多品种策略,需要给每个品种单独设置模拟权益变量,核算完单个品种的盈亏后再汇总得到总模拟权益
内容的提问来源于stack exchange,提问作者dorien
相关产品推荐
相关产品推荐

