
A estratégia é baseada no Ells-Fisher Random Relative Dynamics Index (RRDI) proposto por John Ells em seu livro de análise controlada de ações e futuros. A estratégia usa o Ells-Fisher para julgar a força relativa de uma ação e combina regras de negociação personalizadas para comprar e vender.
A estratégia primeiro calcula o preço de fechamento - preço de abertura, ou seja, a parte real da ação. Em seguida, calcula o preço alto - preço baixo, ou seja, a parte da linha de sombra da ação.
Em seguida, a fórmula de cálculo do Índice de Ehlers-Fischel aplicada ao RVI, obtém o valor do sinal. Quando o valor do sinal é excedido, o valor do gatilho é excedido, e quando o valor do gatilho é excedido, o valor do gatilho é excedido. Além disso, o stop loss fixo e o stop loss de rastreamento são configurados para controlar o risco.
A estratégia utiliza a dinâmica das ações e os indicadores aleatórios para avaliar a força e fraqueza dos mercados. O indicador de Erles-Fischer foi projetado para reduzir o impacto do ruído e gerar um sinal de negociação mais confiável. O índice de dinâmica reflete a tendência e a volatilidade das próprias ações.
Em comparação com o uso de indicadores dinâmicos ou aleatórios, a estratégia faz uma combinação orgânica de indicadores e modelos para melhorar a qualidade do sinal. A rigorosa regra de stop loss também permite que a estratégia controle o risco, desde que a lucratividade seja garantida.
A estratégia baseia-se principalmente no Índice de Ehlers-Fischel, onde os parâmetros do indicador precisam ser otimizados para se adaptar ao novo ambiente quando o mercado muda drasticamente. Se os parâmetros do indicador estiverem mal configurados, isso gerará sinais errados ou sinais atrasados.
Além disso, a estratégia em si também apresenta um certo grau de risco de ajuste de curva. Se o ambiente de mercado em testes e no mercado real mudar muito, o desempenho da estratégia pode produzir um grande desvio.
A estratégia pode ser melhorada em alguns aspectos:
Os parâmetros do Índice de Ehlers-Fischel foram otimizados para serem mais sensíveis ou filtrarem o ruído.
Os indicadores são modelados com algoritmos de aprendizagem de máquina, como o LSTM, para gerar sinais de negociação mais confiáveis.
Combinação de indicadores de volatilidade do mercado como o ATR para ajustar dinamicamente a distância de parada.
Aumentar o suporte a modelos multifatores, integrando outros indicadores técnicos e básicos para melhorar a qualidade do sinal.
Optimizar a lógica de abertura de posição, definir condições de entrada dinâmicas. Introduzir a tecnologia de stop loss e stop loss adaptativa.
A estratégia utiliza um indicador aleatório do Índice de Dinâmica Relativa de Ehlers-Fischel para avaliar as tendências e as fraquezas do mercado e estabelecer um mecanismo de controle de risco de perda razoável. Em comparação com um único indicador, a estratégia faz uma combinação orgânica de vários indicadores e modelos, que podem filtrar o ruído e fornecer um sinal de alta qualidade. Há espaço para melhorar ainda mais o desempenho da estratégia por meio de otimização de parâmetros, fusão de modelos e ajustes adaptativos.
/*backtest
start: 2022-12-15 00:00:00
end: 2023-12-21 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=3
strategy("Ehlers Fisher Stochastic Relative Vigor Index Strategy", overlay = false, default_qty_type = strategy.percent_of_equity, default_qty_value = 100.0, pyramiding = 1, commission_type = strategy.commission.percent, commission_value = 0.1)
p = input(10, title = "Length")
FisherStoch(src, len) =>
val1 = stoch(src, src, src, len) / 100
val2 = (4 * val1 + 3 * val1[1] + 2 * val1[2] + val1[3]) / 10
FisherStoch = 0.5 * log((1 + 1.98 * (val2 - 0.5)) / (1 - 1.98 * (val2 - 0.5))) / 2.64
CO = close - open
HL = high - low
value1 = (CO + 2 * CO[1] + 2 * CO[2] + CO[3]) / 6
value2 = (HL + 2 * HL[1] + 2 * HL[2] + HL[3]) / 6
num = sum(value1, p)
denom = sum(value2, p)
RVI = denom != 0 ? num / denom : 0
signal = FisherStoch(RVI, p)
trigger = signal[1]
oppositeTrade = input(true)
barsSinceEntry = 0
barsSinceEntry := nz(barsSinceEntry[1]) + 1
if strategy.position_size == 0
barsSinceEntry := 0
if ((crossover(signal, trigger) and not oppositeTrade) or (oppositeTrade and crossunder(signal, trigger))) and abs(signal) > 2 / 2.64
strategy.entry("Long", strategy.long)
barsSinceEntry := 0
if ((crossunder(signal, trigger) and not oppositeTrade) or (oppositeTrade and crossover(signal, trigger))) and abs(signal) > 2 / 2.64
strategy.entry("Short", strategy.short)
barsSinceEntry := 0
if strategy.openprofit < 0 and barsSinceEntry > 8
strategy.close_all()
barsSinceEntry := 0
hline(0, title="ZeroLine", color=gray)
signalPlot = plot(signal, title = "Signal", color = blue)
triggerPlot = plot(trigger, title = "Trigger", color = green)
fill(signalPlot, triggerPlot, color = signal < trigger ? red : lime, transp = 50)