TradingView Pine Script回测:40周SMA策略收益率及止损实现问题
问题解决方案
以下是修正后的可运行完整代码,同时解决你提到的两个核心问题:
//@version=4 strategy("40周均线交叉策略", initial_capital=100000, default_qty_type=strategy.cash, commission_type=strategy.commission.percent, commission_value=0.1) // 强制取40周均线,不受当前图表周期影响 sma40 = security(syminfo.tickerid, "W", sma(close, 40)) // 买卖信号:价格上穿40周均线买入,下穿卖出 long = crossover(close, sma40) sell = crossunder(close, sma40) // 回测时间范围 start= timestamp(1995,6,1,0,0) end= timestamp(2020,6,1,0,0) time_in_range = time >= start and time <= end if time_in_range // 用全部账户权益开仓,实现合约无关的百分比收益 strategy.entry("Long", strategy.long, qty=strategy.equity, when=long) // 绑定仓位同时设置止损,和原卖出逻辑并行触发 strategy.exit("Exit_Long", "Long", stop = strategy.position_avg_price * 0.95, when = time_in_range) strategy.close("Long", when = sell and time_in_range)
注:原代码存在变量调用错误,你定义了
sma40但交易逻辑中使用了未声明的sma200,上述代码已修复该问题,同时使用crossover/crossunder函数过滤重复信号,添加security函数强制读取周线级别的40周期均线,避免当前图表周期不是周线时逻辑出错。
1. 不受合约规模影响的收益率实现
- 策略初始化时添加
default_qty_type = strategy.cash参数,指定下单数量按现金价值计算 - 开仓时
qty参数传入strategy.equity,即用当前全部账户权益满仓开仓 - 该配置下最终回测展示的收益率为百分比净收益,和固定下单手数、合约面值无关,仅和策略涨跌幅度挂钩
2. 5%止损逻辑实现
- 调用
strategy.exit()函数绑定入场订单ID为Long的仓位 - 止损参数
stop设置为strategy.position_avg_price * 0.95,即当价格下跌到比入场均价低5%时自动平仓 - 止损条件和原有的下穿均线卖出条件并行触发,满足任意一个就会平仓
内容的提问来源于stack exchange,提问作者user15890942
相关产品推荐
相关产品推荐

