0
votes

I am trying to do a back test in trading view, when this below condition met,

1) long = RSI > 50 and MACD > SIGNAL (vise versa for short)

2) when both are met, entry at OPEN(0) > HIGH(signal bar when above condition met)

and exit when profit target reached.

3) And go long only again re-crossover happens...not immediately Which I cannot able to do in pine script and need help

below is the Code for the same:

//@version=4
strategy("Test1 script",overlay=false)
var a = 0
var hiBar = 0
var loBar = 0
//MACD
fast = 12, slow = 26

fastMA = ema(close, fast)
slowMA = ema(close, slow)
macd = fastMA - slowMA
signal = sma(macd, 9)

//RSI
rsiSource = close //input(title="RSI Source", type=input.source, defval=close)
rsiLength = 7 //input(title="RSI Length", type=input.integer, defval=14)
rsiOverbought = 70 //nput(title="RSI Overbought Level", type=input.integer, defval=80)
rsiOversold = 30 //input(title="RSI Oversold Level", type=input.integer, defval=20)
rsiValue = rsi(rsiSource, rsiLength)
isRsiOB = rsiValue >= rsiOverbought
isRsiOS = rsiValue <= rsiOversold

uptrend1 = rsiValue > 50 and macd > signal 
downtrend1 = rsiValue < 50  and macd < signal 


if uptrend1 or downtrend1
    a := 10
else 
    a := 20

if uptrend1
    hiBar := bar_index

if downtrend1
    loBar := bar_index


barcolor(uptrend1 ? color.purple:downtrend1 ? color.yellow: a == 20 ? color.gray: na) 

if uptrend1
    strategy.entry("Long", strategy.long,when = close[0] > high[hiBar-1] or open[0] > high[hiBar-1])


strategy.exit("exit long","Long", profit = 2400, loss = 1200)

if downtrend1
    strategy.entry("Short", strategy.short)

strategy.exit("exit short", "Short", profit = 2800, loss = 1200)

Also attached the image of back test

enter image description here

1
This is unclear: 3) And go long only again re-crossover happens...not immediately. Can you explain it again pls? - PineCoders-LucF
I have re-attached an image with some explanation please have a look and let me know if that is enough or I could see to provided some more information too. @PineCoders-LucF - siva

1 Answers

2
votes

This should implement that logic. Your target and profit numbers weren't expressed in ticks, and you can now change them through Inputs. Values are larger than yours to prevent premature exits:

//@version=4
strategy("Test1 script",overlay=true)
targetProfit = input(1000., "Profit target (in currency)") / syminfo.mintick
targetLoss = input(500., "Profit loss (in currency)") / syminfo.mintick

var a = 0
var float hiBar = na
var float loBar = na
var float referenceHi = na
// This is true when a long was exited and we're waiting for downtrend condition to occur.
var waitingForLongReset = false

//MACD
fast = 12, slow = 26
fastMA = ema(close, fast)
slowMA = ema(close, slow)
macd = fastMA - slowMA
signal = sma(macd, 9)

//RSI
rsiSource = close //input(title="RSI Source", type=input.source, defval=close)
rsiLength = 7 //input(title="RSI Length", type=input.integer, defval=14)
rsiOverbought = 70 //nput(title="RSI Overbought Level", type=input.integer, defval=80)
rsiOversold = 30 //input(title="RSI Oversold Level", type=input.integer, defval=20)
rsiValue = rsi(rsiSource, rsiLength)
isRsiOB = rsiValue >= rsiOverbought
isRsiOS = rsiValue <= rsiOversold

uptrend1 = rsiValue > 50 and macd > signal 
downtrend1 = rsiValue < 50  and macd < signal 
enterUpTrend = not uptrend1[1] and uptrend1
enterDnTrend = not downtrend1[1] and downtrend1

// Only save bar on transition into trend.
if enterUpTrend and not waitingForLongReset
    hiBar := bar_index
referenceHi := high[max(0, bar_index - hiBar)]
if uptrend1 and max(close, open) > referenceHi and not waitingForLongReset
    waitingForLongReset := true
    strategy.entry("Long", strategy.long)
    strategy.exit("exit long","Long", profit = targetProfit, loss = targetLoss)
if strategy.position_size[1] > 0 and strategy.position_size == 0
    // Long was exited, wait for reset before next long.
    waitingForLongReset := true

if enterDnTrend
    loBar := bar_index
    // Allow another long condition to become true.
    waitingForLongReset := false


barcolor(uptrend1 ? color.purple:downtrend1 ? color.yellow: a == 20 ? color.gray: color.blue) 

// Debugging plots.
plotchar(uptrend1, "uptrend1", "▲", location.top)
plotchar(downtrend1, "downtrend1", "▼", location.bottom)
plotchar(waitingForLongReset, "waitingForLongReset", "—", location.bottom)
plotchar(max(close, open) > referenceHi, "max(close, open) > referenceHi", "—", location.top)
plot(referenceHi, "referenceHi", color.green, 2, plot.style_circles)

enter image description here