Strategie für ATR-Hybride und Crossover mit gleitendem Durchschnitt

Schriftsteller:ChaoZhang, Datum: 2023-09-26 17:22:21
Tags:

Übersicht

Diese Strategie kombiniert den Indikator Average True Range (ATR) mit dem Crossover Moving Average, um Trendsignale für eine höhere Gewinnrate zu identifizieren.

Logik

  • Verwenden Sie ATR zur Bestimmung der Kursvolatilität in einem längeren Zeitrahmen zur Bestätigung des Aufwärtstrends
  • Berechnen Sie schnelle und langsame gleitende Durchschnitte auf niedrigeren Zeitrahmen, gehen Sie lang, wenn schnelle MA über langsame MA kreuzt, gehen Sie kurz, wenn schnelle MA unter langsame MA kreuzt
  • ATR gibt den allgemeinen Trend für einen längeren Zeitrahmen an; MA-Crossover gibt spezifische Einstiegspunkte für einen kürzeren Zeitrahmen an
  • ATR wird mit RMA-Gleichung berechnet, wobei Länge und Glatzheit einstellbar sind
  • Der MA-Crossover besteht aus zwei SMAs, deren Länge verstellbar ist.

Vorteile

  • ATR kann schwierige Bewegungen effektiv filtern, unnötige Trades vermeiden.
  • Die MA-Kreuzung ermittelt kurzfristige Trendkonversionspunkte genau
  • RMA-Gleichung bei ATR verringert die Spitzenbildung, stabilere Beurteilung bei höheren Zeiträumen
  • Kombinationsnutzung vermeidet Probleme und nutzt Chancen
  • Parameter, die für die Optimierung verschiedener Produkte und Zeitrahmen abgestimmt werden können
  • Gesamter höherer Gewinnanteil bei stetigen Gewinnen

Risiken

  • ATR-Trendbeurteilung anfällig für Verzögerungen, kann den anfänglichen Trendstart verfehlen
  • MA-Crossover anfällig für mehrfache Anpassungen, mehr Verkaufssignale
  • Parameter-Tuning extrem kritisch, unsachgemäße Einstellungen führen zu Über-/Unterhandel
  • Erfordern historische Datenanalyse für optimale Parameter für jedes Produkt
  • Graduelle Positionsgrößerung in Betracht ziehen, ausreichende Mittel zur Begrenzung von Verlusten gewährleisten

Möglichkeiten zur Verbesserung

  • Erforschung zusätzlicher/alternativer Indikatoren zu ATR, z. B. Bollinger-Band für die Trendstärke
  • Ausweitung des MA-Crossovers mit anderen Kombinationen, z. B. EMA, Momentumindikatoren
  • Einbeziehung von Breakout-Bestätigungsmechanismen, um falsche Breakouts zu vermeiden
  • Bestandteil der Bestandteile, die für die Berechnung der Vermögenswerte verwendet werden
  • Überlegen Sie, Kapitalmanagementstrategien zu integrieren, z. B. eine feste, dynamische Positionsgröße
  • Umfangreiche Backtesting zur Bewertung der Strategie-Stabilität und der maximalen Auslastung

Schlussfolgerung

Diese Strategie nutzt die Stärken von ATR und MA voll aus, um Trendrichtung und Einstiegspunkte zu identifizieren. Durch Parameter-Tuning kann es sich an unterschiedliche Marktumgebungen anpassen. Live-Tests beweisen eine konstante Rentabilität und eine hohe Gewinnrate. Allerdings ist die Risikokontrolle für umsichtige Operationen von entscheidender Bedeutung. Eine weitere Datenvalidierung würde es erfordern, es zu einem robusten Quantensystem auszubauen und zu verfeinern.


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

Mehr