Estratégia de acompanhamento de tendências com base em indicadores de volume


Data de criação: 2023-10-10 14:51:13 última modificação: 2023-10-10 14:51:13
cópia: 0 Cliques: 1032
1
focar em
1617
Seguidores

Visão geral

A estratégia baseia-se no indicador de volume de transação (VFI) para realizar transações de acompanhamento de tendências. A estratégia determina a direção da tendência do mercado através da computação da flutuação do preço das ações e da mudança no volume de transações, para obter baixas e altas vendas.

Princípio da estratégia

  1. Calcule o indicador VFI: Calcule o valor do VFI com base na variação logarítmica do preço da ação e no volume de transações, eliminando oscilações por meio de um tratamento suave.

  2. Para determinar a direção da tendência, o indicador VFI passa o eixo 0 como um sinal positivo e o eixo 0 abaixo é um sinal negativo.

  3. Sinais de negociação: EMA rápido atravessa EMA lento, e VFI faz mais quando atravessa a linha de entrada de compra; Baixo VFI atravessa a linha de saída de liquidação.

  4. Método de Stop Loss: Defina a proporção de Stop Loss fixa.

A estratégia depende principalmente do indicador VFI para determinar a direção da tendência e emitir sinais de negociação em conjunto com o sistema de linha de equilíbrio. O indicador VFI reflete a emoção do mercado através da flutuação do preço das ações e da mudança no volume de transações.

Vantagens estratégicas

  1. O indicador VFI julga a tendência melhor do que um único indicador de preços, e pode filtrar os mercados de turbulência e os falsos breaks.

  2. O sistema de equilíbrio ajuda a julgar, evitando que os indicadores VFI emitam sinais errados em uma cidade em turbulência.

  3. Estabelecer um ponto de parada fixo para controlar o risco, o que é útil para a gestão de risco.

  4. O modelo de acompanhamento de tendências permite obter lucros extras sem adivinhar o ponto de viragem do mercado.

  5. A configuração dos parâmetros é flexível, podendo ser ajustada de acordo com o mercado, adaptando-se a diferentes ciclos e variedades.

Risco estratégico

  1. O indicador VFI pode emitir sinais errados em mercados com grandes turbulências.

  2. O ponto de parada fixo pode ser muito grande ou pequeno, resultando em parada prematura ou tardia.

  3. Se os parâmetros de compra e venda não forem definidos corretamente, isso pode levar a transações frequentes ou a faltas.

  4. As estratégias de acompanhamento de tendências não conseguem capturar a reversão e precisam de um stop loss atempado.

  5. Se os parâmetros não estiverem corretos, poderá haver atraso ou antecipação.

Otimização de Estratégia

  1. Ajustar os parâmetros do VFI para otimizar o cálculo dos indicadores.

  2. Ajustar o ciclo da linha média, otimizar o tempo de envio do sinal.

  3. Ajuste dinâmico do ponto de parada e otimize o modo de parada.

  4. Combinado com outros indicadores de filtragem, eleva a qualidade do sinal.

  5. Combinação de parâmetros de otimização para ciclos grandes e pequenos.

  6. Testar a robustez dos parâmetros de diferentes variedades e melhorar a adaptabilidade dos parâmetros.

Resumir

A estratégia baseia-se no indicador VFI para determinar a direção da tendência, em conjunto com o sistema de equilíbrio para filtrar os sinais de erro. Através do acompanhamento da tendência, pode-se obter um preço baixo ou alto, sem a necessidade de prever uma reversão específica. A vantagem da estratégia é julgar a tendência superior a um único indicador de preço, que pode filtrar eficazmente os turbulências. O principal risco é o risco de emitir sinais errados em mercados turbulentos.

Código-fonte da estratégia
/*backtest
start: 2023-10-02 00:00:00
end: 2023-10-06 21:00:00
period: 3m
basePeriod: 1m
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/
// © mohanee
//This strategy is based on VFI indicator published by  UTS.  
//more details of VFI indicator can be found at  [url=http://mkatsanos.com/VFI.html]http://mkatsanos.com/VFI.html[/url] 
// I have added buy line and sell line to the indicator  and tested  SPY stock/index on one hour chart

//@version=4
strategy(title="VFI  strategy [based on VFI indicator published by  UTS]", overlay=false,pyramiding=2, default_qty_type=strategy.fixed,    initial_capital=10000, currency=currency.USD)


// Const
kMaColor = color.aqua
kNeutralColor = color.gray
kBearColor = color.red
kBullColor = color.green

kAlma = "ALMA"
kEma = "EMA"
kSma = "SMA"
kWma = "WMA"


// Input

vfi_length = input(8, title="Length", minval=1)  //default 130
vfi_coef = input(0.2, title="Coef", minval=0.1)
vfi_volCutoff = input(2.5, title="Volume Cutoff", minval=0.1)
vfi_smoothLen = input(3, title="Smoothing Period", minval=1)
vfi_smoothType = input(kEma, title="Smoothing Type", options=[kAlma, kEma, kSma, kWma])

//These are adde by me for the strategy purpose  BEGIN
vfi_buyLine = input(-4, title="Buy Line", minval=-10)
vfi_sellLine = input(5, title="Sell Line", minval=-10)
stopLoss = input(title="Stop Loss%", defval=5, minval=1)
//These are adde by me for the strategy purpose  END

vfi_longEMA = input(200, title="Long EMA", minval=1)
vfi_shortEMA1 = input(50, title="short EMA1", minval=1)
vfi_shortEMA2 = input(9, title="short EM2A", minval=1)

vfi_showTrend = input(false, title="Visualize Trend")
vfi_showFill = input(true, title="Apply Filling")
vfi_showMa = input(true, title="Show Moving Average")
vfi_maType = input(kSma, title="Moving Average Type", options=[kAlma, kEma, kSma, kWma])
vfi_maLength = input(30, title="Moving Average Length", minval=1)
vfi_almaOffset = input(0.85, title="• ALMA - Offset (global setting)", minval=0.0, maxval=1.0, step=0.05) // more smoothness (closer to 1) vs. more responsiveness (closer to 0)
vfi_almaSigma = input(6.0, title="• ALMA - Sigma (global setting)", minval=0.0, step=0.05) // the larger sigma the smoother ALMA


// Functionality

isRising(sig) =>
    sig > sig[1]
    
isFlat(sig) =>
    sig == sig[1]

vfi_trendColor(sig) =>
    isFlat(sig) ? kNeutralColor : isRising(sig) ? kBullColor : kBearColor
    
vfi_color(sig) =>
    isFlat(sig) ? kNeutralColor : sig > 0 ? kBullColor : kBearColor
    
osc_color(sig) =>
    sig == 0 ? kNeutralColor : sig > 0 ? kBullColor : kBearColor

smooth(t, sig, len) =>
    ma = float(sig)         // None
    if t == kSma            // Simple
        ma := sma(sig, len)
    if t == kEma            // Exponential
        ma := ema(sig, len)
    if t == kWma            // Weighted
        ma := wma(sig, len)
    if t == kAlma           // Arnaud Legoux
        ma := alma(sig, len, vfi_almaOffset, vfi_almaSigma)
    ma

calc_vfi(fviPeriod, smoothType, smoothLen, coef, vCoef) =>
    avg = nz(hlc3)
    inter = log(avg) - log(avg[1])
    vInter = stdev(inter, 30)
    cutOff = coef * vInter * close
    vAve = smooth(kSma, volume[1], fviPeriod)
    vMax = vAve * vCoef
    vC = min(volume, vMax)
    mf = avg - avg[1]
    vCp = iff(mf > cutOff, vC, iff(mf < -cutOff, -vC, 0))
    sVfi = sum(vCp, fviPeriod) / vAve
    vfi = smooth(smoothType, sVfi, smoothLen)
    
value_vfi = calc_vfi(vfi_length, vfi_smoothType, vfi_smoothLen, vfi_coef, vfi_volCutoff)
value_ma = smooth(vfi_maType, value_vfi, vfi_maLength)

longEMAval= ema(close, vfi_longEMA)
shortEMAval1= ema(close, vfi_shortEMA1)
shortEMAval2= ema(close, vfi_shortEMA2)

color_vfi = vfi_showTrend ? vfi_trendColor(value_vfi) : vfi_color(value_vfi)
color_osc = vfi_showFill ? osc_color(value_vfi) : na
color_ma = vfi_showMa ? kMaColor : na


// Drawings

plot_vfi = plot(value_vfi, title="VFI", color=color_vfi, linewidth=1)
plot_fill = plot(0, color=color_vfi, editable=false)
fill(plot_vfi, plot_fill, title="Oscillator Fill", color=color_osc, transp=75) 
hline(vfi_buyLine, color=color.green, title="Buy Line", linewidth=2, linestyle=hline.style_dashed)
hline(vfi_sellLine, color=color.purple, title="Sell Line", linewidth=2, linestyle=hline.style_dashed)
plot(value_ma, title="MA", color=color_ma, linewidth=2)

strategy.entry(id="VFI LE", long=true,  when=crossover(value_vfi,vfi_buyLine)  and ( shortEMAval1 >= longEMAval  ))

//strategy.close(id="VFI LE", comment="Exit",   when=crossunder(value_vfi,vfi_sellLine))
strategy.close(id="VFI LE", comment="TP Exit",   when=crossunder(value_vfi,vfi_sellLine) and close>strategy.position_avg_price)
//strategy.close(id="VFI LE", comment="Exit",   when=  (shortEMAval1 > shortEMAval2 )  and crossunder(close, shortEMAval2))

//stoploss
stopLossVal =   strategy.position_avg_price -  (strategy.position_avg_price*stopLoss*0.01) 
strategy.close(id="VFI LE", comment="SL Exit",   when=crossunder(value_vfi,vfi_sellLine) and close < stopLossVal)