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