Estratégia de Filtragem Múltipla de Canal Gaussiano: Como Construir um Sistema de Negociação Quantitativa Robusto

GAUSSIAN Kijun-Sen VAPI ATR TRAILING
Data de criação: 2025-09-02 18:22:32 última modificação: 2025-09-09 09:39:46
cópia: 0 Cliques: 333
2
focar em
319
Seguidores

Estratégia de Filtragem Múltipla de Canal Gaussiano: Como Construir um Sistema de Negociação Quantitativa Robusto Estratégia de Filtragem Múltipla de Canal Gaussiano: Como Construir um Sistema de Negociação Quantitativa Robusto

Por que os indicadores tecnológicos tradicionais falham em mercados complexos?

Na área de negociação quantitativa, muitas vezes enfrentamos um problema central: um único indicador técnico é propenso a produzir falsos sinais em meio ao ruído do mercado, levando a frequentes paradas e retiradas de capital. Então, como construir um sistema de negociação que capte tendências e filtre o ruído de forma eficaz?

A estratégia de filtragem múltipla do canal de Gauss, analisada hoje, oferece-nos uma solução digna de aprofundamento através da combinação de quatro indicadores técnicos de diferentes dimensões.

Arquitetura Tecnológica do Núcleo: Como os quatro filtros funcionam em conjunto?

1. Gaussian Channel - Identificação de tendências

A base da estratégia é um filtro de Gauss de 4 níveis, com uma janela de amostragem de 144 ciclos. Ao contrário da média móvel tradicional, o filtro de Gauss elimina a maior parte do ruído do mercado através da modelagem matemática, mantendo a sensibilidade às mudanças de preço.

Parâmetros-chave:

  • Número de pontos de Gauss: 4 (equilibrando retardo e suavidade)
  • Período de amostragem: 144 (para capturar tendências de médio prazo)
  • Multiplicador de filtro: 1.414 (multiplicador de diferença padrão, controle de largura do canal)

2. Linha Kijun-Sen ((130 ciclos) - Confirmação de tendências de médio e longo prazo

A linha Kijun-Sen de 130 ciclos é usada como filtro de tendência, em vez dos tradicionais 26 ciclos. Qual é a importância desse ajuste?

A configuração de ciclo mais longo permite:

  • Redução de falsos sinais de ruptura
  • Assegurar que a direção das transações esteja de acordo com as principais tendências
  • Melhorar a qualidade do sinal e reduzir a frequência das transações

3. Indicador VAPI - Análise de preços de volume de transação

VAPI (Volume Adjusted Price Indicator) é um indicador de volume ajustado que analisa a relação entre volume de transação e mudanças de preço para determinar a verdadeira intenção dos participantes do mercado. Quando o VAPI é > 0, o suporte é excessivo e quando é < 0, o suporte é vazio.

4. ATR Dynamic Stop Loss - Mecanismo de Controle de Risco

Usando 4,5 vezes o ATR de 11 ciclos como distância de parada, essa configuração considera a volatilidade do mercado e evita que a parada seja muito apertada e desencadeada pelo ruído do mercado.

Inovação na gestão de fundos: a sabedoria da estratégia de divisão 7525

O que mais vale a pena aprender com esta estratégia é a sua maneira única de administrar o dinheiro:

Logística de distribuição:

  • 75% de posições: fixação de 3,5 vezes o risco de retorno do que o stop loss
  • 25% de posições: traçado dinâmico de stop loss

Por que isso?

  1. Garantir o rendimento básicoA paralisação de 75% das posições garantiu um retorno estável para a maioria dos investimentos.
  2. Capturar o excesso de receitaPerda de seguimento de 25% de posições permite obter maiores ganhos se a tendência continuar
  3. Dispersão de riscosA diferença de mecanismos de saída diminui o risco de uma única estratégia falhar

Sistemas de controlo de riscos: mecanismos de proteção em vários níveis

1. Controle de risco de entrada

  • O risco de cada transação é limitado a 3% do capital da conta
  • Cálculo de posições dinâmicas baseado no ATR

2. Gerenciamento de riscos de detenção

  • Prejuízo principal: 4,5 vezes o ATR
  • Perda de rastreamento: ajuste dinâmico, bloqueio de flutuação
  • Proteção adicional: 10% de proteção de receita fixa

3. Mecanismo de filtragem de sinal Os quatro indicadores técnicos foram simultaneamente confirmados, reduzindo significativamente a probabilidade de falsos sinais.

Análise de vantagens e limitações estratégicas

Os principais pontos fortes:

  1. Qualidade de sinalO mecanismo de filtragem múltipla aumenta significativamente a confiabilidade dos sinais de transação.
  2. Riscos controladosSistema perfeito de gestão de stop loss e posições
  3. Altamente adaptávelATR: Dinâmica de ajustes para adaptar-se a diferentes ambientes de mercado
  4. Otimização de receitasA estratégia de divisão de posições equilibra os ganhos estáveis com os excedentes.

Limites potenciais:

  1. Dependência de tendênciaO que é que os investidores estão a fazer?
  2. Parâmetros sensíveisOs vários parâmetros precisam ser otimizados para diferentes variedades:
  3. AtrasoA falta de filtragem pode atrasar a entrada.

Recomendações para aplicações em combate

1. Seleção de variedades Preferência para variedades com forte tendência, como os principais pares de moedas, futuros de índices de ações, etc.

Optimização de parâmetros 2. Recomenda-se que o retrospecto seja otimizado com base nos dados históricos das variedades de transação específicas, com especial atenção para:

  • Ciclo de amostragem do Canal de Gauss
  • Período de Kijun-Sen
  • ATR Stop Loss Multiplier

3. Adaptação ao mercado Em mercados com uma visível oscilação, pode-se considerar a suspensão da estratégia ou ajustar a configuração dos parâmetros.

Resumo: Pensamento sistêmico em transações quantitativas

O valor desta estratégia não está apenas na sua implementação técnica, mas na sua forma de pensar sistematicamente:

  1. Verificação multidimensionalVerificar sinais de negociação de várias perspectivas, como tendência, volume de transação e volatilidade
  2. Prioridade ao riscoA base da estratégia é um bom sistema de controlo de riscos
  3. Otimização de receitasA estratégia de divisão de posições equilibra diferentes objetivos de lucro.

A estratégia fornece um bom referencial de estrutura para os comerciantes de quantidade. A chave não é seguir os parâmetros, mas entender a sua concepção e fazer ajustes adequados de acordo com a sua própria variedade de negociação e preferências de risco.

Lembre-se que a melhor estratégia não é a mais complexa, mas a que melhor se adequa ao seu estilo de negociação e ao seu ambiente de mercado.

Código-fonte da estratégia
/*backtest
start: 2025-01-01 00:00:00
end: 2025-04-01 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT","balance":500000}]
*/

// @version=6
strategy("Gaussian Channel Strategy – GC + Kijun (120) + VAPI Gate + ATR(4.5x) + 75/25 TP-TRAIL + Extra %TP",
     overlay=true)

// =============================
// ======= INPUTS ==============
// =============================
N_poles   = input.int(4,   "Gaussian Poles", minval=1, maxval=9)
per       = input.int(144, "Sampling Period", minval=2)
mult      = input.float(1.414, "Filtered TR Multiplier", step=0.001)
src       = input.source(hlc3, "Source")
modeLag   = input.bool(false, "Reduced Lag Mode")
modeFast  = input.bool(false, "Fast Response Mode")

kijunLen  = input.int(130, "Kijun-Sen Period")

vapiLen   = input.int(10, "VAPI Length")
vapiThresh= input.float(0.0, "VAPI Threshold (0 = zero line)")

atrLen    = input.int(11, "ATR Length (RMA)")
slATRmul  = input.float(4.5, "SL = ATR ×", step=0.1)
rr_fixed  = input.float(3.5, "Fixed TP RR (Leg A)", step=0.1)
allocA    = input.float(75,  "Allocation %: Fixed TP Leg", minval=1, maxval=99)
riskPct   = input.float(3.0, "Risk % of Equity per Trade", step=0.1, minval=0.1, maxval=10)

tpEnable    = input.bool(true,  "Enable Extra % Take Profit")
tpPctLong   = input.float(10.0, "Extra Long TP % of Entry",  step=0.1, minval=0)
tpPctShort  = input.float(10.0, "Extra Short TP % of Entry", step=0.1, minval=0)

// =============================
// ===== CORE COMPONENTS =======
// =============================
atr = ta.rma(ta.tr(true), atrLen)

donchian_avg(len) => (ta.highest(high, len) + ta.lowest(low, len)) / 2.0
kijun = donchian_avg(kijunLen)

// --- VAPI_LB (LazyBear) ---
rs(x, len) => ta.cum(x) - nz(ta.cum(x)[len])
v_x   = (2*close - high - low) / math.max(high - low, syminfo.mintick)
v_tva = rs(volume * v_x, vapiLen)
v_tv  = rs(volume, vapiLen)
v_va  = 100 * (v_tva / v_tv)

// =============================
// ===== Gaussian Channel ======
// =============================
f_filt9x(_a, _s, _i) =>
    int _m2 = 0, int _m3 = 0, int _m4 = 0, int _m5 = 0, int _m6 = 0,
    int _m7 = 0, int _m8 = 0, int _m9 = 0, float _f = 0.0, _x = (1 - _a)
    _m2 := _i == 9 ? 36  : _i == 8 ? 28 : _i == 7 ? 21 : _i == 6 ? 15 : _i == 5 ? 10 : _i == 4 ? 6 : _i == 3 ? 3 : _i == 2 ? 1 : 0
    _m3 := _i == 9 ? 84  : _i == 8 ? 56 : _i == 7 ? 35 : _i == 6 ? 20 : _i == 5 ? 10 : _i == 4 ? 4 : _i == 3 ? 1 : 0
    _m4 := _i == 9 ? 126 : _i == 8 ? 70 : _i == 7 ? 35 : _i == 6 ? 15 : _i == 5 ? 5  : _i == 4 ? 1 : 0
    _m5 := _i == 9 ? 126 : _i == 8 ? 56 : _i == 7 ? 21 : _i == 6 ? 6  : _i == 5 ? 1  : 0 
    _m6 := _i == 9 ? 84  : _i == 8 ? 28 : _i == 7 ? 7  : _i == 6 ? 1  : 0 
    _m7 := _i == 9 ? 36  : _i == 8 ? 8  : _i == 7 ? 1  : 0 
    _m8 := _i == 9 ? 9   : _i == 8 ? 1  : 0 
    _m9 := _i == 9 ? 1   : 0
    _f := math.pow(_a, _i) * nz(_s) +
         _i  *     _x      * nz(_f[1])      - (_i >= 2 ?
         _m2 * math.pow(_x, 2)  * nz(_f[2]) : 0) + (_i >= 3 ?
         _m3 * math.pow(_x, 3)  * nz(_f[3]) : 0) - (_i >= 4 ?
         _m4 * math.pow(_x, 4)  * nz(_f[4]) : 0) + (_i >= 5 ?
         _m5 * math.pow(_x, 5)  * nz(_f[5]) : 0) - (_i >= 6 ?
         _m6 * math.pow(_x, 6)  * nz(_f[6]) : 0) + (_i >= 7 ?
         _m7 * math.pow(_x, 7)  * nz(_f[7]) : 0) - (_i >= 8 ?
         _m8 * math.pow(_x, 8)  * nz(_f[8]) : 0) + (_i == 9 ?
         _m9 * math.pow(_x, 9)  * nz(_f[9]) : 0)

f_pole(_a, _s, _i) =>
    _f1 =            f_filt9x(_a, _s, 1),      _f2 = (_i >= 2 ? f_filt9x(_a, _s, 2) : 0), _f3 = (_i >= 3 ? f_filt9x(_a, _s, 3) : 0)
    _f4 = (_i >= 4 ? f_filt9x(_a, _s, 4) : 0), _f5 = (_i >= 5 ? f_filt9x(_a, _s, 5) : 0), _f6 = (_i >= 6 ? f_filt9x(_a, _s, 6) : 0)
    _f7 = (_i >= 7 ? f_filt9x(_a, _s, 7) : 0), _f8 = (_i >= 8 ? f_filt9x(_a, _s, 8) : 0), _f9 = (_i == 9 ? f_filt9x(_a, _s, 9) : 0)
    _fn = _i == 1 ? _f1 : _i == 2 ? _f2 : _i == 3 ? _f3 : _i == 4 ? _f4 : _i == 5 ? _f5 : _i == 6 ? _f6 : _i == 7 ? _f7 : _i == 8 ? _f8 : _i == 9 ? _f9 : na
    [_fn, _f1]

beta  = (1 - math.cos(4*math.asin(1)/per)) / (math.pow(1.414, 2/N_poles) - 1)
alpha = - beta + math.sqrt(math.pow(beta, 2) + 2*beta)

lag = (per - 1) / (2.0 * N_poles)

srcdata = modeLag ? src + (src - nz(src[lag])) : src
tr_raw  = ta.tr(true)
trdata  = modeLag ? tr_raw + (tr_raw - nz(tr_raw[lag])) : tr_raw

[filt_n, filt_1]       = f_pole(alpha, srcdata, N_poles)
[filt_n_tr, filt_1_tr] = f_pole(alpha, trdata,  N_poles)

filt   = modeFast ? (filt_n + filt_1)/2.0 : filt_n
filttr = modeFast ? (filt_n_tr + filt_1_tr)/2.0 : filt_n_tr

hband = filt + filttr * mult
lband = filt - filttr * mult

// =============================
// ===== Signals & Filters =====
// =============================
doLong  = close > filt and close > kijun and v_va > vapiThresh
doShort = close < filt and close < kijun and v_va < -vapiThresh

// =============================
// ===== Position Sizing =======
// =============================
riskValue   = strategy.equity * (riskPct/100.0)
slDist      = atr * slATRmul
qtyTotal    = slDist > 0 ? riskValue / slDist : 0.0
qtyA        = qtyTotal * (allocA/100.0)
qtyB        = qtyTotal * ((100 - allocA)/100.0)

// =============================
// ===== Order Execution =======
// =============================
var float trailStopL = na
var float trailStopS = na

inLong  = strategy.position_size > 0
inShort = strategy.position_size < 0
entryPx = strategy.position_avg_price

// Entries
if doLong and not inLong and strategy.position_size <= 0
    strategy.order("L-A", strategy.long, qty=qtyA)
    strategy.order("L-B", strategy.long, qty=qtyB)
    trailStopL := na
if doShort and not inShort and strategy.position_size >= 0
    strategy.order("S-A", strategy.short, qty=qtyA)
    strategy.order("S-B", strategy.short, qty=qtyB)
    trailStopS := na

// LONG management
if inLong
    slL = entryPx - slDist
    tpA = entryPx + rr_fixed * slDist

    // Leg A: 固定RR止盈 + 止损
    strategy.exit("TP/SL-LA", from_entry="L-A", limit=tpA, stop=slL)

    // Leg B: 追踪止损
    trailStopL := na(trailStopL[1]) or strategy.position_size[1] <= 0 ? slL : math.max(trailStopL[1], close - slDist)
    strategy.exit("Trail-LB", from_entry="L-B", stop=trailStopL)

    // 额外百分比止盈
    if tpEnable and high >= entryPx * (1 + tpPctLong/100.0)
        strategy.close("L-A", comment="ExtraTP")
        strategy.close("L-B", comment="ExtraTP")

// SHORT management
if inShort
    slS = entryPx + slDist
    tpA = entryPx - rr_fixed * slDist

    // Leg A: 固定RR止盈 + 止损
    strategy.exit("TP/SL-SA", from_entry="S-A", limit=tpA, stop=slS)

    // Leg B: 追踪止损
    trailStopS := na(trailStopS[1]) or strategy.position_size[1] >= 0 ? slS : math.min(trailStopS[1], close + slDist)
    strategy.exit("Trail-SB", from_entry="S-B", stop=trailStopS)

    // 额外百分比止盈
    if tpEnable and low <= entryPx * (1 - tpPctShort/100.0)
        strategy.close("S-A", comment="ExtraTP")
        strategy.close("S-B", comment="ExtraTP")

// =============================
// ===== 图表绘制 ==============
// =============================
fcolor = filt > nz(filt[1]) ? color.new(color.lime, 0) : filt < nz(filt[1]) ? color.new(color.red, 0) : color.new(color.gray, 0)
plotFilter = plot(filt,  title="GC Filter",    color=fcolor, linewidth=2)
plotH      = plot(hband, title="GC High Band", color=fcolor)
plotL      = plot(lband, title="GC Low Band",  color=fcolor)
fill(plotH, plotL, color=color.new(fcolor, 80))

plot(kijun, "Kijun-Sen", color=color.new(color.maroon, 0))

// 信号标记
plotshape(doLong,  title="Long Setup",  style=shape.triangleup,   location=location.belowbar, color=color.new(color.lime, 0), size=size.tiny, text="ENTRY L")
plotshape(doShort, title="Short Setup", style=shape.triangledown, location=location.abovebar, color=color.new(color.fuchsia, 0), size=size.tiny, text="ENTRY S")