Stratégie de suivi de la dynamique des prix

Auteur:ChaoZhang est là., Date: 2023-11-27 à 11h45
Les étiquettes:

img

Résumé

Cette stratégie calcule l'élan du prix pour déterminer la direction de la tendance et définit des arrêts de suivi bidirectionnels pour verrouiller les profits, réalisant un stop-loss suivant la tendance.

La logique de la stratégie

Il calcule l'élan du prix de 12 périodes, et calcule ensuite l'élan du momentum de 1 période. Lorsque l'élan rapide (l'élan du momentum du prix de 1 période) est supérieur à 0, il va long. Quand il est inférieur à 0, il va court. Cela juge le changement de direction de l'élan du prix pour déterminer la tendance du prix.

Il définit la distance d'arrêt de suivi et le niveau d'activation. La distance d'arrêt de suivi fait référence à l'ajustement de l'arrêt à une distance spécifiée du plus haut ou du plus bas dernier lorsque le prix atteint de nouveaux sommets ou de nouveaux bas. Le niveau d'activation signifie que l'arrêt de suivi ne commence qu'après avoir atteint un certain ratio de profit.

La stratégie bloque les bénéfices en suivant le prix le plus élevé ou le prix le plus bas, en envoyant des ordres de fermeture lorsque le prix se retire au-delà de la distance d'arrêt définie.

Analyse des avantages

  1. La double détermination de l'élan juge avec précision la direction de la tendance, réduit les transactions et évite d'être piégé.

  2. Une distance de freinage flexible réduit les risques et les bénéfices.

  3. Le niveau d'activation empêche le stop loss prématuré en permettant le trailing seulement après que l'objectif de profit ait été atteint.

  4. Les arrêts bidirectionnels contrôlent de manière complète les risques pour les longs et les courts.

  5. Calcul simple et efficace, facile à comprendre et à mettre en œuvre.

Analyse des risques

  1. Le double momentum peut générer des signaux inverses, nécessitant un filtre de tendance.

  2. Une distance d'arrêt excessive peut entraîner des pertes importantes.

  3. Un niveau d'activation élevé risque de manquer les opportunités d'arrêt.

  4. Plus de tests de paramètres et d'optimisation sont nécessaires pour trouver des arrêts optimaux.

Peut réduire les faux signaux par le jugement de tendance et l'optimisation des paramètres. Testez sur différents produits et ensembles de paramètres pour trouver la meilleure configuration.

Directions d'optimisation

  1. Combiner la reconnaissance de la structure du marché pour la tendance, en évitant les échanges inversés.

  2. Ajoutez plus de conditions de chronométrage comme des changements de volume, appuyez sur les interruptions pour améliorer la précision du signal.

  3. Optimiser les paramètres en testant différentes distances d'arrêt et niveaux d'activation.

  4. Considérez un arrêt dynamique suivant la volatilité du marché.

  5. Mettez des arrêts partiels ou en mouvement pour un meilleur contrôle des risques.

Conclusion

La stratégie a une structure claire, jugeant la tendance avec une double dynamique et verrouillant les bénéfices avec des arrêts de suivi flexibles, contrôlant efficacement les risques de trading.


/*backtest
start: 2023-01-01 00:00:00
end: 2023-02-03 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Trailing Stop Snippet", overlay=true)

length = input(12)
price = close
momentum(seria, length) =>
	mom = seria - seria[length]
	mom
mom0 = momentum(price, length)
mom1 = momentum( mom0, 1)

tsact = input.float(0.0, "Trailing Stop Activation |", group="strategy", tooltip="Activates the Trailing Stop once this PnL is reached.") / 100
tsact := tsact ? tsact : na
ts = input.float(0.0, "Position Trailing Stop |", group="strategy", tooltip="Trails your position with a stop loss at this distance from the highest PnL") / 100
ts := ts ? ts : na

in_long = strategy.position_size > 0
in_short = strategy.position_size < 0

var ts_ = array.new_float()
ts_size = array.size(ts_)
ts_get = ts_size > 0 ? array.get(ts_, ts_size - 1) : 0

if in_long
    if tsact and high > strategy.position_avg_price + strategy.position_avg_price * tsact
        if ts_size > 0 and ts_get < high
            array.push(ts_, high)
        if ts_size < 1
            array.push(ts_, high)
    if not tsact
        if ts_size > 0 and ts_get < high
            array.push(ts_, high)
        if ts_size < 1
            array.push(ts_, high)
if in_short
    if tsact and low < strategy.position_avg_price - strategy.position_avg_price * tsact
        if ts_size > 0 and ts_get > low
            array.push(ts_, low)
        if ts_size < 1
            array.push(ts_, low)
    if not tsact
        if ts_size > 0 and ts_get > low
            array.push(ts_, low)
        if ts_size < 1
            array.push(ts_, low)
    
trail = in_long and ts_size > 0 ? low < ts_get - ts_get * ts : in_short and ts_size > 0 ? high > ts_get + ts_get * ts : na

if (mom0 > 0 and mom1 > 0)
	strategy.entry("MomLE", strategy.long, stop=high+syminfo.mintick, comment="MomLE")
else
	strategy.cancel("MomLE")
if (mom0 < 0 and mom1 < 0)
	strategy.entry("MomSE", strategy.short, stop=low-syminfo.mintick, comment="MomSE")
else
	strategy.cancel("MomSE")

tsClose = in_long ? ts_get - ts_get * ts : in_short ? ts_get + ts_get * ts : na
if trail    
    strategy.close_all()
if not strategy.opentrades
	array.clear(ts_)

//plot(strategy.equity, title="equity", color=color.red, linewidth=2, style=plot.style_areabr)

plotchar(ts_get, "GET", "")
plot(strategy.position_avg_price > 0 ? strategy.position_avg_price : na, "Average", color.rgb(251, 139, 64), 2, plot.style_cross)
plot(tsClose > 0 ? tsClose : na, "Trailing", color.rgb(251, 64, 64), 2, plot.style_cross)
plot(strategy.position_avg_price - strategy.position_avg_price * tsact > 0 ? strategy.position_avg_price - strategy.position_avg_price * tsact : na, "TS Activation", color.fuchsia, 2, plot.style_cross)

Plus de