Esta estratégia foi concebida com base no indicador de saldos de volume para determinar o poder de compra e de venda no mercado.
O indicador de saldos de volume (VB) reflete a força motriz das variações de volume nos preços.
Calcular a taxa de volatilidade intradiária do preço típico como a dinâmica do preço.
Julgar o poder de compra e venda em perto pelo produto do volume e do ímpeto de preços.
O indicador flutua acima e abaixo do eixo 0. Os critérios para medir o poder de compra e venda são a positividade e a negatividade do valor do indicador.
Esta estratégia constrói o indicador VB e define uma linha de sinal. Um sinal de compra é gerado quando o indicador VB cruza acima da linha de sinal. Um sinal de venda é gerado quando o indicador VB cruza abaixo da linha de sinal.
As principais etapas do código são:
Calcular a taxa de volatilidade intradiária do preço típico como a dinâmica do preço.
Defina o coeficiente do intervalo de corte para o momento. O excesso de momento acima do intervalo é tomado como coeficiente.
Calcular o vcp de momento quantificado após o corte.
Somar vcp para obter o indicador quantificado vfi.
Definir o comprimento da linha de sinal sinalLength e obtê-lo vfima.
Comparar o indicador VB vfi com a linha de sinal vfima para gerar sinais comerciais.
As vantagens desta estratégia são as seguintes:
Use a relação volume-preço para julgar o poder de compra e venda, não afetado pelo preço em si.
O intervalo de cálculo do momento quantificado pode ser controlado por parâmetros para evitar o impacto de flutuações anormais.
A combinação da comparação entre o próprio indicador VB e a linha de sinal pode definir um calendário de entrada razoável.
O método de cálculo do indicador é simples e claro, fácil de operar na negociação em tempo real.
Parâmetros de indicadores e de linhas de sinal personalizáveis para otimizar o desempenho da estratégia.
Esta estratégia apresenta também alguns riscos:
O indicador VB é sensível a flutuações anormais de preços.
A probabilidade de divergência dos preços em relação aos sinais dos indicadores é elevada.
Os parâmetros do indicador e os parâmetros da linha de sinal necessitam de uma otimização adequada para evitar falsos sinais.
Mais adequado para produtos com características de volume-preço óbvias, não adequado para produtos de baixa liquidez.
Preste atenção à divergência do indicador, que pode indicar uma inversão do mercado.
Os riscos podem ser controlados ajustando a gama de parâmetros, utilizando outros filtros, permitindo uma perda de parada solta adequada, etc.
A estratégia pode ser otimizada nos seguintes aspectos:
Otimizar os parâmetros de cálculo para o momento quantificado para equilibrar sensibilidade e estabilidade.
Otimizar os parâmetros da linha de sinal para equilibrar atraso e ruído.
Adicionar outros indicadores como a análise do volume de distribuição para verificação.
Adicionar indicadores de tendência e de suporte/resistência para evitar operações desfavoráveis.
Estabelecer um stop loss dinâmico com base na volatilidade do mercado.
Use aprendizagem de máquina para encontrar a combinação de parâmetros ideal.
Testes de retrocesso em vários produtos e prazos para avaliar a robustez.
Comparar os parâmetros do indicador
Esta estratégia julga o poder de compra/venda com base no indicador Volume Balances. Tem vantagens como design de indicador simples e parâmetros ajustáveis, e também riscos como sinais falsos.
/*backtest start: 2023-09-29 00:00:00 end: 2023-10-29 00:00:00 period: 3h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 strategy("VB Strategy", overlay=true) length = input(130, title="거래량 길이") coef = input(0.2, title="계수") vcoef = input(2.5, title="최대 계수") signalLength=input(5) smoothVFI=input(false, type=bool, title="부드럽게") //볼밴 length2 = input(20, minval=1, title="볼밴 길이") ma(x,y) => smoothVFI ? 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) 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 ) d=vfi-vfima upper = vfima + stdev(vfi, length2) lower = vfima - stdev(vfi, length2) buysignal = cross(vfi, lower) and crossunder(vfi, lower) == 1 ? vfima : na sellsignal = cross(vfi, upper) and crossover(vfi, upper) == 1 ? vfima : na //times = timestamp("GMT+6", 2017, 12, 6, 00, 00) //if (buysignal and times <= time) if (buysignal) if(strategy.position_size < 0) strategy.close("SHORT") if(strategy.position_size > 0) strategy.order("LONG", true, 1, when = (low+high)/2) if(strategy.position_size == 0) strategy.entry("LONG", strategy.long, when = (low+high)/2) //if (sellsignal and times <= time) if (sellsignal) if(strategy.position_size > 0) strategy.close("LONG") if(strategy.position_size < 0) strategy.order("SHORT", false, 1, when = (low+high)/2) if(strategy.position_size == 0) strategy.entry("SHORT", strategy.short, when = (low+high)/2)