A estratégia Twin Range Filter é uma estratégia de negociação baseada na volatilidade de preços. Utiliza dois indicadores de faixa média com configurações de parâmetros diferentes, combinados com a relação entre preço e faixa, para gerar sinais de negociação. Esta estratégia é adequada para ativos digitais altamente voláteis como o Bitcoin.
Esta estratégia utiliza dois indicadores de intervalo suave com diferentes comprimentos de período: um indicador de intervalo rápido (período padrão 27) e um indicador de intervalo lento (período padrão 55).
A estratégia Twin Range Filter compara o preço com os dois indicadores de faixa para determinar se ele está atualmente dentro de uma certa faixa de oscilação.
Especificamente, a estratégia usa uma linha mediana como referência, que é a média dos dois indicadores de intervalo. Um sinal longo é gerado quando o preço está acima da linha mediana por um intervalo rápido; um sinal curto é gerado quando o preço cai abaixo da linha mediana por um intervalo rápido.
Para filtrar sinais falsos, ele também adiciona uma condição: um sinal só é gerado quando o movimento do preço atual é consistente com o período anterior.
Em resumo, essa estratégia identifica a faixa de oscilação com indicadores de faixa gêmeos e gera ordens quando o preço atravessa a faixa.
As vantagens da estratégia Twin Range Filter:
Utiliza características de volatilidade de preços, adaptáveis a ativos altamente voláteis como o Bitcoin.
Os indicadores de intervalo gémeos contêm diferentes prazos, sendo que o rápido detecta oportunidades de curto prazo, enquanto o lento considera tendências de longo prazo.
A adição de filtros de direção de preços reduz os falsos sinais de flutuações de curto prazo.
Lógica simples e clara, fácil de entender e implementar, adequada para negociação de algo.
Alguns riscos da estratégia a ter em conta:
Baseia-se em indicadores de volatilidade, podendo ter um desempenho inferior em ambientes de baixa volatilidade.
Os parâmetros do intervalo devem ser otimizados para diferentes produtos, caso contrário, as oportunidades de negociação podem ser perdidas ou ocorrerem sinais falsos.
A divergência entre o preço e a volatilidade não é considerada. Podem ocorrer falsos sinais se a volatilidade aumentar sem aumento correspondente do preço.
Os níveis de stop loss podem precisar de ajuste em ambientes de alta volatilidade.
A estratégia pode ser reforçada em vários aspectos:
Teste e otimize os parâmetros da gama para encontrar combinações ideais para diferentes produtos e prazos.
Adicionar mecanismos dinâmicos de stop loss com base na volatilidade recente, para otimizar a estratégia de stop loss.
Adicionar filtros baseados na divergência de volatilidade de preços para evitar sinais falsos.
Incorporar outros indicadores, como as alterações de volume, para aumentar a certeza da entrada.
Teste e adicione mecanismos de saída de lucro adequados adequados para a estratégia.
Em geral, o Twin Range Filter é uma estratégia de negociação eficaz para ativos altamente voláteis. Ele utiliza bem as características de volatilidade de preços e gera uma lógica de negociação simples e clara. Com melhorias adicionais como otimização de parâmetros e gerenciamento de riscos, ele pode se tornar um componente valioso em um sistema de negociação quântica.
/*backtest start: 2023-11-05 00:00:00 end: 2023-11-12 00:00:00 period: 30m basePeriod: 15m 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/ // © colinmck, greenmask9 //@version=4 strategy(title="Twin Range Filter Algo", overlay=true) source = input(defval=close, title="Source") // Smooth Average Range per1 = input(defval=27, minval=1, title="Fast period") mult1 = input(defval=1.6, minval=0.1, title="Fast range") per2 = input(defval=55, minval=1, title="Slow period") mult2 = input(defval=2, minval=0.1, title="Slow range") smoothrng(x, t, m) => wper = t * 2 - 1 avrng = ema(abs(x - x[1]), t) smoothrng = ema(avrng, wper) * m smoothrng smrng1 = smoothrng(source, per1, mult1) smrng2 = smoothrng(source, per2, mult2) smrng = (smrng1 + smrng2) / 2 // Range Filter rngfilt(x, r) => rngfilt = x rngfilt := x > nz(rngfilt[1]) ? x - r < nz(rngfilt[1]) ? nz(rngfilt[1]) : x - r : x + r > nz(rngfilt[1]) ? nz(rngfilt[1]) : x + r rngfilt filt = rngfilt(source, smrng) upward = 0.0 upward := filt > filt[1] ? nz(upward[1]) + 1 : filt < filt[1] ? 0 : nz(upward[1]) downward = 0.0 downward := filt < filt[1] ? nz(downward[1]) + 1 : filt > filt[1] ? 0 : nz(downward[1]) hband = filt + smrng lband = filt - smrng longCond = bool(na) shortCond = bool(na) longCond := source > filt and source > source[1] and upward > 0 or source > filt and source < source[1] and upward > 0 shortCond := source < filt and source < source[1] and downward > 0 or source < filt and source > source[1] and downward > 0 CondIni = 0 CondIni := longCond ? 1 : shortCond ? -1 : CondIni[1] long = longCond and CondIni[1] == -1 short = shortCond and CondIni[1] == 1 // Plotting // Strategy // From this part on, programmer is greenmaks9 // Separator = input(title="Following conditions and backtest algorithm are added by @greenmask9 🎯, original script is written by @colinmck 👍. Read both of their's release notes for more info on how this script works.", type=input.bool, defval=false) disabler = input(title="Disable greenmask9's ATR conditions", type=input.bool, defval=false) //second l2 = input(title="ATR1", defval=32, minval=1) s2 = input(title="Smoothing", defval="SMA", options=["RMA", "SMA", "EMA", "WMA"]) atr2(source, l2) => if s2 == "SMA" sma(source, l2) else if s2 == "RMA" rma(source, l2) else if s2 == "EMA" ema(source, l2) else wma(source, l2) //third l3 = input(title="ATR2", defval=64, minval=1) s3 = input(title="Smoothing", defval="RMA", options=["RMA", "SMA", "EMA", "WMA"]) atr3(source, l3) => if s3 == "RMA" rma(source, l3) else if s3 == "SMA" sma(source, l3) else if s3 == "EMA" ema(source, l3) else wma(source, l3) atr20=atr2(tr(true), l2) atr30=atr3(tr(true), l3) strategy.initial_capital = 50000 ordersize=floor(strategy.initial_capital/close) profit = input(title="Ticks profit", type=input.integer, defval=900) stop = input(title="Ticks stoploss", type=input.integer, defval=300) maxcandles_till_close = input(title="Time stoploss", type=input.integer, defval=17) bull = long and (atr20<atr30 or disabler) bear = short and (atr20<atr30 or disabler) bullclock = barssince(bull) bearclock = barssince(bear) if (bull) strategy.entry("Twin Long", strategy.long, ordersize) strategy.exit("Exit", from_entry = "Twin Long", profit = profit, loss = stop) if (bear) strategy.entry("Twin Short", strategy.short, ordersize) strategy.exit("Exit", from_entry = "Twin Short", profit = profit, loss = stop) //time stoploss strategy.close("Twin Long", when = bullclock == maxcandles_till_close, comment = "Timed out") strategy.close("Twin Short", when = bearclock == maxcandles_till_close, comment = "Timed out")