You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 17:52:22