Tendencia siguiendo una estrategia basada en la proporción de volumen

El autor:¿ Qué pasa?, Fecha: 14 de septiembre de 2023 19:53:55
Las etiquetas:

Este artículo explica en detalle una tendencia cuantitativa siguiendo una estrategia basada en el análisis del ratio de volumen.

I. Lógica de la estrategia

El indicador central de esta estrategia es el volumen alcista y bajista.

  1. Calcular el volumen total diario.

  2. Marque el volumen como volumen alcista cuando la barra diaria se cierra, y volumen bajista cuando se cierra.

  3. Calcular las medias móviles por separado para los volúmenes alcistas y bajistas.

  4. Una señal de compra se genera cuando el volumen alcista cruza el volumen bajista, y viceversa.

  5. El indicador de cambio de tasa de precios también se utiliza como filtro, tomando operaciones solo cuando existe una tendencia clara.

  6. Configurar stop loss y tomar ganancias basado en las señales para bloquear las ganancias.

Al juzgar la dirección de la tendencia a través de la relación de volumen y filtrar con la tasa de cambio de precios, la calidad de la señal puede mejorarse.

II. Ventajas de la Estrategia

La mayor ventaja de esta estrategia es el uso de volumen para determinar la dirección de la tendencia, que es uno de los métodos más básicos de seguimiento de tendencias.

Además, los indicadores de volumen pueden reflejar temprano las señales de ruptura, siendo relativamente sensibles.

Por último, el filtrado con la tasa de cambio de precios también mejora la calidad de la señal.

III. Riesgos potenciales

Si bien la estrategia tiene méritos, los siguientes riesgos deben tenerse en cuenta para la negociación en vivo:

En primer lugar, los parámetros de los indicadores de volumen deben fijarse con prudencia para evitar señales falsas.

En segundo lugar, el hecho de basarse únicamente en un indicador hace que sea susceptible a la invalidación de los precios.

Por último, si el stop loss se establece demasiado cerca, se corre el riesgo de que se detenga prematuramente.

IV. Resumen

En resumen, este artículo ha explicado una estrategia cuantitativa que utiliza la proporción de volumen para determinar tendencias. Genera señales comerciales mediante el cálculo de promedios móviles de volumen alcista y bajista. La estrategia tiene cierto grado de liderazgo y sensibilidad, pero debe combinarse con otros indicadores para su verificación. Además, el ajuste adecuado de parámetros y la gestión prudente del dinero también son clave para su viabilidad.


/*backtest
start: 2023-08-14 00:00:00
end: 2023-09-13 00:00:00
period: 3h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// Based on Volume Flow v3 indicator by oh92
strategy("Volume Flow BF", overlay=false, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.0)

/////////////// Time Frame ///////////////
testStartYear = input(2017, "Backtest Start Year") 
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)

testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)

testPeriod() => true
    
maType =    input(title="Moving Average Type", options=["Simple", "Exponential", "Double Exponential"], defval="Simple")
length =    input(6, title="MA Length")
x      =    input(3.1, title="Factor For Breakout Candle")

// Basic Volume Calcs //
vol  =  volume
bull =  close>open?vol:0 
bear =  open>close?vol:0

// Double EMA Function //
dema(src, len) => (2 * ema(src, len) - ema(ema(src, len), len))

// BULL Moving Average Calculation
bullma = maType == "Exponential" ?        ema(bull, length) :
         maType == "Double Exponential" ? dema(bull, length) :
         sma(bull, length)

// BEAR Moving Average Calculation //
bearma = maType == "Exponential" ?        ema(bear, length) :
         maType == "Double Exponential" ? dema(bear, length) :
         sma(bear, length)

///////////// Rate Of Change ///////////// 
source = close
roclength = input(12, minval=1)
pcntChange = input(2, minval=1)
roc = 100 * (source - source[roclength]) / source[roclength]
emaroc = ema(roc, roclength / 2)
isMoving() => emaroc > (pcntChange / 2) or emaroc < (0 - (pcntChange / 2))

/////////////// Strategy ///////////////
long = bullma > bearma and isMoving()
short = bullma < bearma and isMoving()

last_long = 0.0
last_short = 0.0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])

long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

last_open_long_signal = 0.0
last_open_short_signal = 0.0
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])

last_long_signal = 0.0
last_short_signal = 0.0
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])

in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal

last_high = 0.0
last_low = 0.0
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])
sl_inp = input(2.0, title='Stop Loss %') / 100
tp_inp = input(900.0, title='Take Profit %') / 100 
 
take_level_l = strategy.position_avg_price * (1 + tp_inp)
take_level_s = strategy.position_avg_price * (1 - tp_inp) 

since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) 
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) 

slLong = in_long_signal ? strategy.position_avg_price * (1 - sl_inp) : na
slShort = strategy.position_avg_price * (1 + sl_inp)
long_sl = in_long_signal ? slLong : na
short_sl = in_short_signal ? slShort : na

/////////////// Execution /////////////// 
if testPeriod()
    strategy.entry("Long",  strategy.long, when=long)
    strategy.entry("Short", strategy.short, when=short)
    strategy.exit("Long Ex", "Long", stop=long_sl, limit=take_level_l, when=since_longEntry > 0)
    strategy.exit("Short Ex", "Short", stop=short_sl, limit=take_level_s, when=since_shortEntry > 0)
    
///////////// Plotting /////////////
bgcolor(isMoving() ? long ? color.green : short ? color.red : na : color.white, transp=80)
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=30) 
plot(bullma, color=color.lime, linewidth=1, transp=0, title="Bull MA", transp=10)
plot(bearma, color=color.red, linewidth=1, transp=0, title="Bear MA", transp=10)

Más.