
Esta estratégia, combinada com a construção de tendências com o indicador de preços de massa VFI e as médias móveis, e com a construção de reversões com o indicador de bandas de browning, permite uma combinação orgânica de negociação de tendências e negociação de choques.
A estratégia é composta por:
O indicador VFI determina a tendência. Combina a taxa de variação do parâmetro do preço típico com a variação do volume de transação para determinar a tendência do preço, alcançando uma correspondência razoável entre os preços.
O indicador de diferença da EMA determina a tendência. Calcula a proporção de diferença entre a linha de 20 dias e a linha de 50 dias para determinar a direção da tendência da linha média e longa.
Os indicadores da faixa de Brin são invertidos. O meio da faixa de Brin é a média móvel simples de 20 dias e a largura de banda é 1,5 vezes a diferença padrão do meio da faixa. O sinal de negociação é emitido quando o preço entra na faixa de cima para baixo.
A amplitude do indicador VFI julga a reversão. Quando o valor do VFI está perto do limite superior e inferior (,20), a probabilidade de reversão da tendência é maior.
Quando o preço quebra a faixa de Bollinger e os indicadores de diferença VFI e EMA são favoráveis, fazemos mais; quando o preço cai para baixo da faixa de Bollinger ou o VFI atinge um determinado limite, fazemos zero.
A introdução do indicador VFI tornou mais racional a correspondência entre a quantidade e o preço, evitando o acompanhamento cego dos preços.
A combinação da avaliação da diferença da EMA com a avaliação do VFI torna a avaliação da tendência mais estável e confiável.
A combinação da correlação entre a correlação de Brin e o julgamento inverso do indicador VFI torna a estratégia mais adequada para as flutuações bidirecionais do mercado.
Os indicadores de preços não evitam completamente o risco de falsas rupturas.
A diferença entre os EMAs está atrasada e não permite uma resposta oportuna a mudanças de curto prazo.
A configuração inadequada dos parâmetros da faixa de Bryn pode levar a um risco de negociação frequente ou de mercado capturado.
A solução para o risco:
Combinando tendências com mais indicadores, evitando a dependência de um único indicador.
Os parâmetros do EMA não devem ser grandes ou pequenos demais, ajustando-os adequadamente.
Teste o impacto de variações de parâmetros de Brin sobre a estratégia em diferentes situações de mercado.
Continuar otimizando os parâmetros do VFI para torná-lo mais sensível.
Adicionar julgamentos de ruptura baseados em canais de preço ou indicadores de Envelopes.
Testar a introdução de mais indicadores de preço, como OBV, PVT, etc.
Introdução de aprendizagem de máquina e tecnologia de IA para a otimização dinâmica dos parâmetros.
A estratégia compreende o julgamento de tendências e o julgamento de reversão, usando VFI, EMA e indicadores de faixa de Bryn, para capturar a flutuação bidirecional do mercado. O próximo passo será continuar a otimizar a configuração de parâmetros, enriquecer a base de julgamento, expandir o escopo e melhorar a rentabilidade estável da estratégia.
/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-24 00:00:00
period: 1h
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/
// © beststockalert
//@version=4
strategy(title="Super Bollinger Band Breakout", shorttitle = "Super BB-BO", overlay=true)
source = close
length = input(130, title="VFI length")
coef = input(0.2)
vcoef = input(2.5, title="Max. vol. cutoff")
signalLength=input(5)
// session
pre = input( type=input.session, defval="0400-0935")
trade_session = input( type=input.session, defval="0945-1700")
use_trade_session = true
isinsession = use_trade_session ? not na(time('1', trade_session)) : true
is_newbar(sess) =>
t = time("D", sess)
not na(t) and (na(t[1]) or t > t[1])
is_session(sess) =>
not na(time(timeframe.period, sess))
preNew = is_newbar(pre)
preSession = is_session(pre)
float preLow = na
preLow := preSession ? preNew ? low : min(preLow[1], low) : preLow[1]
float preHigh = na
preHigh := preSession ? preNew ? high : max(preHigh[1], high) : preHigh[1]
// vfi 9lazybear
ma(x,y) => 0 ? sma(x,y) : x
typical=hlc3
inter = log( typical ) - log( typical[1] )
vinter = stdev(inter, 30 )
cutoff = coef * vinter * close
vave = sma( volume, length )[1]
vmax = vave * vcoef
vc = iff(volume < vmax, volume, vmax) //min( volume, vmax )
mf = typical - typical[1]
vcp = iff( mf > cutoff, vc, iff ( mf < -cutoff, -vc, 0 ) )
vfi = ma(sum( vcp , length )/vave, 3)
vfima=ema( vfi, signalLength )
//ema diff
ema20 = ema(close,20)
ema50 = ema(close,50)
diff = (ema20-ema50)*100/ema20
ediff = ema(diff,20)
//
basis = sma(source, 20)
dev = 1.5 * stdev(source, 20)
upper = basis + dev
lower = basis - dev
ema9 = ema(source, 9)
if ( ((crossover(source, upper) and diff>ediff and diff>0) or (close>upper and (vfi >0 or vfima>0 or ediff>0.05) and (vfi<14 or vfima<14)) ))
strategy.entry("Long", strategy.long)
if (crossunder(source, lower) or vfi>19 or vfima>19 or diff<(ediff+0.01) )
strategy.close("Long")