Estrategia compuesta de stop loss y take profit basada en la entrada aleatoria

El autor:¿ Qué pasa?, Fecha: 2024-01-24 15:38:49
Las etiquetas:

img

Resumen general

La idea principal de esta estrategia es determinar el punto de entrada al azar y establecer tres puntos de toma de ganancias y un punto de stop loss para gestionar los riesgos y controlar las ganancias y pérdidas de cada operación.

Estrategia lógica

Esta estrategia utiliza el número aleatorio rd_number_entry entre 11 y 13 para determinar el punto de entrada larga, y utiliza rd_number_exit entre 20 y 22 para determinar el cierre de las posiciones.slx. al mismo tiempo, se establecen tres puntos de ganancia. El primer punto de ganancia es el precio de entrada más atr ((14)tpx, el segundo punto de toma de beneficios es el precio de entrada más 2tpx, y el tercer punto de toma de beneficios es el precio de entrada más 3El principio de ir corto es similar, excepto que la decisión de entrada toma diferentes valores de rd_number_entry, y la dirección de tomar ganancias y stop loss es opuesta.

El riesgo puede controlarse ajustando tpx (coeficiente de toma de ganancias) y slx (coeficiente de stop loss).

Análisis de ventajas

Las ventajas de esta estrategia incluyen:

  1. El uso de entrada aleatoria puede reducir la probabilidad de ajuste de curvas
  2. Establecer múltiples puntos de stop loss y take profit puede controlar el riesgo de una sola operación.
  3. El uso de atr para establecer el take profit y el stop loss permite que se base en la volatilidad del mercado
  4. El riesgo de negociación puede controlarse ajustando los coeficientes

Análisis de riesgos

Los riesgos de esta estrategia también incluyen:

  1. La entrada aleatoria puede no tener tendencias
  2. Si el stop loss es demasiado pequeño, se puede detener fácilmente
  3. Si el beneficio que ocupa el espacio es demasiado grande, el beneficio puede ser insuficiente
  4. Los parámetros inadecuados pueden llevar a mayores pérdidas

Los riesgos pueden reducirse ajustando los coeficientes de toma de ganancias y stop loss y optimizando la lógica de entrada aleatoria.

Direcciones de optimización

La estrategia se puede optimizar en los siguientes aspectos:

  1. Mejorar la lógica de entrada aleatoria e incorporar juicios de indicadores de tendencia
  2. Optimizar los coeficientes de toma de ganancias y stop loss para hacer que la relación de ganancias sea más razonable
  3. Aumentar el control de la posición para utilizar diferentes espacios de toma de beneficios en diferentes etapas
  4. Optimizar parámetros con algoritmos de aprendizaje automático

Conclusión

Esta estrategia se basa en la entrada aleatoria y establece múltiples puntos de toma de ganancias y stop loss para controlar el riesgo de una sola operación. Debido a la alta aleatoriedad, la probabilidad de ajuste de la curva se puede reducir. El riesgo comercial se puede reducir a través de la optimización de parámetros. Todavía hay mucho espacio para una mayor optimización e investigación.


/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Random Strategy with 3 TP levels and SL", overlay=true,max_bars_back = 50)

tpx = input(defval = 0.8, title = 'Atr multiplication for TPs?')
slx = input(defval = 1.2, title = 'Atr multiplication for SL?')
isLong = false
isLong := nz(isLong[1])

isShort = false
isShort := nz(isShort[1])

entryPrice = 0.0
entryPrice := nz(entryPrice[1])
tp1 = true
tp1 := nz(tp1[1])
tp2 = true
tp2 := nz(tp2[1])

sl_price = 3213.0
sl_price := nz(sl_price[1])

sl_atr = atr(14)*slx
tp_atr = atr(14)*tpx

rd_number_entry = 1.0
rd_number_entry := (16708 * nz(rd_number_entry[1], 1) % 2147483647)%17

rd_number_exit = 1.0
rd_number_exit := ((16708 * time % 2147483647) %17)


//plot(rd_number_entry)

shortCondition = (rd_number_entry == 13? true:false) and (year >= 2017) and not isLong and not isShort
longCondition = (rd_number_entry == 11 ? true:false) and (year >= 2017) and not isShort and not isShort
//Never exits a trade:
exitLong = (rd_number_exit == 22?true:false) and (year >= 2018) and not isShort
exitShort = (rd_number_exit ==  22?true:false) and (year >= 2018) and not isLong


//shortCondition = crossunder(sma(close, 14), sma(close, 28)) and year >= 2017
//longCondition = crossover(sma(close, 14), sma(close, 28)) and year >= 2017

//exitLong = crossunder(ema(close, 14), ema(close, 28)) and year >= 2017
//exitShort = crossover(ema(close, 14), ema(close, 28)) and year >= 2017

if (longCondition and not isLong)
    strategy.entry('Long1', strategy.long)
    strategy.entry('Long2', strategy.long)
    strategy.entry('Long3', strategy.long)
    isLong := true
    entryPrice := close
    isShort := false
    tp1 := false
    tp2 := false
    sl_price := close-sl_atr

if (shortCondition and not isShort)
    strategy.entry('Short1', strategy.short)
    strategy.entry('Short2', strategy.short)
    strategy.entry('Short3', strategy.short)
    isShort := true
    entryPrice := close
    isLong := false
    tp1 := false
    tp2 := false
    sl_price := close+sl_atr
    
if (exitShort and isShort)
    strategy.close('Short1')
    strategy.close('Short2')
    strategy.close('Short3')
    isShort :=  false

if (exitLong and isLong)
    strategy.close('Long1')
    strategy.close('Long2')
    strategy.close('Long3')
    isLong :=  false

if isLong
    if (close > entryPrice + tp_atr) and not tp1
        strategy.close('Long1')
        tp1 := true
        sl_price := close - tp_atr
    if (close > entryPrice + 2*tp_atr) and not tp2
        strategy.close('Long2')
        tp2 := true
        sl_price := close - tp_atr
    if (close > entryPrice + 3*tp_atr)
        strategy.close('Long3')
        isLong := false
    if (close < sl_price)
        strategy.close('Long1')
        strategy.close('Long2')
        strategy.close('Long3')
        isLong := false

if isShort
    if (close < entryPrice - tp_atr) and not tp1
        strategy.close('Short1')
        sl_price := close + tp_atr
        tp1 := true
    if (close < entryPrice - 2*tp_atr) and not tp2
        strategy.close('Short2')
        sl_price := close + tp_atr
        tp2 := true
    if (close < entryPrice - 3*tp_atr)
        strategy.close('Short3')
        isShort := false
    if (close > sl_price)
        strategy.close('Short1')
        strategy.close('Short2')
        strategy.close('Short3')
        isShort := false
plot(atr(14)*slx)
plot(sl_price)

Más.