Stratégie du DCA Bot

Auteur:ChaoZhang est là., Date: le 26 février 2023
Les étiquettes:

Résumé

Il s'agit d'une stratégie de backtesting sur le mécanisme de moyenne de coût en dollars (DCA) pour évoluer dans les positions après l'entrée initiale. Il peut ajouter à la position en fonction du pourcentage d'écart de prix prédéfini et des règles de pyramide. La stratégie comprend également des fonctions de prise de profit et de prise de profit.

La logique de la stratégie

La stratégie ouvre d'abord une position longue au prix de clôture une fois qu'il est supérieur à 0 dans le délai de test. Ce prix d'entrée est enregistré comme le prix de base bo_level. Il place ensuite tous les ordres de sortie possibles sur la bougie en cours si aucun ordre de sécurité (donc) n'existe. Plus précisément, le prix de l'ordre de sécurité est calculé sur la base du dernier prix de l'ordre de sécurité latest_so_level et de l'échelle d'étape de l'ordre de sécurité safe_order_step_scale. Cela boucle jusqu'à ce que le nombre maximal d'ordres de sécurité max_safe_order soit atteint.

Lors de la détention de positions, si la taille de la position est supérieure à 0, le prix de prise de profit take_profit_level est calculé en fonction du prix de base et du pourcentage de prise de profit cible. Si la prise de profit de suivi est désactivée, ce prix de prise de profit fixe est utilisé. Sinon, le prix le plus élevé ttp_max est mis à jour en fonction du niveau de la bougie pour suivre le prix de prise de profit pour la prise de profit de suivi.

Analyse des avantages

  • Utilise le mécanisme DCA pour mesurer les coûts à la baisse lorsque les prix baissent, couvrant les risques systémiques.

  • Prend en charge des paramètres personnalisables pour une configuration flexible des règles d'entrée et de stratégie de prise de profit pour différents actifs et styles de négociation.

  • A des fonctions de suivi intégrées pour ajuster automatiquement le bénéfice basé sur l'action des prix, évitant ainsi un déclenchement prématuré du bénéfice.

  • Des paramètres de backtest flexibles permettent de tester facilement des données sur différents délais pour évaluer les performances de la stratégie.

  • Peut configurer directement les robots en direct sur 3commas en utilisant les résultats des backtests sans codage supplémentaire.

Analyse des risques

  • DCA risque d'augmenter encore ses positions et ses pertes si le marché continue à baisser.

  • Les bénéfices à pourcentage fixe ne pouvant pas s'adapter à la volatilité du marché, risquent une sortie prématurée ou tardive.

  • Le risque de surentraînement au test de retour, les performances en direct affectées par les coûts de transaction, etc. Une évaluation appropriée est requise.

  • Risque de stabilité de la plateforme, exécution ratée.

Directions d'optimisation

  • Ajustez dynamiquement l'écart de prix en fonction de la volatilité des différents actifs pour optimiser les règles de pyramide.

  • Incorporer des indicateurs de volatilité pour déterminer un pourcentage de profit plus scientifique.

  • Définir un calendrier raisonnable de backtest basé sur les sessions de négociation d'actifs spécifiques.

  • Introduire un stop loss pour réduire les pertes lorsque la position est en baisse significative.

  • Utiliser l'apprentissage automatique pour optimiser dynamiquement les paramètres.

Conclusion

Dans l'ensemble, il s'agit d'un backtester DCA très pratique. Il prend en charge une grande personnalisation pour les règles d'entrée et de prise de profit. Le trailing take profit complète également bien le fixed take profit. Les paramètres de backtest flexibles permettent de tester différents actifs et délais. Avec un réglage approprié des paramètres, cette stratégie peut donner d'excellents résultats pour les actifs à haute opportunité en couvrant les risques systémiques avec DCA. Mais des risques tels que le pyramide et le take profit doivent être surveillés dans le trading en direct, ainsi que la stabilité de la plateforme. D'autres optimisations telles que les paramètres dynamiques, le stop loss peuvent en faire un bot de trading DCA extrêmement puissant.


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

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © rouxam

// Author: rouxam
// Inspired by the original work of ericlin0122

//@version=4
// strategy("Backtesting 3commas DCA Bot", overlay=true, pyramiding=99, process_orders_on_close=true, commission_type=strategy.commission.percent, commission_value=0.1)

// Strategy Inputs
price_deviation         = input(1.0, type=input.float,  title='Price deviation to open safety orders (%)', minval=0.0, step=0.1)/100
take_profit             = input(1.0, type=input.float,  title='Target Take Profit (%)', minval=0.0, step=0.1)/100
ttp                     = input(0.5, type=input.float,  title='Trailing Take Profit (%) [0 = Disabled]', minval=0.0, step=0.1)/100
base_order              = input(10.0, type=input.float, title='base order') 
safe_order              = input(20.0, type=input.float, title='safe order') 
safe_order_volume_scale = input(2.0, type=input.float,  title='Safety order volume scale', step=0.1) 
safe_order_step_scale   = input(1.5, type=input.float,  title='Safety order step scale', step=0.1) 
max_safe_order          = input(5,                      title='Max safe order', minval=1, maxval=99, step=1) 

// Date Inputs
from_month = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
from_day   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
from_year  = input(defval = 2021, title = "From Year")
to_month   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
to_day     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
to_year    = input(defval = 9999, title = "To Year")
start  = timestamp(from_year, from_month, from_day, 00, 00)  // backtest start window
finish = timestamp(to_year, to_month, to_day, 23, 59)        // backtest finish window
window = time >= start and time <= finish ? true : false // create function "within window of time"

var bo_level = 0.0
var latest_so_level = 0.0
var next_so_level = 0.0
var ttp_active = false
var ttp_max = 0.0
var ttp_level = 0.0
var take_profit_level = 0.0

if strategy.position_size <= 0.0
    ttp_max := 0.0
    ttp_active := false


// First Position
if(strategy.opentrades == 0 and window and close > 0)
    // Place Buy Order ASAP
    bo_level := open
    strategy.entry("BO", limit=bo_level, long=strategy.long, qty=base_order/bo_level)
    latest_so_level := open

// Dollar Cost Averaging
place_safety_orders = latest_so_level == bo_level
if place_safety_orders
    // Placing all possible exit orders on that candle
    for i = 1 to max_safe_order
        next_so_level := latest_so_level * (1 - price_deviation * pow(safe_order_step_scale,  i - 1))
        so_name = "SO" + tostring(i) 
        strategy.entry(so_name, long=strategy.long, limit=next_so_level, qty=safe_order * pow(safe_order_volume_scale, i - 1)/next_so_level)
        latest_so_level := next_so_level

// Take Profit
if strategy.position_size > 0
    take_profit_level := strategy.position_avg_price * (1 + take_profit)
    if ttp <= 0.0
        // No trailing take profit
        strategy.exit(id="TP", limit=take_profit_level)
    else
        // Trailing take profit
        if take_profit_level <= close
            ttp_max := max(high, ttp_max)
            ttp_active := true
        if ttp_active 
            // Update exit order
            ttp_level := ttp_max * (1 - ttp)
            strategy.exit(id="TTP", stop=ttp_level)


Plus de