Estrategia combinada de Heiken Ashi y Super Trend


Fecha de creación: 2023-12-15 11:11:27 Última modificación: 2023-12-15 11:11:27
Copiar: 0 Número de Visitas: 1310
1
Seguir
1621
Seguidores

Estrategia combinada de Heiken Ashi y Super Trend

Descripción general

Se trata de una estrategia de trading cuantitativa que combina Heiken Ashi y Super Trend. La estrategia utiliza principalmente el Heiken Ashi para filtrar el ruido del mercado y el indicador de Super Trend para determinar la dirección de la tendencia de los precios y hacer seguimiento de la tendencia.

Principio de estrategia

  1. El uso de Heiken Ashi para procesar la línea K y filtrar parte del ruido del mercado para hacer que las tendencias sean más evidentes
  2. Subidas y bajadas de las supertendencias basadas en el ATR y el factoring
  3. Cuando el precio se rompe en la vía de la baja señal de la señal de la baja cuando se rompe en la vía de la baja señal de la señal de la baja
  4. Cuanto mayor es el factor, menos son las señales de tendencia súper, mejor es el seguimiento, pero menos entradas
  5. Combinado con Heiken Ashi y el Super Trend Indicator, permite el juicio y seguimiento de tendencias

Ventajas estratégicas

  1. El indicador Heiken Ashi filtra con eficacia parte del ruido del mercado para que el gráfico sea más claro
  2. La optimización de los parámetros del indicador de tendencias súper es efectiva y permite ajustar la frecuencia de entrada con flexibilidad
  3. Combinación de dos indicadores para una mejor evaluación de las tendencias de los precios
  4. Implementa un seguimiento automático de las tendencias fuertes

Riesgo estratégico

  1. La combinación de indicadores no puede evitar completamente las señales de error en el intervalo de liquidación de la operación
  2. Un salto muy alto puede hacer que el indicador falle y se pierda una señal importante.
  3. Los factores de la tendencia súper establecieron que la convención perdió la oportunidad de la tendencia

La solución: (1) Ajuste adecuado de los parámetros de la tendencia súper, equilibrio de los efectos de seguimiento y la frecuencia de entrada (2) Aumentar otros indicadores para ayudar a juzgar y evitar problemas de salto en alto

Dirección de optimización de la estrategia

  1. Ajustar el ciclo ATR y el factor de tendencia súper para optimizar la frecuencia de entrada
  2. Aumentar los parámetros de pérdidas y controlar las pérdidas individuales
  3. Combinado con otros indicadores para determinar el tipo de movimiento, evitar el mal manejo del ritmo de la oscilación de la tendencia
  4. El aumento de los algoritmos de aprendizaje automático para ayudar a determinar la dirección de la tendencia

Resumir

La estrategia integra las ventajas de los indicadores Heiken Ashi y Supertrends, utiliza los indicadores para determinar la dirección de la tendencia de los valores y permite el seguimiento automático. En comparación con el uso de un indicador, el efecto de determinar el movimiento de los precios es mejor y aumenta la estabilidad de la estrategia. Por supuesto, también hay cierto espacio para mejorar, en el futuro se puede optimizar en términos de frecuencia de entrada y parada de pérdidas, lo que hace que la estrategia tenga mayores ganancias y menores riesgos.

Código Fuente de la Estrategia
/*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)