Estratégia de canal de flutuação de avanço bilateral da linha K


Data de criação: 2024-01-31 10:24:00 última modificação: 2024-01-31 10:24:00
cópia: 1 Cliques: 568
1
focar em
1617
Seguidores

Estratégia de canal de flutuação de avanço bilateral da linha K

Visão geral

A estratégia de canal de oscilação de linha K de ruptura bilateral determina a direção e a intensidade do mercado através do cálculo do meio do canal, do caminho superior e do caminho inferior, combinado com indicadores de tendência e indicadores de preço de medida, e configura sinais de ruptura simultaneamente em ambos os lados do canal para atingir o principal objetivo de baixar e comprar.

Princípio da estratégia

O indicador central da estratégia é o canal de flutuação da linha K, baseado na estatística. O meio do canal usa um algoritmo de linha média, o caminho ascendente e descendente usa um método de cálculo da amplitude real média, capaz de capturar dinamicamente os limites das flutuações de preços. Ao mesmo tempo, a estratégia adiciona DMI e regras de julgamento de volume de transação, evitando que as falsas rupturas tragam perdas.

Especificamente, quando o preço entra no canal de ruptura de uma trajetória inferior, a linha + DI do DMI excede a linha -DI e a linha de referência ADX definida, gerando um sinal de compra quando o volume de transação é amplificado. Por outro lado, quando o preço entra no canal de ruptura de uma trajetória superior para uma trajetória inferior, a regra de julgamento é o oposto, gerando um sinal de venda.

Análise de vantagens

A maior vantagem da estratégia é capturar a direção da ruptura principal do preço. Usando a determinação de ruptura bilateral, pode-se evitar efetivamente a correção e a oscilação do mercado, reduzindo o número de paradas. Em comparação com a estratégia de média móvel simples, a determinação de ruptura do canal K é mais adaptável à oscilação do preço.

Além disso, a introdução dos indicadores auxiliares DMI e volume de negócios também tem um bom efeito de filtragem, evitando falsos sinais. Portanto, a estratégia tem algumas vantagens do ponto de vista da taxa de ganho e lucro.

Análise de Riscos

O maior risco da estratégia de breakout bilateral é a incapacidade de julgar a reversão da tendência, e se a tendência for uma reversão de tipo V, o ponto de parada pode ser facilmente acionado. Além disso, a configuração inadequada dos parâmetros também pode afetar negativamente o sistema de negociação.

Em relação ao risco, podemos reduzir o risco ao otimizar ainda mais os parâmetros do indicador, reduzindo a margem de parada. É claro que o sistema de negociação nunca pode evitar completamente os prejuízos, a chave é controlar o risco.

Direção de otimização

A estratégia também tem um forte potencial de otimização, que pode ser melhorado em várias áreas:

  1. Parâmetros de otimização, como o DI e o ADX do DMI, o ciclo e o parâmetro do K-channel

  2. Adição de condições de filtragem, como a combinação de MACD e outros indicadores para evitar falsas brechas

  3. Implementação de rastreamento automático de stop loss para controlar ainda mais os riscos

  4. Optimização de configurações de parâmetros e regras de filtragem para diferentes variedades

Resumir

A estratégia bilateral de ruptura do canal de oscilação da linha K é, em geral, um sistema de ruptura eficaz. Ela pode determinar com eficácia a direção e a intensidade das principais tendências, e também tem grande potencial em termos de otimização e controle de risco. Se for melhorada e otimizada sistematicamente, a estratégia pode manter o lucro estável a longo prazo.

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

//Original Idea by: Wunderbit Trading

//@version=5
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.int(46, 'Period', step=1)

leadLine1 = ta.ema(close, ribbon_period)
leadLine2 = ta.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.int(81, step=1, minval=1)
mult = input.float(2.5, step=0.1)

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

plot(ma, title='Middle', color=color.new(color.orange, 0))
p1 = plot(upper, title='Upper', color=color.new(color.orange, 0))
p2 = plot(lower, title='Lower', color=color.new(color.orange, 0))
fill(p1, p2, transp=90)


// 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 = ta.change(high)
    down = -ta.change(low)
    truerange = ta.rma(ta.tr, len)
    plus = fixnan(100 * ta.rma(up > down and up > 0 ? up : 0, len) / truerange)
    minus = fixnan(100 * ta.rma(down > up and down > 0 ? down : 0, len) / truerange)
    [plus, minus]

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

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

benchmark = input.int(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.float(4.5, title='Long Take Profit 1 %', step=0.1) / 100
long_tp1_qty = input.int(15, title='Long Take Profit 1 Qty', step=1)

long_tp2_inp = input.float(20, title='Long Take Profit 2%', step=0.1) / 100
long_tp2_qty = input.int(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.float(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 = ta.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', direction=strategy.long, 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.new(color.green, 0), linewidth=1, title='1st Long Take Profit')
plot(strategy.position_size > 0 ? long_take_level_2 : na, style=plot.style_linebr, color=color.new(color.green, 0), linewidth=1, title='2nd Long Take Profit')
plot(strategy.position_size > 0 ? long_stop_level : na, style=plot.style_linebr, color=color.new(color.red, 0), linewidth=1, title='Long Stop Loss')