Heiken Ashi e Super Trend Strategy

Autora:ChaoZhang, Data: 2023-11-02 16:15:18
Tags:

img

Resumo

A estratégia Heiken Ashi e Super Trend é uma estratégia de tendência que combina os velas Heiken Ashi e o indicador Super Trend.

Estratégia lógica

As velas Heiken Ashi são um tipo especial de velas que usam a média dos preços abertos, fechados, altos e baixos para traçar os corpos das velas, filtrando o ruído do mercado e tornando o padrão mais claro.

A estratégia primeiro calcula as velas de Heiken Ashi, em seguida, calcula o indicador de Super Tendência com base nas velas de Heiken Ashi. Os sinais de negociação são gerados quando o preço quebra as linhas de Super Tendência. Especificamente, a estratégia usa velas de Heiken Ashi para calcular a faixa verdadeira, em seguida, deriva as bandas superior e inferior da Super Tendência usando a faixa e o preço médio. Os sinais longos são gerados quando o preço quebra acima da faixa inferior e os sinais curtos quando o preço quebra abaixo da faixa superior.

Os parâmetros da Super Tendência também são otimizados para melhores resultados, melhorando a sensibilidade do indicador.

Análise das vantagens

  • As velas Heiken Ashi filtram o ruído para sinais mais claros.
  • A Super Tendência capta rapidamente as mudanças de tendência e gera sinais oportunos.
  • A otimização dos parâmetros melhora a fiabilidade do indicador.
  • O mecanismo de stop loss integrado controla eficazmente os riscos.
  • Alto grau de automação através da combinação de seguimento de tendências e negociação automatizada.

Análise de riscos

  • A alta automação requer um acompanhamento minucioso para evitar anomalias.
  • O Heiken Ashi pode perder sinais de inversão muito pequenos ao filtrar o ruído.
  • A Super Tendência pode gerar sinais falsos, causando entrada prematura ou stop loss.
  • A colocação incorreta de stop loss também pode levar a perdas desnecessárias.
  • Os dados insuficientes dos backtests podem causar sobreajuste, podendo os resultados em tempo real desviarem significativamente dos backtests.

Orientações de otimização

  • Teste mais combinações de parâmetros para otimizar ainda mais a Super Tendência.
  • Adicionar outros indicadores para confirmar sinais de Super Tendência e reduzir sinais falsos.
  • Otimize a estratégia de stop loss para minimizar paradas desnecessárias enquanto bloqueia lucros.
  • Incorporar algoritmos de aprendizagem de máquina para treinar o julgamento de tendências reais usando big data.
  • Usar prazos mais longos e dados históricos mais diversos para backtesting para melhorar a confiabilidade.

Resumo

A estratégia de Heiken Ashi e Super Trend é uma estratégia de tendência seguinte. Identifica a direção da tendência e negocia com a tendência principal, enquanto rapidamente pára em reversões. A estratégia integra a filtragem de ruído de Heiken Ashi e a rápida detecção de mudança de tendência da Super Trend. A otimização de parâmetros e o design de stop loss permitem maximizar os retornos enquanto controlam riscos. As otimizações futuras podem incluir mais ajuste de parâmetros, confirmação adicional de sinal, dados de backtesting expandidos, etc. para melhorar a estabilidade e confiabilidade da estratégia.


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





Mais.