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.
Calcule a média móvel exponencial de 10 períodos dos preços de fechamento do candelabro Heikin-Ashi.
Com base nos dados da média móvel acima, calcule a pontuação Z em uma janela de retrospectiva de 25 períodos.
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.
Estabelecer limiares superiores e inferiores com base na distribuição dos dados emaScore.
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.
Aplique a ideia de distribuição gaussiana através da pontuação Z para julgar a normalidade e filtrar falhas.
A média móvel exponencial dupla tem um efeito de filtragem para determinar a tendência a longo prazo.
A fixação de um limiar razoável reduz as probabilidades de negociação incorretas.
Incorporar os pontos mais altos/mais baixos de 100 períodos ajuda a captar oportunidades de reversão.
A combinação de Z-score e MAs é sensível ao ajuste de parâmetros.
Os níveis de limiar adequados estão directamente relacionados com a validade da estratégia.
Os pontos mais altos/mais baixos de 100 períodos podem facilmente gerar sinais errados.
O Heikin-Ashi tem um pouco de atraso.
Teste diferentes períodos de médias móveis, janelas de observação de pontuação Z.
Utilize a análise de avanço para otimizar automaticamente os parâmetros.
Tente diferentes métodos de fixação de limiares, por exemplo, múltiplos de DST.
Melhorar a lógica dos pontos mais altos/mais baixos para evitar sinais errados.
Teste outros tipos de velas ou preços típicos para substituir Heikin-Ashi.
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")