Gewinnmaximierer PMax

Schriftsteller:ChaoZhang, Datum: 2022-05-25 17:13:45
Tags:SMAEMAWMATMAATRZLEMA

Sowohl die MOST- als auch die SuperTrend-Indikatoren sind sehr gut in Trendfolgensystemen, aber umgekehrt sind ihre Leistungen bei seitlichen Marktbedingungen nicht so gut wie die meisten anderen Indikatoren.

Profit Maximizer - PMax versucht, dieses Problem zu lösen. PMax kombiniert die leistungsstarken Seiten von MOST (Moving Average Trend Changer) und SuperTrend (ATR Preisdetektion) in einem Indikator.

Die Rücktest- und Optimierungsergebnisse von PMax sind im Vergleich zu seinen Vorgängern MOST und SuperTrend viel besser.

PMax ist leicht zu bestimmen und kann in allen Arten von Märkten und Instrumenten verwendet werden.

Der erste Parameter des PMax-Indikators, der durch die drei Parameter festgelegt wird, ist die ATR-Periode/Länge.

Der zweite Parameter ist der Multiplikator von ATR, der nützlich wäre, um den Wert der Entfernung vom eingebauten gleitenden Durchschnitt festzulegen.

Ich persönlich denke, der wichtigste Parameter ist die gleitende Durchschnittslänge und der Typ.

PMax wird sehr empfindlich auf Trendbewegungen reagieren, wenn die gleitende Durchschnittslänge kleiner ist und umgekehrt weniger empfindlich, wenn sie länger ist.

Mit zunehmendem Zeitraum wird es weniger empfindlich für kleine Trends und Kursbewegungen.

Auf diese Weise wird Ihre Wahl der Periode eng mit der Art der Trends zusammenhängen, an denen Sie interessiert sind.

Wir sind in den Fällen, in denen der gleitende Durchschnitt über PMax liegt, unter dem Effekt des Aufwärtstrends; Umgekehrt unter dem Einfluß eines Abwärtstrends, wenn der gleitende Durchschnitt unter PMax liegt.

Eingebundener gleitender Durchschnittstyp, der standardmäßig als EMA eingestellt ist, aber Benutzer können aus 8 verschiedenen gleitenden Durchschnittstypen wählen, wie:

SMA: einfacher gleitender Durchschnitt EMA: Exponentieller beweglicher Durchschnitt WMA: gewichteter gleitender Durchschnitt TMA: Dreiecks gleitender Durchschnitt VAR: Variabler Index Dynamischer gleitender Durchschnitt auch bekannt als VIDYA Welles Wilders gleitender Durchschnitt ZLEMA: Nullverzögerung exponentieller gleitender Durchschnitt TSF: Wahre Stärke

Tipp: Seitwärts wäre VAR eine gute Wahl

Sie können PMax-Standard-Alarme und Kauf-Verkauf-Signale wie:

1- KAUFEN, wenn der gleitende Durchschnitt über PMax steigt SELL, wenn sich der gleitende Durchschnitt unter PMax kreuzt

2- Kaufen, wenn die Preise über die Pmax-Linie springen. Verkauft, wenn die Preise unter die Pmax-Linie fallen.

Zurückprüfung

img


/*backtest
start: 2022-04-24 00:00:00
end: 2022-05-23 23:59:00
period: 15m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// 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

study("Profit Maximizer","PMax", overlay=true, format=format.price, precision=2, resolution="")
src = input(hl2, title="Source")
Periods = input(title="ATR Length", type=input.integer, defval=10)
Multiplier = input(title="ATR Multiplier", type=input.float, step=0.1, defval=3.0)
mav = input(title="Moving Average Type", defval="EMA", options=["SMA", "EMA", "WMA", "TMA", "VAR", "WWMA", "ZLEMA", "TSF"])
length =input(10, "Moving Average Length", minval=1)
changeATR= input(title="Change ATR Calculation Method ?", type=input.bool, defval=true)
Normalize= input(title="Normalize ATR ?", type=input.bool, defval=false)
showsupport = input(title="Show Moving Average?", type=input.bool, defval=true)
showsignalsk = input(title="Show Crossing Signals?", type=input.bool, defval=true)
showsignalsc = input(title="Show Price/Pmax Crossing Signals?", type=input.bool, defval=false)
highlighting = input(title="Highlighter On/Off ?", type=input.bool, defval=true)
atr2 = sma(tr, Periods)
atr= changeATR ? atr(Periods) : atr2
valpha=2/(length+1)
vud1=src>src[1] ? src-src[1] : 0
vdd1=src<src[1] ? src[1]-src : 0
vUD=sum(vud1,9)
vDD=sum(vdd1,9)
vCMO=nz((vUD-vDD)/(vUD+vDD))
VAR=0.0
VAR:=nz(valpha*abs(vCMO)*src)+(1-valpha*abs(vCMO))*nz(VAR[1])
wwalpha = 1/ length
WWMA = 0.0
WWMA := wwalpha*src + (1-wwalpha)*nz(WWMA[1])
zxLag = length/2==round(length/2) ? length/2 : (length - 1) / 2
zxEMAData = (src + (src - src[zxLag]))
ZLEMA = ema(zxEMAData, length)
lrc = linreg(src, length, 0)
lrc1 = linreg(src,length,1)
lrs = (lrc-lrc1)
TSF = linreg(src, length, 0)+lrs
getMA(src, length) =>
    ma = 0.0
    if mav == "SMA"
        ma := sma(src, length)
        ma

    if mav == "EMA"
        ma := ema(src, length)
        ma

    if mav == "WMA"
        ma := wma(src, length)
        ma

    if mav == "TMA"
        ma := sma(sma(src, ceil(length / 2)), 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)
longStop = Normalize ? MAvg - Multiplier*atr/close : MAvg - Multiplier*atr
longStopPrev = nz(longStop[1], longStop)
longStop := MAvg > longStopPrev ? max(longStop, longStopPrev) : longStop
shortStop = Normalize ? MAvg + Multiplier*atr/close : MAvg + Multiplier*atr
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := MAvg < shortStopPrev ? 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
plot(showsupport ? MAvg : na, color=#0585E1, linewidth=2, title="Moving Avg Line")
pALL=plot(PMax, color=color.red, linewidth=2, title="PMax", transp=0)
alertcondition(cross(MAvg, PMax), title="Cross Alert", message="PMax - Moving Avg Crossing!")
alertcondition(crossover(MAvg, PMax), title="Crossover Alarm", message="Moving Avg BUY SIGNAL!")
alertcondition(crossunder(MAvg, PMax), title="Crossunder Alarm", message="Moving Avg SELL SIGNAL!")
alertcondition(cross(src, PMax), title="Price Cross Alert", message="PMax - Price Crossing!")
alertcondition(crossover(src, PMax), title="Price Crossover Alarm", message="PRICE OVER PMax - BUY SIGNAL!")
alertcondition(crossunder(src, PMax), title="Price Crossunder Alarm", message="PRICE UNDER PMax - SELL SIGNAL!")

buySignalk = 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.green, textcolor=color.white, transp=0)

sellSignallk = 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.red, textcolor=color.white, transp=0)

buySignalc = 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=#0F18BF, textcolor=color.white, transp=0)

sellSignallc = 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=#0F18BF, textcolor=color.white, transp=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)
fill(mPlot, pALL, title="DownTrend Highligter", color=shortFillColor)


if buySignalk
    strategy.entry("Enter Long", strategy.long)
else if sellSignallk
    strategy.entry("Enter Short", strategy.short)

Verwandt

Mehr