Les indicateurs MOST et SuperTrend sont tous deux très bons pour suivre les tendances, mais inversement, leur performance n'est pas aussi brillante dans les conditions de marché latérales que la plupart des autres indicateurs.
Le PMax tente de résoudre ce problème en combinant les aspects puissants de MOST (changement de tendance moyenne mobile) et de SuperTrend (détection de prix ATR) dans un seul indicateur.
Les résultats des tests de retour et de l'optimisation de PMax sont bien meilleurs par rapport à ses prédécesseurs MOST et SuperTrend.
PMax est facile à déterminer la tendance et peut être utilisé dans tous les types de marchés et d'instruments.
Le premier paramètre de l'indicateur PMax défini par les trois paramètres est la période/longueur de l'ATR.
Le deuxième paramètre est le multiplicateur de l'ATR qui serait utile pour définir la valeur de la distance par rapport à la moyenne mobile intégrée.
Personnellement, je pense que le paramètre le plus important est la longueur moyenne mobile et le type.
PMax sera beaucoup plus sensible aux mouvements de tendance si la longueur moyenne mobile est plus petite.
Au fur et à mesure que la période s'allonge, il deviendra moins sensible aux petites tendances et aux mouvements de prix.
De cette façon, votre choix de période sera étroitement lié au type de tendance qui vous intéresse.
Nous sommes sous l'effet de la tendance haussière dans les cas où la moyenne mobile est supérieure à PMax; inversement sous l'influence d'une tendance à la baisse, lorsque la moyenne mobile est inférieure à PMax.
Construit dans le type de moyenne mobile définie par défaut comme EMA mais les utilisateurs peuvent choisir parmi 8 différents types de moyenne mobile comme:
SMA: moyenne mobile simple EMA: Moyenne mobile exponentielle WMA: moyenne mobile pondérée TMA: moyenne mobile triangulaire VAR: Indice variable Moyenne mobile dynamique alias VIDYA WWMA: La moyenne mobile de Welles Wilder ZLEMA: Moyenne mobile exponentielle à retard zéro TSF: La vraie force de la force
Astuce: dans les côtés VAR serait un bon choix
Vous pouvez utiliser les alarmes par défaut PMax et les signaux de vente comme:
1- Acheter lorsque la moyenne mobile dépasse PMax VENDRE lorsque la moyenne mobile est inférieure à PMax
2- Achetez lorsque les prix dépassent la ligne Pmax. Vendez lorsque les prix descendront en dessous de la ligne Pmax.
test de retour
/*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)