Trenddurchbruch-Doppel-Gleitende-Durchschnitt-Filterstrategie


Erstellungsdatum: 2023-11-27 17:03:08 zuletzt geändert: 2023-11-27 17:03:08
Kopie: 0 Klicks: 689
1
konzentrieren Sie sich auf
1617
Anhänger

Trenddurchbruch-Doppel-Gleitende-Durchschnitt-Filterstrategie

Überblick

Dies ist eine Strategie, die die Gleichungs- und Brinkanäle nutzt, um Trends zu beurteilen und die Filter- und Stoppprinzipien zu durchbrechen. Sie kann die Signale bei Trendänderungen in der richtigen Zeit erfassen, die Fehlsignale durch die Doppelgleichungsfilterung reduzieren und die Stopps einstellen, um das Risiko zu kontrollieren.

Strategieprinzip

Die Strategie besteht aus folgenden Teilen:

  1. Trendbeurteilung: MACD wird verwendet, um die Preisentwicklung zu bestimmen und zwischen mehrköpfigen und leeren Trends zu unterscheiden.

  2. Spannungsfilter: Die Brinkanäle werden verwendet, um die Spannung der Preisschwankungen zu bestimmen und die nicht überschreitenden Signale zu filtern.

  3. Binäre EMA-Bestätigung: Die binäre EMA, die aus einem schnellen EMA und einem langsamen EMA besteht, wird verwendet, um ein Trendsignal zu bestätigen. Ein Kaufsignal wird nur erzeugt, wenn ein schneller EMA > ein langsamer EMA besteht.

  4. Stop-Loss-Mechanismus: Setzt einen Stop-Loss-Punkt ein, um die Position zu beenden, wenn der Preis den Stop-Loss-Punkt in eine nachteilige Richtung überschreitet.

Die Logik des Signals lautet:

  1. Der MACD bewertet den Trend als aufwärts
  2. Die Preise durchbrechen den Brin-Kanal
  3. Schnelle EMA höher als langsame EMA

Wenn diese drei Bedingungen gleichzeitig erfüllt sind, wird ein Kaufsignal erzeugt.

Die Playoff-Logik besteht aus zwei Arten: Stop-Playoff- und Stop-Loss-Playoff-Positionen. Die Stop-Playoff-Position wird mit einem bestimmten Prozentsatz für den Einstiegspreis multipliziert, die Stop-Loss-Playoff-Position mit einem bestimmten Prozentsatz für den Einstiegspreis multipliziert.

Analyse der Stärken

Diese Strategie hat folgende Vorteile:

  1. Es gibt auch eine Reihe von Anwendungen, um Trends zu erfassen und weniger zu traceback.
  2. Erhöht die Signalqualität durch die Doppel-Einheitlichkeitsfilterung von Fehlsignalen.
  3. Die Stop-Loss-Mechanismen wirken auf einzelne Verluste ab.
  4. Die Parameter haben viel Platz für Optimierung und können auf den optimalen Zustand eingestellt werden.

Risikoanalyse

Die Strategie birgt auch einige Risiken:

  1. Fehlsignale bei Erschütterungen können Schäden verursachen.
  2. Unnötige Verluste können durch falsche Einstellungen des Stopps verursacht werden.
  3. Die falschen Parameter können dazu führen, dass die Strategie nicht wirkt.

Diese Risiken können durch Optimierung von Parametern und Anpassung der Stop-Loss-Position optimiert und verbessert werden.

Optimierungsrichtung

Die Strategie kann in folgenden Richtungen optimiert werden:

  1. Anpassung der Längen der doppelten Mittellinien auf die optimale Kombination der Parameter.
  2. Verschiedene Schadensstop-Methoden, wie Tracking-Stop, Shake-Stop usw. werden getestet.
  3. Testen von MACD-Parametern, um optimale Parameter zu finden.
  4. Die automatische Optimierung der Parameter wird durch maschinelles Lernen durchgeführt.
  5. Zusätzliche bedingte Filtersignale hinzugefügt.

Durch das Testen verschiedener Parameter-Einstellungen und die Bewertung der Rendite und des Sharpe-Ratios kann der optimale Zustand der Strategie gefunden werden.

Zusammenfassen

Es ist eine quantitative Strategie, die Trendbeurteilung, Spannungsfilter, Doppelgleichslinie-Bestätigung und Stop-Loss-Gedanken nutzt. Es ist in der Lage, die Richtung des Trends zu bestimmen und die Balance zwischen Gewinnmaximierung und Risikokontrolle zu finden. Durch Parameteroptimierung und maschinelles Lernen gibt es viel Raum für Verbesserungen, um bessere Ergebnisse zu erzielen.

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