Pine Script策略测试器未来数据问题及3Commas适配需求
3Commas风格无未来数据策略脚本修改
需求说明
要模拟3Commas机器人的交易逻辑:仅基于已完全收盘的K线执行交易。例如设置RSI低于20开仓时,机器人会在RSI<20的K线收盘后,在下一根K线的时段执行买入操作,买入时的K线RSI可以是任意数值,仅依据前一根已收盘K线的信号。
原脚本问题
原脚本直接使用request.security获取当前日K线的RSI值,会在日K线尚未收盘时就触发开仓条件,属于误用未来数据,不符合3Commas的交易逻辑。
修正思路
- 只基于上一根已完成的日K线的RSI信号触发买入
- 通过检测当前K线是否是新日K线的起点,同时验证上一根日K线的RSI<20,确保交易仅在新K线时段执行,完全规避未来数据
修正后的代码
//@version=5 strategy("3Commas Style Test", overlay=true, initial_capital = 100, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_value = 0.1) startTime = timestamp('2023-09-01 00:00:00') endTime = timestamp('2023-09-11 00:00:00') len_2 = input.int(2, "Length 2", options=[2]) tf_1d = 'D' inTimePeriod = startTime <= time and time <= endTime inTrade = strategy.position_size > 0 notInTrade = not(inTrade) // 获取上一根已完成日K线的RSI,使用barmerge.gaps_on确保只取已收盘数据 rsi_1d_2l = request.security(syminfo.ticker, tf_1d, ta.rsi(close, len_2), lookahead = barmerge.lookahead_off, barmerge.gaps_on = true) // 检测是否进入新的日K线时段 isNewDailyBar = ta.change(time(tf_1d)) != 0 // 买入条件:不在持仓中 + 进入新日K线 + 上一根日K线RSI<20 buyCondition = notInTrade and isNewDailyBar and rsi_1d_2l < 20 sellCondition = true if (inTimePeriod) if (buyCondition) strategy.entry('buy', strategy.long) else if (inTrade and sellCondition) strategy.close('buy')
关键改动说明
- 新增
isNewDailyBar变量,通过ta.change(time(tf_1d))判断当前是否是新日K线的起始点 - 调整
buyCondition,必须同时满足进入新日K线和上一根日K线RSI<20才触发买入,确保完全基于已收盘的K线数据执行交易 - 保留
barmerge.lookahead_off和barmerge.gaps_on,进一步保证数据无未来性
内容的提问来源于stack exchange,提问作者hkodavid
相关产品推荐
相关产品推荐

