Estratégia de acompanhamento de tendências do canal de equilíbrio de momentum


Data de criação: 2023-12-12 18:07:31 última modificação: 2023-12-12 18:07:31
cópia: 0 Cliques: 621
1
focar em
1621
Seguidores

Estratégia de acompanhamento de tendências do canal de equilíbrio de momentum

Visão geral

A estratégia permite o rastreamento de tendências através da computação de indicadores de canais e de dinâmica, identificando as formas de tendências. Concretamente, combina indicadores de dinâmica e indicadores de canais de equilíbrio, usando ambos em conjunto, e, ao mesmo tempo, usa canais de equilíbrio para bloquear áreas de lucro de múltiplos pontos, enquanto intervém em tendências de longo prazo.

Princípio da estratégia

A estratégia baseia-se em dois indicadores:

  1. Indicador de dinâmica (DMI): para determinar a tendência de mercado de alta volatilidade, o indicador é maior do que o valor de limiar para gerar um sinal de negociação.

  2. Canais de equilíbrio (Keltner Channel): para determinar a região de tendência, o preço quebra a trajetória como um momento de compra, quando o preço cai na trajetória do meio como um sinal de parada.

A lógica de negociação específica é: quando o indicador de dinâmica + DI é maior do que o limiar definido (default 32), é considerado uma tendência de múltiplas cabeças, quando o preço quebra o canal de equilíbrio para a trajetória, gerando um sinal de compra; Em seguida, use o canal de equilíbrio para a trajetória como linha de parada, para rastrear a parada e obter proteção de lucro.

A estratégia combina os benefícios de dois indicadores, usando o indicador de dinâmica para determinar a direção da tendência e o canal de equilíbrio para determinar o momento de entrada e a zona de parada. A combinação de dois indicadores permite que a estratégia entre com eficiência na detecção de tendências mais cedo e, ao mesmo tempo, use o indicador de canal para bloquear ganhos e perdas.

Análise de vantagens

  1. A estratégia de usar indicadores de dinamismo para determinar a tendência do mercado no início é mais eficiente do que indicadores atrasados como a média móvel simples.

  2. O uso de um canal de equilíbrio para determinar a zona de negociação específica permite bloquear eficazmente a zona de lucro.

  3. Os parâmetros do indicador e as regras de negociação são rigorosos e razoáveis, os dados de retrospectiva têm um bom desempenho e a eficácia é verificada no disco.

  4. A estratégia é simples, clara e fácil de entender, apropriada para iniciantes em negociação quantitativa.

  5. O risco da estratégia é controlado, com a utilização de stop loss dinâmico linear médio, para controlar efetivamente os perdas individuais.

Análise de Riscos

  1. A estratégia aplica-se apenas a situações de tendência e não se aplica à liquidação de mercados voláteis, caso o canal QtCore cresça e o stop loss do meio-campo fique muito relaxado e não consiga controlar os prejuízos.

  2. O indicador DMI está um pouco atrasado, não é possível determinar a confirmação da tendência, e a intervenção precoce na tendência pode trazer prejuízos.

  3. O método de parada de percentual fixo tem o risco de não poder intervir novamente na tendência após um grande choque, perdendo a sequência.

  4. Os dados de detecção são abundantes, mas o disco rígido ainda precisa de muito tempo para verificar a estabilidade dos parâmetros.

Direção de otimização

  1. Pode-se testar diferentes métodos de parada, como parada ATR, parada móvel, etc. em vez de parada de porcentagem fixa.

  2. Indicadores de confirmação secundários podem ser adicionados, como aumento do volume de transações, para garantir a entrada após a confirmação da tendência.

  3. É possível testar a otimização de diferentes combinações de parâmetros para encontrar a melhor combinação de parâmetros.

  4. A robustez dos parâmetros pode ser verificada por otimização em etapas e teste de retorno flutuante.

Resumir

Esta estratégia usa o julgamento de duplo indicador para capturar de forma eficiente a tendência. A estratégia é mais simples, intuitiva, lógica clara, bom desempenho de retrospectiva e pode ser usada como uma das estratégias de entrada para negociação quantitativa.

Código-fonte da estratégia
/*backtest
start: 2023-11-11 00:00:00
end: 2023-12-11 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Original Idea by: @Wunderbit


//@version=4
strategy("Keltner Channel [LINKUSDT] 1H", overlay=true, initial_capital=3000,pyramiding = 0, currency="USD", default_qty_type=strategy.percent_of_equity, default_qty_value=100,  commission_type=strategy.commission.percent,commission_value=0.1)


/// TREND
trend_cond = input(true, title="Enable Ribbon Filter")
ribbon_period = input(30, "Ribbon 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(80, "KELTNER Period", step=1, minval=1)
mult         = input(3.0,"KELTNER Multiple", step=0.1)

// Calculate Keltner Channel
ma      = ema(source, length)
range   = useTrueRange ? tr : high - low
rangema = ema(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 //

lensig = input(14, title="ADX Smoothing", minval=1, maxval=50)
len = input(14, minval=1, title="DI Length")
up = change(high)
down = -change(low)
plusDM = na(up) ? na : (up > down and up > 0 ? up : 0)
minusDM = na(down) ? na : (down > up and down > 0 ? down : 0)
trur = rma(tr, len)
plus = fixnan(100 * rma(plusDM, len) / trur)
minus = fixnan(100 * rma(minusDM, len) / trur)
sum = plus + minus
adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), lensig)

trig_level=input(title="+DI Trigger Level", defval=32, minval=1,step=1)
//trig_level_adx=input(title="ADX Trigger Level", defval=30, minval=1,step=1)

//plot(adx, color=#FF006E, title="ADX")
//plot(plus, color=#0094FF, title="+DI")
//plot(minus, color=#FF6A00, title="-DI")
// plot(trig_level, 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(2030, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)

testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false
    
///// Component Code Stop //////////////////////////////////////////

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

// STRATEGY CONDITION
// LONG

long = ((open > lower and open < upper) and close > upper) and plus > minus and plus > trig_level and volume[0] > volume[1]
entry_long = trend_cond ? long and UT : long
exit_long = (close < ma) //or low < SL_long

//LONG SET UP
// Take Profit / Stop Loss

entry_price_long=valuewhen(entry_long,close,0)
//SL_long = entry_price_long * (1 - long_sl_inp)

long_tp1_inp = input(8, title='Long Take Profit 1 Target %', step=0.1)/100
long_tp1_qty = input(20, title="Long Take Profit 1 Qty %", step=1)

long_tp2_inp = input(16, title='Long Take Profit 2 Target %', step=0.1)/100
long_tp2_qty = input(30, 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 EXECUTION
if testPeriod()

    // LONG
    
    strategy.entry(id="Long", long=true, when=entry_long, comment = "INSERT ENTRY 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")