Golden Cross Handelsstrategie


Erstellungsdatum: 2024-01-26 14:29:01 zuletzt geändert: 2024-01-26 14:29:01
Kopie: 4 Klicks: 613
1
konzentrieren Sie sich auf
1617
Anhänger

Golden Cross Handelsstrategie

Überblick

Die Gold-Cross-Trading-Strategie nutzt die Kreuzung von zwei unterschiedlichen Perioden von Moving Averages als Kauf- und Verkaufssignale. Insbesondere wird ein Gold-Cross-Signal erzeugt, wenn der kurzfristige Moving Average den langfristigen Moving Average von unten durchbricht, was einen Aufschwung bedeutet. Ein Todes-Cross-Signal wird erzeugt, wenn der kurzfristige Moving Average von oben abfällt und den langfristigen Moving Average durchbricht.

Strategieprinzip

Die Strategie basiert auf zwei Prinzipien:

  1. Bewegliche Durchschnitte spiegeln die Trends und Kräfte des Marktes wider. Kurze Perioden bewegliche Durchschnitte erfassen die jüngsten Bewegungen und Wendepunkte des Marktes. Lange Perioden bewegliche Durchschnitte zeigen die wichtigsten Trends des Marktes.

  2. Wenn ein Kurz- und ein Langzeit-Moving-Average eine Gold-Kreuzung bilden, bedeutet dies, dass die kurzfristige Marktkraft die langfristige Trendkraft übersteigt und es daher wahrscheinlich ist, dass ein neuer Aufwärtstrend beginnt. Wenn ein Todeskreuzung gebildet wird, bedeutet dies, dass die langfristige Abwärtstrend dominiert und es daher wahrscheinlich ist, dass der Abwärtstrend anhält.

Konkret setzt die Strategie einen einfachen Moving Average mit 13 und 30 Perioden und erzeugt ein Handelssignal, wenn sie sich kreuzen. Das Kreuzungsprinzip ist wie folgt:

  1. Wenn der kurze Period bewegliche Durchschnitt über den langen Period bewegliche Durchschnitt, erzeugt ein goldenes Kreuz Signal, was bedeutet, dass mehr zu tun. In diesem Fall, durch die Beurteilung der Trendfestigkeit Eintritt: Wenn die Preise halten über einen bestimmten Zyklus zu steigen, ist zuversichtlich, dass die aktuelle ist der Aufwärtstrend, dann mehr zu tun.

  2. Wenn der kurzfristige bewegliche Durchschnitt unter dem langfristigen beweglichen Durchschnitt durchbricht, wird ein Todes-Cross-Signal erzeugt, das eine Ausnahme darstellt. Hierbei wird durch die Beurteilung der Trendfestigkeit eingegeben: Wenn der Preis über einen bestimmten Zeitraum hinweg weiter sinkt, ist es zuversichtlich, dass es sich um einen Abwärtstrend handelt.

  3. Die Kreuzungsstärke wird anhand der Gleitlänge des gleitenden Durchschnitts beurteilt. Nur wenn die Gleitlänge des kurz- und langfristigen gleitenden Durchschnitts größer als eine bestimmte Schwelle ist, wird das Kreuzungssignal als stark genug angesehen, um eingegeben zu werden. Dies dämpft die Störung des normalen False-Signals.

  4. Der Stop-Loss wurde auf 20% und der Stop-Out auf 100% festgelegt.

Analyse der Stärken

Die Strategie der doppelten Gleichgewichtskreuzung hat folgende Vorteile:

  1. Einfach zu denken, leicht zu verstehen und umzusetzen, für Anfänger geeignet.

  2. Die Nutzung der Preisdurchschnittscharakteristiken hat eine gewisse Lärmschutzwirkung und verhindert, dass man von kurzfristigen Preisschwankungen irregeführt wird.

  3. Es ist wichtig, die Trendfestigkeit zu beurteilen, und nicht mechanisch zu viel zu tun, sondern in Kombination mit dem großen Markt zu urteilen.

  4. Die Einführung eines Moving Average Slope Momentum-Faktors macht das Signal zuverlässiger.

  5. Die Optimierung der Retracement ist einfach und erfordert nur eine Anpassung einiger wichtiger Parameter wie beispielsweise der Moving Average-Parameter und der Trendhaltungszeit.

Risikoanalyse

Die Strategie birgt auch folgende Risiken:

  1. Die Doppel-Gleichlinien-Kreuzung ist von Natur aus ein Verzögerungssignal. Es ist nicht möglich, die Wendepunkte perfekt vorherzusagen, und es gibt eine gewisse Verzögerung. Der Moving-Average-Zyklus sollte entsprechend verkürzt oder in Kombination mit Faktoren verwendet werden, die den Wendepunkt vorhersagen können.

  2. Mechanische Handelssysteme sind anfällig für Kollektivschläge, wodurch die Situation übertrieben wird, so dass die Stop-Loss- oder Stop-Stop-Effekte nicht wirksam sind. Die Stop-Loss-Stop-Stopps sollten in Stufen eingerichtet werden oder durch geeignete manuelle Intervention.

  3. Es ist nicht möglich, mit den Schwingungen gut umzugehen. Vermeiden Sie die Varianten, die sich in diesen Zyklen wiederholt haben, und wählen Sie die Sorten, die in einer klaren Richtung handeln.

  4. Die Zeitfenster zur Beurteilung der Trendfestigkeit sind so festgelegt, dass der optimale Wert durch wiederholte Tests ermittelt werden kann, ob die Ergebnisse stark beeinflusst werden.

Optimierungsrichtung

Die Strategie der doppelten Gleichgewichtskreuzung kann auch in folgenden Bereichen optimiert werden:

  1. Hinzufügen von Indikatoren zur Bewertung von Großtrends und Vermeidung von Rückwärtsoperationen. Zum Beispiel das Hinzufügen der Position der Vergleichsgrenze oder der Mondlinie.

  2. Hinzu kommt die Verifizierung der Transaktionsmenge, die nur dann gesendet wird, wenn die Transaktionsmenge größer ist, um falsche Signale zu vermeiden.

  3. Optimieren Sie die Moving Average-Parameter, um die beste Periodenzusammenstellung zu finden. Sie können versuchen, die Moving Average-Parameter selbst anzupassen.

  4. In Kombination mit Hilfe von Mainstream-Formel-Indikatoren wie MACD, KD und anderen, erhöht sich die Signalgenauigkeit.

  5. Die Schadensstopper sind auf einer Stufe angeordnet, um die Risiken besser zu kontrollieren.

Zusammenfassen

Die Doppel-Gleichlinien-Kreuzungsstrategie ist insgesamt eine sehr intuitive und interpretierbare Strategie. Sie kombiniert die Geräuschlösung der beweglichen Mittelwerte mit der einfachen Trenderkennungsfähigkeit der Kreuzungsbeurteilung. Gleichzeitig wird das Signal geprüft, um blindes Folgen zu vermeiden, was die Praxis und Stabilität verbessert.

Strategiequellcode
/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-25 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © MakeMoneyCoESTB2020


//*********************Notes for continued work***************

//************************************************************

//Hello my fellow investors
//I am creating a simple non-cluttered strategy that uses 3(+1) simple means to determine: viability, entry, and exit
//1) Has a consistent trend been maintained for several days/weeks
//2) SH SMA crossover LG SMA = Bullish entry/LG SMA crossover SH SMA = Bearish entry
//3) Use the Slope factor & Weeks in Trend (WiT) to dertermine how strong of an entry signal you are comfortable with
//4) Exit position based on next SMA cross and trend reversal or stop loss%
//3+1) For added confidence in trend detection: Apply MACD check - buy--> MACD line above signal line and corssover below histogram \\ sell --> MACD line below signal line and crossover above histogram.
//*)This code also allows you to determine your desired backtesting date compliments of alanaster


//This code is the product of many hours of hard work on the part of the greater tradingview community.  The credit goes to everyone in the community who has put code out there for the greater good.

//Happy Hunting!

// 1. Define strategy settings*************************************************************************************************************************************************************************

//Title
strategy("KISS Strategy: SMA + EMA", shorttitle="KISS Strat")

//define calculations price source
price = input(title="Price Source", defval=close)

// 2. Calculate strategy values*************************************************************************************************************************************************************************

//Calculate 13/30/200SMA 
SH_SMA_length= input(title="SH SMA Length", defval=13) //short SMA length
LG_SMA_length= input(title="LG SMA Length", defval=30) //long SMA length
GV_SMA_length= input(title="SH SMA Length", defval=200) //Gravitational SMA length

SH_SMA=sma(price, SH_SMA_length) //short SMA 
LG_SMA=sma(price, LG_SMA_length) //long SMA
GV_SMA=sma(price, GV_SMA_length) //gravitational SMA

//calculate MACD
//define variables for speed
fast = 12, slow = 26
//define parameters to calculate MACD
fastMA = ema(price, fast)
slowMA = ema(price, slow)
//define MACD line
macd = fastMA - slowMA
//define SIGNAL line
signal = sma(macd, 9)

//Determine what type of trend we are in
dcp = security(syminfo.tickerid, 'D', close)   //daily close price 
wcp = security(syminfo.tickerid, 'W', close)   //weekly close price 

WiT = input(title="Weeks In Trend", defval=1, maxval=5, minval=1)    //User input for how many weeks of price action to evaluate (Weeks in Trend = WiT)
BearTrend = false       //initialize trend variables as false
BullTrend = false       //initialize trend variables as false

// BullTrend := (wcp > SH_SMA) and (SH_SMA > LG_SMA)  //true if price is trending up based on weekly price close
// BearTrend := (wcp < SH_SMA) and (SH_SMA < LG_SMA)  //true if price is trending down based on weekly price close


// BullTrend := (price > SH_SMA) and (SH_SMA > LG_SMA)  //true if price is trending up
// BearTrend := (price < SH_SMA) and (SH_SMA < LG_SMA)  //true if price is trending down

//Determine if the market has been in a trend for 'n' weeks

n=WiT                           //create loop internal counting variable
for i=1 to WiT                  //create loop to determine if BearTrend=true to set number of weeks
    if (wcp[n] < price)         //evaluate if BearTrend=false comparing the current price to a paticular week close
        BearTrend := false      //set value to false if older price value is less than newer: trending up
        break                   //break out of for loop when trend first falters
    if (wcp[n] > price)         //evaluate if BearTrend=true comparing the current price to a paticular week close
        BearTrend := true       //set value to true if older price value is greater than newer: trending down
    n:=n-1                      //set internal counter one day closer to present

m=WiT                           //create loop internal counting variable
for j=1 to WiT                  //create loop to determine if BearTrend=true to set number of weeks
    if (wcp[m] > price)         //evaluate if BullTrend=false comparing the current price to a paticular week close
        BullTrend := false      //set value to false if older price value is greater than newer: trending down
        break                   //break out of for loop when trend first falters
    if (wcp[m] < price)         //evaluate if BullTrend=true comparing the current price to a paticular week close
        BullTrend := true       //set value to true if older price value is less than newer: trending up
    m:=m-1                      //set internal counter one day closer to present


//Determine if crossings occur
SH_LGcrossover = crossover(SH_SMA, LG_SMA)  //returns true if short crosses over long
SH_LGcrossunder = crossunder(SH_SMA, LG_SMA)    //returns true if short crosses under long

//Determine the slope of the SMAs when a cross over occurs
SlopeFactor= input(title="Slope Factor", defval=.01, minval=0, step = 0.001) //user input variable for what slope to evaluate against
XSlopeSH = abs(SH_SMA-SH_SMA[2]) //slope of short moving average (time cancels out)
XSlopeLG = abs(LG_SMA-LG_SMA[2]) //slope of long moving average (time cancels out)
StrongSlope = iff (abs(XSlopeSH-XSlopeLG)>SlopeFactor, true, false) //create a boolean variable to determine is slope intensity requirement is met

// ************************************ INPUT BACKTEST RANGE ******************************************=== coutesy of alanaster
fromMonth = input(defval = 4,    title = "From Month",      type = input.integer, minval = 1, maxval = 12)
fromDay   = input(defval = 1,    title = "From Day",        type = input.integer, minval = 1, maxval = 31)
fromYear  = input(defval = 2020, title = "From Year",       type = input.integer, minval = 1970)
thruMonth = input(defval = 1,    title = "Thru Month",      type = input.integer, minval = 1, maxval = 12)
thruDay   = input(defval = 1,    title = "Thru Day",        type = input.integer, minval = 1, maxval = 31)
thruYear  = input(defval = 2112, title = "Thru Year",       type = input.integer, minval = 1970)

// === INPUT SHOW PLOT ===
showDate  = input(defval = true, title = "Show Date Range", type = input.bool)

// === FUNCTION EXAMPLE ===
start     = timestamp(fromYear, fromMonth, fromDay, 00, 00)        // backtest start window
finish    = timestamp(thruYear, thruMonth, thruDay, 23, 59)        // backtest finish window
window()  => true

bgcolor(color = showDate and window() ? color.gray : na, transp = 90) 
// === EXECUTION ===
//strategy.entry("L", strategy.long, when = window() and crossOv)    // enter long when "within window of time" AND crossover
//strategy.close("L", when = window() and crossUn)                   // exit long when "within window of time" AND crossunder

// 3. Output strategy data*************************************************************************************************************************************************************************

//Embolden line if a trend exists
trendcolorLG = BearTrend?color.red:color.black //highlights beartrend condition met graphically
trendcolorSH = BullTrend?color.green:color.black //highlights beartrend condition met graphically

//plot SMAs
plot(SH_SMA, title = "SH SMA", color = trendcolorSH)
plot(LG_SMA, title = "LG SMA", color = trendcolorLG)
plot(GV_SMA, title = "GV SMA", color = color.silver, linewidth = 4, transp = 70)

//Highlight crossovers
plotshape(series=SH_LGcrossover, style=shape.arrowup, location=location.belowbar,size=size.normal, color=color.green)
plotshape(series=SH_LGcrossunder, style=shape.arrowdown, location=location.abovebar,size=size.normal, color=color.red)

// 4. Determine Long & Short Entry Calculations*************************************************************************************************************************************************************************

//Define countback variable
countback=input(minval=0, maxval=5, title="Price CountBack", defval=0)
//User input for what evaluations to run: SMA or SMA + EMA
SMA_Y_N=input(defval = "Y", title="Run SMA", type=input.string, options=["Y", "N"])
MACD_Y_N=input(defval = "N", title="Run MACD", type=input.string, options=["Y", "N"])

//Calculate SMA Cross entry conditions
SMAbuy=false
SMAsell=false
SMAbuy := SH_LGcrossover and StrongSlope and BearTrend[WiT*7]   //enter long if short SMA crosses over long SMA & security has been in a BearTrend for 'n' days back
SMAsell := SH_LGcrossunder and StrongSlope and BullTrend[WiT*7] //enter short if short SMA crosses under long SMA & security has been in a BullTrend for 'n' days back

//Calculate MACD Cross entry conditions
MACDbuy = iff(MACD_Y_N=="Y", crossunder(signal[countback], macd[countback]), true) and iff(MACD_Y_N=="Y", macd[countback]<0, true) and StrongSlope and BearTrend     //enter long if fast MACD crosses over slow MACD & there is a strong slope & security has been in a BearTrend for 'n' days back
MACDsell = iff(MACD_Y_N=="Y", crossunder(macd[countback], signal[countback]), true) and iff(MACD_Y_N=="Y", signal[countback]>0, true) and StrongSlope and BullTrend  //enter short if fast MACD crosses under slow MACD & there is a strong slope & security has been in a BullTrend for 'n' days back

//long entry condition
dataHCLB=(iff(SMA_Y_N=="Y", SMAbuy, true) and iff(MACD_Y_N=="Y", MACDbuy, true))
plotshape(dataHCLB, title= "HC-LB", color=color.lime, style=shape.circle, text="HC-LB")
strategy.entry("HC-Long", strategy.long, comment="HC-Long", when = dataHCLB and window())

//short entry condition
dataHCSB=(iff(SMA_Y_N=="Y", SMAsell, true) and iff(MACD_Y_N=="Y", MACDsell, true))
plotshape(dataHCSB, title= "HC-SB", color=color.fuchsia, style=shape.circle, text="HC-SB")
strategy.entry("HC-Short", strategy.short, comment="HC-Short", when=dataHCSB and window())


// 5. Submit Profit and Loss Exit Calculations Orders*************************************************************************************************************************************************************************

// User Options to Change Inputs (%)
stopPer = input(12, title='Stop Loss %', type=input.float) / 100
takePer = input(25, title='Take Profit %', type=input.float) / 100

// Determine where you've entered and in what direction
longStop = strategy.position_avg_price * (1 - stopPer)
shortStop = strategy.position_avg_price * (1 + stopPer)
shortTake = strategy.position_avg_price * (1 - takePer)
longTake = strategy.position_avg_price * (1 + takePer)

//exit position conditions and orders
if strategy.position_size > 0//or crossunder(price[countback], upperBB)
    strategy.exit(id="Close Long", when = window(), stop=longStop, limit=longTake)
if strategy.position_size < 0 //or crossover(price[countback], lowerBB)
    strategy.exit(id="Close Short", when = window(), stop=shortStop, limit=shortTake)





//Evaluate/debug equation***************************************************************************************************************************************************************************
// plotshape((n==5? true : na), title='n=5', style=shape.labeldown, location=location.abovebar, text='5', color=color.white, textcolor=color.black, transp=0) //print n value if 5
// plotshape((n==4? true : na), title='n=4', style=shape.labeldown, location=location.abovebar, text='4', color=color.white, textcolor=color.black, transp=0) //print n value if 4 
// plotshape((n==3? true : na), title='n=3', style=shape.labeldown, location=location.abovebar, text='3', color=color.white, textcolor=color.black, transp=0) //print n value if 3
// plotshape((n==2? true : na), title='n=2', style=shape.labeldown, location=location.abovebar, text='2', color=color.white, textcolor=color.black, transp=0) //print n value if 2
// plotshape((n==1? true : na), title='n=1', style=shape.labeldown, location=location.abovebar, text='1', color=color.white, textcolor=color.black, transp=0) //print n value if 1
// lineValue = 11                                           //set random visible line value to check when equation is true
// colorP = (BearTrend==true) ? color.green : color.red
// plot (lineValue, title = "BearTrend", color = colorP)   //Plot when condition true=green, false=red
// plot (XSlopeLG+15, color=color.white) //used for code debugging
// plot (XSlopeSH+15, color=color.blue) //used for code debugging
// plot (abs(XSlopeSH-XSlopeLG)+20, color=color.fuchsia) //used for code debugging