Coordonner la stratégie d'arrêt des pertes par glissement

Auteur:ChaoZhang est là., Date: 2023-11-02 16h28:55 Je vous en prie.
Les étiquettes:

img

Résumé

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.

La logique de la stratégie

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.

Analyse des avantages

Les avantages de cette stratégie:

  1. L'indicateur stochastique RSI identifie efficacement les tendances et les situations de surachat/survente.

  2. Le taux de variation des prix filtre le marché en dehors de la fourchette pour éviter de faux signaux.

  3. L'arrêt-perte coordonné par glissement peut garantir des bénéfices dans la plus grande mesure tout en contrôlant le risque.

  4. La stratégie a une grande marge d'optimisation pour l'ajustement des paramètres basé sur différents produits.

  5. La logique de la stratégie est simple et claire, facile à comprendre et à mettre en œuvre.

Analyse des risques

Les risques de cette stratégie:

  1. Le RSI stochastique peut générer de faux signaux, nécessite une confirmation avec d'autres facteurs.

  2. L'arrêt des pertes coordonnées peut être trop agressif, il pourrait être arrêté par des lacunes du jour au lendemain.

  3. L'inversion à court terme peut déclencher un stop loss.

  4. Les paramètres doivent être optimisés pour différents produits, sinon les performances peuvent être médiocres.

  5. 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.

Directions d'optimisation

La stratégie peut être encore optimisée dans les aspects suivants:

  1. Optimiser les paramètres stochastiques du RSI pour réduire les faux signaux.

  2. Optimiser le taux de changement des paramètres de prix pour améliorer l'effet de filtrage.

  3. Ajoutez un indicateur de tendance pour éviter d'être arrêté par des renversements, comme les moyennes mobiles.

  4. Optimiser le pourcentage de stop loss pour réduire le risque d'être pris au piège.

  5. 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.

  6. Tester les paramètres sur différents produits pour améliorer l'adaptabilité.

Résumé

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)

Plus de