You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

TradingView策略:实现蜡烛与线交点同K线平仓

问题:TradingView策略无法在ATR交点的同一K线内平仓

在基于外部数据源编写回测脚本时,希望将蜡烛与ATR线的交点作为平仓触发条件,但当前策略总是在下一根K线执行平仓操作,已尝试设置use_bar_magnifier = true,但问题仍未解决。

核心原因

  1. 原代码中hasATRIntersection依赖当前K线的low/high判断穿越,而Pine Script策略默认在K线收盘后才执行信号逻辑,导致平仓延迟到下一根K线。
  2. 手动维护的inPosition变量可能与策略实际仓位状态不同步,干扰信号判断。

解决方案

  1. 放弃基于K线收盘的if判断平仓,改用strategy.exit的动态条件实时监控价格穿越ATR线,实现同一K线内触发平仓。
  2. 移除手动维护的inPosition变量,直接使用strategy.position_size > 0判断是否持有仓位,避免状态不同步。
  3. 调整ATR线的引用逻辑,确保实时监控当前K线内的价格穿越行为。

修改后的完整代码

//@version=5
strategy("Externe Indikator Strategie", overlay=true, use_bar_magnifier = true)

// 外部数据源输入
externerIndikator = input.source(close, "外部信号源")
externerATR = input.source(close, "外部ATR数据源")

// 外部信号设置组
input_group_external = "外部信号设置"
takeProfitMode = input.string("禁用", "止盈模式", options=["禁用", "全部平仓", "部分平仓"], group=input_group_external)
takeProfitExitPercent = input.float(50.0, "部分止盈比例(%)", minval=1.0, maxval=99.0, step=1.0, group=input_group_external)

// 额外退出设置组
input_group_exits = "额外退出设置"
enablePercentTP = input.bool(false, "启用百分比止盈", group=input_group_exits)
percentTPValue = input.float(3.0, "止盈比例(%)", minval=0.1, maxval=100.0, step=0.1, group=input_group_exits)
enablePercentSL = input.bool(false, "启用百分比止损", group=input_group_exits)
percentSLValue = input.float(2.0, "止损比例(%)", minval=0.1, maxval=100.0, step=0.1, group=input_group_exits)

// ATR交点设置组
input_group_atr = "ATR交点设置"
showATRIntersections = input.bool(true, "显示ATR交点", group=input_group_atr)
useATRIntersectionExit = input.bool(false, "使用ATR交点作为平仓条件", group=input_group_atr)

// 信号定义
kaufSignal = externerIndikator == 1
takeProfitSignal = externerIndikator == 2
exitSignal = externerIndikator == 4

// 获取当前ATR值(无需偏移,用于实时监控)
float currentATR = externerATR

// 判断当前K线内是否穿越ATR线(实时判断逻辑)
bool hasATRIntersection = low <= currentATR and high >= currentATR

// 开仓逻辑
if (kaufSignal)
    strategy.entry("多单", strategy.long)
    
    // 初始化退出条件:百分比TP/SL + ATR交点平仓
    float tpLevel = na
    float slLevel = na
    
    if (enablePercentTP)
        tpLevel := close * (1 + percentTPValue / 100)
        
    if (enablePercentSL)
        slLevel := close * (1 - percentSLValue / 100)
    
    // 使用strategy.exit同时监控TP/SL和ATR交点
    strategy.exit("退出条件", "多单", 
        limit=tpLevel, 
        stop=slLevel,
        // 当启用ATR交点平仓时,添加动态触发条件
        stop=useATRIntersectionExit ? currentATR : na,
        comment="TP/SL/ATR平仓"
    )

// 外部止盈信号处理
if (strategy.position_size > 0 and takeProfitSignal)
    if (takeProfitMode == "全部平仓")
        strategy.close("多单", comment="全部止盈平仓")
    else if (takeProfitMode == "部分平仓")
        strategy.close("多单", qty_percent=takeProfitExitPercent, comment="部分止盈平仓")

// 外部退出信号处理
if (strategy.position_size > 0 and exitSignal)
    strategy.close("多单", comment="常规平仓")

// 可视化信号
plotshape(series=kaufSignal, location=location.belowbar, color=color.green, style=shape.triangleup, title="买入信号")
plotshape(series=takeProfitSignal and takeProfitMode != "禁用", location=location.abovebar, color=color.yellow, style=shape.circle, title="止盈信号")
plotshape(series=exitSignal, location=location.abovebar, color=color.red, style=shape.triangledown, title="退出信号")
plotshape(series=useATRIntersectionExit and hasATRIntersection, location=location.abovebar, color=color.orange, style=shape.xcross, title="ATR平仓信号")

// 绘制ATR线
plot(currentATR, title="外部ATR线", color=color.purple, style=plot.style_line, linewidth=2)

// 标记ATR交点
plotshape(showATRIntersections and hasATRIntersection ? currentATR : na, 
          title="ATR交点", 
          style=shape.cross, 
          location=location.absolute, 
          color=color.purple,
          size=size.small)

关键修改说明

  • 将ATR交点的平仓逻辑整合到strategy.exit中,利用该函数的实时监控特性,在价格穿越ATR线时立即触发平仓,无需等待K线收盘。
  • 移除了inPosition变量,直接使用strategy.position_size > 0判断仓位状态,避免手动维护的状态与实际仓位不一致。
  • 调整了ATR值的引用逻辑,使用当前K线的externerATR而非偏移值,确保实时监控当前价格与ATR线的交互。

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

火山引擎 最新活动