含IsFlat()函数的Pine Script策略无法生成交易的原因咨询
你的Pine Script策略没生成交易的原因及修复方法
核心问题拆解
你写的策略没出交易,主要逃不开这两个原因:
1. 交叉信号压根没出现
你的交易信号依赖d3(100周期EMA减200周期EMA)上穿/下穿0轴,但如果回测的品种在你选的时间区间里,100EMA一直趴在200EMA下面(长期熊市)或者上面(长期牛市),就不会产生交叉信号。比如拿常年走牛的标普500指数回测,100EMA可能好几年都在200EMA之上,自然不会触发空单信号;要是碰上个长期熊市,多单信号也不会有。
2. 没有平仓逻辑,开一次仓就“锁死”了
你的IsFlat()函数是判断当前无持仓才开仓,但策略里只写了开仓规则,完全没写平仓代码!一旦开仓后,strategy.position_size就不再是0,后续哪怕出现反向交叉信号,也会因为IsFlat()的限制,根本触发不了新交易——相当于开仓后就一直拿着,再也不会动了。
修复步骤
先补平仓逻辑
在现有代码末尾加上反向交叉时的平仓规则,这样持仓才能回到“空仓”状态,后续信号才能触发:
//@version=5 strategy("EMA Strategy", overlay=true) ema20 = ta.ema(close,20) ema50 = ta.ema(close,50) ema100 = ta.ema(close,100) ema200 = ta.ema(close,200) d0 = close - ema20 d1 = ema20-ema50 d2 = ema50-ema100 d3 = ema100-ema200 IsFlat() => strategy.position_size == 0 // 开仓条件 if IsFlat() and ta.crossover(d3,0) strategy.entry("MacdLE", strategy.long, comment="MacdLE") if IsFlat() and ta.crossunder(d3,0) strategy.entry("MacdSE", strategy.short, comment="MacdSE") // 新增:反向交叉时平仓 if strategy.position_size > 0 and ta.crossunder(d3, 0) strategy.close("MacdLE", comment="平多单") if strategy.position_size < 0 and ta.crossover(d3, 0) strategy.close("MacdSE", comment="平空单")
可视化信号,方便排查
再加几行代码把d3和0轴画在副图,就能直观看到有没有交叉信号了:
// 副图显示d3和0轴,验证信号 plot(d3, title="EMA100-EMA200", color=color.blue) hline(0, "零轴", color=color.red, linestyle=hline.style_dashed)
检查回测设置
- 选的回测时间区间要足够长,至少覆盖一次100EMA和200EMA的交叉;
- 初始资金、滑点这些设置不影响有没有交易,但会影响交易结果,不用纠结这个。
小优化建议
- 其实
IsFlat()函数可以不用单独定义,直接把strategy.position_size == 0写在开仓条件里就行,代码更简洁; - 如果想让策略自动反手(比如出现空单信号时直接平多开空),可以用
strategy.reverse函数代替单独的平仓+开仓逻辑。
内容的提问来源于stack exchange,提问作者smaillis
相关产品推荐
相关产品推荐

