Tendencia de seguimiento de la estrategia basada en el indicador de flujo de volumen

El autor:¿ Qué pasa?, Fecha: 2023-10-10 14:51:13
Las etiquetas:

Resumen general

Esta estrategia implementa la tendencia después de la negociación basada en el indicador de flujo de volumen (VFI).

Principio de la estrategia

  1. Calcular el indicador VFI: calcular el valor VFI basándose en el cambio logarítmico de precios y volumen, y suavizar las oscilaciones mediante técnicas de suavización.

  2. Determinar la dirección de la tendencia: el cruce de VFI por encima de 0 es una señal alcista, mientras que el cruce por debajo de 0 es una señal bajista.

  3. Señales de negociación: pasar a largo cuando la EMA rápida cruza la EMA lenta y la VFI cruza la línea de compra; cerrar la posición cuando la VFI cruza la línea de venta.

  4. Las pérdidas de detención se fijan en un porcentaje de pérdidas de detención fijo.

Esta estrategia se basa principalmente en el VFI para determinar la dirección de la tendencia, combinado con promedios móviles para generar señales comerciales.

Ventajas

  1. El VFI determina las tendencias mejor que los indicadores únicos de precios, filtrando efectivamente las consolidaciones y las falsas rupturas.

  2. Las medias móviles proporcionan juicios suplementarios, evitando señales incorrectas de los inversores de capital riesgo en mercados variables.

  3. El stop loss fijo controla el riesgo y facilita la gestión del mismo.

  4. El modo de seguimiento de tendencias genera rendimientos excedentes sin predecir reversiones.

  5. El ajuste de parámetros flexible se adapta a diferentes períodos y productos.

Los riesgos

  1. El VFI puede generar señales incorrectas durante fluctuaciones significativas.

  2. El stop loss fijo puede ser demasiado amplio o demasiado estrecho.

  3. Las configuraciones de entrada y salida mal configuradas conducen a operaciones excesivas o faltantes.

  4. El seguimiento de la tendencia no capta las reversiones y necesita un stop loss oportuno.

  5. Los parámetros incorrectos causan una entrada prematura o tardía.

Mejoras

  1. Optimizar el cálculo del VFI ajustando los parámetros.

  2. Ajuste fino de los períodos de media móvil para un mejor tiempo de señal.

  3. Emplear un stop loss dinámico en lugar de uno fijo.

  4. Añadir otros indicadores a las señales filtradas.

  5. Optimice los parámetros por separado en función del plazo.

  6. Prueba de robustez en diferentes productos.

Conclusión

Esta estrategia determina la dirección de la tendencia con VFI y utiliza promedios móviles para filtrar señales incorrectas. Realiza compras bajas / ventas altas a través de la tendencia sin predecir reversiones. La ventaja radica en su detección de tendencia superior a los indicadores de precios únicos y la capacidad de filtrar las consolidaciones. El principal riesgo es generar señales incorrectas durante las fluctuaciones. La optimización de parámetros, la adición de indicadores suplementarios y técnicas de stop loss pueden mejorar su estabilidad. En general, con la puesta a punto de parámetros y las optimizaciones de stop loss, esta estrategia basada en VFI puede convertirse en un sistema de seguimiento de tendencias confiable.


/*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)




Más.