// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © KivancOzbilgic //developer: KivancOzbilgic //author: KivancOzbilgic //@version=5 strategy('PMax Explorer', shorttitle='PMEx', overlay=true) src = input(hl2, title='Source') Periods = input(title='ATR Length', defval=10) Multiplier = input.float(title='ATR Multiplier', step=0.1, defval=3.0) mav = input.string(title='Moving Average Type', defval='VAR', options=['SMA', 'EMA', 'WMA', 'TMA', 'VAR', 'WWMA', 'ZLEMA', 'TSF']) length = input.int(10, 'Moving Average Length', minval=1) changeATR = input(title='Change ATR Calculation Method ?', defval=true) showsupport = input(title='Show Moving Average?', defval=true) showsignalsk = input(title='Show Crossing Signals?', defval=true) showsignalsc = input(title='Show Price/Pmax Crossing Signals?', defval=false) highlighting = input(title='Highlighter On/Off ?', defval=true) atr2 = ta.sma(ta.tr, Periods) atr = changeATR ? ta.atr(Periods) : atr2 Var_Func(src, length) => valpha = 2 / (length + 1) vud1 = src > src[1] ? src - src[1] : 0 vdd1 = src < src[1] ? src[1] - src : 0 vUD = math.sum(vud1, 9) vDD = math.sum(vdd1, 9) vCMO = nz((vUD - vDD) / (vUD + vDD)) VAR = 0.0 VAR := nz(valpha * math.abs(vCMO) * src) + (1 - valpha * math.abs(vCMO)) * nz(VAR[1]) VAR VAR = Var_Func(src, length) Wwma_Func(src, length) => wwalpha = 1 / length WWMA = 0.0 WWMA := wwalpha * src + (1 - wwalpha) * nz(WWMA[1]) WWMA WWMA = Wwma_Func(src, length) Zlema_Func(src, length) => zxLag = length / 2 == math.round(length / 2) ? length / 2 : (length - 1) / 2 zxEMAData = src + src - src[zxLag] ZLEMA = ta.ema(zxEMAData, length) ZLEMA ZLEMA = Zlema_Func(src, length) Tsf_Func(src, length) => lrc = ta.linreg(src, length, 0) lrc1 = ta.linreg(src, length, 1) lrs = lrc - lrc1 TSF = ta.linreg(src, length, 0) + lrs TSF TSF = Tsf_Func(src, length) getMA(src, length) => ma = 0.0 if mav == 'SMA' ma := ta.sma(src, length) ma if mav == 'EMA' ma := ta.ema(src, length) ma if mav == 'WMA' ma := ta.wma(src, length) ma if mav == 'TMA' ma := ta.sma(ta.sma(src, math.ceil(length / 2)), math.floor(length / 2) + 1) ma if mav == 'VAR' ma := VAR ma if mav == 'WWMA' ma := WWMA ma if mav == 'ZLEMA' ma := ZLEMA ma if mav == 'TSF' ma := TSF ma ma MAvg = getMA(src, length) Pmax_Func(src, length) => longStop = MAvg - Multiplier * atr longStopPrev = nz(longStop[1], longStop) longStop := MAvg > longStopPrev ? math.max(longStop, longStopPrev) : longStop shortStop = MAvg + Multiplier * atr shortStopPrev = nz(shortStop[1], shortStop) shortStop := MAvg < shortStopPrev ? math.min(shortStop, shortStopPrev) : shortStop dir = 1 dir := nz(dir[1], dir) dir := dir == -1 and MAvg > shortStopPrev ? 1 : dir == 1 and MAvg < longStopPrev ? -1 : dir PMax = dir == 1 ? longStop : shortStop PMax PMax = Pmax_Func(src, length) plot(showsupport ? MAvg : na, color=color.new(#0585E1, 0), linewidth=2, title='Moving Avg Line') pALL = plot(PMax, color=color.new(color.red, 0), linewidth=2, title='PMax') alertcondition(ta.cross(MAvg, PMax), title='Cross Alert', message='PMax - Moving Avg Crossing!') alertcondition(ta.crossover(MAvg, PMax), title='Crossover Alarm', message='Moving Avg BUY SIGNAL!') alertcondition(ta.crossunder(MAvg, PMax), title='Crossunder Alarm', message='Moving Avg SELL SIGNAL!') alertcondition(ta.cross(src, PMax), title='Price Cross Alert', message='PMax - Price Crossing!') alertcondition(ta.crossover(src, PMax), title='Price Crossover Alarm', message='PRICE OVER PMax - BUY SIGNAL!') alertcondition(ta.crossunder(src, PMax), title='Price Crossunder Alarm', message='PRICE UNDER PMax - SELL SIGNAL!') buySignalk = ta.crossover(MAvg, PMax) plotshape(buySignalk and showsignalsk ? PMax * 0.995 : na, title='Buy', text='Buy', location=location.absolute, style=shape.labelup, size=size.tiny, color=color.new(color.green, 0), textcolor=color.new(color.white, 0)) sellSignallk = ta.crossunder(MAvg, PMax) plotshape(sellSignallk and showsignalsk ? PMax * 1.005 : na, title='Sell', text='Sell', location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.new(color.red, 0), textcolor=color.new(color.white, 0)) buySignalc = ta.crossover(src, PMax) plotshape(buySignalc and showsignalsc ? PMax * 0.995 : na, title='Buy', text='Buy', location=location.absolute, style=shape.labelup, size=size.tiny, color=color.new(#0F18BF, 0), textcolor=color.new(color.white, 0)) sellSignallc = ta.crossunder(src, PMax) plotshape(sellSignallc and showsignalsc ? PMax * 1.005 : na, title='Sell', text='Sell', location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.new(#0F18BF, 0), textcolor=color.new(color.white, 0)) mPlot = plot(ohlc4, title='', style=plot.style_circles, linewidth=0, display=display.none) longFillColor = highlighting ? MAvg > PMax ? color.green : na : na shortFillColor = highlighting ? MAvg < PMax ? color.red : na : na fill(mPlot, pALL, title='UpTrend Highligter', color=longFillColor, transp=90) fill(mPlot, pALL, title='DownTrend Highligter', color=shortFillColor, transp=90) showscr = input(true, title='Show Screener Label') posX_scr = input(20, title='Pos. Label x-axis') posY_scr = input(1, title='Pos. Size Label y-axis') colinput = input.string(title='Label Color', defval='Blue', options=['White', 'Black', 'Red', 'Green', 'Yellow', 'Blue']) col = color.gray if colinput == 'White' col := color.white col if colinput == 'Black' col := color.black col if colinput == 'Red' col := color.red col if colinput == 'Green' col := color.green col if colinput == 'Yellow' col := color.yellow col if colinput == 'Blue' col := color.blue col dummy0 = input(true, title='=Backtest Inputs=') FromDay = input.int(defval=1, title='From Day', minval=1, maxval=31) FromMonth = input.int(defval=1, title='From Month', minval=1, maxval=12) FromYear = input.int(defval=2005, title='From Year', minval=2005) ToDay = input.int(defval=1, title='To Day', minval=1, maxval=31) ToMonth = input.int(defval=1, title='To Month', minval=1, maxval=12) ToYear = input.int(defval=9999, title='To Year', minval=2006) Start = timestamp(FromYear, FromMonth, FromDay, 00, 00) Finish = timestamp(ToYear, ToMonth, ToDay, 23, 59) Timerange() => time >= Start and time <= Finish ? true : false timesource = input("1600-0600", title='Source') t = time(timeframe.period, timesource) if buySignalk and na(t) strategy.entry('Long', strategy.long, when=Timerange()) if sellSignallk and na(t) strategy.entry('Short', strategy.short, when=Timerange())