Estrategias de tendencias basadas en ratios de volumen


Fecha de creación: 2023-09-14 19:53:55 Última modificación: 2023-09-14 19:53:55
Copiar: 3 Número de Visitas: 713
1
Seguir
1617
Seguidores

En este artículo se detalla una estrategia cuantitativa para determinar la dirección de la tendencia basada en el ratio de transacción. La estrategia genera una señal de compra y venta mediante el cálculo de la línea media de transacción de más de un espacio.

El principio de la estrategia

El indicador central de esta estrategia es el volumen de transacciones en el aire libre. Los pasos para calcularlo son los siguientes:

  1. Calcula el volumen de transacciones del día.

  2. Cuando se considera que la línea K es múltiple, el volumen de transacciones se registra como el volumen de transacciones de múltiples partes (Bull Volume).

  3. Cuando la línea K se considera vacía, el volumen de transacciones se registra como el volumen de transacciones en la parte vacía (Bear Volume).

  4. Calcular las medias móviles de las transacciones entre el polígono y el polígono vacío, respectivamente.

  5. Cuando la media móvil de múltiples lados atraviesa la media móvil de la parte vacía, se genera una señal de compra; por el contrario, se genera una señal de venta.

  6. También se filtra a través de índices de cambio de precios, que solo se negocian cuando hay una clara tendencia en los precios.

  7. Establezca un punto de parada de pérdidas según la señal para bloquear las ganancias.

De esta manera, la dirección de la tendencia se determina a través de la proporción de espacio libre en el volumen de transacciones, y se ayuda con el filtrado de los indicadores de la tasa de cambio de precios, lo que mejora la calidad de la señal. La configuración de stop loss también permite una pérdida controlada por transacción.

Dos, las ventajas estratégicas

La mayor ventaja de esta estrategia es que se utiliza el volumen de transacciones para determinar la dirección de la tendencia, que es uno de los métodos más básicos para determinar la tendencia. El volumen de transacciones puede reflejar el comportamiento de los participantes en el mercado.

Además, el indicador de volumen de transacciones también puede reflejar señales de ruptura con anticipación, y es más sensible. En comparación con el uso del indicador de precios solo, puede capturar un cambio de tendencia antes.

Por último, el filtrado en combinación con el índice de variación de precios también mejora la calidad de la señal.

Tercero, el riesgo potencial.

A pesar de las ventajas de esta estrategia, hay riesgos a tener en cuenta en el juego real:

En primer lugar, hay que tener cuidado al configurar los parámetros del indicador de tráfico para evitar falsas señales.

En segundo lugar, el hecho de confiar en un solo indicador invalida el precio de la brecha. Se debe verificar una combinación de varios indicadores.

Finalmente, el riesgo de que el parón se encuentre demasiado cerca puede provocar que el parón se rompa.

Cuatro contenido, resumen

Este artículo detalla una estrategia de cuantificación que utiliza tendencias para juzgar el ratio de transacción. Puede generar señales de transacción calculando una línea de media de transacción multivariada. La estrategia tiene cierta precedencia, pero también requiere ser verificada en combinación con otros indicadores. Además, la configuración de parámetros adecuados y la administración estricta de fondos son la clave de su viabilidad.

Código Fuente de la Estrategia
/*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)