Estratégia de negociação de média móvel gaussiana


Data de criação: 2024-01-03 16:06:45 última modificação: 2024-01-03 16:06:45
cópia: 0 Cliques: 1104
1
focar em
1621
Seguidores

Estratégia de negociação de média móvel gaussiana

Visão geral

A estratégia usa a distribuição de Gauss para calcular o valor de Z com base na média móvel de 10 periodicidades de Heckel, e define um limite para o valor de Z com base na média móvel de 20 periodicidades, para determinar se a posição está aberta ou fechada de acordo com o traçado da curva.

Princípio da estratégia

  1. Calcule a média móvel do índice de 10 períodos do preço de fechamento do Helix.

  2. Com base nos dados das médias móveis acima, calcula-se o valor de Z em 25 períodos. O valor de Z reflete o número de diferenças padrão entre os dados e o valor médio, permitindo determinar se os dados são normais ou anormais.

  3. A média móvel de 20 periodicidades para o valor de Z é calculada novamente, obtendo a curva emaScore. Esta curva reflete a tendência de longo prazo para o valor de Z.

  4. De acordo com a distribuição dos dados do emaScore, configure um limite superior ou inferior. Considerando que a curva pode ter uma certa oscilação, selecione 90% e 10% dos dados distribuídos como limite.

  5. Faça mais quando o emaScore atravessa a linha média ou o limiar inferior; faça vazio quando o emaScore atravessa o limiar inferior, o limiar inferior ou o máximo de 100 ciclos.

Análise de vantagens

  1. Aplicando a teoria da distribuição de Gauss, a normalidade pode ser julgada através de valores Z, filtrando as falsas rupturas.

  2. Filtro duplo, computação da curva exeScore para determinar a tendência de longo prazo EXTENSIVE511.

  3. Estabelecer um limite razoável para reduzir a probabilidade de uma transação errada.

  4. A combinação dos pontos mais altos e mais baixos dos ciclos centenários permite aproveitar as oportunidades de reversão.

Análise de Riscos

  1. A combinação de Z-valores e médias móveis é sensível a parâmetros e precisa de otimização.

  2. A definição de um limiar é razoável se for grande, muito largo ou muito estreito.

  3. Os pontos mais altos e mais baixos de cem ciclos são propensos a erros de sinalização, permitindo uma flexibilidade apropriada nas condições de disparo.

  4. A própria Helix tem um certo atraso e precisa ser avaliada se é adequada para essa estratégia.

Direção de otimização

  1. Teste de médias móveis de diferentes períodos, parâmetros de valor Z.

  2. Parâmetros de otimização automática usando o método de análise de caminhada.

  3. Tente diferentes métodos de definição de barreiras, como o múltiplo da diferença padrão.

  4. Melhorar a lógica de julgamento dos pontos mais altos e mais baixos para evitar sinais errados.

  5. Experimente outros tipos de colchões ou alternativas de preço típico, como colchões Heckler.

Resumir

A estratégia baseia-se na distribuição de Gauss, através de um duplo índice de média móvel e de definição de limiares dinâmicos, para avaliar as anomalias de preços e produzir sinais de negociação. A principal vantagem é que pode ser filtrado falso rompimento, capturar reversão.

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



// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © jensenvilhelm

// Here is an attempt to create a robust strategy for BTCUSD on a 5 minute chart
// I can't seem to get this code to work the way i want.... if you want to give it a try, please let me know -
// how it goes in comment section. 

//@version=5
// Define the strategy settings
strategy("The Z-score", shorttitle="TZS", overlay=true)

// User can set the start date for the strategy
startDate = timestamp("2023 06 01")

// Heikin-Ashi Open, Close, High and Low calculation
haClose = ohlc4
var float haOpen = na
haOpen := na(haOpen[1]) ? (open + close) / 2 : (haOpen[1] + haClose[1]) / 2
haHigh = math.max(nz(haOpen, high), nz(haClose, high), high)
haLow = math.min(nz(haOpen, low), nz(haClose, low), low)

// Function to calculate the Z-Score
z_score(_series, _length) =>
    _mean = ta.sma(_series, _length)
    _stddev = ta.stdev(_series, _length)
    (_series - _mean) / _stddev

// Compute the score and its EMA
score = z_score(ta.ema(haClose, 10), 25)
emaScore = ta.ema(score, 20)

// Calculate lower and upper thresholds using percentiles of EMA
lowerBlue = ta.percentile_linear_interpolation(emaScore, 50, 10)
upperBlue = ta.percentile_linear_interpolation(emaScore, 50, 90)

// Calculate the middle line as 50th percentile
middleLine = ta.percentile_linear_interpolation(emaScore, 50, 50) 

// Plot the EMA of the score and the thresholds
plot(emaScore,"The White Line", color=color.white, linewidth=2)
plot(lowerBlue,"Lower Blue Line", linewidth=2)
plot(upperBlue, "Upper Blue Line", linewidth=2)
plot(middleLine, "Middle Yellow Line", linewidth=2, color=color.yellow)
plot(score,"The Z-Score Mixed With EMA 10", color=color.green)

// Calculate highest and lowest EMA score over 100 bars period
highest = ta.highest(emaScore, 100)
lowest = ta.lowest(emaScore, 100)

// Plot highest and lowest EMA score lines 
plot(highest, "Highest of emaScore", color=color.red, linewidth=2)
plot(lowest, "Lowest of emaScore", color=color.red, linewidth=2)

// Define entry and exit conditions for long and short positions
longCon = ta.crossover(score, lowerBlue) or ta.crossover(emaScore, middleLine)
addOn = ta.crossover(score, highest)
shortCon = ta.crossunder(emaScore, upperBlue) or ta.crossunder(emaScore, lowerBlue) or ta.crossunder(emaScore, highest)

// Execute trading logic based on conditions and after the start date
if (time >= startDate)
    if longCon
        strategy.entry("Long", strategy.long)
        if shortCon
            strategy.close("Long")
    if addOn
        strategy.entry("LongNR2", strategy.long)
        if shortCon
            strategy.close("LongNR2")
    
    if shortCon
        strategy.entry("Short", strategy.short)
        if longCon
            strategy.close("Short")