Heiken Ashi und Super Trend Kombinationsstrategie


Erstellungsdatum: 2023-12-15 11:11:27 zuletzt geändert: 2023-12-15 11:11:27
Kopie: 0 Klicks: 1310
1
konzentrieren Sie sich auf
1621
Anhänger

Heiken Ashi und Super Trend Kombinationsstrategie

Überblick

Es handelt sich um eine quantitative Handelsstrategie, die Heiken Ashi und Supertrends kombiniert. Die Strategie nutzt Heiken Ashi, um Marktgeräusche zu filtern, und Supertrends, um die Richtung der Preisentwicklung zu bestimmen.

Strategieprinzip

  1. K-Linien mit Heiken-Ashi-Indikatoren, um Marktgeräusche zu filtern und Trends deutlicher zu machen
  2. Auf- und Abgleise der Supertrends basierend auf ATR und Faktorisierung
  3. Wenn der Preis brechen Sie die Bahn ist ein Signal für den Rückgang, wenn der Preis brechen Sie die Bahn ist ein Signal für den Rückgang
  4. Je größer der Faktor, desto weniger Supertrend-Signale, desto besser die Tracking-Effekte, aber die Anzahl der Eintritte sinkt
  5. Die Kombination von Heiken Ashi und Supertrend-Indikatoren ermöglicht die Beurteilung und Verfolgung von Trends.

Strategische Vorteile

  1. Der Heiken Ashi Index filtert einen Teil des Marktgeräusches und macht die Grafik deutlich
  2. Die Optimierung der Parameter des Supertrend-Indikators funktioniert gut und die Eintrittsfrequenz kann flexibel angepasst werden
  3. Kombination von zwei Indikatoren, um die Preisentwicklung besser zu beurteilen
  4. Automatische Verfolgung von starken Trends

Strategisches Risiko

  1. Die Indicator-Palette ist nicht vollständig ausgeschlossen von Fehlsignalen in der Devisenumstellung.
  2. Große Übersprüche können dazu führen, dass die Anzeige ausfällt und wichtige Signalpunkte verpasst werden.
  3. Supertrend-Faktoren setzen die Konferenz auf eine verpasste Trendchance

Die Lösung: (1) Richtige Anpassung der Supertrendparameter zur Ausgewogenheit der Tracking-Effekte und der Eintrittsfrequenz (2) Hinzufügen von anderen Indikatoren, die zur Beurteilung beitragen, um Probleme zu vermeiden, die durch Springen verursacht werden

Richtung der Strategieoptimierung

  1. Anpassung der ATR-Zyklen und Supertrend-Faktoren zur Optimierung der Eintrittsfrequenz
  2. Erhöhung der Stop-Loss-Kennzahlen und Kontrolle der Einzelschäden
  3. In Kombination mit anderen Indikatoren zur Bestimmung des Trends und zur Vermeidung einer falschen Behandlung des Trendschwankungs-Taktes
  4. Die Entwicklung von “Machine-Learning-Algorithmen”, die die Richtung bestimmen

Zusammenfassen

Die Strategie integriert die Vorteile von Heiken Ashi und Supertrends in zwei Indikatoren. Die Indikatoren werden verwendet, um die Richtung der Werttrends zu bestimmen und automatische Verfolgung zu ermöglichen. Im Vergleich zur Verwendung eines Indikators allein ist die Wirksamkeit der Preisbewegung besser und erhöht die Stabilität der Strategie.

Strategiequellcode
/*backtest
start: 2022-12-08 00:00:00
end: 2023-12-14 00:00:00
period: 1d
basePeriod: 1h
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/
// © RingsCherrY

//@version=5

strategy("Heiken Ashi & Super Trend", 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/////////////////////
///////////////////////////////////////////////////

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

[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          =                   true

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