Fantazma
Fantazma

Reputation: 1

Tradingview - pine script for Take profit and Stop loss by percentage now working

Im trying to use the script suggested at the thread: Tradingview - pine script for Take profit and Stop loss by percentage But there are some issues with the calculation of TP and SL The tester can't understand that TP1 hit and when TP2 hit take the total amount and not the half amount. Also if the SL hit, the script takes 100% for the TP1 and 100% for the TP2 both at the same time.

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © SafetyHammer

//@version=4
strategy(title="Take profit (% of instrument price)", overlay=true, pyramiding=1)

// STEP 1:
// Make inputs that set the take profit % (optional)



FastPeriod = input(title="Fast MA Period", type=input.integer, defval=9, minval=1, group="Moving Average")
SlowPeriod = input(title="Slow MA Period", type=input.integer, defval=50, minval=1, group="Moving Average")



TP1Perc = input(title="Long Take Profit (%)", type=input.float, minval=0.0, step=0.1, defval=0.5, group="TP & SL") 
TP2Perc = input(title="Long Take Profit (%)", type=input.float, minval=0.0, step=0.1, defval=1, group="TP & SL") 
SLPerc = input(title="Long Stop Loss (%)", type=input.float, minval=0.0, step=0.1, defval=0.5, group="TP & SL")

TP1_Ratio = input(title="Sell Postion Size % @ TP1", type=input.float, defval=50, step=1, group="TP & SL", tooltip="Example: 50 closing 50% of the position once TP1 is reached")/100


// Calculate moving averages
fastSMA = ema(close, FastPeriod)
slowSMA = ema(close, SlowPeriod)

// Calculate trading conditions
enterLong  = crossover(fastSMA, slowSMA)
enterShort  = crossunder(fastSMA, slowSMA)

// Plot moving averages
plot(series=fastSMA, color=color.green, title="Fase MA")
plot(series=slowSMA, color=color.red, title="Slow MA")

// STEP 2:
// Figure out take profit price
percentAsPoints(pcnt) =>
    strategy.position_size != 0 ? round(pcnt / 100.0 * strategy.position_avg_price / syminfo.mintick) : float(na)

percentAsPrice(pcnt) =>
    strategy.position_size != 0 ? ((pcnt / 100.0) + 1.0) * strategy.position_avg_price : float(na)
 
current_position_size = abs(strategy.position_size)
initial_position_size = abs(valuewhen(strategy.position_size[1] == 0.0, strategy.position_size, 0))   
    
TP1  = strategy.position_avg_price + percentAsPoints(TP1Perc) * syminfo.mintick * strategy.position_size / abs(strategy.position_size)
TP2  = strategy.position_avg_price + percentAsPoints(TP2Perc) * syminfo.mintick * strategy.position_size / abs(strategy.position_size)
SL   = strategy.position_avg_price - percentAsPoints(SLPerc) * syminfo.mintick * strategy.position_size / abs(strategy.position_size)



// Submit entry orders
if (enterLong) 
    strategy.entry(id="Long", long=true)  



// STEP 3:
// Submit exit orders based on take profit price

if strategy.position_size > 0 
    strategy.exit("TP1", from_entry="Long", qty = initial_position_size * TP1_Ratio, limit = TP1, stop = SL)
    strategy.exit("TP2", from_entry="Long", limit = TP2, stop = SL) 
    
    
    
// Plot take profit values for confirmation
plot(series=(strategy.position_size > 0) ? TP1 : na, color=color.green, style=plot.style_circles, linewidth=1, title="Take Profit 1")
plot(series=(strategy.position_size > 0) ? TP2 : na, color=color.green, style=plot.style_circles, linewidth=1, title=" Take Profit 2")
plot(series=(strategy.position_size > 0) ? SL : na, color=color.red, style=plot.style_circles, linewidth=1, title="Stop Loss")

Upvotes: 0

Views: 826

Answers (1)

Nadav Ezra
Nadav Ezra

Reputation: 26

You need to use qty_percent

strategy.exit("TP1", from_entry="Long", qty = initial_position_size * TP1_Ratio, 
limit = TP1, stop = SL, qty_percent = 50)
strategy.exit("TP2", from_entry="Long", limit = TP2, stop = SL, qty_percent = 50) 

Upvotes: 0

Related Questions