
Esta é uma estratégia de acompanhamento de tendências auto-adaptável baseada na volatilidade e na combinação do Williams Percent Range (William Index). A estratégia ajusta a sensibilidade dos juízos de tendência através da computação do intervalo de flutuação dos preços e de um contador personalizado, permitindo assim uma melhor adaptabilidade em diferentes cenários de mercado. O núcleo da estratégia é ajustar dinamicamente os parâmetros do Williams Index observando a amplitude das flutuações dos preços, de modo a capturar com maior precisão os pontos de mudança das tendências do mercado.
A estratégia primeiro calcula o intervalo de variação de preço (Range) e sua média móvel (AvgRange) em um período. A frequência de ocorrência de flutuações significativas é registrada através da criação de dois contadores (TrueCount e TrueCount2) comparando a relação entre a variação de preço em tempo real e o intervalo de variação médio. Estes contadores são usados para ajustar dinamicamente os parâmetros de cálculo do Williamson, permitindo que a estratégia ajuste automaticamente sua sensibilidade de acordo com o estado de flutuação do mercado.
Trata-se de uma estratégia inovadora que combina análise de volatilidade e acompanhamento de tendências, aumentando a estabilidade e a confiabilidade da estratégia por meio de mecanismos de adaptação. Embora haja alguns riscos inerentes, a estratégia tem a perspectiva de manter um desempenho estável em vários cenários de mercado através da implementação de uma direção razoável de configuração de parâmetros e otimização. O design da estrutura da estratégia permite expansão e otimização adicionais e tem um bom potencial de desenvolvimento.
/*backtest
start: 2024-10-28 00:00:00
end: 2024-11-27 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("ASCTrend", shorttitle="ASCTrend", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)
eternalfg = input(false, title="eternal 確定")
eternal = eternalfg ? 1 : 0
ASClength = input.int(title="ASC Length", minval=4, defval=10)
RISK = input.int(title="RISK", minval=0, defval=3)
// Custom sum function
customSum(source, length) =>
sum = 0.0
for i = 0 to length - 1
sum := sum + source[i]
sum
x1 = 67 + RISK
x2 = 33 - RISK
Range = ta.highest(ASClength) - ta.lowest(ASClength)
AvgRange = ta.sma(Range, ASClength)
CountFg = math.abs(open - close) >= AvgRange * 2.0 ? 1 : 0
TrueCount = customSum(CountFg, ASClength)
CountFg2 = math.abs(close[3] - close) >= AvgRange * 4.6 ? 1 : 0
TrueCount2 = customSum(CountFg2, ASClength - 3)
wpr3RR = ta.wpr(3 + RISK + RISK)
wpr3 = ta.wpr(3)
wpr4 = ta.wpr(4)
WprAbs = 100 + (TrueCount2 > 0 ? wpr4 : TrueCount > 0 ? wpr3 : wpr3RR)
ASC_Trend = 0
ASC_Trend := WprAbs[eternal] < x2[eternal] ? -1 : WprAbs[eternal] > x1[eternal] ? 1 : ASC_Trend[1]
if (ta.crossover(ASC_Trend, 0))
strategy.entry("Long", strategy.long)
if (ta.crossunder(ASC_Trend, 0))
strategy.entry("Short", strategy.short)
plotshape(ta.crossover(ASC_Trend, 0), location=location.belowbar, color=color.green, style=shape.triangleup, size=size.small, text="B", textcolor=color.white)
plotshape(ta.crossunder(ASC_Trend, 0), location=location.abovebar, color=color.red, style=shape.triangledown, size=size.small, text="S", textcolor=color.white)
alertcondition(ta.crossover(ASC_Trend, 0), title="ASC_Trend UP", message="ASC_Trend UP")
alertcondition(ta.crossunder(ASC_Trend, 0), title="ASC_Trend Down", message="ASC_Trend Down")