Die Ressourcen sind geladen. Beförderung...

Heiken Ashi und die Super Trend Strategie

Schriftsteller:ChaoZhang, Datum: 2023-11-02 16:15:18
Tags:

img

Übersicht

Die Heiken Ashi und Super Trend Strategie ist eine Trend-folgende Strategie, die die Heiken Ashi Kerzen und den Super Trend Indikator kombiniert.

Strategie Logik

Heiken Ashi Kerzen sind eine spezielle Art von Kerzen, die den Durchschnitt der offenen, geschlossenen, hohen und niedrigen Preise verwenden, um Kerzenkörper zu zeichnen, Marktlärm zu filtern und das Muster klarer zu machen.

Die Strategie berechnet zuerst die Heiken Ashi Kerzen, berechnet dann den Super Trend Indikator basierend auf den Heiken Ashi Kerzen. Handelssignale werden erzeugt, wenn der Preis durch die Super Trend Linien bricht. Insbesondere verwendet die Strategie Heiken Ashi Kerzen, um den wahren Bereich zu berechnen, und leitet dann die oberen und unteren Bands des Super Trend mit dem Bereich und dem Durchschnittspreis ab.

Die Super Trend-Parameter sind auch für beste Ergebnisse optimiert, wodurch die Empfindlichkeit des Indikators verbessert wird.

Analyse der Vorteile

  • Heiken Ashi Kerzen filtern Geräusche aus, um deutlichere Signale zu erhalten.
  • Super Trend erfasst schnell Trendänderungen und erzeugt zeitnahe Signale.
  • Die Optimierung der Parameter verbessert die Zuverlässigkeit des Indikators.
  • Ein eingebauter Stop-Loss-Mechanismus kontrolliert die Risiken wirksam.
  • Hohe Automatisierungsgrad durch Kombination von Trendverfolgung und automatisiertem Handel.

Risikoanalyse

  • Eine hohe Automatisierung erfordert eine sorgfältige Überwachung, um Anomalien zu vermeiden.
  • Heiken Ashi kann sehr kleine Umkehrsignale beim Filtern von Lärm verpassen.
  • Super Trend kann falsche Signale erzeugen, was zu einem vorzeitigen Einstieg oder Stop-Loss führt.
  • Eine unsachgemäße Stop-Loss-Platzierung kann auch zu unnötigen Verlusten führen.
  • Unzureichende Daten aus dem Backtest können zu einer Überanpassung führen.

Optimierungsrichtlinien

  • Testen Sie mehr Parameterkombinationen, um den Super Trend weiter zu optimieren.
  • Hinzufügen anderer Indikatoren zur Bestätigung von Super-Trend-Signalen und zur Verringerung falscher Signale.
  • Optimieren Sie die Stop-Loss-Strategie, um unnötige Stops zu minimieren und gleichzeitig Gewinne zu erzielen.
  • Einbeziehung von Algorithmen des maschinellen Lernens, um das Urteilen über reale Trends mithilfe von Big Data zu trainieren.
  • Verwenden Sie längere Zeitrahmen und vielfältigere historische Daten für Backtesting, um die Zuverlässigkeit zu verbessern.

Zusammenfassung

Die Heiken Ashi und Super Trend Strategie ist eine Trendfolgsstrategie. Sie identifiziert die Trendrichtung und handelt mit dem Haupttrend, während sie bei Umkehrungen schnell stoppt. Die Strategie integriert Heiken Ashi's Noise Filtering und Super Trend's schnelle Trendänderungserkennung. Parameteroptimierung und Stop-Loss-Design ermöglichen die Maximierung von Renditen bei gleichzeitiger Kontrolle von Risiken. Zukünftige Optimierungen können weitere Parameter-Tuning, zusätzliche Signalbestätigung, erweiterte Backtesting-Daten usw. um die Stabilität und Zuverlässigkeit der Strategie zu verbessern.


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

//@version=5

strategy("Heiken Ashi & Super Trend_ARM", overlay=true,  pyramiding=1,initial_capital = 10000, default_qty_type= strategy.percent_of_equity, default_qty_value = 100, calc_on_order_fills=false, slippage=0,commission_type=strategy.commission.percent,commission_value=0.02)

///////////////////////////////////////////////////
////////////////////Function///////////////////////
///////////////////////////////////////////////////


heikinashi_open = request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, open)
heikinashi_high = request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, high)
heikinashi_low  = request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, low)
heikinashi_close= request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, close)
heikinashi_color = heikinashi_open < heikinashi_close ? #53b987 : #eb4d5c
// plotbar(heikinashi_open, heikinashi_high, heikinashi_low, heikinashi_close, color=heikinashi_color)

x_sma(x, y) =>
    sumx = 0.0
    for i = 0 to y - 1
        sumx := sumx + x[i] / y
    sumx

x_rma(src, length) =>
	alpha = 1/length
	sum = 0.0
	sum := na(sum[1]) ? x_sma(src, length) : alpha * src + (1 - alpha) * nz(sum[1])

x_atr(length) =>
    trueRange = na(heikinashi_high[1])? heikinashi_high-heikinashi_low : math.max(math.max(heikinashi_high - heikinashi_low, math.abs(heikinashi_high - heikinashi_close[1])), math.abs(heikinashi_low - heikinashi_close[1]))
    //true range can be also calculated with ta.tr(true)
    x_rma(trueRange, length)

x_supertrend(factor, atrPeriod) =>
	src = (heikinashi_high+heikinashi_low)/2
	atr = x_atr(atrPeriod)
	upperBand = src + factor * atr
	lowerBand = src - factor * atr
	prevLowerBand = nz(lowerBand[1])
	prevUpperBand = nz(upperBand[1])

	lowerBand := lowerBand > prevLowerBand or heikinashi_close[1] < prevLowerBand ? lowerBand : prevLowerBand
	upperBand := upperBand < prevUpperBand or heikinashi_close[1] > prevUpperBand ? upperBand : prevUpperBand
	int direction = na
	float superTrend = na
	prevSuperTrend = superTrend[1]
	if na(atr[1])
		direction := 1
	else if prevSuperTrend == prevUpperBand
		direction := heikinashi_close > upperBand ? -1 : 1
	else
		direction := heikinashi_close < lowerBand ? 1 : -1
	superTrend := direction == -1 ? lowerBand : upperBand
	[superTrend, direction]
	

///////////////////////////////////////////////////
////////////////////Indicators/////////////////////
///////////////////////////////////////////////////

factor = input.float(3.0, "Factor", step = 0.01)
atrPeriod = input(10, "ATR Length")


[supertrend, direction] = x_supertrend(factor, atrPeriod)

bodyMiddle = plot((heikinashi_open + heikinashi_close) / 2, display=display.none)
upTrend = plot(direction < 0 ? supertrend : na, "Up Trend", color = color.green, style=plot.style_linebr)
downTrend = plot(direction < 0? na : supertrend, "Down Trend", color = color.red, style=plot.style_linebr)

fill(bodyMiddle, upTrend, color.new(color.green, 90), fillgaps=false)
fill(bodyMiddle, downTrend, color.new(color.red, 90), fillgaps=false)

///////////////////////////////////////////////////
////////////////////Strategy///////////////////////
///////////////////////////////////////////////////

var bool longCond                    = na, var bool shortCond                   = na, longCond := nz(longCond[1]), shortCond := nz(shortCond[1])
var int CondIni_long                 = 0, var int CondIni_short                 = 0, CondIni_long := nz(CondIni_long[1]), CondIni_short := nz(CondIni_short[1])
var float open_longCondition         = na, var float open_shortCondition   = na


long  = ta.change(direction) < 0
short = ta.change(direction) > 0


longCond        :=                                                              long
shortCond       :=                                                              short

CondIni_long    :=                                                              longCond[1] ? 1 : shortCond[1] ? -1 : nz(CondIni_long[1])
CondIni_short   :=                                                              longCond[1] ? 1 : shortCond[1] ? -1 : nz(CondIni_short[1])
longCondition   =                                                               (longCond[1] and nz(CondIni_long[1]) == -1)
shortCondition  =                                                               (shortCond[1] and nz(CondIni_short[1]) == 1)


open_longCondition             :=                                          long ? close[1] :                                                      nz(open_longCondition[1])
open_shortCondition            :=                                          short ? close[1] :                                                     nz(open_shortCondition[1])


//TP
tp                    = input.float(1.1  , "TP [%]",                      step = 0.1) 

//BACKTESTING inputs --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

testStartYear       =                   input.int(2000,                             title="start year",                                         minval = 1997, maxval = 3000,                                                   group= "BACKTEST") 
testStartMonth      =                   input.int(01,                               title="start month",                                        minval = 1, maxval = 12,                                                        group= "BACKTEST")
testStartDay        =                   input.int(01,                               title="start day",                                          minval = 1, maxval = 31,                                                        group= "BACKTEST")
testPeriodStart     =                   timestamp(testStartYear,testStartMonth,testStartDay,0,0)
testStopYear        =                   input.int(3333,                             title="stop year",                                          minval=1980, maxval = 3333,                                                     group= "BACKTEST")
testStopMonth       =                   input.int(12,                               title="stop month",                                         minval=1, maxval=12,                                                            group= "BACKTEST")
testStopDay         =                   input.int(31,                               title="stop day",                                           minval=1, maxval=31,                                                            group= "BACKTEST")
testPeriodStop      =                   timestamp(testStopYear, testStopMonth, testStopDay, 0, 0)
testPeriod          =                   time >= testPeriodStart and time <= testPeriodStop ? true : false

// Backtest  ==================================================================================================================================================================================================================================================================================================================================


if longCond
    strategy.entry("L", strategy.long, when=testPeriod)

if shortCond
    strategy.entry("S", strategy.short, when=testPeriod)
    

strategy.exit("TP_L", "L", profit =((open_longCondition   *       (1+(tp/100))) - open_longCondition)/syminfo.mintick)

strategy.exit("TP_S", "S", profit =((open_shortCondition  *       (1+(tp/100))) - open_shortCondition)/syminfo.mintick)





Mehr