Die Ressourcen sind geladen. Beförderung...

Multiplikative gleitende Durchschnittswert-Doppelrichtung-Handelsstrategie

Schriftsteller:ChaoZhang, Datum: 15.01.2024
Tags:

img

Übersicht

Diese Strategie berechnet die multiplikative gleitende Durchschnittslinie und kombiniert die Kreuzungen von Preis und PMax-Indikator, um die Trendrichtung zu bestimmen.

Strategieprinzip

Der Kernindikator dieser Strategie ist die multiplikative gleitende Durchschnittslinie. Zu den Indikatorparametern gehören: ATR-Periode, ATR-Multiplikator, gleitende Durchschnittsart und Länge. Der ATR-Wert repräsentiert die Volatilität über den Zeitraum. Die multiplikative gleitende Durchschnittslinie entspricht dem durchschnittlichen Preis plus/minus dem Produkt von ATR-Multiplikator und ATR über den Zeitraum. Wenn der Preis über der Linie liegt, gibt es ein langes Signal. Wenn der Preis unter der Linie liegt, gibt es ein kurzes Signal.

Der PMax-Indikator stellt den Stop-Loss- oder Take-Profit-Preis dar. Er wird anhand des ATR-Wertes und der Trendrichtung berechnet. Im Aufwärtstrend entspricht PMax dem gleitenden Durchschnitt minus ATR-Multiplikator mal ATR, der als Stop-Loss-Linie fungiert. Im Abwärtstrend entspricht PMax dem gleitenden Durchschnitt plus ATR-Multiplikator mal ATR, der als Take-Profit-Linie fungiert.

Wenn der Preis den PMax-Indikator nach oben überschreitet, gibt es ein langes Signal. Wenn der Preis den PMax-Indikator nach unten überschreitet, gibt es ein kurzes Signal. Die Strategie geht basierend auf den Signalen ein und aus, indem sie im Aufwärtstrend lang und im Abwärtstrend kurz ist, mit dynamischem Stop-Loss und Take-Profit.

Analyse der Vorteile

Die Vorteile dieser Strategie:

  1. Durch die Einführung des zweiseitigen Handels werden alle Marktbedingungen in hohem Maße berücksichtigt.

  2. Die Anwendung multiplikativer gleitender Durchschnitte erzeugt stabile und zuverlässige Handelssignale.

  3. Mit PMax für Stop-Loss/Take-Profit wird das Risiko effektiv kontrolliert.

  4. Der verstellbare Zyklus und die Multiplikatorparameter machen ihn sehr anpassungsfähig.

Risikoanalyse

Es gibt auch einige Risiken:

  1. Falsche Einstellungen der Parameter können zu Verlusten führen.

  2. Achten Sie beim Shorting auf Hebelwirkungsgrenzen.

  3. Schwarze Schwanen sind schwer zu vermeiden.

Lösungen:

  1. Optimieren Sie die Parameter, um Whipsaws zu reduzieren.

  2. Steuerung der Hebelwirkung und Diversifizierung.

  3. Erhöhen Sie den ATR-Multiplikator, um die Reichweite zu erweitern.

Optimierungsrichtlinien

Die Strategie kann wie folgt verbessert werden:

  1. Stabilität auf verschiedenen Märkten und Zyklen testen.

  2. Maschinelles Lernen zur automatischen Optimierung von Parametern anwenden.

  3. Beurteilen Sie Marktregime mit Deep Learning-Techniken.

  4. Integrieren Sie mehr Datenquellen, um Entscheidungen zu ermöglichen.

Zusammenfassung

Die Gesamtleistung dieser Strategie ist stabil mit starker Inklusivität. Durch die Annahme von dualem Handel und dynamischem Stop-Loss/Take-Profit werden Risiken effektiv kontrolliert. Durch Parameter-Tuning und Modell-Iteration können die Strategie-Fitness und -Wirksamkeit weiter verbessert werden. Im Allgemeinen ist dies eine Strategie, die langfristige Aufmerksamkeit und Anwendung verdient.


/*backtest
start: 2023-01-08 00:00:00
end: 2024-01-14 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © melihtuna
//developer: @KivancOzbilgic
//author: @KivancOzbilgic
//stretegy converter: @crypto_melih
//@version=4

strategy("Profit Maximizer Strategy Long-Short", shorttitle="PMax-Strategy", overlay=true, default_qty_type=strategy.cash, default_qty_value=10000, initial_capital=10000, currency=currency.USD, commission_value=0, commission_type=strategy.commission.percent)

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)
condition = input(title="Signal Type", defval="Only Crossing Signals", options=["Only Crossing Signals", "Only Price/Pmax Crossing Signals"])
changeATR= input(title="Change ATR Calculation Method ?", type=input.bool, defval=true)
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)
long_short = input(defval = false, title = "Long-Short", type=input.bool)
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 = MAvg - Multiplier*atr
longStopPrev = nz(longStop[1], longStop)
longStop := MAvg > longStopPrev ? max(longStop, longStopPrev) : longStop
shortStop = 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(condition=="Only Crossing Signals")
    strategy.entry("BUY", strategy.long, when = buySignalk)
else
    strategy.entry("BUY", strategy.long, when = buySignalc)

if(long_short)
    if(condition=="Only Crossing Signals")
        strategy.entry("SELL", strategy.short, when = sellSignallk)
    else
        strategy.entry("SELL", strategy.short, when = sellSignallc)
else
    if(condition=="Only Crossing Signals")
        strategy.close("BUY", when = sellSignallk)
    else
        strategy.close("BUY", when = sellSignallc)
    

    
    
    
  

Mehr