Stratégie combinée Heiken Ashi et Super Trend


Date de création: 2023-12-15 11:11:27 Dernière modification: 2023-12-15 11:11:27
Copier: 0 Nombre de clics: 1310
1
Suivre
1621
Abonnés

Stratégie combinée Heiken Ashi et Super Trend

Aperçu

Il s’agit d’une stratégie de trading quantitatif combinant deux indicateurs Heiken Ashi et Super Trend. La stratégie utilise principalement le filtrage du bruit du marché par la ligne K lisse de Heiken Ashi et l’indicateur de Super Trend pour déterminer la direction de la tendance des prix et permettre le suivi de la tendance.

Principe de stratégie

  1. L’utilisation de l’indicateur Heiken Ashi pour traiter les lignes K, filtrer une partie du bruit du marché et rendre les tendances plus visibles
  2. Les hauts et les bas des supertrends basés sur l’ATR et le calcul des facteurs
  3. Un signal de baisse lorsque le prix dépasse la trajectoire et un signal de hausse lorsque le prix dépasse la trajectoire
  4. Plus le facteur est grand, moins il y a de signaux de super-tendance, plus il y a de suivi, mais moins il y a d’entrée
  5. Il s’agit d’un outil de suivi des tendances, combiné à Heiken Ashi et à l’indicateur de super-tendance.

Avantages stratégiques

  1. L’indicateur Heiken Ashi filtre efficacement une partie du bruit du marché pour rendre le graphique plus clair
  2. L’optimisation des paramètres de l’indicateur de tendance super est efficace et permet d’ajuster la fréquence d’entrée avec souplesse
  3. La combinaison de deux indicateurs permet de mieux connaître les tendances des prix
  4. Le suivi automatique de la tendance à la hausse

Risque stratégique

  1. La combinaison d’indicateurs ne peut pas éviter complètement les signaux erronés de la zone de couverture
  2. Un saut important peut entraîner une défaillance de l’indicateur et ainsi manquer des points de signal importants.
  3. Le facteur de super-tendance a mis en place une convention qui a manqué une opportunité de tendance

La solution est simple: (1) Ajustement approprié des paramètres de super-tendance pour équilibrer les effets de suivi et la fréquence d’entrée (2) ajouter d’autres indicateurs pour aider à juger et éviter les problèmes de saut en hauteur

Orientation de l’optimisation de la stratégie

  1. Adaptation des cycles ATR et des facteurs de super-tendance pour optimiser la fréquence d’entrée
  2. Augmentation des indices de stop-loss et maîtrise des pertes individuelles
  3. Combiner avec d’autres indicateurs pour déterminer le type de tendance et éviter le mauvais traitement du rythme des oscillations de tendance
  4. L’ajout d’algorithmes d’apprentissage automatique pour aider à déterminer la direction à prendre

Résumer

La stratégie intègre les avantages des deux indicateurs Heiken Ashi et Super Trend, en utilisant des indicateurs pour déterminer la direction de la tendance des valeurs et en permettant un suivi automatique. Comparé à l’utilisation d’un indicateur seul, l’efficacité de la détermination des mouvements de prix est meilleure et renforce la stabilité de la stratégie. Bien sûr, il y a aussi une certaine marge d’amélioration, et à l’avenir, il est possible d’optimiser la fréquence d’entrée et la stop loss, ce qui rend la stratégie plus rentable et moins risquée.

Code source de la stratégie
/*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)