Esta estrategia se basa en dos indicadores bien conocidos: MACD y Relative Strength (RS). Al acoplarlos, obtenemos poderosas señales de compra. De hecho, la característica especial de esta estrategia es que crea un indicador a partir de un indicador. Por lo tanto, construimos un MACD cuya fuente es el valor del RS. La estrategia solo toma señales de compra, ignorando las señales de venta ya que en su mayoría son perdedoras. También hay un método de gestión de dinero que nos permite reinvertir parte de las ganancias o reducir el tamaño de las órdenes en caso de pérdidas sustanciales.
RS es un indicador que mide la anomalía entre el impulso y la suposición de la eficiencia del mercado. Es utilizado por profesionales y es uno de los indicadores más robustos. La idea es poseer activos que funcionan mejor que el promedio, basados en su rendimiento pasado.
RS = Precio actual / máximo máximo durante el período de duración de RS
Por lo tanto, podemos situar el precio actual en relación con su precio más alto durante este período definido por el usuario.
El MACD es uno de los indicadores más conocidos, que mide la distancia entre dos promedios móviles exponenciales: uno rápido y otro más lento. Una distancia ancha indica un impulso rápido y viceversa. Trazaremos el valor de esta distancia y llamaremos a esta línea macdline. El MACD utiliza un tercer promedio móvil con un período menor que los dos primeros. Este último promedio móvil dará una señal cuando cruce la macdline. Por lo tanto, se construye utilizando los valores de la macdline como su fuente.
Es importante tener en cuenta que los dos primeros MAs se construyen utilizando los valores de RS como su fuente. Así que acabamos de construir un indicador de un indicador. Este tipo de método es muy poderoso porque rara vez se utiliza y aporta valor a la estrategia.
Esta estrategia combina dos indicadores muy potentes: MACD y RS. MACD es capaz de capturar tendencias a corto plazo y cambios de impulso, mientras que RS refleja la robustez de las tendencias a mediano y largo plazo.
Además, la estrategia es muy única al derivar el MACD del indicador RS, mejorando creativamente el efecto de la estrategia.
Por último, la estrategia cuenta con mecanismos de gestión de riesgos y stop loss que controlan eficazmente los riesgos y limitan las pérdidas por operación.
El mayor riesgo de esta estrategia es la posibilidad de que los indicadores RS y MACD den señales erróneas. A pesar de que ambos indicadores son robustos, ningún indicador técnico puede predecir el futuro al 100% y las señales pueden fallar ocasionalmente. Además, el propio RS está sesgado hacia el juicio de tendencias a mediano y largo plazo y puede producir señales engañosas en el corto plazo.
Para reducir los riesgos, los parámetros de RS y MACD se pueden ajustar para adaptarse mejor a instrumentos comerciales específicos y entornos de mercado. También, se puede imponer un rango de stop loss más estricto.
En primer lugar, probar qué mercado (por ejemplo, acciones, divisas, criptomonedas, etc.) da el mejor efecto de esta estrategia, y luego centrarse en ese activo óptimo.
En segundo lugar, tratar de utilizar algoritmos de aprendizaje automático para optimizar automáticamente los parámetros de RS y MACD en lugar de fijarlos manualmente.
En tercer lugar, considerar la incorporación de otros indicadores para establecer señales comerciales, formando un modelo multifactor para mejorar la precisión de la señal.
Esta estrategia aprovecha los indicadores MACD y RS sinérgicamente para suministrar fuertes señales de compra. Su novedad radica en derivar el MACD del indicador RS, realizando el acoplamiento entre los indicadores para mejorar la eficacia. La estrategia tiene mecanismos claros de entrada, stop loss y gestión de dinero que controlan los riesgos de manera efectiva. Los próximos pasos podrían ser mejorar aún más la estrategia a través de la optimización de parámetros, refinar la generación de señales, agregar otros factores, etc.
/*backtest start: 2022-12-14 00:00:00 end: 2023-12-20 00:00:00 period: 1d basePeriod: 1h 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/ // © gsanson66 //This strategy calculates the Relative Strength and plot the MACD of this Relative Strenght //We take only buy signals send by MACD //@version=5 strategy("MACD OF RELATIVE STRENGHT STRATEGY", shorttitle="MACD RS STRATEGY", precision=4, overlay=false, initial_capital=1000, default_qty_type=strategy.cash, default_qty_value=950, commission_type=strategy.commission.percent, commission_value=0.18, slippage=3) //------------------------------TOOL TIPS--------------------------------// t1 = "Relative Strength length i.e. number of candles back to find the highest high and compare the current price with this high." t2 = "Relative Strength fast EMA length used to plot the MACD." t3 = "Relative Strength slow EMA length used to plot the MACD." t4 = "Macdline SMA length used to plot the MACD." t5 = "The maximum loss a trade can incur (in percentage of the trade value)" t6 = "Each gain or losse (relative to the previous reference) in an amount equal to this fixed ratio will change quantity of orders." t7 = "The amount of money to be added to or subtracted from orders once the fixed ratio has been reached." //----------------------------------------FUNCTIONS---------------------------------------// //@function Displays text passed to `txt` when called. debugLabel(txt, color, loc) => label.new(bar_index, loc, text=txt, color=color, style=label.style_label_lower_right, textcolor=color.black, size=size.small) //@function which looks if the close date of the current bar falls inside the date range inBacktestPeriod(start, end) => (time >= start) and (time <= end) //---------------------------------------USER INPUTS--------------------------------------// //Technical parameters rs_lenght = input.int(defval=300, minval=1, title="RS Length", group="Technical parameters", tooltip=t1) fast_length = input(title="MACD Fast Length", defval=14, group="Technical parameters", tooltip=t2) slow_length = input(title="MACD Slow Length", defval=26, group="Technical parameters", tooltip=t3) signal_length = input.int(title="MACD Signal Smoothing", minval=1, maxval=50, defval=10, group="Technical parameters", tooltip=t4) //Risk Management slMax = input.float(8, "Max risk per trade (in %)", minval=0, group="Risk Management", tooltip=t5) //Money Management fixedRatio = input.int(defval=400, minval=1, title="Fixed Ratio Value ($)", group="Money Management", tooltip=t6) increasingOrderAmount = input.int(defval=200, minval=1, title="Increasing Order Amount ($)", group="Money Management", tooltip=t7) //Backtesting period startDate = input(title="Start Date", defval=timestamp("1 Jan 2020 00:00:00"), group="Backtesting Period") endDate = input(title="End Date", defval=timestamp("1 July 2024 00:00:00"), group="Backtesting Period") //----------------------------------VARIABLES INITIALISATION-----------------------------// strategy.initial_capital = 50000 //Relative Strenght Calculation rs = close/ta.highest(high, rs_lenght) //MACD of RS Calculation [macdLine, signalLine, histLine] = ta.macd(rs, fast_length, slow_length, signal_length) //Money management equity = math.abs(strategy.equity - strategy.openprofit) var float capital_ref = strategy.initial_capital var float cashOrder = strategy.initial_capital * 0.95 //Backtesting period bool inRange = na //------------------------------CHECKING SOME CONDITIONS ON EACH SCRIPT EXECUTION-------------------------------// //Checking if the date belong to the range inRange := true //Checking performances of the strategy if equity > capital_ref + fixedRatio spread = (equity - capital_ref)/fixedRatio nb_level = int(spread) increasingOrder = nb_level * increasingOrderAmount cashOrder := cashOrder + increasingOrder capital_ref := capital_ref + nb_level*fixedRatio if equity < capital_ref - fixedRatio spread = (capital_ref - equity)/fixedRatio nb_level = int(spread) decreasingOrder = nb_level * increasingOrderAmount cashOrder := cashOrder - decreasingOrder capital_ref := capital_ref - nb_level*fixedRatio //Checking if we close all trades in case where we exit the backtesting period if strategy.position_size!=0 and not inRange strategy.close_all() debugLabel("END OF BACKTESTING PERIOD : we close the trade", color=color.rgb(116, 116, 116), loc=macdLine) //-----------------------------------EXIT SIGNAL------------------------------// if strategy.position_size>0 and histLine<0 strategy.close("Long") //-------------------------------BUY CONDITION-------------------------------------// if histLine>0 and not (strategy.position_size>0) and inRange qty = cashOrder/close stopLoss = close*(1-slMax/100) strategy.entry("Long", strategy.long, qty) strategy.exit("Exit Long", "Long", stop=stopLoss) //---------------------------------PLOTTING ELEMENT----------------------------------// hline(0, "Zero Line", color=color.new(#787B86, 50)) plot(macdLine, title="MACD", color=color.blue) plot(signalLine, title="Signal", color=color.orange) plot(histLine, title="Histogram", style=plot.style_columns, color=(histLine>=0 ? (histLine[1] < histLine ? #26A69A : #B2DFDB) : (histLine[1] < histLine ? #FFCDD2 : #FF5252))) plotchar(rs, "Relative Strenght", "", location.top, color=color.yellow)