Moving Average Crossover und Average True Range Hybrid-Strategie


Erstellungsdatum: 2023-09-26 17:22:21 zuletzt geändert: 2023-09-26 17:22:21
Kopie: 7 Klicks: 976
1
konzentrieren Sie sich auf
1617
Anhänger

Überblick

Die Strategie nutzt eine Kombination aus den beiden technischen Indikatoren der Mittellinien-Kreuzung und der mittleren realen Wellenlänge, um mittellinien-Kreuzungssignale in Trends zu identifizieren und eine höhere Gewinnrate zu erzielen.

Grundsätze

  • Der ATR-Indikator wird verwendet, um die Preisschwankungen im Grosskreis zu beurteilen und bestätigt, dass sie sich im Aufwärtstrend befinden
  • Berechnen Sie die schnelle und die langsame Durchschnittslinie in kleinen Perioden, machen Sie mehr, wenn die Schnelle die langsame Linie durchläuft, und machen Sie nichts, wenn die Schnelle die langsame Linie durchläuft
  • Der ATR-Indikator berechnet die durchschnittliche tatsächliche Breite der großen Perioden, um die Gesamttrends zu bestimmen; die Durchschnittslinie bestimmen die spezifischen Einstiegspunkte innerhalb der kleinen Perioden
  • Der ATR-Indikator wird durch einen RMA-Schleifenbewegungsmittel berechnet, dessen Länge und Gleit sind einstellbar
  • Durchschnittskreuzungen bestehen aus zwei SMA-Durchschnittsrechnungen, deren Länge sich anpassen lässt

Vorteile

  • Der ATR-Indikator filtert schwankende Trends und verhindert unnötige Transaktionen
  • Durchschnittliche Kreuzung kann einen kleinen Periodentrend präzise bestimmen
  • RMA berechnet ATR, um Kurven zu reduzieren und den Großzyklus zu bestimmen
  • Die Kombination von beiden ermöglicht es uns, sowohl Schwankungen zu vermeiden, als auch konkrete Chancen zu nutzen.
  • Parameter sind anpassbar und können für verschiedene Sorten und Zeiträume optimiert werden
  • Insgesamt ist die Strategie mit einer hohen Erfolgsquote und stabilen Erträgen zu rechnen.

Die Gefahr

  • Der ATR-Indikator beurteilt den Haupttrend als verspätet und verpasst den Trendbeginn
  • Durchschnittliche Kreuzung mit mehrfacher Anpassung der Wahrscheinlichkeit, mehr Sell-Signale
  • Parameter-Tuning ist sehr wichtig, und eine falsche Einstellung kann zu zu häufigen oder konservativen Transaktionen führen
  • Analyse der historischen Daten für die jeweilige Sorte, um die optimale Kombination von Parametern zu finden
  • Es wird empfohlen, Positionen schrittweise zu eröffnen, um die Verfügbarkeit von Kapital zu gewährleisten und einzelne Verluste zu kontrollieren.

Optimierungsrichtung

  • Versuchen Sie, andere Indikatoren zu ergänzen oder zu ersetzen, wie z. B. die Brin-Band, um die Trendstärke zu bestimmen
  • Durchschnittliche Kreuzungstypen können auf andere Kombinationen wie EMA, Dynamometer usw. erweitert werden
  • Einzug in die Bestätigungsmechanismen zur Vermeidung falscher Durchbrüche
  • Optimierung der Parameter in der Reihenfolge: ATR-Länge und -Gleichheit > Durchschnittslinie-Länge > Stop-Loss-Stop-Einstellung
  • Erwägen Sie eine Kombination von Vermögensmanagementstrategien, wie z. B. feste Anteile, dynamische Positionen
  • Langfristige Rückmessungen auf dem Festplatte zur Beurteilung der Strategie-Stabilität und des maximalen Rückzugs

Zusammenfassen

Die Strategie nutzt die Vorteile von ATR und Average Line Crossings, um die Richtung der Trends und den Zeitpunkt des Eintritts zu bestimmen. Durch Parameteroptimierung kann sie an verschiedene Marktumgebungen angepasst werden. Die praktische Prüfung zeigt, dass die Strategie eine hohe Gewinnrate und stabile Erträge erzielt.

Strategiequellcode
/*backtest
start: 2023-08-26 00:00:00
end: 2023-09-25 00:00:00
period: 1h
basePeriod: 15m
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/
// © Phoenix085

//@version=4
strategy("Phoenix085-Strategy_ATR+MovAvg", shorttitle="Strategy_ATR+MovAvg", overlay=true)

// // ######################>>>>>>>>>>>>Inputs<<<<<<<<<<<#########################
// // ######################>>>>>>>>>>>>Strategy Inputs<<<<<<<<<<<#########################

TakeProfitPercent = input(50, title="Take Profit %", type=input.float, step=.25)
StopLossPercent = input(5, title="Stop Loss %", type=input.float, step=.25)

ProfitTarget = (close * (TakeProfitPercent / 100)) / syminfo.mintick
LossTarget = (close * (StopLossPercent / 100)) / syminfo.mintick

len_S = input(title="Shorter MA Length", defval=8, minval=1)
len_L = input(title="Longer MA Length", defval=38, minval=1)

TF = input(defval="", title="Session TF for calc only", type=input.session,options=[""])
TF_ = "1"

if TF == "3"
    TF_ == "1"
else 
    if TF == "5" 
        TF_ == "3"
    else 
        if TF == "15"
            TF_ == "5"
        else 
            if TF == "30"
                TF_ == "15"
            else 
                if TF == "1H"
                    TF_ == "30"
                else 
                    if TF == "2H"
                        TF_ == "1H"
                    else 
                        if TF == "4H"
                            TF_ == "3H"
                        else 
                            if TF == "1D"
                                TF_ == "4H"
                            else
                                if TF == "1W"
                                    TF_ == "1H"
                                else 
                                    if TF == "1M"
                                        TF_ == "1W"
                                    else
                                        if TF =="3H"
                                            TF_ == "2H"

Src = security(syminfo.tickerid, TF, close[1], barmerge.lookahead_on)

Src_ = security(syminfo.tickerid, TF_, close, barmerge.lookahead_off)

// ######################>>>>>>>>>>>>ATR Inputs<<<<<<<<<<<#########################
length = input(title="ATR Length", defval=4, minval=1)
smoothing = input(title="ATR Smoothing", defval="RMA", options=["RMA", "SMA", "EMA", "WMA"])


// //######################>>>>>>>>>>>>Custom Functions Declarations<<<<<<<<<<<#########################



// ######################>>>>>>>>>>>>ATR<<<<<<<<<<<#########################

ma_function(source, length) =>
	if smoothing == "RMA"
		rma(Src, length)
	else
		if smoothing == "SMA"
			sma(Src, length)
		else
			if smoothing == "EMA"
				ema(Src, length)
			else
				wma(Src, length)

ATR=ma_function(tr(true), length)


// //######################>>>>>>>>>>>>Conditions<<<<<<<<<<<#########################
ATR_Rise = ATR>ATR[1] and ATR[1]<ATR[2] and ATR[2]<ATR[3]

longCondition = crossover(sma(Src_, len_S), sma(Src_, len_L)) and sma(Src_, len_L) < sma(Src_, len_S) and (sma(Src_, len_S) < Src_[1])
shortCondition = crossunder(sma(Src_, len_S), sma(Src_, len_L)) and sma(Src_, len_L) > sma(Src_, len_S) 

plot(sma(Src_, len_S), color=color.lime, transp=90)
col = longCondition ? color.lime : shortCondition ? color.red : color.gray
plot(sma(Src_, len_L),color=col,linewidth=2)


bool IsABuy = longCondition 
bool IsASell = shortCondition

// // ######################>>>>>>>>>>>>Strategy<<<<<<<<<<<#########################

testStartYear = input(2015, "Backtest Start Year", minval=1980)
testStartMonth = input(1, "Backtest Start Month", minval=1, maxval=12)
testStartDay = input(1, "Backtest Start Day", minval=1, maxval=31)
testPeriodStart = timestamp(testStartYear, testStartMonth, testStartDay, 0, 0)

testStopYear = input(9999, "Backtest Stop Year", minval=1980)
testStopMonth = input(12, "Backtest Stop Month", minval=1, maxval=12)
testStopDay = input(31, "Backtest Stop Day", minval=1, maxval=31)
testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, 0, 0)

testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false
inDateRange = true

bgcolor(inDateRange ? color.green : na, 90)
// //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<//

// // ######################>>>>>>LongEntries<<<<<<<#########################
if inDateRange and ATR_Rise and IsABuy 
    strategy.entry("longCondition",true,when = longCondition)
    strategy.close("shortCondition")
    strategy.exit("Take Profit or Stop Loss", "longCondition",trail_points = close * 0.05 / syminfo.mintick ,trail_offset = close * 0.05 / syminfo.mintick, loss = LossTarget)
// strategy.risk.max_drawdown(10, strategy.percent_of_equity)
    
// // ######################>>>>>>ShortEntries<<<<<<<#########################
if inDateRange and ATR_Rise and IsASell  
    strategy.entry("shortCondition",false,when = shortCondition)
    strategy.exit("Take Profit or Stop Loss", "shortCondition",trail_points = close * 0.05 / syminfo.mintick ,trail_offset = close * 0.05 / syminfo.mintick, loss = LossTarget)
    strategy.close("longCondition")