Cette stratégie est basée sur deux indicateurs bien connus: le MACD et la force relative (RS). En les couplant, nous obtenons des signaux d'achat puissants. En fait, la particularité de cette stratégie est qu'elle crée un indicateur à partir d'un indicateur. Ainsi, nous construisons un MACD dont la source est la valeur du RS. La stratégie ne prend que des signaux d'achat, ignorant les signaux de vente car ils sont principalement des perdants. Il existe également une méthode de gestion de l'argent qui nous permet de réinvestir une partie des profits ou de réduire la taille des ordres en cas de pertes substantielles.
RS est un indicateur qui mesure l'anomalie entre l'élan et l'hypothèse d'efficacité du marché. Il est utilisé par les professionnels et est l'un des indicateurs les plus robustes. L'idée est de posséder des actifs qui font mieux que la moyenne, en fonction de leur performance passée. Nous calculons RS en utilisant cette formule:
RS = Prix actuel / Prix le plus élevé au cours de la période de RS
Nous pouvons ainsi situer le prix actuel par rapport à son prix le plus élevé sur cette période définie par l'utilisateur.
Le MACD est l'un des indicateurs les plus connus, mesurant la distance entre deux moyennes mobiles exponentielles: l'une rapide et l'autre plus lente. Une distance large indique une dynamique rapide et vice versa. Nous tracerons la valeur de cette distance et appellerons cette ligne macdline. Le MACD utilise une troisième moyenne mobile avec une période inférieure aux deux premières. Cette dernière moyenne mobile donnera un signal lorsqu'elle traverse la macdline. Elle est donc construite en utilisant les valeurs de la macdline comme source.
Il est important de noter que les deux premières MAs sont construites en utilisant les valeurs RS comme source. Nous venons donc de construire un indicateur d'un indicateur.
Cette stratégie combine deux indicateurs individuellement très puissants: MACD et RS. MACD est capable de capturer les tendances à court terme et les changements de momentum tandis que RS reflète la robustesse des tendances à moyen et long terme.
En outre, la stratégie est très unique en dérivant le MACD de l'indicateur RS, renforçant de manière créative l'effet de la stratégie.
Enfin, la stratégie comporte des mécanismes de gestion des risques et de stop loss qui contrôlent efficacement les risques et limitent les pertes par transaction.
Le plus grand risque de cette stratégie est la possibilité que les indicateurs RS et MACD donnent de mauvais signaux. Même si les deux indicateurs sont robustes, aucun indicateur technique ne peut prédire à 100% l'avenir et les signaux peuvent parfois échouer.
Pour réduire les risques, les paramètres de RS et MACD peuvent être ajustés pour mieux s'adapter à des instruments de trading spécifiques et à des environnements de marché.
Tout d'abord, testez quel marché (par exemple, actions, forex, crypto, etc.) donne le meilleur effet de cette stratégie, puis concentrez-vous sur cet actif optimal.
Deuxièmement, essayez d'utiliser des algorithmes d'apprentissage automatique pour optimiser automatiquement les paramètres RS et MACD au lieu de les fixer manuellement.
Troisièmement, envisager d'intégrer d'autres indicateurs pour établir des signaux de négociation, en formant un modèle multifactoriel pour améliorer la précision du signal.
Cette stratégie exploite les indicateurs MACD et RS de manière synergique pour fournir de forts signaux d'achat. Sa nouveauté réside dans la dérivation du MACD de l'indicateur RS, réalisant un couplage entre les indicateurs pour améliorer l'efficacité. La stratégie dispose de mécanismes d'entrée, de stop loss et de gestion de l'argent clairs qui contrôlent efficacement les risques. Les prochaines étapes pourraient être d'améliorer davantage la stratégie via l'optimisation des paramètres, le raffinement de la génération de signaux, l'ajout d'autres facteurs, 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)