La estrategia de precios de volumen relativo es una estrategia de negociación cuantitativa basada en el volumen de negociación anormal y la volatilidad de los precios. Esta estrategia compara el volumen de negociación actual con el promedio histórico para determinar si el volumen de negociación es anormal. También combina el intervalo de rango verdadero promedio para determinar si el precio es relativamente estable. Cuando el volumen de negociación aumenta anormalmente y el precio es relativamente estable, se considera una señal de entrada.
La lógica central de la estrategia de precios de volumen relativo se basa en dos indicadores para el juicio: volumen de operaciones relativo y rango de fluctuación de precios.
Primero, se calcula el promedio móvil simple del volumen de operaciones durante los 20 períodos más recientes como el volumen de operaciones promedio histórico. Luego se establece un parámetro múltiple (como 1,5 veces). Cuando el volumen de operaciones actual es mayor de 1,5 veces el volumen de operaciones promedio, se considera que el volumen de operaciones es anormal y pertenece a una situación de
En segundo lugar, se calcula el intervalo verdadero promedio (ATR) durante los 14 períodos más recientes como medida de la volatilidad de precios. Al mismo tiempo, se calcula la desviación estándar de la volatilidad promedio. Si la volatilidad verdadera actual está entre el promedio más o menos una desviación estándar, se considera que la fluctuación de precios está en un intervalo relativamente estable.
Cuando se cumplen las dos condiciones anteriores al mismo tiempo, se emite una señal larga para abrir una posición larga.
La mayor ventaja de la estrategia de precios de volumen relativo es que captura las tendencias de precios provocadas por un volumen de operaciones anormal. Cuando el volumen de operaciones aumenta, representa un cambio en la actitud de los participantes del mercado, lo que a menudo señala rupturas de precios y la formación de nuevas tendencias. Al comparar la relación entre el volumen de operaciones y los promedios históricos, la estrategia puede determinar eficazmente el momento del volumen de operaciones anormal.
Por otro lado, la estrategia también considera la tasa de volatilidad, de modo que las señales ocurren durante períodos de precios relativamente estables. Esto evita el enorme riesgo de pérdida causado por perseguir máximos durante violentas fluctuaciones. También aumenta las oportunidades de ganancia porque las tendencias generalmente comienzan a romper después de la relativa estabilidad.
El mayor riesgo de esta estrategia es que el indicador de volumen de negociación no puede estar 100% seguro de las nuevas tendencias.
Para reducir las pérdidas, ajustar adecuadamente los parámetros de
La estrategia se puede optimizar en los siguientes aspectos:
Añadir otros indicadores para el juicio, tales como el índice de cambio, la facturación, etc., para hacer más fiables las señales de volumen de negociación anormal.
El parámetro ATR se puede optimizar para diferentes existencias para determinar con mayor precisión el rango de precios estable.
Añadir algoritmos de aprendizaje automático para juzgar activamente el volumen de operaciones anormales, no sólo la simple comparación con los promedios históricos.
Usar modelos de aprendizaje profundo para predecir la volatilidad de los precios, no sólo en base a ATR histórica.
La estrategia de precios de volumen relativo captura el volumen de operaciones anormal como una señal característica y combina el juicio de estabilidad de precios para emitir señales comerciales. La estrategia es simple y práctica, y funciona bien en el seguimiento del volumen de operaciones de acciones anormal.
/*backtest start: 2022-12-21 00:00:00 end: 2023-12-27 00:00:00 period: 1d basePeriod: 1h 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/ // © DojiEmoji (kevinhhl) //@version=4 strategy("[KL] Relative Volume + ATR Strategy",overlay=true,pyramiding=1) ENUM_LONG = "Long" // Timeframe { backtest_timeframe_start = input(defval = timestamp("01 Apr 2016 13:30 +0000"), title = "Backtest Start Time", type = input.time) USE_ENDTIME = input(false,title="Define backtest end-time (If false, will test up to most recent candle)") backtest_timeframe_end = input(defval = timestamp("01 May 2021 19:30 +0000"), title = "Backtest End Time (if checked above)", type = input.time) within_timeframe = true // } len_volat = input(14,title="Length of ATR to determine volatility") ATR_volat = atr(len_volat) avg_ATR_volat = sma(ATR_volat, len_volat) std_ATR_volat = stdev(ATR_volat, len_volat) // } // Trailing stop loss { ATR_X2_TSL = atr(input(14,title="Length of ATR for trailing stop loss")) * input(2.0,title="ATR Multiplier for trailing stop loss",type=input.float) TSL_source = low var stop_loss_price = float(0) TSL_line_color = color.green, TSL_transp = 100 if strategy.position_size == 0 or not within_timeframe TSL_line_color := color.black stop_loss_price := TSL_source - ATR_X2_TSL else if strategy.position_size > 0 stop_loss_price := max(stop_loss_price, TSL_source - ATR_X2_TSL) TSL_transp := 0 plot(stop_loss_price, color=color.new(TSL_line_color, TSL_transp)) // } // Signals for entry { _avg_vol = sma(volume,input(20, title="SMA(volume) length (for relative comparison)")) _relative_vol = _avg_vol * input(1.5,title="Multiple of avg vol to consider relative volume as being high",type=input.float) __lowerOfOpenClose = min(open,close) _wickRatio_lower = (__lowerOfOpenClose - low) / (high - low) entry_signal1 = volume > _relative_vol entry_signal2 = ATR_volat < avg_ATR_volat + std_ATR_volat and ATR_volat > avg_ATR_volat - std_ATR_volat // } alert_per_bar(msg)=> prefix = "[" + syminfo.root + "] " suffix = "(P=" + tostring(close) + "; atr=" + tostring(ATR_volat) + ")" alert(tostring(prefix) + tostring(msg) + tostring(suffix), alert.freq_once_per_bar) // MAIN: if within_timeframe if strategy.position_size > 0 and strategy.position_size[1] > 0 and (stop_loss_price/stop_loss_price[1]-1) > 0.005 alert_per_bar("TSL raised to " + tostring(stop_loss_price)) // EXIT :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: // placed before entry, will re-enter if stopped out exit_msg = close <= strategy.position_avg_price ? "stop loss" : "take profit" if strategy.position_size > 0 and TSL_source <= stop_loss_price strategy.close(ENUM_LONG, comment=exit_msg) // ENTRY ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: if entry_signal1 and entry_signal2// and entry_signal3 entry_msg = strategy.position_size > 0 ? "adding" : "initial" strategy.entry(ENUM_LONG, strategy.long, comment=entry_msg) // CLEAN UP: if strategy.position_size == 0 stop_loss_price := float(0)