La estrategia se llama
La estrategia integra los indicadores Bollinger Band y RSI. La banda de Bollinger juzga claramente la tendencia donde por encima de la banda media significa un mercado alcista y por debajo significa un mercado bajista. RSI indica situaciones de sobrecompra y sobreventa. La estrategia construye un indicador MIX ponderando la desviación de la banda de Bollinger y el valor K de RSI. Se genera una señal larga cuando el indicador MIX rompe 20 desde abajo.
Para la parte progresiva de DCA, se abre una posición inicial cuando MIX rompe 20. Se agregan posiciones adicionales a una cantidad fija cada vez que el precio cae en un porcentaje fijo. Esto se continúa hasta que se alcanzan las posiciones máximas o se activa el stop loss / take profit. Al agregar posiciones en mínimos de mercado varias veces, el costo promedio se puede reducir progresivamente.
La combinación de dos indicadores mejora la precisión de la señal mediante un juicio de tendencia más claro.
El DCA progresivo reduce la base de costos durante los descensos, reduciendo el riesgo de pérdidas al tiempo que aumenta el rango de ganancias.
Las condiciones de toma de ganancias y stop loss controlan rápidamente los riesgos y bloquean ganancias parciales.
El filtro de rango de fecha agregado permite backtests enfocados y optimizaciones de períodos específicos.
Tanto la banda de Bollinger como el RSI pueden sufrir fallas. Se pueden probar diferentes combinaciones de parámetros para obtener la mejor precisión de la señal.
El DCA progresivo puede aumentar las pérdidas durante grandes caídas agregando continuamente posiciones.
Los eventos de cisne negro y los movimientos anormales de los precios no pueden ser previstos.
Prueba y optimiza los parámetros del indicador MIX para obtener señales comerciales más precisas.
Optimice los parámetros de stop loss y take profit para obtener la mejor relación ganancia/pérdida.
Prueba diferentes tamaños y frecuencias de posición de suma para encontrar combinaciones óptimas.
Considere la posibilidad de añadir módulos de control del volumen de operaciones a la estrategia de apertura/cierre basada en las condiciones de volumen.
La mezcla de la banda de Bollinger y el RSI con la estrategia de DCA combina múltiples técnicas y métodos cuantitativos. Construye un indicador claro para juzgar la tendencia y reduce la base de costos a través de adiciones progresivas. Los métodos estrictos de control de riesgos, incluidas las operaciones de stop loss y take profit, lo hacen práctico.
/*backtest start: 2023-01-11 00:00:00 end: 2024-01-17 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // © lagobrian23 //@version=4 strategy(title = 'Bollinger Bands and RSI mix with DCA', shorttitle = 'BB/RSI with DCA',pyramiding = 20, calc_on_every_tick = true, overlay = false ) source=close smoothK = input(3, "K", minval=1) smoothD = input(3, "D", minval=1) lengthRSI = input(14, "RSI Length", minval=1) lengthStoch = input(14, "Stochastic Length", minval=1) src = input(close, title="RSI Source") rsi1 = rsi(src, lengthRSI) k = sma(stoch(rsi1, rsi1, rsi1, lengthStoch), smoothK) d = sma(k, smoothD) // Bollinger Band length = input(20,title = 'BB lookback length', minval=1) mult = input(2.0, minval=0.001, maxval=50, title="StdDev") basis = sma(src, length) dev = mult * stdev(src, length) upper = basis + dev lower = basis - dev BBval = (src - basis)/dev*30+50 offset = input(0, title = "Offset", type = input.integer, minval = -500, maxval = 500) mix=(d + BBval)/2 //plot //plot(k, "K", color=#606060) plot(BBval, "BBval", color=#872323, offset = offset) plot(d, "D", color=#FF6A00) h0 = hline(80, "Upper Band", color=#606060) h1 = hline(20, "Lower Band", color=#606060) plot(mix, "MIX", color=#888888, linewidth=3) //background MIX bgcolor(mix < 20 ? color.green : color.white, transp=50) bgcolor(mix > 80 ? color.red : color.white, transp=50) // Choosing the date range fromMonth = input(defval = 1, title = "From Month", type = input.integer, minval = 1, maxval = 12) fromDay = input(defval = 1, title = "From Day", type = input.integer, minval = 1, maxval = 31) fromYear = input(defval = 2020, title = "From Year", type = input.integer, minval = 1970) toMonth = input(defval = 1, title = "To Month", type = input.integer, minval = 1, maxval = 12) toDay = input(defval = 1, title = "To Day", type = input.integer, minval = 1, maxval = 31) toYear = input(defval = 2112, title = "To Year", type = input.integer, minval = 1970) start = timestamp(fromYear, fromMonth, fromDay, 00, 00) // backtest start window finish = timestamp(toYear, toMonth, toDay, 23, 59) // backtest finish window window() => true // Initializing the strategy paraeters P = input(defval = 1, title = 'Amount (P)' , type = input.integer, minval = 1, maxval = 100) X = input(defval = 2, title = '% Price drop for consecutive entries(X)', type = input.float, minval = 1, maxval = 100) B_tp = input(defval = 10, title = '% Level for Take Profit (B)', type = input.float , minval = 1, maxval = 100) D_sl = input(defval = 10, title = '% Level for Stop Loss (D)', type = input.float, minval = 1, maxval = 100) A = input(defval = 5, title = 'Max consecutive entries (A)', type = input.integer, minval = 2, maxval = 20) Z = input(defval = 0.5, title = 'Z', type = input.float , minval = 0, maxval = 10) // Declaring key DCA variables entry_price = 0.0 entry_price := na(entry_price[1]) ? na : entry_price[1] new_entry = 0.0 consec_entryCondition = false // Implementing the strategy longEntry = crossover(mix,20) exitLongs = crossunder(mix, 80) if(longEntry) entry_price := close strategy.entry('main_LE', strategy.long , P, when = window() and longEntry) // Exiting conditions stoploss = strategy.position_avg_price*(1-(D_sl/100)) takeprofit = strategy.position_avg_price*(1+(B_tp/100)) slCondition = crossunder(close, stoploss) tpCondition = crossover(close, takeprofit) // We want to exit if the 'mix' indicator crosses 80, take profit is attained or stop loss is tagged. exitConditions = exitLongs or slCondition or tpCondition // Consecutive entries upto A times // strategy.risk.max_intraday_filled_orders(A) //Dollar-Cost-Averaging // Enter long whenever price goes down X%: amount set to (P+Y)*Z newAmount = (P+X)*Z // If we haven't reached max open trades, buy newAmount immediately price crosses under X% lower the previous entry price new_entry := entry_price - ((X/100)*entry_price) consec_entryCondition := crossunder(close, new_entry) if(consec_entryCondition and strategy.opentrades != A) strategy.entry('consec_LE', strategy.long, newAmount, oca_name = 'consecLongs', when = window() and consec_entryCondition) entry_price := close // Exiting // The main trade is closed only when the main exit conditions are satisfied strategy.close('main_LE', comment = 'Main Long Closed', when = window() and exitConditions) // A consective long is closed only when tp or sl is tagged strategy.exit('ext a consec', 'consec_LE', loss = D_sl*strategy.position_avg_price , profit = B_tp*strategy.position_avg_price, oca_name = 'consecLongs')