
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.
Calcule a média móvel do índice de 10 períodos do preço de fechamento do Helix.
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.
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.
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.
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.
Aplicando a teoria da distribuição de Gauss, a normalidade pode ser julgada através de valores Z, filtrando as falsas rupturas.
Filtro duplo, computação da curva exeScore para determinar a tendência de longo prazo EXTENSIVE511.
Estabelecer um limite razoável para reduzir a probabilidade de uma transação errada.
A combinação dos pontos mais altos e mais baixos dos ciclos centenários permite aproveitar as oportunidades de reversão.
A combinação de Z-valores e médias móveis é sensível a parâmetros e precisa de otimização.
A definição de um limiar é razoável se for grande, muito largo ou muito estreito.
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.
A própria Helix tem um certo atraso e precisa ser avaliada se é adequada para essa estratégia.
Teste de médias móveis de diferentes períodos, parâmetros de valor Z.
Parâmetros de otimização automática usando o método de análise de caminhada.
Tente diferentes métodos de definição de barreiras, como o múltiplo da diferença padrão.
Melhorar a lógica de julgamento dos pontos mais altos e mais baixos para evitar sinais errados.
Experimente outros tipos de colchões ou alternativas de preço típico, como colchões Heckler.
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.
/*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")