Stratégie de test de retour PB SAR avec stop loss élastique

Auteur:ChaoZhang est là., Date: 2023-10-11 15h22 et 26h
Les étiquettes:

Résumé

La stratégie est basée sur des indicateurs de stop-loss souples, la mise en place de signaux d'achat et de vente, les opérations de long et de court.

Le principe

Cette stratégie utilise principalement des indicateurs d'arrêt élastiques pour identifier les points tournants de la tendance et effectuer des opérations d'inversion. L'indicateur utilise des indicateurs de plage réelle pour identifier les prix extrêmes, et considère que les prix dépassant le seuil peuvent être considérés comme des ruptures anormales et déterminer la possibilité d'un renversement de la tendance. Plus précisément, l'indicateur maintient deux variables à l'intérieur: le prix extrême (EP) et le prix de déclenchement (TP).

Dans une tendance haussière, lorsque le prix est supérieur à l'EP, il est défini comme une rupture anormale, lorsque l'EP est renouvelé en tant que prix le plus élevé et le TP en tant que prix le plus bas. Lorsque le prix est inférieur au TP, il est défini comme un renversement de tendance, ce qui génère un signal de vente. Dans une tendance baissière, le principe est similaire.

La stratégie est combinée à un mécanisme de suivi des arrêts de perte qui, lorsqu'une position est ouverte, suit en temps réel le prix optimal de l'arrêt de perte pour contrôler les risques tout en garantissant une rentabilité. Plus précisément, après avoir fait plus, la ligne d'arrêt de perte suit les bas de clôture; après avoir fait plus, la ligne d'arrêt de perte suit le haut de clôture.

Les avantages

La stratégie présente les avantages suivants:

  1. Les indicateurs sont utilisés pour identifier les points d'inversion des tendances et ne sont pas faciles à piéger.

  2. Le mécanisme de suivi des arrêts de perte peut bloquer les bénéfices et éviter que les pertes ne s'intensifient.

  3. Les paramètres de l'indicateur sont simples et faciles à mettre en œuvre.

  4. Les signaux de vente et d'achat peuvent être configurés pour faciliter l'utilisation.

  5. Il est possible de configurer des cycles de réévaluation flexibles pour une évaluation complète de l'efficacité de la stratégie.

Le risque

La stratégie comporte également des risques:

  1. L'indicateur est en retard et peut manquer le point idéal pour inverser la tendance.

  2. Les pertes sont trop radicales et peuvent être compensées par des fluctuations de prix à court terme.

  3. Les cycles de réévaluation sont mal choisis et ne permettent pas d'évaluer pleinement l'efficacité de la stratégie.

  4. Il est important de se concentrer sur l'impact des coûts de transaction sur les bénéfices.

Les risques peuvent être optimisés par les éléments suivants:

  1. Les paramètres de l'indicateur ont été ajustés pour réduire le retard.

  2. Optimisez les algorithmes de stop-loss pour éviter d'être pris au piège.

  3. Choisissez les cycles de réévaluation appropriés pour assurer la fiabilité.

  4. Optimiser la gestion des positions et réduire les coûts de transaction.

Optimisation

La stratégie peut être optimisée pour:

  1. En combinaison avec les indicateurs de tendance, il est possible d'éviter que les transactions inversées ne soient couvertes.

  2. Optimiser les algorithmes de gestion des positions, tels que les positions à taux fixe, les positions dynamiques, etc.

  3. Il y a aussi des outils pour filtrer les volumes et éviter les erreurs de transaction causées par les lacunes.

  4. Optimisez les paramètres pour trouver la meilleure combinaison.

  5. Il est important de suivre une stratégie d'arrêt de la tendance et d'arrêter la tendance en temps opportun.

  6. Optimisez votre stratégie de stop-loss pour qu'elle soit plus fluide. Vous pouvez essayer des algorithmes de stop-loss comme Chandelier Exit.

  7. Optimiser la variété des transactions, les délais, etc. pour améliorer l'adaptabilité de la stratégie.

  8. L'ajout d'algorithmes d'apprentissage automatique rend les stratégies plus adaptables.

Résumé

Cette stratégie est globalement simple et fiable, elle identifie les points d'inversion à l'aide d'indicateurs d'arrêt souples et est équipée d'un mécanisme d'arrêt de suivi pour contrôler les risques. Elle peut être utilisée comme stratégie d'inversion à courte portée.

Résumé

Cette stratégie est basée sur l'indicateur SAR parabolique pour générer des signaux d'achat et de vente pour les positions longues et courtes.

Principe

Le noyau de cette stratégie est d'identifier les points d'inversion de tendance à l'aide de l'indicateur SAR parabolique pour le contre-trend. L'indicateur utilise la plage réelle pour détecter les prix extrêmes. Lorsque le prix dépasse l'extrême, il est considéré comme une rupture et un signe d'inversion de tendance potentielle.

Dans une tendance à la hausse, lorsque le prix est supérieur à l'EP, il est considéré comme une rupture. L'EP est ensuite mis à jour au prix le plus élevé et le TP au prix le plus bas. Lorsque le prix tombe en dessous du TP, un renversement de tendance est identifié et un signal de vente est généré. Le même principe s'applique à une tendance à la baisse.

La stratégie intègre également un mécanisme de stop loss de trailing. Après avoir ouvert une position, il suivra le prix de stop loss optimal en temps réel, en bloquant les profits tout en contrôlant les risques. Plus précisément, après une entrée longue, le stop loss suit le bas de clôture; après une entrée courte, il suit le haut de clôture.

Les avantages

Les principaux avantages de cette stratégie sont les suivants:

  1. Identifiez les points d'inversion de tendance avec l'indicateur, en évitant d'être pris au piège des tendances.

  2. Le suivi des arrêts de perte bloque les bénéfices et empêche des pertes plus importantes.

  3. Paramètres d'indicateur simples, faciles à mettre en œuvre.

  4. Alertes de signaux d'achat/de vente configurables pour plus de commodité.

  5. Configuration de la période de backtest flexible pour une évaluation approfondie.

Les risques

Il y a aussi quelques risques à prendre en considération:

  1. Le décalage de l'indicateur peut manquer les points d'inversion optimaux.

  2. Les arrêts agressifs peuvent être arrêtés par des fluctuations à court terme.

  3. Une mauvaise sélection de la période de backtest ne peut pas évaluer pleinement la stratégie.

  4. Les coûts de transaction peuvent nuire aux bénéfices.

Voici quelques moyens de lutter contre les risques:

  1. Optimisez les paramètres pour réduire le retard.

  2. Améliorer l'algorithme de stop loss pour éviter d'être arrêté inutilement.

  3. Sélectionnez des périodes de rétro-essai appropriées pour la fiabilité.

  4. Optimiser la taille des positions pour réduire les coûts de transaction.

Amélioration

Quelques moyens d'optimiser davantage la stratégie:

  1. Incorporer des indicateurs de tendance tels que l'AM pour éviter d'être pris au piège des contre-tendances.

  2. Optimiser les algorithmes de dimensionnement de la position, par exemple les algorithmes fractionnaires fixes et dynamiques.

  3. Ajoutez un filtre de volume pour éviter les faux signaux provenant de lacunes.

  4. Optimisation des paramètres pour trouver des combinaisons optimales.

  5. Mettre en œuvre des stratégies de prise de bénéfices pour verrouiller les bénéfices dans les tendances.

  6. Améliorer les algorithmes de stop-loss pour des arrêts plus fluides.

  7. Optimiser les produits, les délais, etc. pour améliorer l'adaptabilité.

  8. Incorporer l'apprentissage automatique pour une plus grande adaptabilité.

Résumé

En résumé, il s'agit d'une stratégie simple et robuste utilisant le SAR parabolique pour identifier les renversements et les arrêts de perte pour contrôler le risque. Il peut fonctionner comme une stratégie de renversement moyen à court terme.


/*backtest
start: 2023-09-10 00:00:00
end: 2023-10-10 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("PB SAR BackTest - Colorbar", overlay=false)

// Full credit to Sawcruhteez, Lucid Investment Strategies LLC, Casey Bowman and Peter Brandt.
// This is a strategy version of the Peterbolic SAR indicator created by the above-mentioned parties.
// Original version of the indicator: https://www.tradingview.com/script/6nYrH3Vm-Peterbolic-SAR/

// SAR #1
// Lucid Sar
// Branded under the name "Lucid SAR"
// as agreed to with Lucid Investment Strategies LLC on July 9, 2019
// https://lucidinvestmentstrategies.com/
// see branch "lucid"

// SAR #2
// Peterbolic Sar
// Using the name "Peterbolic SAR"
// as agreed to by Peter Brandt on October 2, 2019
// - https://twitter.com/PeterLBrandt/status/1179365590668075008
// in response to request from Sawcruhteez
// - https://twitter.com/Sawcruhteez/status/1179213105705836544
// Sawcruhteez gives credit to @CrazyGabey for coming up with the name
// - https://twitter.com/Sawcruhteez/status/1179213196583940097
// see branch "peterbolic"

// SAR #3
// Sawcruhteez Sar
// Branded under the name "Sawcruhteez SAR"
// as agreed to with Sawcruhteez on September 11, 2019
// see branch "sawcruhteez"

// Open Source on github
// https://github.com/casey-bowman/sar/blob/peterbolic/peterbolic.pine

// Created by Casey Bowman on July 4, 2019

// MIT License

// Copyright (c) 2019 Casey Bowman

// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:

// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.



TSR() =>

    // start with uptrend
    var uptrend = true
    var EP = high       // extreme price - high or low depending on trend
    var SP = low        // setup price
    var TP = float(na)  // trigger price


    var setup   = low
    var trigger = float(na)

    if barstate.isnew
        setup := low
        trigger = float(na)

    extreme_candle = false
    first_extreme_candle = false
    setup_candle = false
    trigger_candle = false

    waiting_for_setup = false
    waiting_for_trigger = false

    var since_extreme = 0
    var since_setup = 0

    waiting_for_setup   := not extreme_candle and not na(SP)
    waiting_for_trigger := not na(TP)

    if not barstate.isfirst
        if barstate.isnew and extreme_candle[1]
            trigger := float(na)
        if barstate.isnew and setup_candle[1]
            setup := float(na)
        if barstate.isnew and waiting_for_trigger
            since_setup := since_setup + 1
            trigger := TP
        if barstate.isnew and waiting_for_setup
            since_extreme := since_extreme + 1
            setup := SP
        if uptrend

            if extreme_candle
                EP := high
                SP := low
            else
                if high > EP
                    extreme_candle := true
                    EP := high
                    SP := low
                    since_extreme := 0
                    since_setup   := 0
                else
                    if waiting_for_setup
                        if barstate.isconfirmed
                            if close < SP
                                setup_candle := true
                                SP := float(na)
                                TP := low
            if waiting_for_trigger
                if low < TP
                    trigger_candle := true
                    extreme_candle := true
                    EP := low
                    SP := high
                    TP := float(na)
                    uptrend := false
                    since_extreme := 0
                    since_setup := 0
                else
                    if barstate.isconfirmed and extreme_candle
                        TP := float(na)
                        trigger := float(na)

        else
            if extreme_candle
                EP := low
                SP := high
            else
                if low <  EP
                    extreme_candle := true
                    EP := low
                    SP := high
                    since_extreme := 0
                    since_setup   := 0
                else
                    if waiting_for_setup
                        if barstate.isconfirmed
                            if close > SP
                                setup_candle := true
                                SP := float(na)
                                TP := high
            if waiting_for_trigger
                if high > TP
                    trigger_candle := true
                    extreme_candle := true
                    EP := high
                    SP := low
                    TP := float(na)
                    uptrend := true
                    since_extreme := 0
                    since_setup := 0
                else
                    if barstate.isconfirmed and extreme_candle
                        TP := float(na)
                        trigger := float(na)


    [trigger_candle, trigger, since_setup, setup_candle, setup, since_extreme, extreme_candle, uptrend]


[TC, T, SS, SC, S, SE, EC, up] = TSR()

// Make input options that configure backtest date range
StartMonth = input(title="Start Month", type=input.integer,
     defval=1, minval=1, maxval=12)
StartDate = input(title="Start Date", type=input.integer,
     defval=1, minval=1, maxval=31)
StartYear = input(title="Start Year", type=input.integer,
     defval=(2019), minval=1800, maxval=2100)

EndMonth = input(title="End Month", type=input.integer,
     defval=1, minval=1, maxval=12)
EndDate = input(title="End Date", type=input.integer,
     defval=1, minval=1, maxval=31)
EndYear = input(title="End Year", type=input.integer,
     defval=(2020), minval=1800, maxval=2100)
     
// Look if the close time of the current bar falls inside the date range
inDateRange = true

buytrigger = (TC and up)
selltrigger = (TC and not up)
buysetup = (SC and not up)
sellsetup = (SC and up)

IntBuy = buytrigger ? 1 : 0
IntSB = buysetup ? 0.5 : 0

IntSell= selltrigger ? -1 : 0
IntSS = sellsetup ? -0.5 : 0

bgcolor = buytrigger ? color.green : selltrigger ? color.red : buysetup ? color.yellow : sellsetup ? color.orange : color.black
trans = buytrigger ? 20 : selltrigger ? 20 : 100

bgcolor(bgcolor, 30)

NUM = IntBuy + IntSB + IntSell + IntSS
linecolor = color.orange
plot(NUM, color=linecolor, linewidth=2)

alertcondition(NUM > 0.5, title="Buy Signal", message="Buy Alert")
alertcondition(NUM < -0.5, title="Sell Signal", message="Sell Alert")

alertcondition(NUM == 0.5, title="Buy Setup", message="Buy Setup")
alertcondition(NUM == -0.5, title="Sell Setup", message="Sell Setup")

//Switch on for strategy moves

if(inDateRange and buytrigger)
    strategy.exit("SHORT", "SHORT_SL", comment="Short_Exit")
    strategy.entry("LONG", strategy.long, comment="")
if(inDateRange and selltrigger)
    strategy.exit("LONG", "LONG_SL", comment="Long_Exit")
    strategy.entry("SHORT", strategy.short, comment="")
if (not inDateRange)
    strategy.close_all()

// plotshape(SC and not up, color = color.yellow, style = shape.triangleup, location = location.belowbar, size = size.auto, transp = 0, title = "Setup to Buy")
// plotshape(TC and up, color = color.green, style = shape.triangleup, location = location.belowbar, size = size.auto, title = "Trigger to Buy")
// plotshape(SC and up, color = color.yellow, style = shape.triangledown, location = location.abovebar, size = size.auto, transp = 0, title = "Setup to Sell")
// plotshape(TC and not up, color = color.red, style = shape.triangledown, location = location.abovebar, size = size.auto, title = "Trigger to Sell")


Plus de