Estrategia de negociación de equilibrio entre posiciones largas y cortas basada en indicadores de volumen y precio


Fecha de creación: 2023-11-24 14:35:13 Última modificación: 2023-11-24 14:35:13
Copiar: 0 Número de Visitas: 649
1
Seguir
1617
Seguidores

Estrategia de negociación de equilibrio entre posiciones largas y cortas basada en indicadores de volumen y precio

Descripción general

La estrategia es una estrategia de trading de indicadores de precios y cantidades en un marco de tiempo múltiple. Utiliza el índice de fuerza relativa (RSI), la amplitud real promedio (ATR), la media móvil simple (SMA) y las condiciones de precios personalizadas para identificar posibles señales de venta. La estrategia establece una posición de venta cuando se cumplen ciertas condiciones, como sobreventa, cruce de indicadores de precios y ruptura de precios.

Principio de estrategia

La estrategia se basa principalmente en los siguientes puntos clave:

  1. El RSI se considera una señal de sobreventa cuando está por debajo de la línea de sobreventa y ha estado en una situación de sobreventa en los últimos 10 K
  2. Se definen varios conjuntos de condiciones cuantitativas que deben cumplirse simultáneamente para que se considere que el indicador cuantitativo emite múltiples señales
  3. Cuando el precio de cierre se rompe el SMA de 13 ciclos de abajo hacia arriba, se considera una señal de ruptura del precio
  4. El ATR de menor ciclo es menor que el de mayor ciclo y también es una señal de refuerzo
  5. La integración de las señales de los indicadores mencionados anteriormente con el fin de tomar decisiones

Concretamente, la estrategia establece parámetros de longitud y línea de venta por encima para el indicador RSI, de acuerdo con los cuales se calcula el valor RSI. Cuando el indicador RSI genera una señal de venta por encima cuando hay varias líneas K consecutivas por debajo de la línea de venta por encima.

Además, la estrategia define 3 valores de volumen de transacción y establece varios conjuntos de condiciones de volumen de acuerdo con los datos de diferentes períodos de tiempo. Por ejemplo, el valor de volumen de 90 períodos es mayor que 1.5 veces el valor de volumen de 49 períodos. Cuando se cumplen simultáneamente estos requisitos de volumen de precios, se emite una señal de multiplicación del indicador de volumen de precios.

En cuanto al precio, la estrategia calcula el indicador SMA de 13 ciclos y calcula el número de líneas K desde que el precio rompió el SMA hacia arriba. Cuando el precio rompió el SMA desde abajo hacia arriba y el número de líneas K después de la ruptura fue menor a 5, se consideró una señal de ruptura del precio.

En cuanto a los parámetros del ATR de ciclo, la estrategia especifica el ATR del ciclo pequeño 5 y el ciclo grande 14. Cuando el ATR de ciclo pequeño es inferior al ATR de ciclo grande, indica que la fluctuación del mercado se acelera y se reduce, como una señal de aumento.

Finalmente, la estrategia tiene en cuenta las condiciones de compra mencionadas anteriormente, incluidas las condiciones de sobreventa, el indicador de precio de medida, la brecha de precio y el indicador ATR. Cuando estas condiciones se cumplen simultáneamente, se genera una señal de compra final y se establece una posición de compra.

Ventajas estratégicas

La estrategia tiene las siguientes ventajas:

  1. La estrategia no solo considera los datos de precios de un solo período, sino que evalúa el cruce de varios grupos de diferentes condiciones de precios de períodos, lo que permite juzgar con mayor precisión la concentración de la capacidad cuantitativa.

  2. El mecanismo de triple juicio de sobreventa + precio + cantidad garantiza la fiabilidad de las señales de compra. La sobreventa proporciona la selección más básica de los momentos de compra, además de que el cruce de indicadores de precio y cantidad agrega una confirmación adicional para el momento de compra, con una mayor fiabilidad.

  3. Configurar un mecanismo de stop-loss para controlar estrictamente el riesgo de cada operación. Los parámetros de stop-loss y stop-loss se pueden ajustar según las preferencias de riesgo personales, para controlar razonablemente el riesgo de cada operación a la vez que se busca maximizar los beneficios.

  4. La integración de varios indicadores de juicio aumenta la flexibilidad. Incluso si algunos indicadores se rompen o se equivocan, se puede confiar en otros indicadores de juicio para garantizar una cierta capacidad de funcionamiento continuo.

Riesgos y contramedidas

La estrategia también tiene sus riesgos:

  1. La configuración de los parámetros del riesgo. La configuración de los parámetros de los diversos indicadores afecta directamente a los resultados del juicio. Los parámetros no razonables pueden causar una desviación en la señal de negociación.

  2. El espacio de ganancia es limitado. Como estrategia para la integración de varios indicadores para el juicio integrado, la frecuencia de generación de señales es relativamente más conservadora, el número de transacciones por unidad de tiempo es menor, y el espacio de ganancia tiene ciertas limitaciones.

  3. Riesgo de dispersión de los indicadores. Cuando algunos indicadores emiten señales de multiplicación y otros de vacío, la estrategia no puede determinar la decisión óptima. Esto requiere la identificación anticipada y la solución de posibles dispersiones entre los indicadores.

Dirección de optimización de la estrategia

La estrategia puede ser optimizada aún más en los siguientes aspectos:

  1. Aumentar el aprendizaje automático de los modelos de ayuda al juicio. Se puede entrenar el precio cuantitativo y los modelos de características de fluctuación, para ayudar a los parámetros establecidos manualmente, para lograr la dinámica de los parámetros.

  2. Aumentar la madurez de las estrategias de stop-loss. Por ejemplo, se puede configurar un stop-loss flotante, un stop-loss por lotes, un stop-loss de seguimiento, etc., lo que puede mejorar aún más los ingresos por unidad, al tiempo que se evita la pérdida.

  3. Evaluación de la introducción de datos de la apertura. Además de los datos de la línea K, los datos de la apertura de compra y venta en profundidad también pueden determinar la distribución de las posiciones de tenencia y proporcionar señales de referencia adicionales.

  4. Prueba y comprueba la integración de otros indicadores. Esta estrategia utiliza principalmente indicadores como RSI, ATR y SMA para la integración. También se puede intentar introducir una combinación de otros indicadores como Brinline, KDJ y otros para enriquecer y optimizar la fuente de señales de negociación.

Resumir

Esta estrategia utiliza RSI, ATR, SMA y criterios de precios personalizados para identificar posibles oportunidades de inversión. También tiene ventajas como el juicio de indicadores de precios de múltiples marcos temporales, el mecanismo de confirmación de la triple señal y el control de riesgos de la parada de pérdidas. Por supuesto, también se debe tener en cuenta el riesgo de configuración de parámetros, las limitaciones del espacio de ganancias, etc. En el futuro, la estrategia puede optimizarse aún más a partir de la ayuda del aprendizaje automático, la optimización de la estrategia de parada, la introducción de datos de puertas de negociación y la integración de indicadores.

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