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

//@version=5
indicator('Dynamic Take Profit & Signal Provider'shorttitle='DTSP'overlay=truemax_bars_back=4000)
//**************************************************************************************//
//******************************Moving Average Strategy********************************//
timer input(title='ATR Period'defval=14)
source input(hl2'Source')
MTP input.float(title='ATR Multiplier'step=0.1defval=7.0)
sf input.float(0.8'Sensitivity [0,1]'minval=0maxval=1)
changeATR input(title='Changing ATR method?'defval=false)
showsignals input(title='Reveal Long/Short Signals ?'defval=true)

avg 0.
srca 
sf source + (sf) * nz(avg[1], source)
atrsecond ta.sma(ta.trtimer)
atr changeATR ta.atr(timer) : atrsecond
upa 
srca MTP atr
up1a 
nz(upa[1], upa)
upa := close[1] > up1a math.max(upaup1a) : upa
dna 
srca MTP atr
dn1a 
nz(dna[1], dna)
dna := close[1] < dn1a math.min(dnadn1a) : dna
avg 
:= math.avg(upadna)

trenda 1
trenda 
:= nz(trenda[1], trenda)
trenda := trenda == -and close dn1a trenda == and close up1a ? -trenda


LongSignal 
trenda == and trenda[1] == -1
ShortSignal 
trenda == -and trenda[1] == 1

//***********************************************************************************************************************//
//*****************************************ATR STOP and Swing HIgh and Swing Low TP********************************************************************//

//Mode
src input(title='Source'defval=close)
atrLen input.int(title='ATR'defval=21minval=1maxval=100)
m1 input.float(title='ATR Multiplier - ADX Rising'defval=3minval=1step=0.1maxval=100)
m2 input.float(title='ATR Multiplier - ADX Falling'defval=3minval=1step=0.1maxval=100)

adxLen input.int(title='ADX'defval=14minval=1maxval=100)

// DI-Pos, DI-Neg, ADX

hR high nz(high[1])
lR nz(low[1]) - low

dmPos 
hR lR math.abs(hR) : 0
dmNeg 
lR hR math.abs(lR) : 0
var float sTR na
sTR 
:= nz(sTR[1]) - nz(sTR[1]) / adxLen ta.tr
var float sDMPos na
sDMPos 
:= nz(sDMPos[1]) - nz(sDMPos[1]) / adxLen dmPos
var float sDMNeg na
sDMNeg 
:= nz(sDMNeg[1]) - nz(sDMNeg[1]) / adxLen dmNeg

DIP 
sDMPos sTR 100
DIN 
sDMNeg sTR 100
DX 
math.abs(DIP DIN) / (DIP DIN) * 100
adx 
ta.sma(DXadxLen)

// Trailing ATR
var float m na
:= ta.rising(adx1) ? m1 ta.falling(adx1) ? m2 nz(m[1])
up hl2 ta.atr(atrLen)
dn hl2 ta.atr(atrLen)

var 
float TUp na
TUp 
:= src[1] > TUp[1] ? math.max(upTUp[1]) : up
var float TDown na
TDown 
:= src[1] < TDown[1] ? math.min(dnTDown[1]) : dn

var float trend na
trend 
:= src TDown[1] ? src TUp[1] ? -nz(trend[1], 1)
stop trend == TUp TDown
trendChange 
ta.change(trend)

// Plot

lineColor not trendChange trend #00FF00DD : #FF0000DD : #00000000
shapeColor trendChange trendChange #00FF00F8 : #FF0000F8 : #00000000

plot(stopcolor=lineColorstyle=plot.style_linelinewidth=1title='ATR Trend')



barsback input(90title='Bars back to check for a swing')

swing_detection(index) =>
    var 
float swing_high na
    
var float swing_low na
    start 
index 1  // -1 so we have an even number of
    
swing_point_high high[index]
    
swing_point_low low[index]

    
//Swing Highs
    
for 0 to start by 1
        
// swing_high := true
        
if index
            
if high[i] > swing_point_high
                swing_high 
:= high[i]
                break
        
// Have to do checks before pivot and after seperately because we can get
        // two highs of the same value in a row. Notice the > and >= difference
        
if index
            
if high[i] >= swing_point_high
                swing_high 
:= high[i]
                break

    
//Swing lows
    
for 0 to start by 1
        
// swing_low := true
        
if index
            
if low[i] < swing_point_low
                swing_low 
:= low[i]
                break
        
// Have to do checks before pivot and after seperately because we can get
        // two lows of the same value in a row. Notice the > and >= difference
        
if index
            
if low[i] <= swing_point_low
                swing_low 
:= low[i]
                break

    [
swing_highswing_low]

// Check for a swing
[sw_hsw_l] = swing_detection(barsback)


new_bar(res) =>
    
ta.change(time(res)) != 0
adr
(length) =>
    
range_1 high low
    ta
.sma(range_1[1], length)
adr_high(adr) =>
    
high low adr low adr close >= open low adr high
adr_low
(adr) =>
    
high low adr high adr close >= open low high adr


plotshape
(LongSignal and showsignals up natitle='BUY'style=shape.arrowuplocation=location.belowbarsize=size.autotext='Buy'color=color.new(color.green0))
plotshape(ShortSignal and showsignals dn natitle='SELL'style=shape.arrowdownlocation=location.abovebarsize=size.autotext='Sell'color=color.new(color.red0))

os 0.
tp 
0.
os 
:= LongSignal ShortSignal os[1]
tp := ta.change(os) == sw_h ta.change(os) == -sw_l tp[1]
css os == #0cb51a : #2157f3
plot(tpcolor=ta.change(os) ? na fixnan(css))
tpl input(50'Tp Length')
tpm input(2.'Tp Multiplicative Factor')

valong ta.valuewhen(LongSignalclose0)
valshort ta.valuewhen(ShortSignalclose0)
dev ta.stdev(closetpl) * tpm
up2 
valong dev 2
up1 
valong dev
dn1 
valong dev
dn2 
valong dev 2

plotshape
(os == up1 dn1title='TP 1'style=shape.circlelocation=location.absolutesize=size.autotext='TP 1'textcolor=csscolor=fixnan(css), show_last=1offset=14transp=0)

plotshape(os == up2 dn2title='TP 2'style=shape.circlelocation=location.absolutesize=size.autotext='TP 2'textcolor=csscolor=fixnan(css), show_last=1offset=14transp=0)

plotshape(os == na valongtitle='Long'style=shape.circlelocation=location.absolutesize=size.autotext='Long Position'textcolor=color.new(#0cb51a, 0), color=color.new(#0cb51a, 0), show_last=1, offset=14)

plotshape(os == na valshorttitle='Short'style=shape.circlelocation=location.absolutesize=size.autotext='Short Position'textcolor=color.new(#ff1100, 0), color=color.new(#ff1100, 0), show_last=1, offset=14)