Esta estrategia identifica las oportunidades de sobreventa utilizando el indicador RSI y toma posiciones en lotes cuando los precios caen para reducir gradualmente la base de costos y lograr ganancias a largo plazo.
La estrategia primero calcula el indicador RSI para determinar si el mercado está sobrevendido. Cuando el RSI está por debajo de 30, indica una oportunidad de sobreventa. En este caso, si el precio está por debajo del promedio móvil de 100 períodos, se abrirá una posición larga.
Después de abrir la posición, la estrategia establece 6 niveles de precio de reversión promedio en 98%, 97%, 95%, 90%, 84% y 70% del precio actual. Cuando el precio alcanza estos niveles, se agregarán más posiciones. Al promediar constantemente hacia abajo, la base de costo de la posición se puede reducir.
Además, se calcula el precio promedio de la posición. La toma de ganancias comienza cuando el precio sube más del 5% por encima del precio promedio. Además, si el precio continúa subiendo por encima del precio del 5% de la toma de ganancias del precio promedio, todas las posiciones se cerrarán.
Por último, se incorpora en la estrategia un mecanismo de DCA: cada lunes, si hay posiciones abiertas y el precio está por debajo del precio medio, se añade una cantidad fija a la posición, lo que reduce aún más la base de costes.
La mayor ventaja de esta estrategia es la utilización de promedios a la baja y mecanismos DCA para controlar los riesgos.
La adopción de posiciones en lotes diversifica el riesgo de apertura y evita perder el punto más bajo.
El establecimiento de niveles de precios de reversión medios múltiples reduce constantemente la base de costos y gestiona el riesgo a la baja.
El cálculo del precio promedio de la posición permite obtener ganancias oportunas y bloquear las ganancias cuando está en el verde.
La aplicación de DCA reduce aún más la base de costes y controla el riesgo.
El uso del indicador RSI evita la apertura de posiciones en los picos.
El filtro de media móvil evita las operaciones de inversión.
La estrategia también tiene algunos riesgos:
La estrategia no puede determinar los puntos de reversión del mercado. Las posiciones largas persistentes durante los fondos prolongados del mercado aumentarán las pérdidas.
No existe un mecanismo de stop loss para controlar eficazmente las pérdidas de una sola operación.
No hay límite en el número de posiciones, lo que puede conducir a adiciones desenfrenadas si el mercado se derrumba violentamente.
DCA tiene un riesgo de tiempo y no garantiza la apertura de posiciones en el punto más bajo.
Soluciones posibles:
Incorporar otros indicadores para juzgar la estructura del mercado en lugar de basarse únicamente en el RSI.
Añadir movimiento o stop loss escalonado.
Limitar el número de adiciones de posición.
Optimice la lógica de entrada de DCA para un mecanismo más estable.
La estrategia puede mejorarse de las siguientes maneras:
Optimizar el algoritmo de reversión media para un enfoque más científico.
Mejorar los mecanismos de toma de ganancias, tales como la parada de seguimiento o la toma de ganancias en capas.
Añadir un stop loss para un mejor control del riesgo de una sola operación.
Incorporar otros indicadores para el análisis de la estructura del mercado en lugar del RSI puro.
Optimizar la lógica DCA para evitar los riesgos de entrada en tiempo fijo.
Añadir el tamaño de la posición para optimizar el tamaño total de la posición.
Optimizar los parámetros para adaptarlos a las características estadísticas del mercado.
Añadir una lógica de conmutación para adaptarse a diferentes regímenes de mercado.
En resumen, esta es una estrategia de inversión a largo plazo que utiliza el RSI para el tiempo y promediando hacia abajo con múltiples entradas para una base de menor costo. Es muy adecuado para el mercado de criptomonedas volátil actual para administrar los costos de posición durante períodos variados. También hay espacio para mejorar los mecanismos para incorporar más indicadores para el análisis de mercado y la gestión de riesgos para permitir que la estrategia prospere en entornos más complejos.
/*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()