Dies ist eine Backtesting-Strategie auf dem Dollar-Kosten-Durchschnittsmechanismus (DCA), um nach dem ersten Eintrag in Positionen zu skalieren.
Die Strategie eröffnet zunächst eine Long-Position zum Schlusskurs, sobald er innerhalb des Backtest-Zeitrahmens über 0 liegt. Dieser Einstiegspreis wird als Basispreis bo_level aufgezeichnet. Es werden dann alle möglichen Exit-Orders auf der aktuellen Kerze platziert, wenn keine Safety-Orders (so) vorhanden sind. Insbesondere wird der Safety-Order-Preis auf der Grundlage des letzten Safety-Order-Preises latest_so_level und der Safety-Order-Schrittskala safe_order_step_scale berechnet. Dies läuft bis zur Erreichung der maximalen Safety-Order-Zählung max_safe_order.
Bei Halten von Positionen, wenn die Positionsgröße größer als 0 ist, wird der Take-Profit-Preis take_profit_level auf der Grundlage des Basispreises und des Ziel-Take-Profit-Prozentsatzes berechnet. Wenn der nachfolgende Take-Profit deaktiviert ist, wird dieser feste Take-Profit-Preis verwendet. Andernfalls wird der höchste Preis ttp_max basierend auf dem Kerzenhoch aktualisiert, um den Take-Profit-Preis für den nachfolgende Take-Profit zu verfolgen.
Verwendet den DCA-Mechanismus, um bei Preisrückgängen die durchschnittliche Kostenbasis zu ermitteln, um systemische Risiken abzusichern.
Unterstützt anpassbare Parameter für eine flexible Konfiguration der Einstiegsregeln und Gewinnstrategie für verschiedene Vermögenswerte und Handelsstile.
Es verfügt über eingebaute Trailing-Take-Profit-Funktionen zur automatischen Anpassung des Take-Profits basierend auf der Kursentwicklung, wodurch ein vorzeitiger Take-Profit-Trigger vermieden wird.
Flexible Einstellungen für Backtest-Parameter ermöglichen das Testen verschiedener Zeitrahmendaten, um die Strategieleistung leicht zu bewerten.
Kann live-Bots direkt auf 3 Kommas mit Backtest-Ergebnissen ohne zusätzliche Codierung konfigurieren.
DCA droht, Positionen und Verluste weiter zu erhöhen, wenn der Markt weiter rückläufig ist.
Festes Prozentsatz-Gewinn, der sich nicht an die Marktvolatilität anpassen kann, Risiken eines vorzeitigen oder späten Ausstiegs.
Backtest-Risiko, Live-Leistung, die von Transaktionskosten beeinflusst wird usw. Eine ordnungsgemäße Bewertung ist erforderlich.
Die Plattformstabilität ist gefährdet, die Ausführung fehlgeschlagen.
Dynamische Anpassung der Preisabweichung anhand der Volatilität verschiedener Vermögenswerte zur Optimierung der Pyramidenregeln.
Einbeziehung von Volatilitätsindikatoren zur Bestimmung wissenschaftlicheren Gewinnprozentsatzes.
Festlegen eines angemessenen Zeitrahmens für Backtests auf der Grundlage von Handelssitzungen mit bestimmten Vermögenswerten.
Einführung eines Stop Loss zur Verlustminderung bei einer deutlichen Abwärtsposition.
Nutzen Sie maschinelles Lernen, um Parameter dynamisch zu optimieren.
Insgesamt ist dies ein sehr praktischer DCA-Backtester. Er unterstützt eine große Anpassung an die Ein- und Gewinnregeln. Der Trailing Take Profit ergänzt auch den festen Take Profit gut. Flexible Backtestparameter ermöglichen das Testen verschiedener Vermögenswerte und Zeitrahmen. Mit der richtigen Parameter-Ausrichtung kann diese Strategie durch Absicherung von systemischen Risiken mit DCA ausgezeichnete Ergebnisse für hochrangige Vermögenswerte liefern. Allerdings sollten Risiken wie Pyramiden und Take Profit im Live-Handel sowie die Stabilität der Plattform beachtet werden. Weitere Optimierungen wie dynamische Parameter, Stop Loss können dies zu einem extrem leistungsstarken DCA-Handelsbot machen.
/*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)