Cette stratégie utilise l'indicateur RSI stochastique et le taux de variation des prix pour identifier la direction de la tendance pour l'entrée et coordonner le stop loss glissant pour la gestion des risques.
Tout d'abord, la stratégie calcule le RSI stochastique en utilisant l'indicateur RSI de longueur 5 et l'indicateur stochastique de longueur 7.
Deuxièmement, la stratégie calcule le taux de variation des prix de l'indicateur EMA ROC. Lorsque le taux de variation des prix de l'EMA ROC est supérieur à la moitié du seuil ou inférieur à la moitié négative du seuil, elle identifie un mouvement actif des prix.
Ensuite, en combinant les signaux du RSI stochastique et le taux de variation des prix, il identifie la direction de la tendance.
Enfin, la stratégie utilise un stop loss coordonné pour gérer les risques. Après l'ouverture de la position, elle continue à actualiser le prix le plus élevé / le plus bas et utilise un certain pourcentage de distance du prix le plus élevé / le plus bas comme niveau de stop loss.
Les avantages de cette stratégie:
L'indicateur stochastique RSI identifie efficacement les tendances et les situations de surachat/survente.
Le taux de variation des prix filtre le marché en dehors de la fourchette pour éviter de faux signaux.
L'arrêt-perte coordonné par glissement peut garantir des bénéfices dans la plus grande mesure tout en contrôlant le risque.
La stratégie a une grande marge d'optimisation pour l'ajustement des paramètres basé sur différents produits.
La logique de la stratégie est simple et claire, facile à comprendre et à mettre en œuvre.
Les risques de cette stratégie:
Le RSI stochastique peut générer de faux signaux, nécessite une confirmation avec d'autres facteurs.
L'arrêt des pertes coordonnées peut être trop agressif, il pourrait être arrêté par des lacunes du jour au lendemain.
L'inversion à court terme peut déclencher un stop loss.
Les paramètres doivent être optimisés pour différents produits, sinon les performances peuvent être médiocres.
Le coût de négociation a une incidence sur la rentabilité de la stratégie, une fréquence de négociation raisonnable est nécessaire.
La stratégie peut être encore optimisée dans les aspects suivants:
Optimiser les paramètres stochastiques du RSI pour réduire les faux signaux.
Optimiser le taux de changement des paramètres de prix pour améliorer l'effet de filtrage.
Ajoutez un indicateur de tendance pour éviter d'être arrêté par des renversements, comme les moyennes mobiles.
Optimiser le pourcentage de stop loss pour réduire le risque d'être pris au piège.
Ajoutez la gestion de la taille des positions pour contrôler le risque d'une seule transaction, comme le montant fixe du stop loss ou ajustez dynamiquement la taille des positions en fonction du capital du compte.
Tester les paramètres sur différents produits pour améliorer l'adaptabilité.
En résumé, cette stratégie a une logique claire et simple, identifie la direction de la tendance avec le RSI stochastique et filtre les signaux avec le taux de variation des prix, ce qui peut capturer efficacement les tendances à moyen et long terme. Coordonner les verrous de stop-loss glissants dans les bénéfices et contrôler le risque. Avec une optimisation supplémentaire, cette stratégie peut devenir une tendance très pratique suivant la stratégie.
/*backtest start: 2023-10-02 00:00:00 end: 2023-11-01 00:00:00 period: 2h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy("Sto2", overlay=false, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.0) /////////////// Time Frame /////////////// testStartYear = input(2017, "Backtest Start Year") testStartMonth = input(1, "Backtest Start Month") testStartDay = input(1, "Backtest Start Day") testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0) testStopYear = input(2019, "Backtest Stop Year") testStopMonth = input(12, "Backtest Stop Month") testStopDay = input(31, "Backtest Stop Day") testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0) testPeriod() => true ///////////// Stochastic calc ///////////// smoothK = input(1, minval=1) smoothD = input(7, minval=1) lengthRSI = input(5, minval=1) lengthStoch = input(7, minval=1) src = input(close, title="RSI Source") up = sma(max(change(src), 0), lengthRSI) down = sma(-min(change(src), 0), lengthRSI) rsi1 = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down)) k = sma(stoch(rsi1, rsi1, rsi1, lengthStoch), smoothK) d = sma(k, smoothD) ///////////// Rate Of Change ///////////// source = close, roclength = input(14, minval=1), pcntChange = input(2, minval=1) roc = 100 * (source - source[roclength]) / source[roclength] emaroc = ema(roc, roclength / 2) isMoving() => emaroc > (pcntChange / 2) or emaroc < (0 - (pcntChange / 2)) /////////////// STRATEGY /////////////// long = k > d and isMoving() short = k < d and isMoving() last_long = 0.0 last_short = 0.0 last_long := long ? time : nz(last_long[1]) last_short := short ? time : nz(last_short[1]) long_signal = crossover(last_long, last_short) short_signal = crossover(last_short, last_long) last_open_long_signal = 0.0 last_open_short_signal = 0.0 last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1]) last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1]) last_long_signal = 0.0 last_short_signal = 0.0 last_long_signal := long_signal ? time : nz(last_long_signal[1]) last_short_signal := short_signal ? time : nz(last_short_signal[1]) in_long_signal = last_long_signal > last_short_signal in_short_signal = last_short_signal > last_long_signal last_high = 0.0 last_low = 0.0 last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1]) last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1]) sl_inp = input(2.0, title='Stop Loss %') / 100 tp_inp = input(9.0, title='Take Profit %') / 100 take_level_l = strategy.position_avg_price * (1 + tp_inp) take_level_s = strategy.position_avg_price * (1 - tp_inp) since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) // LONG SL since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) // SHORT SL slLong = in_long_signal ? strategy.position_avg_price * (1 - sl_inp) : na slShort = strategy.position_avg_price * (1 + sl_inp) long_sl = in_long_signal ? slLong : na short_sl = in_short_signal ? slShort : na // Strategy if testPeriod() strategy.entry("Long Entry", strategy.long, when=long) strategy.entry("Short Entry", strategy.short, when=short) strategy.exit("Long Ex", "Long Entry", stop=long_sl, limit=take_level_l, when=since_longEntry > 0) strategy.exit("Short Ex", "Short Entry", stop=short_sl, limit=take_level_s, when=since_shortEntry > 0) ///////////// Plotting ///////////// bgcolor(isMoving() ? long ? color.green : short ? color.red : na : color.white, transp=80) p1 = plot(k, color=color.gray, linewidth=0) p2 = plot(d, color=color.gray, linewidth=0) h0 = hline(100) h1 = hline(50) h3 = hline(0) fill(p1, p2, color = k > d ? color.lime : color.red, transp=70)