Pine Script如何实现价格穿越SMA时按SMA价格精准开仓
问题根源
你写的代码有三个核心错误,直接导致了价格、时点偏差和漏单:
- 均线绘图加了
offset=1,会把整条MA线往右挪1根K线的位置,你图上看到的穿越点和代码实际计算的MA位置根本对不上,属于视觉误导。 ta.cross(close, moving_average)只有等整根K线走完、收盘价定下来才会触发,这时候你再挂限价单,订单实际是下根K线才进队列,既错过了穿越的时间点,要是下根K线直接跳空离MA很远,碰不到你挂的限价自然就不会成交,就是你说的漏开仓。- 没收盘的K线的
close是跟着实时tick变动的,用这个值算出来的MA也是来回飘的,你拿浮动的价格当限价单委托价,自然不可能精准成交在你想要的固定MA位置。
可直接运行的正确代码
//@version=5 strategy( title="SMA穿越精准开仓策略", overlay=true, initial_capital=10000, precision=5, pyramiding=9999999999, calc_on_every_tick=true ) // 参数配置 sma_len = input.int(20, title="SMA周期", minval=1) // 取上一根K线收盘后就完全固定的SMA值作为委托基准,不会随当前tick波动 fixed_ma = ta.sma(close[1], sma_len) // 实时SMA仅用于绘图,不做交易判断 plot_ma = ta.sma(close, sma_len) plot(plot_ma, color=color.new(color.blue, 0), title="SMA", linewidth=2) // 穿越条件:前一根K线收盘价在MA一侧,当前K线价格触及MA价位即判定为穿越 prev_close = close[1] cross_over = prev_close < fixed_ma and high >= fixed_ma // 上穿做多条件 cross_under = prev_close > fixed_ma and low <= fixed_ma // 下穿做空条件 // 上穿时挂限价多单,委托价就是固定MA值,当前K线内有效 if cross_over strategy.entry("多单", strategy.long, limit=fixed_ma) // 需要下穿开空就把下面两行的注释去掉 // if cross_under // strategy.entry("空单", strategy.short, limit=fixed_ma)
逻辑说明
- 委托用的MA价格是上一根K线收盘后就定死的值,不会跟着当前K线的实时价格来回跳,保证成交价格完全等于对应位置的SMA价格。
- 不再等K线收盘才判断穿越,开启tick级计算后,只要实时价格碰到MA价位就会立刻成交,时点完全匹配穿越发生的时刻,不会延迟到下一根K线。
- 去掉了MA绘图的偏移参数,图上看到的均线位置和策略实际计算的位置完全一致,不会出现视觉错位。
- 代码里加了SMA周期的可调参数,你可以直接在策略设置里改周期,不用改代码。默认只开上穿做多的逻辑,需要双向交易放开空单部分的注释就行。
内容的提问来源于stack exchange,提问作者RemRois
相关产品推荐
相关产品推荐

