PineScript日内交易策略订单执行问题及功能实现咨询
你的代码存在以下核心问题:
- 仓位参数冲突:你全局配置了按账户权益100%下单,但
strategy.entry里手动指定了qty=1,会覆盖全局仓位设置,导致每次只成交1股,和预期不符 - 限价单价格逻辑错误:你用当前未收盘K线的收盘价上浮1%作为空单限价,会导致挂单价格异常漂移,应该基于触发条件的已收盘K线(前一根K线)的收盘价计算
- 时区不匹配:印度交易时段为UTC+5:30,你回测时间用UTC时区、收盘判断用默认时区,会导致开平仓时间完全错位
- 收盘平仓逻辑重复且不准确:你同时判断自定义session和
hour==15,且未绑定印度时区,经常出现该平仓时没触发、不该平仓时乱触发的问题 - 止盈止损价格计算时机问题:你把止盈止损价格计算放在全局作用域,空单未成交时
strategy.position_avg_price是na,会导致价格计算异常 - 未限制开仓时段:临近收盘触发条件也会开仓,还没成交就到收盘时间,容易产生隔夜持仓
修复后完整代码
strategy('Mean Reversion Shivam', overlay=true, initial_capital=100000, currency='INR', default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.cash_per_order, commission_value=20, close_entries_rule=strategy.close_entries_rule.all, slippage=0.1) // === 日内交易基础配置 === strategy.risk.max_intraday_filled_orders(count=1) // 适配印度时区(UTC+5:30) var tz = "Asia/Kolkata" // === 策略参数配置 === // 回测时间范围 start = input.time(defval = timestamp("01 Jan 2019 09:15 +0530"), title = "回测开始时间", group = "回测配置", timezone=tz) end = input.time(defval = timestamp("01 Dec 2021 15:30 +0530"), title = "回测结束时间", group = "回测配置", timezone=tz) // 收盘平仓时段(默认14:55-15:30,印度时区) posExitSession = input.session(title="收盘平仓时段", defval="1455-1530", confirm=true, group="平仓配置", timezone=tz) // 开仓允许时段(收盘前10分钟禁止开仓) posEntrySession = input.session(title="允许开仓时段", defval="0915-1445", confirm=true, group="开仓配置", timezone=tz) movingAverage = input.int(title="均线周期", defval=200, minval=1,maxval=200, step=5, group="策略参数") shortProfitPerc = input.float(title="空单止盈(%)", minval=0.0, step=0.5, defval=3, group="平仓参数") / 100 shortStopLossPerc = input.float(title="空单止损(%)", minval=0.0, step=0.5, defval=3, group="平仓参数") / 100 // ==== 工具函数 ==== // 判断当前K线是否在指定时段内(适配印度时区) barInSession(sess) => time(timeframe.period, sess, tz) != na // ==== 空单开仓条件 === // 判断当前是否在允许开仓时段 inEntrySession = barInSession(posEntrySession) shortCondition = close[1] > ta.sma(close, movingAverage) // 限价价格基于前一根已收盘K线的收盘价上浮1% shortEntryPrice = close[1] * 1.01 strategy.entry("short", strategy.short, limit=shortEntryPrice, when=shortCondition and time > start and time < end and inEntrySession) // === 止盈止损逻辑 === if (strategy.position_size < 0) // 持仓时才计算止盈止损价格 shortProfitExitPrice = strategy.position_avg_price * (1 - shortProfitPerc) shortLossExitPrice = strategy.position_avg_price * (1 + shortStopLossPerc) strategy.exit(id="short", limit=shortProfitExitPrice, stop=shortLossExitPrice) // ==== 收盘强制平仓 === inExitSession = barInSession(posExitSession) strategy.close_all(when = inExitSession, comment = "收盘平仓")
内容的提问来源于stack exchange,提问作者Shivam Gupta
相关产品推荐
相关产品推荐

