Esta estrategia es una estrategia de negociación de indicadores de precio de volumen de varios marcos de tiempo. Utiliza ampliamente el índice de fuerza relativa (RSI), el rango verdadero promedio (ATR), el promedio móvil simple (SMA) y las condiciones de precio de volumen personalizado para identificar señales largas potenciales. Cuando se cumplen ciertas condiciones de sobreventa, cruce de precios de volumen, ruptura de precios y otras condiciones de entrada, esta estrategia establecerá posiciones largas. También establece niveles de stop loss y toma de ganancias para controlar la relación riesgo-recompensa por operación.
Los puntos clave de esta estrategia son los siguientes:
Específicamente, esta estrategia establece los parámetros de longitud y sobreventa para el indicador RSI y calcula los valores de RSI basados en estos parámetros.
Además, la estrategia define 3 umbrales de volumen y establece múltiples conjuntos de condiciones de precios de volumen basadas en datos de diferentes períodos de tiempo. Por ejemplo, el valor de volumen del período de 90 es mayor que 1,5 veces el del período de 49. Cuando todas estas condiciones de precios de volumen se cumplen al mismo tiempo, el indicador de precios de volumen genera una señal larga.
En el aspecto del precio, la estrategia calcula la SMA de 13 períodos y cuenta el número de barras desde que el precio se rompe por encima de la SMA.
Para los parámetros del período ATR, esta estrategia especifica un período pequeño de 5 y un período grande de 14 para el ATR. Cuando el período pequeño ATR es inferior al período grande ATR, indica que la volatilidad del mercado se está acelerando hacia abajo y contribuye a la señal larga.
Por último, la estrategia tiene en cuenta todos los criterios de entrada anteriores, incluidos los indicadores de sobreventa, precio de volumen, ruptura de precios y ATR. Cuando todas estas condiciones se cumplen al mismo tiempo, se activa la señal larga final y se establece una posición larga.
Esta estrategia tiene las siguientes ventajas:
Al evaluar múltiples conjuntos de datos de precios de volumen en diferentes marcos de tiempo en lugar de un solo marco de tiempo, la estrategia puede juzgar la concentración de los volúmenes de negociación con mayor precisión.
El mecanismo de confirmación triple de sobreventa + precio de volumen + ruptura de precios garantiza señales de entrada confiables.
El mecanismo de stop loss y take profit controla estrictamente el riesgo por operación. Los parámetros de stop loss y take profit se pueden ajustar en función del apetito de riesgo personal para maximizar las ganancias y controlar razonablemente el riesgo por operación.
La integración de múltiples indicadores aumenta la robustez.Incluso si algunos indicadores fallan o funcionan mal, la estrategia aún puede basarse en otros indicadores para el juicio y garantizar un cierto nivel de resiliencia.
También hay algunos riesgos con esta estrategia:
El riesgo de configuración de parámetros. Los parámetros de los indicadores afectan directamente el juicio, y los parámetros inadecuados pueden conducir a sesgos en las señales comerciales. Los valores razonables de los parámetros deben validarse cuidadosamente.
Como estrategia que integra múltiples indicadores para el juicio colectivo, sus señales tienden a ser más conservadoras con relativamente menos operaciones por unidad de tiempo, por lo que el potencial de ganancia tiene algunas limitaciones.
El riesgo de divergencia de los indicadores: cuando algunos indicadores emiten señales largas y otros señales cortas, la estrategia no puede determinar la decisión óptima.
Esta estrategia puede optimizarse aún más en los siguientes aspectos:
Incorporar modelos de aprendizaje automático para ayudar al juicio. Los modelos pueden ser entrenados en las características de precio de volumen y volatilidad para ajustar dinámicamente los parámetros definidos manualmente.
Mejorar la sofisticación de las estrategias de toma de ganancias, tales como la detención posterior de la toma de ganancias, las ganancias de toma parcial, etc., para aumentar aún más la ganancia por operación y evitar la pérdida de ganancias.
Además de los datos del gráfico de precios y volumen, los datos del libro de pedidos también revelan información de distribución de liquidez de profundidad para proporcionar señales de referencia suplementarias.
Combinaciones de pruebas con otros indicadores. Esta estrategia utiliza principalmente indicadores como RSI, ATR y SMA. Otros indicadores como Bollinger Bands y KDJ también se pueden combinar para diversificar y optimizar las fuentes de señales comerciales.
Esta estrategia utiliza una combinación de indicadores que incluyen RSI, ATR, SMA y condiciones de precio de volumen personalizadas para identificar oportunidades potenciales de entrada larga. Tiene ventajas como la evaluación de precios de volumen de múltiples marcos de tiempo, mecanismo de confirmación triple y controles de riesgo de stop loss / take profit. Sin embargo, también hay que tener en cuenta riesgos como la configuración de parámetros, el potencial de ganancia restringido. En el futuro, esta estrategia puede mejorarse aún más mediante el aumento del aprendizaje automático, un diseño de ganancias más sofisticado, la incorporación de datos de libros de pedidos, así como combinaciones de indicadores expandidas.
/*backtest start: 2023-10-24 00:00:00 end: 2023-11-23 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // © Kimply_Tr //@version=5 // Strategy settings and parameters strategy(title='Volume ValueWhen Velocity', overlay=true) // Define the stop-loss and take-profit percentages for the long strategy long_stoploss_value = input.float(defval=3, title='Stop-Loss (SL) %', minval=0, group='▶ Stop Loss/Take Profit => Long-Strategy', inline='2') long_stoploss_percentage = close * (long_stoploss_value / 100) / syminfo.mintick // Calculate long stop-loss percentage long_takeprofit_value = input.float(defval=2, title='Take-Profit (TP) %', minval=0, group='▶ Stop Loss/Take Profit => Long-Strategy', inline='2') long_takeprofit_percentage = close * (long_takeprofit_value / 100) / syminfo.mintick // Calculate long take-profit percentage // Define parameters related to ValueWhen occurrences occurrence_ValueWhen_1 = input.int(title='occurrence_ValueWhen_1', defval=1, maxval=100, step=1, group="▶ ValueWhen",tooltip ="Its value must be smaller than (occurrence_ValueWhen_2)") occurrence_ValueWhen_2 = input.int(title='occurrence_ValueWhen_2', defval=5, maxval=100, step=1, group="▶ ValueWhen" ,tooltip="Its value must be greater than (occurrence_ValueWhen_1)") distance_value=input.int(title='distance_value_occurrence', defval=170, maxval=5000, step=1, group="▶ ValueWhen" ,tooltip="It indicates the minimum distance between the occurrences of 1 and 2, i.e. the difference between the occurrences of 1 and 2 is greater than (distance_value_occurrence)") // Define RSI-related parameters rsi_over_sold = input.int(defval=60, minval=1, title='Oversold Level', group='▶ RSI',inline ='2') // Input for oversold level in RSI rsi_length = input.int(defval=40, minval=1, title='RSI Length', group='▶ RSI',inline ='2') // Input for RSI length rsi = ta.rsi(close, rsi_length) // Calculate RSI // Define volume thresholds volume_threshold1 = input.float(title='volume_threshold_1', defval=0.5, maxval=10, step=0.1, group="▶ Volume") volume_threshold2 = input.float(title='volume_threshold_2', defval=0.4, maxval=10, step=0.1, group="▶ Volume") volume_threshold3 = input.float(title='volume_threshold_3', defval=0.62, maxval=10, step=0.1, group="▶ Volume") // ATR (Average True Range) // Define ATR parameters atr_small = input.int(title='ATR_Small', defval=5, maxval=500, step=1, group="▶ Atr",inline ='2') atr_big = input.int(title='ATR_Big ', defval=14, maxval=500, step=1, group="▶ Atr",inline ='2') atr_value3 = ta.atr(15) // Calculate ATR value 3 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Date Range // Define the date range for back-testing start_date = input.int(title='Start Day', defval=1, minval=1, maxval=31, group='▶ Time-Period for Back-Testing', inline='1') // Input for start day end_date = input.int(title='until Day', defval=1, minval=1, maxval=31, group='▶ Time-Period for Back-Testing', inline='1') // Input for end day start_month = input.int(title='Start Month', defval=7, minval=1, maxval=12, group='▶ Time-Period for Back-Testing', inline='2') // Input for start month end_month = input.int(title='until Month', defval=1, minval=1, maxval=12, group='▶ Time-Period for Back-Testing', inline='2') // Input for end month start_year = input.int(title='Start Year', defval=2022, minval=1800, maxval=3000, group='▶ Time-Period for Back-Testing', inline='3') // Input for start year end_year = input.int(title='until Year', defval=2077, minval=1800, maxval=3000, group='▶ Time-Period for Back-Testing', inline='3') // Input for end year in_date_range = time >= timestamp(syminfo.timezone, start_year, start_month, start_date, 0, 0) and time < timestamp(syminfo.timezone, end_year, end_month, end_date, 0, 0) // Check if the current time is within the specified date range //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// was_over_sold = ta.barssince(rsi <= rsi_over_sold) <= 10 // Check if RSI was oversold in the last 10 bars //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// getVolume(symbol, bar) => request.security(syminfo.tickerid, "D", volume)[bar] // Function to get volume data for a specific symbol and bar getVolume2(symbol, bar) => request.security(syminfo.tickerid, "39", volume)[bar] // Function to get volume data for a specific symbol and bar 2 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// firstCandleColor1 = request.security(syminfo.tickerid, "D", close[2] > open[1] ? 1 : 0) firstCandleColor2 = request.security(syminfo.tickerid, "1", close[2] > open[0] ? 1 : 0) firstCandleColor3 = request.security(syminfo.tickerid, "W", close[1] > open[1] ? 1 : 0) firstCandleColor= ((firstCandleColor1+firstCandleColor2)) > firstCandleColor3 ? 1 : 0 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// sma = ta.sma(close, 13) // Calculate the simple moving average (SMA) of the close price over 13 periods numCandles = ta.barssince(close > sma) // Count the number of candles since the close price crossed above the SMA atr1=request.security(syminfo.tickerid, "30", ta.atr(atr_small)<ta.atr(atr_big)) // Get the ATR value for the specific security and timeframe (30 minutes) and check if ATR_small is less than ATR_big prevClose = ta.valuewhen(close > sma, close, occurrence_ValueWhen_1) // Get the close price when it first crosses above the SMA based on occurrence_ValueWhen_1 prevCloseBarsAgo = ta.valuewhen(close > sma, close, occurrence_ValueWhen_2) // Get the close price when it first crosses above the SMA based on occurrence_ValueWhen_2 prevCloseChange = (prevCloseBarsAgo - prevClose ) // Calculate the change in the close price between the occurrences of crossing above the SMA atrval=(atr_value3>140) or (atr_value3 < 123) // Check if atr_value3 is either greater than 140 or less than 123 Condition = getVolume(syminfo.tickerid, 90) > volume_threshold1 * getVolume(syminfo.tickerid, 49) and getVolume(syminfo.tickerid, 110) > volume_threshold3 * getVolume(syminfo.tickerid, 49) and getVolume2(syminfo.tickerid, 30) > volume_threshold2 * getVolume2(syminfo.tickerid, 55) and getVolume2(syminfo.tickerid, 7) > volume_threshold2 * getVolume2(syminfo.tickerid, 3) // Check multiple volume conditions buy_signal=Condition and atrval and firstCandleColor==0 and was_over_sold and prevCloseChange> distance_value and atr1 and numCandles<5 // Determine if the buy signal is generated based on various conditions //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Long Strategy // Enter long position if the buy signal conditions are met and within the specified date range if buy_signal and in_date_range strategy.entry('Long', strategy.long, alert_message='Open Long Position') // Enter long position strategy.exit('Long SL/TP', from_entry='Long', loss=long_stoploss_percentage, profit=long_takeprofit_percentage, alert_message='Your SL/TP-Limit for the Long-Strategy has been activated.') // Exit long position with stop-loss and take-profit