Durchbruch der Reichweite Dual Moving Average Filterstrategie

Schriftsteller:ChaoZhang, Datum: 2023-11-27 17:03:08
Tags:

img

Übersicht

Dies ist eine Strategie, die gleitende Durchschnitte und Bollinger-Bänder für die Trendbeurteilung verwendet, kombiniert mit Breakout-Filterung und Stop-Loss-Prinzipien.

Strategieprinzip

Die Strategie besteht aus folgenden Hauptteilen:

  1. Trendbeurteilung: Verwenden Sie den MACD, um die Preisentwicklung zu beurteilen und bullische und bärische Trends zu unterscheiden.

  2. Bereichsfilterung: Verwenden Sie Bollinger-Bänder, um den Kursschwankungsbereich zu beurteilen und Signale auszufiltern, die den Bereich nicht durchbrechen.

  3. Beim Kauf werden nur Kaufsignale erzeugt, wenn der schnelle EMA > der langsame EMA.

  4. Stop-Loss-Mechanismus: Stellen Sie Stop-Loss-Punkte fest. Schließen Sie Positionen, wenn die Preise durch Stop-Loss-Punkte in ungünstige Richtungen gehen.

Die Logik für Eingangssignale lautet:

  1. MACD verurteilt Aufwärtstrend
  2. Der Preis durchbricht die obere Schiene der Bollinger-Bänder
  3. Schnelle EMA ist höher als langsame EMA

Wenn alle drei Bedingungen gleichzeitig erfüllt sind, wird ein Kaufsignal generiert.

Es gibt zwei Arten von Schlusspositionen, Take Profit und Stop Loss. Der Take Profit Point ist der Eintrittspreis multipliziert mit einem bestimmten Prozentsatz, und der Stop Loss Point ist der Eintrittspreis multipliziert mit einem bestimmten Prozentsatz. Wenn der Preis durch einen der beiden Punkte bricht, schließen Sie Positionen.

Analyse der Vorteile

Die Vorteile dieser Strategie sind:

  1. Kann Trendänderungen rechtzeitig mit weniger Tracebacks erfassen.
  2. Verringern Sie falsche Signale durch Filtern mit doppelten gleitenden Durchschnitten und verbessern Sie die Signalqualität.
  3. Der Stop-Loss-Mechanismus steuert effektiv einzelne Verluste.
  4. Großer Parameteroptimierungsraum, der auf den optimalen Zustand eingestellt werden kann.

Risikoanalyse

Diese Strategie birgt auch einige Risiken:

  1. Falsche Signale, die in seitlichen Märkten erzeugt werden, können zu Verlusten führen.
  2. Die falsche Einstellung von Stop-Losses kann zu unnötigen Verlusten führen.
  3. Unangemessene Parameter können zu einer schlechten Strategieleistung führen.

Um diesen Risiken entgegenzuwirken, kann die Strategie optimiert werden, indem Parameter angepasst, Stop-Loss-Positionen festgelegt und so weiter.

Optimierungsrichtlinien

Die Strategie kann in folgenden Aspekten optimiert werden:

  1. Die doppelte gleitende Durchschnittslänge wird angepasst, um die optimale Parameterkombination zu finden.
  2. Verschiedene Stop-Loss-Methoden wie Trailing-Stop-Loss, Oscillating-Stop-Loss usw. testen.
  3. Testen Sie die MACD-Parameter, um die optimalen Einstellungen zu finden.
  4. Verwenden Sie maschinelles Lernen zur automatisierten Optimierung von Parametern.
  5. Hinzufügen zusätzlicher Bedingungen zu Filtersignalen.

Durch das Testen verschiedener Parameter-Einstellungen und die Auswertung von Renditen und Sharpe-Verhältnissen kann der optimale Stand der Strategie gefunden werden.

Schlussfolgerung

Dies ist eine quantitative Strategie, die Trendbeurteilung, Bereichsfilterung, doppelte gleitende Durchschnittsbestätigung und Stop-Loss-Ideen nutzt. Sie kann effektiv die Trendrichtung bestimmen und ein Gleichgewicht zwischen Gewinnmaximierung und Risikokontrolle herstellen. Durch Parameteroptimierung, maschinelles Lernen und andere Mittel hat die Strategie viel Raum für Verbesserungen, um bessere Ergebnisse zu erzielen.


/*backtest
start: 2022-11-20 00:00:00
end: 2023-11-26 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title="Range Filter Buy and Sell Strategies", shorttitle="Range Filter Strategies", overlay=true,pyramiding = 5)

// Original Script > @DonovanWall
// Adapted Version > @guikroth
// 
// Updated PineScript to version 5
// Republished by > @tvenn
// Strategizing by > @RonLeigh
//////////////////////////////////////////////////////////////////////////
// Settings for 5min chart, BTCUSDC. For Other coin, change the parameters
//////////////////////////////////////////////////////////////////////////



SS = input.bool(false,"Percentage Take Profit Stop Loss")


longProfitPerc = input.float(title='LongProfit(%)', minval=0.0, step=0.1, defval=1.5) * 0.01

shortProfitPerc = input.float(title='ShortProfit(%)', minval=0.0, step=0.1, defval=1.5) * 0.01


longLossPerc = input.float(title='LongStop(%)', minval=0.0, step=0.1, defval=1.5) * 0.01

shortLossPerc = input.float(title='ShortStop(%)', minval=0.0, step=0.1, defval=1.5) * 0.01


// Color variables
upColor   = color.white
midColor  = #90bff9
downColor = color.blue

// Source
src = input(defval=close, title="Source")

// Sampling Period
// Settings for 5min chart, BTCUSDC. For Other coin, change the paremeters
per = input.int(defval=100, minval=1, title="Sampling Period")

// Range Multiplier
mult = input.float(defval=3.0, minval=0.1, title="Range Multiplier")

// Smooth Average Range
smoothrng(x, t, m) =>
    wper = t * 2 - 1
    avrng = ta.ema(math.abs(x - x[1]), t)
    smoothrng = ta.ema(avrng, wper) * m
    smoothrng
smrng = smoothrng(src, per, mult)

// Range Filter
rngfilt(x, r) =>
    rngfilt = x
    rngfilt := x > nz(rngfilt[1]) ? x - r < nz(rngfilt[1]) ? nz(rngfilt[1]) : x - r : 
       x + r > nz(rngfilt[1]) ? nz(rngfilt[1]) : x + r
    rngfilt
filt = rngfilt(src, smrng)

// Filter Direction
upward = 0.0
upward := filt > filt[1] ? nz(upward[1]) + 1 : filt < filt[1] ? 0 : nz(upward[1])
downward = 0.0
downward := filt < filt[1] ? nz(downward[1]) + 1 : filt > filt[1] ? 0 : nz(downward[1])

// Target Bands
hband = filt + smrng
lband = filt - smrng

// Colors
filtcolor = upward > 0 ? upColor : downward > 0 ? downColor : midColor
barcolor = src > filt and src > src[1] and upward > 0 ? upColor :
   src > filt and src < src[1] and upward > 0 ? upColor : 
   src < filt and src < src[1] and downward > 0 ? downColor : 
   src < filt and src > src[1] and downward > 0 ? downColor : midColor

filtplot = plot(filt, color=filtcolor, linewidth=2, title="Range Filter")

// Target
hbandplot = plot(hband, color=color.new(upColor, 70), title="High Target")
lbandplot = plot(lband, color=color.new(downColor, 70), title="Low Target")

// Fills
fill(hbandplot, filtplot, color=color.new(upColor, 90), title="High Target Range")
fill(lbandplot, filtplot, color=color.new(downColor, 90), title="Low Target Range")

// Bar Color
barcolor(barcolor)

// Break Outs
longCond = bool(na)
shortCond = bool(na)
longCond := src > filt and src > src[1] and upward > 0 or 
   src > filt and src < src[1] and upward > 0
shortCond := src < filt and src < src[1] and downward > 0 or 
   src < filt and src > src[1] and downward > 0

CondIni = 0
CondIni := longCond ? 1 : shortCond ? -1 : CondIni[1]
longCondition = longCond and CondIni[1] == -1
shortCondition = shortCond and CondIni[1] == 1



// alertcondition(longCondition, title="Buy alert on Range Filter", message="Buy alert on Range Filter")
// alertcondition(shortCondition, title="Sell alert on Range Filter", message="Sell alert on Range Filter")
// alertcondition(longCondition or shortCondition, title="Buy and Sell alert on Range Filter", message="Buy and Sell alert on Range Filter")


////////////// 副

sensitivity = input(150, title='Sensitivity')
fastLength = input(20, title='FastEMA Length')
slowLength = input(40, title='SlowEMA Length')
channelLength = input(20, title='BB Channel Length')
multt = input(2.0, title='BB Stdev Multiplier')

DEAD_ZONE = nz(ta.rma(ta.tr(true), 100)) * 3.7

calc_macd(source, fastLength, slowLength) =>
    fastMA = ta.ema(source, fastLength)
    slowMA = ta.ema(source, slowLength)
    fastMA - slowMA

calc_BBUpper(source, length, multt) =>
    basis = ta.sma(source, length)
    dev = multt * ta.stdev(source, length)
    basis + dev

calc_BBLower(source, length, multt) =>
    basis = ta.sma(source, length)
    dev = multt * ta.stdev(source, length)
    basis - dev

t1 = (calc_macd(close, fastLength, slowLength) - calc_macd(close[1], fastLength, slowLength)) * sensitivity

e1 = calc_BBUpper(close, channelLength, multt) - calc_BBLower(close, channelLength, multt)

trendUp = t1 >= 0 ? t1 : 0
trendDown = t1 < 0 ? -1 * t1 : 0

duoad = trendUp > 0 and trendUp > e1

kongad = trendDown > 0 and trendDown > e1



duo =  longCondition and duoad

kong = shortCondition and kongad


//Alerts
plotshape(longCondition  and trendUp > e1 and  trendUp > 0 , title="Buy Signal", text="Buy", textcolor=color.white, style=shape.labelup, size=size.small, location=location.belowbar, color=color.new(#aaaaaa, 20))
plotshape(shortCondition  and trendDown > e1 and  trendDown > 0 , title="Sell Signal", text="Sell", textcolor=color.white, style=shape.labeldown, size=size.small, location=location.abovebar, color=color.new(downColor, 20))




if  longCondition and trendUp > e1 and  trendUp > 0 
    strategy.entry('Long',strategy.long, comment = "buy" )

if  shortCondition and trendDown > e1 and  trendDown > 0 
    strategy.entry('Short',strategy.short, comment = "sell" )




longlimtPrice  = strategy.position_avg_price * (1 + longProfitPerc)
shortlimtPrice = strategy.position_avg_price * (1 - shortProfitPerc)
   
longStopPrice  = strategy.position_avg_price * (1 - longLossPerc)
shortStopPrice = strategy.position_avg_price * (1 + shortLossPerc)



if (strategy.position_size > 0)  and SS == true
    
    strategy.exit(id="Long",comment_profit = "Profit",comment_loss = "StopLoss", stop=longStopPrice,limit = longlimtPrice)
    

if (strategy.position_size < 0)  and SS == true
    
    strategy.exit(id="Short",comment_profit = "Profit",comment_loss = "StopLoss", stop=shortStopPrice,limit = shortlimtPrice)


Mehr