Multiplikative, gleitende Durchschnittsstrategie für bidirektionales Trading


Erstellungsdatum: 2024-01-15 14:50:32 zuletzt geändert: 2024-01-15 14:50:32
Kopie: 1 Klicks: 607
1
konzentrieren Sie sich auf
1617
Anhänger

Multiplikative, gleitende Durchschnittsstrategie für bidirektionales Trading

Überblick

Die Strategie beurteilt die Richtung des Trends durch die Berechnung von Multiplikation von Moving Averages in Kombination mit einer Kreuzung von Preis- und PMax-Indikatoren. Die Strategie verwendet eine langfristige, bidirektionale Handelsmethode, bei der der Trend nach oben geht, wird bei der Tendenz nach unten gemacht, und das Positionsrisiko wird in Echtzeit bewertet, um einen Gewinn zu erzielen.

Strategieprinzip

Der Kern der Strategie ist der Multiplikator Moving Average. Die Indikatorparameter umfassen: ATR-Zykluslänge, ATR-Multiplikator, Art und Länge des Moving Averages. Die ATR-Werte repräsentieren die Periodenschwankungen. Der Multiplikator Moving Average ist gleich dem Preisdurchschnitt plus/minus ATR-Multiplikator multipliziert mit ATR.

Der PMax-Indikator repräsentiert einen Stop-Loss- oder Stopp-Preis. Der Indikator wird in Kombination mit dem ATR-Wert und der Trendrichtung berechnet. In einem bullish Markt ist PMax gleich dem Multiplikator des Moving Average minus dem Multiplikator des ATR-Wertes und des Multiplikators als Stop-Line.

Wenn der Preis mit dem PMax-Indikator aufwärts kreuzt, gibt es ein Plussignal. Wenn der Preis mit dem PMax-Indikator aufwärts kreuzt, gibt es ein Minussignal. Die Strategie setzt damit ein, um aufwärts zu gehen und einen Plus zu machen und einen Minus zu machen.

Analyse der Stärken

Diese Strategie hat folgende Vorteile:

  1. Es ist ein langfristiges, zweiseitiges Handelssystem, das den gesamten Markt abdeckt und sehr inklusiv ist.

  2. Die Anwendung von Multiplikations-Moving Average-Indikatoren sorgt für stabile und zuverlässige Handelssignale.

  3. In Kombination mit dem PMax-Wert wird ein Stop-Stop-Loss verwendet, um das Risiko effektiv zu kontrollieren.

  4. Berechnungszyklen und Multiplikationsparameter sind einstellbar und flexibel.

Risikoanalyse

Die Strategie birgt auch Risiken:

  1. Die falsche Einstellung der Parameter kann zu Verlusten bei Whipsaw-Handel führen.

  2. Die Risiken von Leverage-Restrictions sind bei Leverage-Trading zu beachten.

  3. Die Gefahr eines unvorhergesehenen Ereignisses, das zu starken Marktschwankungen führen könnte, ist unumgänglich.

Entsprechende Lösungen:

  1. Optimierung der Parameter zur Verringerung der Wahrscheinlichkeit eines Whipsaws.

  2. Die Leverage-Grenze soll angemessen kontrolliert werden, um die Risiken der Position zu verteilen.

  3. Erhöhung der ATR-Multiplikatoren und Ausweitung der Stop-Loss-Reihe.

Optimierungsrichtung

Die Strategie kann optimiert werden durch:

  1. Tests zur Stabilität verschiedener Markt- und Zyklusparameter

  2. Automatische Optimierung der Parameter durch Anwendung von Machine Learning-Algorithmen.

  3. Die Analyse der Marktstruktur in Kombination mit Technologien wie Deep Learning.

  4. Integration von mehr Datenquellen zur Verbesserung der Entscheidungsfindung.

Zusammenfassen

Die Strategie arbeitet insgesamt stabil und hat eine starke Inklusivität. Mit langfristigen Zwei-Wege-Trading und dynamischen Stop-Loss-Stopp-Methoden kann das Risiko effektiv kontrolliert werden. Durch Parameteroptimierung und Modell-Iteration wird eine bessere Anpassung und Handelswirksamkeit erwartet.

Strategiequellcode
/*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)