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

50D WMA交易策略中strategy.close执行异常频繁问题排查

问题排查与解决方案

核心问题原因

你代码中的moving50AvgFlag变量未用var关键字声明,导致每根K线都会被重置为false。在50D场景下,买入后的下一根K线,moving50AvgFlag回到初始值false,触发了else分支,此时buffer被切换为200D缓冲值。若QQQ收盘价低于200D缓冲(而非你预期的50D缓冲),就会触发strategy.close,这就是“买入次日就平仓”的根本原因。

修复步骤

  1. 用var声明moving50AvgFlag,保留其跨K线的状态:
    var moving50AvgFlag = false 
    
  2. 同时为movingAvg和buffer添加var声明,避免初始值干扰逻辑:
    var float movingAvg = na
    var float buffer = na
    

完整修复代码

//@version=5
strategy("S4 QQQ 2.0", process_orders_on_close=true,
overlay=true,commission_type=strategy.commission.cash_per_order, commission_value=0, slippage=0, initial_capital = 100000, default_qty_type=strategy.percent_of_equity, default_qty_value=100)

// Script Date Range Inputs
StartTime = input.time(defval=timestamp('14 June 2010 05:00 +0000'), group="Script Date Range Settings", title='Start Time')
EndTime = input.time(defval=timestamp('20 Jan 2023 00:00 +0000'), group="Script Date Range Settings", title='End Time')
InDateRange = time>=StartTime and time<=EndTime

QQQ = request.security("QQQ","D",close)
QQQ50 = ta.wma(QQQ,50)
QQQ200 = ta.wma(QQQ,200)
QQQ50Buffer = QQQ50*.98 //50D Buffer
QQQ200Buffer = QQQ200*.98 //200D Buffer

plot(QQQ50, color = color.green)
plot(QQQ200, color = color.white)
plot(QQQ50Buffer, color = color.green, style = plot.style_cross)
plot(QQQ200Buffer, color = color.white, style = plot.style_cross)

// 使用var保留变量跨K线状态
var moving50AvgFlag = false 
var float movingAvg = na
var float buffer = na

if (QQQ[1] <= QQQ50[1]) and (QQQ50[1] < QQQ200[1])  //if QQQ is < 50 and the 50 is less than the 200
    movingAvg := QQQ50
    buffer := QQQ50Buffer
    moving50AvgFlag := true
else if ((QQQ[1] <= QQQ200[1]) and moving50AvgFlag == true) //keep using the 50d as long as qqq < 200
    movingAvg := QQQ50
    buffer := QQQ50Buffer    
else                                   //start using the 200d
    movingAvg := QQQ200
    buffer := QQQ200Buffer
    moving50AvgFlag := false

if QQQ > movingAvg and InDateRange==true  //Buying at the WMA
    strategy.entry("Buy",strategy.long)
if QQQ < buffer and InDateRange==true   //Selling at the buffer
    strategy.close("Buy")

验证建议

  • 修复后可添加plot(buffer)到代码中,观察50D场景下buffer是否始终跟随50D缓冲值,而非跳转为200D缓冲。
  • 触发平仓时,检查QQQ收盘价是否确实低于当前使用的缓冲值,确认逻辑符合预期。

内容的提问来源于stack exchange,提问作者user21148808

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 16:46:09