Estratégia baseada na tendência do canal Keltner

Autora:ChaoZhang, Data: 2023-11-03 16:59:39
Tags:

img

Resumo

Esta estratégia baseia-se em três indicadores principais: indicador de tendência, canal Keltner e indicador DM.

O indicador de tendência consiste em SMA e EMA. O canal de Keltner é usado para determinar o preço de abertura e fechamento de velas. O indicador de DM é para julgar a direção de longo e curto.

O sinal de entrada é acionado quando:

  1. EMA cruza SMA, confirmando tendência de alta
  2. A vela abre acima da banda superior e fecha dentro do canal
  3. Indicador DM acima do valor de referência

A estratégia tem dois níveis de take profit e um nível de stop loss.

Princípios de estratégia

Identificação da tendência

Os cruzamentos entre SMA e EMA são utilizados para determinar a direção da tendência.

Canal Keltner

O canal tem três linhas: média, superior e inferior. A linha do meio é SMA de preço de fechamento com comprimento de 81. As bandas superior e inferior são colocadas em um múltiplo do intervalo verdadeiro acima e abaixo da linha do meio. Aqui usamos 2,5 vezes o intervalo verdadeiro.

O canal Keltner mostra níveis de suporte e resistência.

Indicador DM

O indicador DM contém ADX, +DI e -DI. +DI mede a força da tendência ascendente enquanto -DI mede a força da tendência descendente.

Quando o +DI cruza acima do índice de referência (default 27), indica uma forte tendência de alta e é bom para uma entrada longa.

Análise das vantagens

Esta estratégia combina indicadores de tendência, canal e impulso para determinar eficazmente as ações de preços e a direcção longa/curta.

  1. A identificação da tendência é relativamente precisa para evitar transações contra tendência.

  2. O canal Keltner mostra níveis claros de suporte e resistência.

  3. O indicador DM mede o momento longo/curto para assegurar a direcção.

  4. Regras estritas de entrada ajudam a filtrar falsas fugas.

  5. Os pontos de take profit e stop loss permitem capturar lucros.

Análise de riscos

Há também alguns riscos a considerar:

  1. A tendência pode reverter quando a EMA cruzar abaixo da SMA, por isso saia em tempo hábil.

  2. O canal pode falhar em tendências fortes, não em suporte/resistência rigoroso.

  3. O DM pode gerar sinais falsos, verificar a ação do preço.

  4. Falsa fuga pode desencadear entrada mas rapidamente fallback, usar stop loss razoável.

  5. O aproveitamento e o stop loss necessitam de uma otimização contínua para se adaptarem às condições de mercado em mudança.

Orientações de otimização

Algumas formas de otimizar ainda mais a estratégia:

  1. Ajustar parâmetros e testar diferentes métodos de identificação de tendências.

  2. Otimize os parâmetros do canal para se adequar melhor ao alcance verdadeiro.

  3. Teste diferentes parâmetros de DM e encontre a combinação ideal.

  4. Adicione mais filtros de entrada como volume.

  5. Tente trail stop loss para obter mais lucros.

  6. Ensaiar separadamente diferentes produtos para encontrar os melhores conjuntos de parâmetros.

Conclusão

A estratégia integra múltiplos indicadores para determinar tendência, suporte/resistência e impulso, o que permite capturar efetivamente tendências e controlar riscos.


/*backtest
start: 2022-10-27 00:00:00
end: 2023-11-02 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Original Idea by: Wunderbit Trading

//@version=4
strategy("Keltner Channel ETH/USDT 1H", overlay=true, initial_capital=1000,pyramiding = 0, currency="USD", default_qty_type=strategy.percent_of_equity, default_qty_value=100,  commission_type=strategy.commission.percent,commission_value=0.07)


/// TREND
ribbon_period = input(46, "Period", step=1)

leadLine1 = ema(close, ribbon_period)
leadLine2 = sma(close, ribbon_period)

// p3 = plot(leadLine1, color= #53b987, title="EMA", transp = 50, linewidth = 1)
// p4 = plot(leadLine2, color= #eb4d5c, title="SMA", transp = 50, linewidth = 1)
// fill(p3, p4, transp = 60, color = leadLine1 > leadLine2 ? #53b987 : #eb4d5c)

//Upward Trend
UT=leadLine2 < leadLine1
DT=leadLine2>leadLine1

///////////////////////////////////////INDICATORS

// KELTNER //
source       = close
useTrueRange = input(true)
length       = input(81, step=1, minval=1)
mult         = input(2.5, step=0.1)

// Calculate Keltner Channel
ma      = sma(source, length)
range   = useTrueRange ? tr : high - low
rangema = sma(range, length)
upper = ma + rangema * mult
lower = ma - rangema * mult

plot(ma, title="Middle", color=color.orange)
p1=plot(upper, title="Upper", color=color.orange)
p2=plot(lower, title="Lower", color=color.orange)
fill(p1,p2)


// DMI INDICATOR //
adxlen = 10 // input(10, title="ADX Smoothing")
dilen = input(19, title="DI Length")
keyLevel = 23// input(23, title="key level for ADX")
dirmov(len) =>
	up = change(high)
	down = -change(low)
	truerange = rma(tr, len)
	plus = fixnan(100 * rma(up > down and up > 0 ? up : 0, len) / truerange)
	minus = fixnan(100 * rma(down > up and down > 0 ? down : 0, len) / truerange)
	[plus, minus]

adx(dilen, adxlen) =>
	[plus, minus] = dirmov(dilen)
	sum = plus + minus
	adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)
	[adx, plus, minus]

[sig, up, down] = adx(dilen, adxlen)

benchmark=input(title="DMI Benchmark", defval=27, minval=1,step=1)

// plot(sig, color=color.red, title="ADX")
// plot(up, style=plot.style_histogram, color=color.green, title="+DI")
// plot(down, style=plot.style_histogram, color=color.red, title="-DI")
// plot(keyLevel, color=color.white, title="Key Level")

///////////////////////////////////////////////////////////


////////////////////////////////////////////////////Component Code Start

testStartYear = input(2019, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

testStopYear = input(9999, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)

testPeriod() => true
///// Component Code Stop //////////////////////////////////////////

//////////////// STRATEGY EXECUTION //////////////////////////

//LONG SET UP
// Take Profit / Stop Loss
long_tp1_inp = input(4.5, title='Long Take Profit 1 %', step=0.1)/100
long_tp1_qty = input(15, title="Long Take Profit 1 Qty", step=1)

long_tp2_inp = input(20, title='Long Take Profit 2%', step=0.1)/100
long_tp2_qty = input(100, title="Long Take Profit 2 Qty", step=1)

long_take_level_1 = strategy.position_avg_price * (1 + long_tp1_inp)
long_take_level_2 = strategy.position_avg_price * (1 + long_tp2_inp)

long_sl_inp = input(4, title='Long Stop Loss %', step=0.1)/100
long_stop_level = strategy.position_avg_price * (1 - long_sl_inp)


// STRATEGY CONDITION
// LONG
entry_long = ((open > lower and open < upper) and close > upper) and up > down and up > benchmark //  and volume[0] > volume[1]
entry_price_long=valuewhen(entry_long,close,0)
SL_long = entry_price_long * (1 - long_sl_inp)
exit_long = (close < lower) or low < SL_long


// STRATEGY EXECUTION
if testPeriod()

    // LONG
    if UT
        strategy.entry(id="Long", long=true, when=entry_long, comment = "INSERT ENTER LONG COMMAND")
    strategy.exit("TP1","Long", qty_percent=long_tp1_qty, limit=long_take_level_1) // PLACE TAKE PROFIT IN WBT BOT SETTINGS 
    strategy.exit("TP2","Long", qty_percent=long_tp2_qty, limit=long_take_level_2) // PLACE TAKE PROFIT IN WBT BOT SETTINGS
    strategy.close(id="Long", when=exit_long, comment= "INSERT EXIT LONG COMMAND")


//PLOT FIXED SLTP LINE
// LONG POSITION
plot(strategy.position_size > 0 ? long_take_level_1 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="1st Long Take Profit")
plot(strategy.position_size > 0 ? long_take_level_2 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="2nd Long Take Profit")
plot(strategy.position_size > 0 ? long_stop_level : na, style=plot.style_linebr, color=color.red, linewidth=1, title="Long Stop Loss")

Mais.