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


Fecha de creación: 2024-01-24 15:38:49 Última modificación: 2024-01-24 15:38:49
Copiar: 5 Número de Visitas: 688
1
Seguir
1617
Seguidores

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

Descripción general

La idea principal de esta estrategia es determinar el punto de entrada a través de números aleatorios y establecer tres puntos de parada y un punto de pérdida para administrar el riesgo y controlar las pérdidas por cada operación.

Principio de estrategia

La estrategia utiliza un número aleatorio rd_number_entry para decidir entre 11 y 13 puntos de entrada, y rd_number_exit entre 20 y 22 puntos para decidir la posición en blanco. Al hacer más, establece una pérdida de parada para el precio de entrada menosatr(14) * slx。 Al mismo tiempo, establece tres puntos de parada, el primer punto de parada para el precio de entrada másatr(14) * tpx, el segundo punto de parada para el precio de entrada más 2* tpx, y el tercer punto de parada para el precio de entrada más 3* tpx。 El principio de hacer vacío es similar, pero la diferencia es que la decisión de la entrada toma un valor diferente en rd_number_entry, y la pérdida de parada es en la dirección opuesta。

La estrategia puede controlar el riesgo ajustando tpx (el factor de detención) y slx (el factor de deterioro).

Análisis de las ventajas

La estrategia tiene las siguientes ventajas:

  1. El uso de la entrada aleatoria puede reducir la probabilidad de la curvatura
  2. Configuración de varios puntos de parada y pérdida para controlar el riesgo de una sola transacción
  3. El uso de atr para establecer un stop loss, puede establecer puntos de ganancia y pérdida basados en la volatilidad del mercado
  4. Se puede controlar el riesgo de la transacción ajustando el coeficiente

Análisis de riesgos

La estrategia también tiene los siguientes riesgos:

  1. La entrada al azar podría haberse perdido.
  2. El punto de parada es demasiado pequeño para detenerlo.
  3. El espacio para parar es demasiado grande y puede no ser rentable.
  4. Los parámetros incorrectos pueden aumentar las pérdidas

Se puede reducir el riesgo ajustando el coeficiente de stop loss y optimizando la lógica de entrada aleatoria.

Dirección de optimización

La estrategia puede ser optimizada en los siguientes aspectos:

  1. Mejora de la lógica de entrada aleatoria combinada con el juicio de indicadores de tendencia
  2. Optimización del coeficiente de pérdidas y pérdidas para hacer que las ganancias sean más razonables que las pérdidas
  3. Control de posición aumentado, con diferentes espacios de frenado en diferentes etapas
  4. Parámetros de optimización combinados con algoritmos de aprendizaje automático

Resumir

Esta estrategia se basa en la entrada aleatoria, la configuración de varios puntos de parada y pérdida para controlar el riesgo de una sola transacción, ya que la aleatoriedad fuerte puede reducir la probabilidad de ajuste curvo, mediante la optimización de los parámetros puede reducir el riesgo de transacción. El espacio para la optimización posterior es grande y vale la pena investigar más.

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