为何策略触发交易次数远少于指标信号?附Pine Script代码求助
问题分析与修复方案
核心问题1:持仓判断逻辑错误
你的平仓条件if strategy.position_avg_price > 0完全错误——Pine Script中,空单的strategy.position_avg_price是负值(空单的平均价格以负数形式记录),所以这个条件永远不会成立,导致开仓后永远不会平仓。一旦持有空单,策略默认不允许同一方向重复开仓,后续的shortSignal即使触发也无法开新仓,最终回测只有寥寥几次交易。
核心问题2:变量命名笔误
代码中定义了ema5 = ta.ema(close,100),但后续调用的是ema100,这属于未定义变量,会导致previousdetachedabove条件失效(实际运行时ema100会被视为na,比较结果始终为false)。虽然你提到图表上有大量信号,可能实际运行时修正了这个笔误,但代码里的这个错误必须修正。
修复后的完整代码
strategy('AMI short', overlay = true) // 修正变量命名笔误:ema5改为ema100 ema100 = ta.ema(close,100) rsi = ta.rsi(close, 14) plot(ema100, linewidth = 2, color = color.yellow) currentcrossbelow = close < low[1] previousdetachedabove = low[1] > ema100[1] shortSignal = currentcrossbelow and previousdetachedabove and high < high[1] bgcolor(shortSignal ? color.new(color.red, 40) : na) SL = 0.05 TP = 0.10 // 修正平仓条件:判断是否持有空单(position_size < 0) if shortSignal strategy.entry('Short', strategy.short, 1) if strategy.position_size < 0 shortStop = strategy.position_avg_price * (1 + SL) shortProfit = strategy.position_avg_price * (1 - TP) strategy.exit('closeShort', stop = shortStop, limit = shortProfit)
额外优化建议
- 可以将
strategy.exit直接绑定到strategy.entry,简化代码:if shortSignal strategy.entry('Short', strategy.short, 1) strategy.exit('closeShort', 'Short', stop = strategy.position_avg_price*(1+SL), limit = strategy.position_avg_price*(1-TP)) - 如果需要允许同一方向多次开仓,可以在策略开头添加:
strategy.risk.allow_entry_in = strategy.short
内容的提问来源于stack exchange,提问作者user20537640
相关产品推荐
相关产品推荐

