Die Strategie ist eine Rückmeldungsprozedur, die Dollar-Kosten-Averaging (DCA) -Prinzipien verwendet, um Lagerhaltungsgeschäfte zu tätigen. Sie kann nach der ersten Eröffnung der Position zusätzliche Positionen gemäß den festgelegten Preis-Abweichungs-Prozentsätzen und der Anzahl der Lagerhaltungs-Regeln hinzufügen. Die Strategie enthält auch die Stop-Off-Strategie und die Tracking-Stop-Funktion.
Die Strategie eröffnet zunächst innerhalb des Rückmesszeitfensters, sobald der Schlusskurs am Tag größer als 0 ist, sofort eine Position, wobei der Eröffnungspreis als Basispreis bo_level gilt. Wenn dann kein sicheres Auftrag (((so) vorhanden ist, werden alle möglichen stillen Orders auf der Basis des festgelegten Preisanteils und der Anzahl der Auflagen auf den aktuellen Teller gestellt.
In der Haltephase wird der Stop-Price berechnet, wenn die Position größer als 0 ist. Wenn die Stop-Price-Tracking-Funktion ausgeschaltet ist, wird dieser Fix-Stop-Price verwendet. Andernfalls wird der Stop-Price-Tracking-Stop-Price auf Basis der höchsten Stop-Price-Tracking-Funktion fortlaufend aktualisiert.
Die DCA-Strategie kann automatisch nach einem Preisverfall aufgenommen werden, um die durchschnittlichen Haltekosten zu senken und das Systemrisiko abzudecken.
Unterstützung für benutzerdefinierte Parameter, flexible Konfiguration von Aufnahme- und Ausstiegsregeln und -strategien für verschiedene Sorten und Handelsstile.
Die eingebaute Stop-Tracking-Funktion kann die Stop-Position automatisch anpassen, um zu verhindern, dass der Stopp zu früh ausgelöst wird.
Die flexiblen Einstellungen der Rückmessparameter ermöglichen es, Daten aus verschiedenen Zeiträumen zu testen und die Wirksamkeit der Strategie zu bewerten.
In Kombination mit der 3commas-Plattform kann der Roboter direkt mit den Rückmeldungen konfiguriert werden, ohne dass zusätzliche Entwicklung erforderlich ist.
Die DCA-Strategie birgt die Gefahr, dass die Positionen weiter erhöht und die Verluste erhöht werden, wenn die Marktlage weiter sinkt.
Die festgelegte Prozentsatz-Stoppschwelle kann nicht an Marktbewegungen angepasst werden, was zu einem vorzeitigen Stopp oder einem vorzeitigen Ausstieg führen kann. Es ist erforderlich, die Stoppschwelle zu verfolgen.
Es wird angenommen, dass ein Anpassungsrisiko besteht, wobei die Wirksamkeit der Festplatte von Faktoren wie den Transaktionskosten beeinflusst wird. Eine Risikobewertung ist erforderlich.
Die Systemstabilität der Börsen und der 3commas muss beachtet werden, um zu vermeiden, dass die geplanten Transaktionen fehlschlagen.
Der Preis kann dynamisch an die Schwankungen der verschiedenen Sorten angepasst werden, um die Preise prozentual zu korrigieren und die Regeln für die Aufstockung zu optimieren.
Der Stopp-Prozentsatz kann in Kombination mit der Schwankungsrate bestimmt werden.
Es kann eine angemessene Zeitfenster für die Rückverfolgung festgelegt werden, die sich von der jeweiligen Sorte abhängig ist.
Es kann eine Stop-Loss-Strategie eingeführt werden, um bei einem erheblichen Verlust auszusteigen.
Die Strategie kann mit einem Algorithmus für maschinelles Lernen kombiniert werden, um die Parameter dynamisch zu optimieren.
Insgesamt ist die Strategie eine sehr praktische DCA-Retestmethode. Sie unterstützt gute, benutzerdefinierte Parameter-Einstellungen und kann Positionseröffnungs- und Stop-Off-Regeln flexibel konfigurieren. Die eingebaute Stop-Off-Funktion kompensiert die Mängel der festen Stop-Off. Die Retestmethode ist auch sehr flexibel und kann die Daten für verschiedene Sorten und Zeiträume testen.
/*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)