Heiken Ashi et la stratégie Super Trend

Auteur:ChaoZhang est là., Date: 2023-11-02 16h15 et 18h
Les étiquettes:

img

Résumé

La stratégie Heiken Ashi et Super Trend est une stratégie de suivi de tendance qui combine les chandeliers Heiken Ashi et l'indicateur Super Trend.

La logique de la stratégie

Les bougies Heiken Ashi sont un type spécial de chandeliers qui utilisent la moyenne des prix d'ouverture, de fermeture, de haut et de bas pour tracer les corps des bougies, filtrant le bruit du marché et rendant le modèle plus clair.

La stratégie calcule d'abord les bougies Heiken Ashi, puis calcule l'indicateur de Super Trend basé sur les bougies Heiken Ashi. Les signaux de trading sont générés lorsque le prix franchit les lignes de Super Trend. Plus précisément, la stratégie utilise les bougies Heiken Ashi pour calculer la plage réelle, puis déduit les bandes supérieures et inférieures de Super Trend en utilisant la plage et le prix moyen. Les signaux longs sont générés lorsque le prix franchit la bande inférieure, et les signaux courts lorsque le prix franchit la bande supérieure.

Les paramètres de Super Trend sont également optimisés pour de meilleurs résultats, améliorant la sensibilité de l'indicateur.

Analyse des avantages

  • Les bougies Heiken Ashi filtrent le bruit pour obtenir des signaux plus clairs.
  • Super Trend capte rapidement les changements de tendance et génère des signaux en temps opportun.
  • L'optimisation des paramètres améliore la fiabilité de l'indicateur.
  • Un mécanisme de stop loss intégré permet de contrôler efficacement les risques.
  • Un haut degré d'automatisation grâce à la combinaison de la suivi des tendances et du trading automatisé.

Analyse des risques

  • Une automatisation élevée nécessite une surveillance étroite pour éviter les anomalies.
  • Heiken Ashi peut manquer de très petits signaux d'inversion lors du filtrage du bruit.
  • Super Trend peut générer de faux signaux, provoquant une entrée prématurée ou un stop loss.
  • Un mauvais placement de stop loss peut également entraîner des pertes inutiles.
  • Des données insuffisantes de backtesting peuvent entraîner un surajustement et les résultats en direct peuvent différer sensiblement de ceux du backtest.

Directions d'optimisation

  • Testez plus de combinaisons de paramètres pour optimiser encore le Super Trend.
  • Ajouter d'autres indicateurs pour confirmer les signaux de Super Trend et réduire les faux signaux.
  • Optimiser la stratégie de stop-loss pour minimiser les arrêts inutiles tout en bloquant les bénéfices.
  • Incorporer des algorithmes d'apprentissage automatique pour former le jugement des tendances réelles à l'aide de big data.
  • Utiliser des délais plus longs et des données historiques plus variées pour le backtesting afin d'améliorer la fiabilité.

Résumé

La stratégie Heiken Ashi et Super Trend est une stratégie de suivi des tendances. Elle identifie la direction de la tendance et négocie avec la tendance principale, tout en s'arrêtant rapidement sur les renversements. La stratégie intègre le filtrage du bruit Heiken Ashi et la détection rapide des changements de tendance de Super Trend.


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





Plus de