
La estrategia utiliza el intervalo de la línea media de dos EMA para juzgar la tendencia de la OBV en el indicador de múltiples espacios, con un enfoque largo y corto en función de la dirección de la tendencia. En este caso, el indicador de OBV puede reflejar con mayor claridad la relación entre precios y volumen de transacción, para juzgar la voluntad de los participantes en el mercado, por lo que se puede utilizar para capturar la tendencia del mercado. La estrategia se combina con el tratamiento suave de los indicadores de las medias móviles, que puede filtrar eficazmente el ruido del mercado y capturar las principales tendencias.
La estrategia se basa principalmente en si el indicador OBV está en una tendencia ascendente para juzgar el momento de entrada de la cabeza múltiple. En concreto, se calcula el EMA de 6 días y el EMA de 24 días de OBV, que produce una señal de cabeza múltiple cuando el EMA de 6 días cruza el EMA de 24 días. Del mismo modo, cuando el EMA de 6 días cruza el EMA de 24 días, produce una señal de cabeza hueca. Además, la estrategia establece un stop loss del 3%.
La clave de esta estrategia para determinar las tendencias es el indicador OBV. El indicador OBV refleja la voluntad colectiva de los grandes capitales y puede reflejar eficazmente la actitud de los participantes en el mercado. En combinación con el procesamiento de promedios móviles, se puede eliminar parte del ruido y hacer que la señal sea más clara y confiable.
La estrategia tiene las siguientes ventajas:
Los indicadores de OBV basados en el volumen de transacciones permiten determinar con claridad la voluntad de los participantes en el mercado, y la señal es más confiable.
El procesamiento uniforme de doble EMA elimina parte del ruido y hace que la señal sea más clara.
El uso de una combinación de líneas EMA rápidas y lentas permite equilibrar los precios y capturar los cambios en la tendencia.
Las estrategias son sencillas y fáciles de aplicar.
La estrategia también tiene sus riesgos:
El indicador OBV en ciertos momentos emite una señal errónea y la estrategia puede perder.
En situaciones extremas, las líneas de la EMA tienen retrasos y pueden perder el punto de entrada óptimo.
Los parámetros fijos de stop loss pueden ser demasiado rígidos para adaptarse a los cambios en el mercado.
Respuesta:
En combinación con otros indicadores, para evitar señales erróneas.
Optimización de la configuración de los parámetros para que la línea EMA sea más sensible.
Se puede configurar para detener la pérdida dinámica.
La estrategia puede ser optimizada en las siguientes direcciones:
Optimice la combinación de EMA para encontrar el parámetro de la línea media que mejor coincida.
Añadir otros indicadores para la confirmación de la señal, como MACD, RSI, etc., para mejorar la precisión de la señal.
Establece un stop loss dinámico que permite ajustar el stop loss en tiempo real según las fluctuaciones del mercado.
Optimización de la combinación de parámetros para encontrar la mejor combinación de parámetros.
La estrategia en general es una estrategia de seguimiento de tendencias más simple y confiable. Combina el indicador OBV y la línea de equilibrio doble EMA para lograr un juicio de la tendencia. La ventaja es la simplicidad de operación, la claridad de la señal y la capacidad de seguir la tendencia de manera efectiva; La desventaja es que puede haber señales erróneas y el procesamiento de la línea EMA está atrasado.
/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy("OBV EMA X 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
/////////////// OBV ///////////////
src = close
atr = atr(input(title="ATR Period", defval=3, minval=1))
atrmult = input(title="ATR Mult", defval=1, minval=0)
obv = cum(change(src) > 0 ? volume * (volume / atr) : change(src) < 0 ? -volume * (volume / atr) : 0 * volume / atr)
e1 = ema(obv, input(24))
e2 = ema(obv, input(6))
/////////////// Strategy ///////////////
long = crossover(e2, e1)
short = crossunder(e2, e1)
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])
since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1])
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1])
//////////////// Stop loss ///////////////
sl_inp = input(3.0, title='Stop Loss %') / 100
tp_inp = input(5000.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)
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("L", strategy.long, when=long)
strategy.entry("S", strategy.short, when=short)
strategy.exit("L SL", "L", stop=long_sl, when=since_longEntry > 0)
strategy.exit("S SL", "S", stop=short_sl, when=since_shortEntry > 0)
/////////////// Plotting ///////////////
plot(e1, color = e1 > e1[1] ? color.lime : e1 < e1[1] ? color.red : color.white, linewidth = 2, offset = 0)
plot(e2, color = e2 > e2[1] ? color.lime : e2 < e2[1] ? color.red : color.white, linewidth = 1)
bgcolor(strategy.position_size > 0 ? color.lime : strategy.position_size < 0 ? color.red : color.white, transp=90)
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=60)