Estratégia de indicador KDJ dinâmico adaptável de múltiplos períodos de tempo

MTF-ADK ATR EMA KDJ TSL
Data de criação: 2025-04-03 14:27:21 última modificação: 2025-04-03 15:13:59
cópia: 0 Cliques: 429
2
focar em
319
Seguidores

Estratégia de indicador KDJ dinâmico adaptável de múltiplos períodos de tempo Estratégia de indicador KDJ dinâmico adaptável de múltiplos períodos de tempo

Visão geral

Trata-se de uma estratégia inovadora de indicadores de oscilação de KDJ adaptados a vários quadros temporais, que visa fornecer sinais de negociação mais precisos e flexíveis, através do ajuste dinâmico dos parâmetros do indicador e da análise de tendências de mercado em vários quadros temporais. A estratégia, combinada com o cálculo de duração baseado em volatilidade, a distribuição de peso em vários quadros temporais e o julgamento de tendências adaptadas, fornece aos comerciantes uma ferramenta de análise complexa e poderosa.

Princípio da estratégia

A estratégia inclui as seguintes tecnologias-chave:

  1. Análise de múltiplos quadros de tempo: três quadros de tempo simultâneos de 1, 5 e 15 minutos
  2. Cálculo de duração de swing adaptável: parâmetros do indicador ajustados dinamicamente com base na volatilidade do mercado
  3. Distribuição de peso dinâmica: distribuição de diferentes coeficientes de peso para diferentes prazos de tempo
  4. Mecanismo de determinação de tendências: determinação da direção da tendência do mercado por meio do cálculo da média do smooth AvgTotal
  5. Geração de sinais inteligentes: combinação de sinais principais e sinais esperados para aumentar a precisão do sinal

Vantagens estratégicas

  1. Alta flexibilidade: configurações de tempo e peso personalizáveis
  2. Adaptabilidade dinâmica: ajuste dos parâmetros do indicador à volatilidade do mercado
  3. Análise multidimensional: informações integradas em vários períodos de tempo
  4. Sinais de baixa latência: contém sinais principais e sinais esperados
  5. Filtro de tendência embutido: redução de sinais errados em condições de mercado adversas

Risco estratégico

  1. Risco de overfitting de parâmetros
  2. Quadros de tempo múltiplos podem aumentar a complexidade do sinal
  3. A fiabilidade do sinal pode ser reduzida em condições de mercado extremas
  4. Indicador de verificação de sinal de confirmação adicional necessário

Direção de otimização da estratégia

  1. Introdução de algoritmos de aprendizagem de máquina para ajuste dinâmico de peso
  2. Adição de condições de filtragem adicionais
  3. Optimizar o mecanismo de suspensão de perdas
  4. Desenvolver adaptabilidade entre espécies

Resumir

A estrutura multi-temporal adapta-se à estratégia do KDJ com um design inovador, oferecendo aos comerciantes uma ferramenta de análise de mercado flexível, dinâmica e multidimensional, com vantagens tecnológicas significativas e potencial de melhoria de desempenho.

Código-fonte da estratégia
/*backtest
start: 2025-01-01 00:00:00
end: 2025-01-25 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Script™ is subject to the Mozilla Public License 2.0 (https://mozilla.org/MPL/2.0/)
// © Lausekopf

//@version=5
strategy("Adaptive KDJ (MTF)", overlay=false)

// Dropdown for the swing length calculation method
method = input.int(1, title="Calculation Method", options=[1, 2, 3], tooltip="1: Volatility Based\n2: Inverse Volatility\n3: Fixed Length")

// Fixed length for method 3
fixedLength = input.int(9, title="Fixed KDJ Length", minval=3, maxval=15)

// Timeframes
tf1 = input.timeframe("1", title="Timeframe 1")
tf2 = input.timeframe("5", title="Timeframe 2")
tf3 = input.timeframe("15", title="Timeframe 3")

// Timeframe weighting
weightOption = input.int(1, title="Timeframe Weighting", options=[1, 2, 3, 4, 5])
weightTF1 = weightOption == 1 ? 0.5 : weightOption == 2 ? 0.4 : weightOption == 3 ? 0.33 : weightOption == 4 ? 0.2 : 0.1
weightTF2 = 0.33
weightTF3 = 1.0 - (weightTF1 + weightTF2)

// EMA smoothing length
smoothingLength = input.int(5, title="EMA Smoothing Length", minval=1, maxval=50)

// Trend calculation period
trendLength = input.int(40, title="Trend Calculation Period", minval=5, maxval=50)

// KDJ function
f_kdj(len, srcHigh, srcLow, srcClose) =>
    roundedLen = int(math.round(len))
    high_max = ta.highest(srcHigh, roundedLen)
    low_min = ta.lowest(srcLow, roundedLen)
    rsv = 100 * (srcClose - low_min) / (high_max - low_min)
    k = ta.sma(rsv, 3)
    d = ta.sma(k, 3)
    j = 3 * k - 2 * d
    [k, d, j]

// Swing length function
f_swingLength(tf) =>
    atrLen = 14
    volatility = request.security(syminfo.tickerid, tf, ta.atr(atrLen) / close)
    var float length = na
    if method == 1
        length := volatility > 0.03 ? 3 : volatility > 0.002 ? 14 : 15
    if method == 2
        length := 18
    if method == 3
        length := fixedLength
    length

// Calculate swing lengths for each timeframe
swingLength1 = f_swingLength(tf1)
swingLength2 = f_swingLength(tf2)
swingLength3 = f_swingLength(tf3)

// Calculate KDJ values
[k1, d1, j1] = f_kdj(swingLength1, request.security(syminfo.tickerid, tf1, high), request.security(syminfo.tickerid, tf1, low), request.security(syminfo.tickerid, tf1, close))
[k2, d2, j2] = f_kdj(swingLength2, request.security(syminfo.tickerid, tf2, high), request.security(syminfo.tickerid, tf2, low), request.security(syminfo.tickerid, tf2, close))
[k3, d3, j3] = f_kdj(swingLength3, request.security(syminfo.tickerid, tf3, high), request.security(syminfo.tickerid, tf3, low), request.security(syminfo.tickerid, tf3, close))

// Weighted averages
avgK = (k1 * weightTF1 + k2 * weightTF2 + k3 * weightTF3)
avgD = (d1 * weightTF1 + d2 * weightTF2 + d3 * weightTF3)
avgJ = (j1 * weightTF1 + j2 * weightTF2 + j3 * weightTF3)
smoothAvgK = ta.ema(avgK, smoothingLength)
smoothAvgD = ta.ema(avgD, smoothingLength)
smoothAvgJ = ta.ema(avgJ, smoothingLength)
smoothAvgTotal = ta.ema((avgK + avgD + avgJ) / 3, smoothingLength)

// Trend determination
trendAvg = ta.sma(smoothAvgTotal, trendLength)
isUptrend = trendAvg > 60
isDowntrend = trendAvg < 40

// Dynamic signal thresholds
buyLevel = isUptrend ? 40 : isDowntrend ? 15 : 25
sellLevel = isUptrend ? 85 : isDowntrend ? 60 : 75

// Buy/Sell signals
buySignal = smoothAvgJ < buyLevel and ta.crossover(smoothAvgK, smoothAvgD)
sellSignal = smoothAvgJ > sellLevel and ta.crossunder(smoothAvgK, smoothAvgD)

// Anticipated signals
anticipateBuy = (smoothAvgK - smoothAvgK[1]) > 0 and (smoothAvgD - smoothAvgD[1]) < 0 and math.abs(smoothAvgK - smoothAvgD) < 5
anticipateSell = (smoothAvgK - smoothAvgK[1]) < 0 and (smoothAvgD - smoothAvgD[1]) > 0 and math.abs(smoothAvgK - smoothAvgD) < 5

// Entry conditions
longEntryCondition = (buySignal or anticipateBuy) and smoothAvgTotal < 22
shortEntryCondition = (sellSignal or anticipateSell) and smoothAvgTotal > 78

// Entry orders
strategy.entry("Long", strategy.long, when=longEntryCondition)
strategy.entry("Short", strategy.short, when=shortEntryCondition)

// Trailing Stop-Loss
atrMultiplierTSL = 2.5
atrValueTSL = ta.atr(12) * atrMultiplierTSL
strategy.exit("TSL Long", from_entry="Long", trail_points=atrValueTSL / syminfo.mintick, stop=open * 0.9972)
strategy.exit("TSL Short", from_entry="Short", trail_points=atrValueTSL / syminfo.mintick, stop=open * 1.0028)

// Plot signals
plotshape(series=buySignal, location=location.bottom, style=shape.triangleup, color=color.green, size=size.small)
plotshape(series=sellSignal, location=location.top, style=shape.triangledown, color=color.red, size=size.small)
plotshape(series=anticipateBuy, location=location.bottom, style=shape.triangleup, color=color.blue, size=size.tiny, offset=-1)
plotshape(series=anticipateSell, location=location.top, style=shape.triangledown, color=color.orange, size=size.tiny, offset=-1)

// Plot KDJ lines
plot(smoothAvgK, color=color.blue, linewidth=1)
plot(smoothAvgD, color=color.orange, linewidth=1)
plot(smoothAvgJ, color=color.purple, linewidth=1)
plot(smoothAvgTotal, color=color.white, linewidth=1)

// Alert for impending signals
alertcondition(anticipateBuy or anticipateSell, title='Impending KDJ Crossover', message='Possible KDJ crossover detected!')
// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Lausekopf