L'idée de base de cette stratégie est de déterminer la fourchette de prix actuelle en combinant des indicateurs RSI de différents cycles, et de prendre des actions d'achat ou de vente correspondantes dans des cycles plus petits lorsqu'il y a une rupture dans un RSI de cycle plus grand.
Les principales étapes de cette stratégie pour déterminer la fourchette de prix et trouver des opportunités commerciales sont les suivantes:
Par exemple, lorsque le RSI quotidien dépasse son niveau le plus élevé précédent, nous jugeons qu'il s'agit actuellement d'un marché haussier. Et lorsque le RSI quotidien dépasse son niveau le plus bas précédent, nous le jugeons comme un marché baissier. Dans les deux cas, nous prenons des actions longues et courtes respectivement dans le graphique de 5 minutes.
Comparée aux stratégies traditionnelles axées sur une seule période, cette stratégie présente les avantages suivants:
Une évaluation plus précise de la valeur relative actuelle des prix. Des cycles plus longs comme le quotidien peuvent filtrer le bruit du marché à court terme et déterminer la tendance globale et la zone de valeur.
La combinaison d'indicateurs à travers les périodes améliore la fiabilité du signal.
Une grande rupture de cycle indique la direction générale, alors que nous n'avons qu'à localiser des opportunités dans de petits cycles comme 5 minutes pour profiter.
La combinaison des périodes croisées permet d'éviter d'être pris au piège.
Les principaux risques liés à cette stratégie sont les suivants:
Un mauvais jugement dans les indicateurs de grands cycles. Une détermination inefficace de la zone de valeur dans le RSI quotidien, etc., peut entraîner des signaux défectueux. Un réglage des paramètres du RSI est nécessaire pour améliorer la précision.
La différence entre les mouvements de prix de petits cycles et la détermination de grands cycles. Parfois, les mouvements à court terme contrecarrent les tendances globales. Nous devons définir un stop loss approprié pour contrôler la perte.
Une gestion du risque inappropriée. Des pertes excessives dans le commerce unique dues à une mauvaise dimensionnement des positions pourraient entraîner un retrait irrécupérable. Des règles de dimensionnement raisonnables doivent être mises en œuvre.
Il reste encore beaucoup à faire pour améliorer cette stratégie, principalement en ce qui concerne les aspects suivants:
Testez plus de combinaisons de périodes pour trouver les paramètres optimaux.
Ajustez les paramètres RSI lookback etc. pour améliorer la précision du jugement.
Ajoutez plus d'indicateurs comme MA pour aider à juger de la direction de la tendance.
Améliorer le mécanisme d'arrêt des pertes, ajuster dynamiquement les points d'arrêt des pertes en fonction des conditions de retrait.
Optimiser les règles de taille des positions, gérer plus scientifiquement les positions spécifiques pour chaque transaction.
Cette stratégie réalise l'arbitrage de période croisée entre différentes dimensions de temps en évaluant la condition haussière dans les RSI de période croisée. Une telle idée de jugement de période croisée mérite une exploitation plus poussée. Nous pouvons continuer à l'améliorer via l'ajustement des paramètres, l'optimisation des stops de perte, les combinaisons d'indicateurs pour la rendre plus avantageuse. Dans l'ensemble, cette stratégie a une idée unique et un énorme potentiel à améliorer.
/*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)