首页 > 解决方案 > Pine 脚本:如果 x -> 百分比停止 else -> ATR 停止

问题描述

我正在尝试为我的百分比追踪止损添加一个触发器,同时有一个 ATR 止损,用于未触发追踪止损的时间。请记住,我对编码很陌生。

尾随的触发器是在慢速 MA 上方的快速 MA 和 ATR 停止的初始停止。触发器和初始停止的类型并不那么重要。问题是我无法弄清楚如何同时实现它们。可以像我在这里尝试的那样简单吗?止损单独起作用,但同时使用时,它仅使用 ATR 止损(从不追踪止损),并且仅在快速 MA 低于慢 MA(未满足触发条件)时使用。当快速 MA 高于慢速 MA 时,它永远不会触发停止,但如果我删除带有 ATR 停止的 else 语句,它工作正常。现在对我来说没有意义。

一些指导将不胜感激!

//Moving Average calculation and plotting
Not important

//ATR input
ATR = input(14, step=1, title='ATR periode')
LongstopMult = input(3, step=0.1, title='ATR Long Stop Multiplier')

//Trailing stop inputs
longTrailPerc = input(title="Trail Long Loss (%)",
     type=float, minval=0.0, step=0.1, defval=4.6) * 0.01

// Determine trail stop loss prices
longStopPrice = 0.0

longStopPrice := if (strategy.position_size > 0)
    stopValue = close * (1 - longTrailPerc)
    max(stopValue, longStopPrice[1])
else
    0

//Strategy entry conditions
XXX

// Submit exit orders for trail stop loss price
if (fastSMMA > slowSMMAlong)
    strategy.exit(id="XL TRL STP1", stop=longStopPrice)

else
    stop_level = low - (ATR * LongstopMult)
    strategy.exit("TP/SL", stop=stop_level)

标签: pine-script

解决方案


您可以切换 longStopPrice 值并仅使用 1 个 strategy.exit 函数,如下所示。

fastSMMA = sma(close, 20) 
slowSMMAlong = sma(close, 200)

//ATR input
ATR = input(14, step=1, title='ATR periode')
LongstopMult = input(3, step=0.1, title='ATR Long Stop Multiplier')

//Trailing stop inputs
longTrailPerc = input(title="Trail Long Loss (%)",
     type=float, minval=0.0, step=0.1, defval=4.6) * 0.01

// Determine trail stop loss prices
longStopPrice = 0.0


if fastSMMA > slowSMMAlong
    longStopPrice := if (strategy.position_size > 0)
        stopValue = close * (1 - longTrailPerc)
        max(stopValue, longStopPrice[1])
    else
        0
else
    longStopPrice := low - (ATR * LongstopMult)

// debug
bgcolor(fastSMMA > slowSMMAlong ? red : na) // highlight the type of trigger
plot(longStopPrice, style = stepline, offset = 1) // print the exit line on the chart

//Strategy entry conditions // example entry
strategy.entry("enter long", true, 1, when = open > high[20]) 

// Submit exit orders for trail stop loss price
strategy.exit(id="XL TRL STP1", stop=longStopPrice)

推荐阅读