La idea central de esta estrategia es determinar el rango de precios actual combinando indicadores de RSI de diferentes ciclos, y tomar acciones de compra o venta correspondientes en ciclos más pequeños cuando hay una ruptura en un RSI de ciclo más grande.
Los principales pasos para esta estrategia para determinar el rango de precios y encontrar oportunidades comerciales son:
Por ejemplo, cuando el RSI diario rompe su máximo anterior, juzgamos que actualmente es un mercado alcista. Y cuando el RSI diario se rompe por debajo de su mínimo anterior, lo juzgamos como un mercado bajista. En ambos casos tomamos acciones largas y cortas respectivamente en el gráfico de 5 minutos.
En comparación con las estrategias tradicionales que sólo se centran en un período, esta estrategia tiene las siguientes ventajas:
Una evaluación más precisa del valor relativo actual de los precios. Los ciclos más largos como los diarios pueden filtrar el ruido del mercado a corto plazo y determinar la tendencia general y el área de valor.
La combinación de indicadores a través de períodos mejora la confiabilidad de la señal.
Una gran ruptura de ciclo señala la dirección general, mientras que solo necesitamos localizar oportunidades en ciclos pequeños como 5 minutos para obtener ganancias.
La combinación de períodos cruzados ayuda a evitar quedar atrapados. Podemos salir rápidamente cuando los grandes indicadores del ciclo comienzan a revertirse.
Los principales riesgos de esta estrategia consisten en:
Un juicio erróneo en indicadores de ciclos grandes. La determinación ineficaz del área de valor en el RSI diario, etc., puede conducir a señales defectuosas. Se necesita ajuste de parámetros del RSI para mejorar la precisión.
Divergencia entre el movimiento de precios de ciclos pequeños y la determinación de ciclos grandes. A veces los movimientos a corto plazo contrarrestan las tendencias generales. Necesitamos establecer un stop loss adecuado para controlar la pérdida.
La gestión inadecuada del riesgo. Las pérdidas excesivas en el comercio único debidas a una mala calificación de las posiciones podrían conducir a una reducción irrecuperable.
La estrategia sigue teniendo mucho que mejorar, principalmente en los siguientes aspectos:
Prueba más combinaciones de períodos para encontrar parámetros óptimos.
Ajuste de parámetros de RSI para mejorar la precisión del juicio.
Añadir más indicadores. Traer más indicadores como MA para ayudar a juzgar la dirección de la tendencia.
Mejorar el mecanismo de stop loss. Ajustar dinámicamente los puntos de stop loss basados en las condiciones de extracción.
Optimizar las reglas de posicionamiento y gestionar los tamaños de posiciones específicas para cada operación de manera más científica.
Esta estrategia realiza el arbitraje de período cruzado entre diferentes dimensiones de tiempo mediante la evaluación de la condición alcista en los RSI de período cruzado. Esta idea de juicio de período cruzado merece una mayor explotación. Podemos seguir mejorándola a través de ajuste de parámetros, optimización de pérdidas de parada, combinaciones de indicadores para que sea más ventajosa. En general, esta estrategia tiene una idea única y un gran potencial para ser mejorada.
/*backtest start: 2022-12-05 00:00:00 end: 2023-12-11 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 strategy("Swing MTF", shorttitle="Swing MTF", overlay=false, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, initial_capital = 10000, slippage = 5) // otf_period = input(defval=2, title="Look Back Period (2nd Timeframe)") otf = input(defval="180", title="Second Momentum Timeframe") // Function to dectect a new bar is_newbar(res) => t = time(res) change(t) != 0 ? true : false // Check how many bars are in our upper timeframe since_new_bar = barssince(is_newbar(otf)) otf_total_bars = na otf_total_bars := since_new_bar == 0 ? since_new_bar[1] : otf_total_bars[1] //Calculate RSI Values ctf_rsi = rsi(open, otf_period) breakline=input(title="Breaks in lines", defval = true, type=bool) so = request.security(syminfo.tickerid, otf, rsi(open, otf_period)) sc = request.security(syminfo.tickerid, otf, rsi(close, otf_period)) final_otf_so = na final_otf_so := barstate.isrealtime ? since_new_bar == otf_total_bars ? so : final_otf_so[1] : so final_otf_sc = na final_otf_sc := barstate.isrealtime ? since_new_bar == otf_total_bars ? sc : final_otf_sc[1] : sc barsback = input(11, title='Bars back to check for a swing') // showsig = input(false, title='Show Signal Markers') swing_detection(index)=> swing_high = false swing_low = false start = (index*2) - 1 // -1 so we have an even number of swing_point_high = final_otf_so[index] swing_point_low = final_otf_sc[index] //Swing Highs for i = 0 to start swing_high := true if i < index if final_otf_so[i] > swing_point_high swing_high := false break // Have to do checks before pivot and after seperately because we can get // two highs of the same value in a row. Notice the > and >= difference if i > index if final_otf_so[i] >= swing_point_high swing_high := false break //Swing lows for i = 0 to start swing_low := true if i < index if final_otf_sc[i] < swing_point_low swing_low := false break // Have to do checks before pivot and after seperately because we can get // two lows of the same value in a row. Notice the > and >= difference if i > index if final_otf_sc[i] <= swing_point_low swing_low := false break [swing_high, swing_low] // Check for a swing [swing_high, swing_low] = swing_detection(barsback) long = final_otf_so > final_otf_sc short = final_otf_so < final_otf_sc if swing_low and long strategy.entry("My Long Entry Id", strategy.long) if swing_high and short strategy.entry("My Short Entry Id", strategy.short)