Estrategia de volatilidad de precios con reversión a la media del RSI


Fecha de creación: 2023-09-26 19:55:03 Última modificación: 2023-09-26 19:55:03
Copiar: 2 Número de Visitas: 749
1
Seguir
1617
Seguidores

Descripción general

Esta estrategia utiliza el indicador RSI para identificar oportunidades de venta excesiva, entrar en lotes cuando los precios bajan, y obtener ganancias a largo plazo mediante la reducción continua de los costos de mantenimiento en la media. Al mismo tiempo, la estrategia incorpora un mecanismo de DCA para controlar aún más el riesgo.

Principio de estrategia

Esta estrategia primero calcula el indicador RSI para determinar si el mercado está sobrevendido. Cuando el RSI está por debajo de los 30, indica la aparición de una oportunidad de sobreventa. En este momento, si el precio está por debajo de la media de 100 ciclos, abra más posiciones.

Una vez abierta la posición, la estrategia establece 6 precios de retorno al promedio, respectivamente el 98%, 97%, 95%, 90%, 84% y 70% del precio actual. Cuando el precio toca estos precios, se continúa agregando posiciones. De esta manera, se puede reducir el costo de la posición mediante el promedio continuo.

Además, la estrategia también calcula el precio promedio de la posición. Si el precio sube más del 5% del precio promedio, comienza la parada. Si el precio continúa subiendo y supera el precio de parada del 5% del precio promedio, se detiene por completo.

Finalmente, la estrategia también incluye un mecanismo de DCA. Cada lunes, si hay una posición y el precio es inferior al precio promedio, se añade una posición de cantidad fija. Esto reduce aún más el costo de la posición.

Análisis de las ventajas

La mayor ventaja de esta estrategia es que el uso de la media y el mecanismo de DCA controlan el riesgo. En concreto, incluyen los siguientes puntos:

  1. La estrategia de entrada por lotes permite dispersar el riesgo de apertura de posiciones y evitar perder el punto más bajo.

  2. La configuración de varios precios de devolución de la media puede reducir continuamente el costo de la posición y controlar el riesgo de caída.

  3. Calcular el precio promedio de la posición, detener el cierre a tiempo después de la obtención de ganancias y bloquear los beneficios.

  4. Aplicación de mecanismos de DCA para reducir aún más los costos de tenencia y controlar el riesgo.

  5. Utilice el indicador RSI para determinar el momento del mercado y evite las posiciones altas.

  6. Utiliza filtros uniformes para evitar el desvío de la posición.

Análisis de riesgos

La estrategia también tiene ciertos riesgos, incluyendo:

  1. La estrategia no puede determinar el punto de inflexión del mercado, y si el mercado se mantiene bajo durante mucho tiempo, el exceso continuado aumentará las pérdidas.

  2. La estrategia no tiene en cuenta el mecanismo de parada de pérdidas y no puede controlar eficazmente las pérdidas individuales.

  3. La estrategia no limita el número de posiciones abiertas, pero si el mercado cae drásticamente, las posiciones aumentan.

  4. El mecanismo DCA tiene un riesgo de tiempo y no garantiza que la posición se abra en el punto más bajo.

Resolución de las mismas:

  1. Se puede combinar con otros indicadores para determinar la estructura del mercado, evitando la dependencia del RSI.

  2. Aumentar la pérdida de movimiento o la pérdida de reducción.

  3. Limite el número de niveles abiertos para evitar posiciones excesivas.

  4. Optimizar el tiempo de apertura de posiciones de DCA para una mayor estabilidad.

Dirección de optimización

Esta estrategia puede ser optimizada en los siguientes aspectos:

  1. Optimización de los algoritmos de regresión de la media, para calcular el valor de regresión de los precios de una manera más científica.

  2. Optimización de los sistemas de frenado mediante frenado móvil o por escaleras.

  3. Aumentar las estrategias de stop loss para controlar mejor las pérdidas individuales.

  4. En combinación con otros indicadores para determinar la estructura del mercado, evite depender únicamente del RSI.

  5. Optimización de la lógica de apertura de posiciones de DCA, evitando el riesgo de abrir posiciones a una hora fija.

  6. Agrega un módulo de administración de posiciones para optimizar el tamaño de las posiciones.

  7. Optimización de la configuración de los parámetros para adaptar la estrategia a las características estadísticas del mercado.

  8. La inclusión de la lógica de cambio, el modo de cambio de estrategias en diferentes entornos de mercado.

Resumir

En general, esta estrategia es una estrategia de inversión de línea larga que utiliza el momento de juicio del RSI para ingresar en lotes a un valor promedio. Es muy adecuada para el mercado de divisas digitales de alta volatilidad actual, y puede utilizar de manera efectiva los rangos de crisis para la gestión de los costos de la posición. Al mismo tiempo, el mecanismo de la estrategia también existe donde se puede optimizar, y si se agregan más indicadores técnicos de juicio y módulos de control de riesgo, se puede mejorar aún más la eficacia de la estrategia, lo que la hace suficiente para responder a un entorno de mercado más complejo.

Código Fuente de la Estrategia
/*backtest
start: 2023-08-26 00:00:00
end: 2023-09-25 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
//@version=4
// © A3Sh

// RSI Strategy that buys the dips, works with Price Averaging and has a Dollar Cost Average option.
// When the price drops below specified percentages of the price (6 PA layers), new entries are openend to average the price of the assets.
// Open entries are closed by a specified take profit.
// Entries can be reopened, after closing and consequently crossing a PA layer again.
// The idea is to lower the average position price to a point that when the market rises, the current price crosses over the average position price.
// When the current price crosses the average position size and reaches the specified take profit, all entries are closed at once.
// In case the market drops significantly, there is an option to activate DCA to lower the average price further.

// RSI code adapted from the Optimized RSI Buy the Dips strategy, by Coinrule
// https://www.tradingview.com/script/Pm1WAtyI-Optimized-RSI-Strategy-Buy-The-Dips-by-Coinrule/
// Pyramiding entries code adapted from Pyramiding Entries on Early Trends startegy, by Coinrule
// https://www.tradingview.com/script/7NNJ0sXB-Pyramiding-Entries-On-Early-Trends-by-Coinrule/
// Plot entry layers code adapted from HOWTO Plot Entry Price by vitvlkv
// https://www.tradingview.com/script/bHTnipgY-HOWTO-Plot-Entry-Price/
// Buy every week code based on the following question in Stack Overflow
// https://stackoverflow.com/questions/59870411/in-pine-script-how-can-you-do-something-once-per-day-or-keep-track-if-somethin


strategy(title = "RSI+PA+DCA", pyramiding = 16, overlay = true, initial_capital = 400, default_qty_type = strategy.percent_of_equity, default_qty_value = 15, commission_type = strategy.commission.percent, commission_value = 0.075)

port = input(15, title = "Portfolio %", type = input.float, step = 0.1, minval = 0.1, maxval = 100)
q = (strategy.equity / 100 * port) / open

// Long position entry layers. Percentage from the entry price of the the first long
PositionInputs = input("++++", title = "+++++ Long Positions VA Layers +++++")

ps2 = input(2,  title = "2nd Long Entry %", step = 0.1)
ps3 = input(3,  title = "3rd Long Entry %", step = 0.1)
ps4 = input(5,  title = "4th Long Entry %", step = 0.1)
ps5 = input(10, title = "5th Long Entry %", step = 0.1)
ps6 = input(16, title = "6th Long Entry %", step = 0.1)


// Calculate Moving Averages
maInput = input("++++", title = "+++++ Moving Average Filter +++++")

plotMA = input(title = "Plot Moving Average", defval = false)
movingaverage_signal = sma(close, input(100))
plot (plotMA ? movingaverage_signal : na, color = color.white)

// RSI inputs and calculations
rsiInput = input( "++++", title = "+++++ RSI Inputs +++++" )

length =     input( 14 )
overSold =   input( 30, title = "oversold, entry trigger long position" )
overBought = input( 70, title = "overbought, has no specific function")
price = close
vrsi = rsi(price, length)

// Long trigger (co)
co = crossover(vrsi, overSold) and close < movingaverage_signal

// Take profit
takeprofit = input("++++", title = "+++++ Take Profit +++++")

ProfitTarget_Percent = input(5)


// Store values to create and plot the different DCA layers
long1 = valuewhen(co, close, 0)
long2 = valuewhen(co, close - (close / 100 * ps2), 0)
long3 = valuewhen(co, close - (close / 100 * ps3), 0)
long4 = valuewhen(co, close - (close / 100 * ps4), 0)
long5 = valuewhen(co, close - (close / 100 * ps5), 0)
long6 = valuewhen(co, close - (close / 100 * ps6), 0)

eps1 = 0.00
eps1 := na(eps1[1]) ? na : eps1[1]

eps2 = 0.00
eps2 := na(eps2[1]) ? na : eps2[1]

eps3 = 0.00
eps3 := na(eps3[1]) ? na : eps3[1]

eps4 = 0.00
eps4 := na(eps4[1]) ? na : eps4[1]

eps5 = 0.00
eps5 := na(eps5[1]) ? na : eps5[1]

eps6 = 0.00
eps6 := na(eps6[1]) ? na : eps6[1]

plot (strategy.position_size > 0 ? eps1 : na, title = "Long entry 1", style = plot.style_linebr)
plot (strategy.position_size > 0 ? eps2 : na, title = "Long entry 2", style = plot.style_linebr)
plot (strategy.position_size > 0 ? eps3 : na, title = "Long entry 3", style = plot.style_linebr)
plot (strategy.position_size > 0 ? eps4 : na, title = "Long entry 4", style = plot.style_linebr)
plot (strategy.position_size > 0 ? eps5 : na, title = "Long entry 5", style = plot.style_linebr)
plot (strategy.position_size > 0 ? eps6 : na, title = "Long entry 6", style = plot.style_linebr)


// Plot position average price
plot (strategy.position_avg_price, title = "Average price", style = plot.style_linebr, color = color.red, linewidth = 2)


// Take profit and exit all on take profit above position average price
tpv = strategy.position_avg_price + (strategy.position_avg_price / 100 * ProfitTarget_Percent)

tpl1 = close < tpv ? eps1 + close * (ProfitTarget_Percent / 100) : tpv
tpl2 = close < tpv ? eps2 + close * (ProfitTarget_Percent / 100) : tpv
tpl3 = close < tpv ? eps3 + close * (ProfitTarget_Percent / 100) : tpv
tpl4 = close < tpv ? eps4 + close * (ProfitTarget_Percent / 100) : tpv
tpl5 = close < tpv ? eps5 + close * (ProfitTarget_Percent / 100) : tpv
tpl6 = close < tpv ? eps6 + close * (ProfitTarget_Percent / 100) : tpv


// Open DCA order once at the start of the week
dcaWeek = input("++++", title = "+++++ Open DCA order once every week +++++")

newWeek = change(time("W"))
dcatime = input(title = "Buy a fixed amount every Monday", defval = false)
fixedAmount = input(40, title = "Fixed amount currency for DCA orders", step = 0.1)
dcaq = fixedAmount / open
plotchar (dcatime ? newWeek : na, "buy at Week start", "▼", location.top, size = size.tiny, color = color.white)
bgcolor (dcatime and newWeek ? color.white : na, transp = 50)

// Submit entry orders
if (co and strategy.opentrades == 0)
    eps1 := long1
    eps2 := long2
    eps3 := long3
    eps4 := long4
    eps5 := long5
    eps6 := long6

    strategy.entry("Long1", strategy.long, q)

if (strategy.opentrades == 1)
    strategy.entry("Long2", strategy.long, q, limit = eps2)

    
if (strategy.opentrades == 2)
    strategy.entry("Long3", strategy.long, q, limit = eps3)


if (strategy.opentrades == 3)
    strategy.entry("Long4", strategy.long, q, limit = eps4)


if (strategy.opentrades == 4)
    strategy.entry("Long5", strategy.long, q, limit = eps5)

    
if (strategy.opentrades == 5) 
    strategy.entry("Long6", strategy.long, q, limit = eps6)
    
// Submit Weekly DCA order, only when price is below position average price and when a position is open
if (dcatime and newWeek and strategy.position_size > 0 and close < strategy.position_avg_price) 
    strategy.entry("DCA", strategy.long, dcaq)


// Exit orders
if (strategy.position_size > 0)
    strategy.exit(id = "Exit 1", from_entry = "Long1", limit = tpl1)
    strategy.exit(id = "Exit 2", from_entry = "Long2", limit = tpl2)
    strategy.exit(id = "Exit 3", from_entry = "Long3", limit = tpl3)
    strategy.exit(id = "Exit 4", from_entry = "Long4", limit = tpl4)
    strategy.exit(id = "Exit 5", from_entry = "Long5", limit = tpl5)
    strategy.exit(id = "Exit 6", from_entry = "Long6", limit = tpl6)
    strategy.exit(id = "Exit DCA", from_entry = "DCA", limit = tpv)
 

// Make sure that all open limit orders are canceled after exiting all the positions 
longClose = strategy.position_size[1] > 0 and strategy.position_size == 0 ? 1 : 0   
if longClose
    strategy.cancel_all()