Coordinar la estrategia de parada de pérdida deslizante

El autor:¿ Qué pasa?, Fecha: 2023-11-02 16:28:55
Las etiquetas:

img

Resumen general

Esta estrategia utiliza el RSI estocástico y el indicador de cambio de la tasa de precios para identificar la dirección de la tendencia de entrada y coordinar el stop loss deslizante para la gestión del riesgo.

Estrategia lógica

En primer lugar, la estrategia calcula el RSI estocástico utilizando el indicador RSI con longitud 5 y el indicador estocástico con longitud 7.

En segundo lugar, la estrategia calcula la tasa de cambio de precios del indicador EMA ROC. Cuando EMA ROC está por encima de la mitad del umbral o por debajo de la mitad negativa del umbral, identifica el movimiento activo de los precios.

Luego, combinando las señales del RSI estocástico y la tasa de cambio de precios, identifica la dirección de tendencia. Cuando el RSI estocástico es alcista y el precio se mueve activamente, vaya largo. Cuando el RSI estocástico es bajista y el precio se mueve activamente, vaya corto.

Finalmente, la estrategia utiliza un stop loss deslizante coordinado para la gestión del riesgo. Después de abrir la posición, continúa actualizando el precio más alto / más bajo, y utiliza cierta distancia porcentual del precio más alto / más bajo como nivel de stop loss.

Análisis de ventajas

Las ventajas de esta estrategia:

  1. El indicador estocástico de RSI identifica eficazmente las tendencias y las situaciones de sobrecompra/sobreventa.

  2. La tasa de cambio de precios filtra fuera del mercado de rango para evitar señales falsas.

  3. El stop loss de deslizamiento coordinado puede bloquear las ganancias en la mayor medida posible mientras se controla el riesgo.

  4. La estrategia tiene un gran espacio de optimización para ajustar parámetros basados en diferentes productos.

  5. La lógica de la estrategia es simple y clara, fácil de entender e implementar.

Análisis de riesgos

Los riesgos de esta estrategia:

  1. El RSI estocástico puede generar señales falsas, necesita confirmación con otros factores.

  2. Coordenadas de deslizamiento de la pérdida de parada puede ser demasiado agresivo, podría ser detenido por los huecos durante la noche.

  3. La inversión a corto plazo puede desencadenar un stop loss.

  4. Los parámetros deben optimizarse para diferentes productos, de lo contrario el rendimiento puede ser pobre.

  5. El coste de negociación afecta a la rentabilidad de la estrategia, se necesita una frecuencia de negociación razonable.

Direcciones de optimización

La estrategia se puede optimizar aún más en los siguientes aspectos:

  1. Optimiza los parámetros del RSI estocástico para reducir las señales falsas.

  2. Optimiza la tasa de cambio de los parámetros de precio para mejorar el efecto de filtrado.

  3. Añadir un indicador de tendencia para evitar ser detenido por las inversiones.

  4. Optimiza el porcentaje de pérdida de parada para reducir el riesgo de quedar atrapado.

  5. Añadir la gestión del tamaño de las posiciones para controlar el riesgo de una sola operación, como el monto fijo de stop loss, o ajustar dinámicamente el tamaño de la posición en función del capital de la cuenta.

  6. Prueba de parámetros en diferentes productos para mejorar la adaptabilidad.

Resumen de las actividades

En resumen, esta estrategia tiene una lógica clara y simple, identifica la dirección de la tendencia con el RSI estocástico y filtra las señales con la tasa de cambio de precios, lo que puede capturar efectivamente las tendencias a medio y largo plazo. Coordinar los bloqueos de stop loss deslizantes en las ganancias y controlar el riesgo. Con una optimización adicional, esta estrategia puede convertirse en una tendencia muy práctica después de la estrategia.


/*backtest
start: 2023-10-02 00:00:00
end: 2023-11-01 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Sto2", overlay=false, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.0)

/////////////// Time Frame ///////////////
testStartYear = input(2017, "Backtest Start Year") 
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)

testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)

testPeriod() => true
    
///////////// Stochastic calc /////////////
smoothK = input(1, minval=1)
smoothD = input(7, minval=1)
lengthRSI = input(5, minval=1)
lengthStoch = input(7, minval=1)
src = input(close, title="RSI Source")

up = sma(max(change(src), 0), lengthRSI) 
down = sma(-min(change(src), 0), lengthRSI)
rsi1 = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))

k = sma(stoch(rsi1, rsi1, rsi1, lengthStoch), smoothK)
d = sma(k, smoothD)

///////////// Rate Of Change ///////////// 
source = close, roclength = input(14, minval=1), pcntChange = input(2, minval=1)
roc = 100 * (source - source[roclength]) / source[roclength]
emaroc = ema(roc, roclength / 2)
isMoving() => emaroc > (pcntChange / 2) or emaroc < (0 - (pcntChange / 2))

/////////////// STRATEGY ///////////////
long = k > d and isMoving()
short = k < d and isMoving()

last_long = 0.0
last_short = 0.0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])

long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

last_open_long_signal = 0.0
last_open_short_signal = 0.0
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])

last_long_signal = 0.0
last_short_signal = 0.0
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])

in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal

last_high = 0.0
last_low = 0.0
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])
sl_inp = input(2.0, title='Stop Loss %') / 100
tp_inp = input(9.0, title='Take Profit %') / 100 
 
take_level_l = strategy.position_avg_price * (1 + tp_inp)
take_level_s = strategy.position_avg_price * (1 - tp_inp) 

since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) // LONG SL
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) // SHORT SL

slLong = in_long_signal ? strategy.position_avg_price * (1 - sl_inp) : na
slShort = strategy.position_avg_price * (1 + sl_inp)
long_sl = in_long_signal ? slLong : na
short_sl = in_short_signal ? slShort : na

// Strategy
if testPeriod()
    strategy.entry("Long Entry",  strategy.long, when=long)
    strategy.entry("Short Entry", strategy.short, when=short)
    strategy.exit("Long Ex", "Long Entry", stop=long_sl, limit=take_level_l, when=since_longEntry > 0)
    strategy.exit("Short Ex", "Short Entry", stop=short_sl, limit=take_level_s, when=since_shortEntry > 0)
    
///////////// Plotting /////////////
bgcolor(isMoving() ? long ? color.green : short ? color.red : na : color.white, transp=80)
p1 = plot(k, color=color.gray, linewidth=0)
p2 = plot(d, color=color.gray, linewidth=0)
h0 = hline(100)
h1 = hline(50)
h3 = hline(0)
fill(p1, p2, color = k > d ? color.lime : color.red, transp=70)

Más.