Page 1 of 1

Resetting stop loss indicator

Posted: Mon Oct 16, 2023 11:15 am
by elcounto
Hey,

I've setup a trailing stop for my entries but it doesn't seem to reset after a new trade is executed.

Below are my buy stop conditions. Any idea what I'm doing wrong?

// Buy condition

if short
if TimeFilter
strategy.entry(Long, strategy.long, comment=Buy Long, when = strategy.position_size <=0)

// Exit trade if stop is hit
strategy.exit(id=Trail Exit, from_entry=Long, limit=na, stop=trailPrice)

Re: Resetting stop loss indicator

Posted: Tue Oct 17, 2023 3:46 am
by Steve Burman
A few questions:
1. Are you getting trades showing on the chart each time?
2. Is the trailing stop drawing on the chart at least initially?
3. Are you resetting the value of trailPrice to 0 each time the trade is closed and recreating the value for each candle update?
4. Have you watched Matt's video on Trailing stops?

It's hard to see as you've given me only a little info.

Re: Resetting stop loss indicator

Posted: Wed Oct 18, 2023 2:42 am
by elcounto
Hey Steve,

I got the script from Matts video on stop loss and copied it into a strat I had. Below is main body of the script.

//plots - arrows and alerts
longarrow = long ? 1 : na
shortarrow = short ? -1 : na
plotarrow(pla ? longarrow : na, colorup=color.new(color.aqua, 50))
plotarrow(pla ? shortarrow : na, colordown=color.new(color.red, 50))

// Declare trailing price variable (stores our trail stop value)
var float trailPrice = na
float next_trailPrice = na

// Get required trailing stop variables
atrValue = ta.atr(atrPeriod) * atrMultiplier
float swingLow = ta.lowest(low, swingLookback)
float swingHigh = ta.highest(high, swingLookback)

// Get trailing stop price
if trailMethod == "ATR" // Determine ATR trailing stop price based on price source
next_trailPrice := switch trailSource
"Close" => strategy.position_size > 0 ? close - atrValue : close + atrValue
"Open" => strategy.position_size > 0 ? open - atrValue : open + atrValue
=> strategy.position_size > 0 ? swingLow - atrValue : swingHigh + atrValue

// Check for trailing stop update
if strategy.position_size != 0 and barstate.isconfirmed
// Trail long stop ONLY IF temp trailPrice is not set or is a higher price
if (next_trailPrice > trailPrice or na(trailPrice)) and strategy.position_size > 0
trailPrice := next_trailPrice
// Trigger alert
alert(message="Trailing Stop updated for " + syminfo.tickerid + ": " + str.tostring(trailPrice, "#.#####"), freq=alert.freq_once_per_bar_close)
// Trail short stop ONLY IF temp trailPrice is not set or is a lower price
if (next_trailPrice < trailPrice or na(trailPrice)) and strategy.position_size < 0
trailPrice := next_trailPrice
// Trigger alert
alert(message="Trailing Stop updated for " + syminfo.tickerid + ": " + str.tostring(trailPrice, "#.#####"), freq=alert.freq_once_per_bar_close)

// Draw data to chart
plot(strategy.position_size != 0 ? trailPrice : na, color=color.red, title="Trailing Stop")


// Buy condition

if long
if TimeFilter
strategy.entry("Long", strategy.long, comment="Buy Long", when = strategy.position_size == 0)



// Exit trade if stop is hit

if (strategy.position_size > 0 and close < trailPrice) or (strategy.position_size < 0 and close > trailPrice)
strategy.close("Long")

Re: Resetting stop loss indicator

Posted: Wed Oct 18, 2023 2:54 am
by elcounto

Re: Resetting stop loss indicator

Posted: Fri Oct 20, 2023 9:34 pm
by Steve Burman
Sorry for the delay in replying. It seems you are missing (or have changed) the part of Matt's code where he resets the trailing stop and draws it on the chart as follows:

// If long stop is hit, reset trail stop
if trailPrice != 0.0 and low <= trailPrice and trailType == "Long"
trailPrice := na

// If short stop is hit, reset trail stop
if trailPrice != 0.0 and high >= trailPrice and trailType == "Short"
trailPrice := na

// Draw data to chart
plot(trailPrice != 0 ? trailPrice : na, color=color.red, title="Trailing Stop")

What you have done is instead of checking for the trailPrice != 0.0 you are checking for strategy.position_size != 0

I hope this helps!

Re: Resetting stop loss indicator

Posted: Sun Nov 26, 2023 3:04 am
by Bmaloney
Hi Steve,

I am having a similar problem but i cant see where the fix is sorry. im very new and half way through mastery course. might be getting a bit ahead of myself but id really like your help.

the plot doesnt seem to be correct in my code?

//@version=5
strategy("My strategy btc", overlay=true, margin_long=100, margin_short=100)

// EMA Input variables
length1 = input.int(20, title="EMA 1 Length", minval=1)
length2 = input.int(50, title="EMA 2 Length", minval=1)
src = input(close, title="Source")
timeframe1 = input.timeframe("5", title="Timeframe for EMA 1")
timeframe2 = input.timeframe("15", title="Timeframe for EMA 2")

// Get user input
tradeType = input.string(title="Trade Direction", defval="Long", options=["Long", "Short"], confirm=true)
trailSource = input.string(title="Trail Source", defval="Lows/Highs", options=["Lows/Highs", "Close", "Open"], confirm=true)
trailMethod = input.string(title="Trail Method", defval="ATR", options=["ATR", "Percent"], confirm=true)
trailPercent = input.float(title="Trail Percent", defval=10, minval=0.1, confirm=true)
swingLookback = input.int(title="Lookback", defval=7, confirm=true)
atrPeriod = input.int(title="ATR Period", defval=14, confirm=true)
atrMultiplier = input.float(title="ATR Multiplier", defval=1.0, confirm=true)

// Calculate EMAs based on the selected timeframes for another symbol (e.g., BTCUST.P)
ema1 = request.security("BTCUSDT.P", timeframe1, ta.ema(src, length1))
ema2 = request.security("BTCUSDT.P", timeframe2, ta.ema(src, length2))

// Plot EMAs on the chart
plot(ema1, color=ema1 > ema2 ? color.green : color.red, title="EMA 1", linewidth=4)
plot(ema2, color=color.gray, title="EMA 2", linewidth=4)

longCondition = ta.crossover(ema1, ema2)
if (longCondition)
strategy.entry("Long", strategy.long)

shortCondition = ta.crossunder(ema1, ema2)
if (shortCondition)
strategy.entry("Short", strategy.short)

// Declare trailing price variable (stores our trail stop value)
var float trailPrice = na
float next_trailPrice = na

// Get required trailing stop variables
atrValue = ta.atr(atrPeriod) * atrMultiplier
float swingLow = ta.lowest(low, swingLookback)
float swingHigh = ta.highest(high, swingLookback)

// Get trailing stop price
if trailMethod == "ATR" // Determine ATR trailing stop price based on price source
next_trailPrice := switch trailSource
"Close" => strategy.position_size > 0 ? close - atrValue : close + atrValue
"Open" => strategy.position_size > 0 ? open - atrValue : open + atrValue
=> strategy.position_size > 0 ? swingLow - atrValue : swingHigh + atrValue
else if trailMethod == "Percent" // Determine percentage trailing stop price based on price source
float percentMulti = strategy.position_size > 0 ? (100 - trailPercent) / 100 : (100 + trailPercent) / 100
next_trailPrice := switch trailSource
"Close" => close * percentMulti
"Open" => open * percentMulti
=> strategy.position_size > 0 ? swingLow * percentMulti : swingHigh * percentMulti

// Check for trailing stop update
if strategy.position_size != 0 and barstate.isconfirmed
// Trail long stop ONLY IF temp trailPrice is not set or is a higher price
if (next_trailPrice > trailPrice or na(trailPrice)) and strategy.position_size > 0
trailPrice := next_trailPrice
// Trigger alert
alert(message="Trailing Stop updated for " + syminfo.tickerid + ": " + str.tostring(trailPrice, "#.#####"), freq=alert.freq_once_per_bar_close)
// Trail short stop ONLY IF temp trailPrice is not set or is a lower price
if (next_trailPrice < trailPrice or na(trailPrice)) and strategy.position_size < 0
trailPrice := next_trailPrice
// Trigger alert
alert(message="Trailing Stop updated for " + syminfo.tickerid + ": " + str.tostring(trailPrice, "#.#####"), freq=alert.freq_once_per_bar_close)

// Draw data to chart
plot(trailPrice != 0 ? trailPrice : na, color=color.red, title="Trailing Stop")

// Exit trade if stop is hit
strategy.exit(id="Trail Exit", from_entry="Trade", limit=na, stop=trailPrice)

if (strategy.position_size > 0 and close < trailPrice) or (strategy.position_size < 0 and close > trailPrice)
strategy.close("Long")

if (strategy.position_size < 0 and close > trailPrice) or (strategy.position_size > 0 and close < trailPrice)
strategy.close("Short")


thanks in advance

Re: Resetting stop loss indicator

Posted: Mon Nov 27, 2023 1:16 am
by Steve Burman
Bmaloney please post this under your own post and I'll look into this.