Reputation: 1
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
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