A estratégia de negociação da média móvel gaussiana

Autora:ChaoZhang, Data: 2024-01-03 16:06:45
Tags:

img

Resumo

Esta estratégia aplica a idéia da distribuição de Gauss e calcula a pontuação Z com base na média móvel exponencial de 10 períodos dos preços de fechamento de velas de Heikin-Ashi. Os limiares são então definidos com base na média móvel exponencial de 20 períodos da pontuação Z para sinais de entrada e saída quando a curva os cruza.

Estratégia lógica

  1. Calcule a média móvel exponencial de 10 períodos dos preços de fechamento do candelabro Heikin-Ashi.

  2. Com base nos dados da média móvel acima, calcule a pontuação Z em uma janela de retrospectiva de 25 períodos.

  3. Pegue a média móvel exponencial de 20 períodos na pontuação Z para obter uma curva chamada emaScore. Esta curva reflete a tendência de longo prazo da pontuação Z.

  4. Estabelecer limiares superiores e inferiores com base na distribuição dos dados emaScore.

  5. Longo quando o emaScore cruza a linha média ou o limiar inferior para cima; curto quando o emaScore cruza o limiar superior, o limiar inferior ou o limiar máximo de 100 períodos para baixo.

Análise das vantagens

  1. Aplique a ideia de distribuição gaussiana através da pontuação Z para julgar a normalidade e filtrar falhas.

  2. A média móvel exponencial dupla tem um efeito de filtragem para determinar a tendência a longo prazo.

  3. A fixação de um limiar razoável reduz as probabilidades de negociação incorretas.

  4. Incorporar os pontos mais altos/mais baixos de 100 períodos ajuda a captar oportunidades de reversão.

Análise de riscos

  1. A combinação de Z-score e MAs é sensível ao ajuste de parâmetros.

  2. Os níveis de limiar adequados estão directamente relacionados com a validade da estratégia.

  3. Os pontos mais altos/mais baixos de 100 períodos podem facilmente gerar sinais errados.

  4. O Heikin-Ashi tem um pouco de atraso.

Orientações de otimização

  1. Teste diferentes períodos de médias móveis, janelas de observação de pontuação Z.

  2. Utilize a análise de avanço para otimizar automaticamente os parâmetros.

  3. Tente diferentes métodos de fixação de limiares, por exemplo, múltiplos de DST.

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

  5. Teste outros tipos de velas ou preços típicos para substituir Heikin-Ashi.

Resumo

Esta estratégia julga a anormalidade do preço e gera sinais de negociação com base na ideia de distribuição de Gauss, médias móveis exponenciais duplas e configuração de limiar dinâmico. As principais vantagens são filtrar falhas e capturar reversões. No entanto, existe um enorme impacto em relação à seleção e combinação de parâmetros. São necessários mais testes e otimização para encontrar os melhores parâmetros e combinações.


/*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")


Mais.