Trend nach einer auf einem gleitenden Durchschnitt basierenden Strategie

Schriftsteller:ChaoZhang, Datum: 23.10.2023
Tags:

img

Übersicht

Diese Strategie verwendet hauptsächlich das goldene Kreuz und das tote Kreuz der gleitenden Durchschnitte und den Kerzenbruch der gleitenden Durchschnitte, um lange und kurze Entscheidungen zu treffen.

Grundsätze

  1. Berechnen Sie zwei gleitende Durchschnitte, EMA1 und EMA2, mit unterschiedlichen Perioden.

  2. Bestimmen Sie, ob EMA1 über EMA2 geht, wenn ja, gehen Sie lang.

  3. Bestimmt, ob die EMA1 unter die EMA2 fällt, wenn ja, geht es kurz.

  4. Bestimmen, ob der Schlusskurs als Einstiegssignal die EMA1 durchbricht.

  5. Ausgangsmechanismus: Festhaltverlust setzen oder Donchian Channel verwenden, um den Stoppverlust zu setzen.

Hauptfunktionen:

  • ema(): berechnen Sie den exponentiellen gleitenden Durchschnitt
  • Überschreitende (crossover): feststellen, ob die EMA1 die EMA2 überschreitet
  • crossunder ((): feststellen, ob sich die EMA1 unter der EMA2 kreuzt
  • rising (() /falling ((): bestimmen, ob der Preis steigt oder fällt
  • valuewhen(): Gibt verschiedene Werte auf Basis der Bedingung zurück

Vorteile

  1. Einfache Logik, leicht zu verstehen und umzusetzen.

  2. Verwenden Sie das Trendfolgende Merkmal von gleitenden Durchschnitten, um Trends effektiv zu verfolgen.

  3. Die Kombination von Candlestick-Schließpreisdurchbruch hilft, falsche Durchbrüche zu vermeiden.

  4. Flexible Verwendung verschiedener gleitender Durchschnittskombinationen, die an unterschiedliche Perioden angepasst werden können.

  5. Der Stop-Loss-Mechanismus kontrolliert das Risiko.

Risiken

  1. Häufige Goldkreuze und tote Kreuze während der Marktkonsolidierung verursachen Whipsaws.

  2. Festgelegte Stop-Loss-Punkte sind möglicherweise zu rigid, um sie anhand von Marktveränderungen anzupassen.

  3. Die gleitenden Durchschnittswerte verfallen und können bei Wendepunkten Rückkehrsignale verpassen.

  4. Genaue Beurteilung der gleitenden Durchschnittsneigung, die benötigt wird, um falsche Durchbrüche zu filtern.

  5. Bei der Parameterwahl ist Vorsicht geboten, unpassende Häufigkeit oder Verzögerung kann die Strategieleistung beeinträchtigen.

Optimierung

  1. Die MACD-Nulllinie-Kreuzung kann dazu beitragen, Trends und Filterkonsolidierungen zu bestimmen.

  2. Hinzufügen von Donchian-Kanal für dynamische Stop-Loss-Linie zur Verbesserung des festen Stop-Loss.

  3. Hinzufügen von Bollinger-Bändern, um starke oder schwache Trends zu beurteilen, um ineffizienten Handel während der Marktkonsolidierung zu vermeiden.

  4. Optimieren Sie Kombinationen von gleitenden Durchschnittsparametern und testen Sie die tatsächliche Leistung verschiedener Periodenstrategien.

  5. Um die Verzögerung zu reduzieren, sollten verankerte gleitende Durchschnitte hinzugefügt werden.

Schlussfolgerung

Die allgemeine Logik dieser Strategie ist einfach und klar, wobei klassische gleitende Durchschnitts-Crossover-Handelstechniken verwendet werden und der Candlestick-Breakout für den Einstieg kombiniert wird, um falsche Signale effektiv zu filtern.


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

//@version=2
strategy(title='Mega crypto bot strategy', shorttitle='megacryptobot_Strategy', overlay=true, pyramiding=0, initial_capital=10000, currency=currency.USD)

//Candle body resistance Channel-----------------------------//
len = 34
src = input(close, title="Candle body resistance Channel")
out = sma(src, len)
last8h = highest(close, 13)
lastl8 = lowest(close, 13)
bearish = cross(close,out) == 1 and falling(close, 1)
bullish = cross(close,out) == 1 and rising(close, 1)
channel2=input(false, title="Bar Channel On/Off")
ul2=plot(channel2?last8h:last8h==nz(last8h[1])?last8h:na, color=black, linewidth=1, style=linebr, title="Candle body resistance level top", offset=0)
ll2=plot(channel2?lastl8:lastl8==nz(lastl8[1])?lastl8:na, color=black, linewidth=1, style=linebr, title="Candle body resistance level bottom", offset=0)
//fill(ul2, ll2, color=black, transp=95, title="Candle body resistance Channel")

//-----------------Support and Resistance 
RST = input(title='Support / Resistance length:',  defval=10) 
RSTT = valuewhen(high >= highest(high, RST), high, 0)
RSTB = valuewhen(low <= lowest(low, RST), low, 0)
RT2 = plot(RSTT, color=RSTT != RSTT[1] ? na : red, linewidth=1, offset=+0)
RB2 = plot(RSTB, color=RSTB != RSTB[1] ? na : green, linewidth=1, offset=0)

//--------------------Trend colour ema------------------------------------------------// 
src0 = close, len0 = input(13, minval=1, title="EMA 1")
ema0 = ema(src0, len0)
direction = rising(ema0, 2) ? +1 : falling(ema0, 2) ? -1 : 0
plot_color = direction > 0  ? lime: direction < 0 ? red : na
plot(ema0, title="EMA", style=line, linewidth=1, color = plot_color)

//-------------------- ema 2------------------------------------------------//
src02 = close, len02 = input(21, minval=1, title="EMA 2")
ema02 = ema(src02, len02)
direction2 = rising(ema02, 2) ? +1 : falling(ema02, 2) ? -1 : 0
plot_color2 = direction2 > 0  ? lime: direction2 < 0 ? red : na
plot(ema02, title="EMA Signal 2", style=line, linewidth=1, color = plot_color2)

//=============Hull MA//
show_hma = input(false, title="Display Hull MA Set:")
hma_src = input(close, title="Hull MA's Source:")
hma_base_length = input(8, minval=1, title="Hull MA's Base Length:")
hma_length_scalar = input(5, minval=0, title="Hull MA's Length Scalar:")
hullma(src, length)=>wma(2*wma(src, length/2)-wma(src, length), round(sqrt(length)))
plot(not show_hma ? na : hullma(hma_src, hma_base_length+hma_length_scalar*6), color=black, linewidth=2, title="Hull MA")

//============ signal Generator ==================================//
period = input('720')
ch1 = request.security(syminfo.tickerid, period, open)
ch2 = request.security(syminfo.tickerid, period, close)
longCondition = crossover(request.security(syminfo.tickerid, period, close),request.security(syminfo.tickerid, period, open))
if (longCondition)
    strategy.entry("BUY", strategy.long)
shortCondition = crossunder(request.security(syminfo.tickerid, period, close),request.security(syminfo.tickerid, period, open))
if (shortCondition)
    strategy.entry("SELL", strategy.short)

///////////////////////////////////////////////////////////////////////////////////////////

Mehr