Это стратегия обратного тестирования на механизме средней стоимости доллара (DCA) для масштабирования позиций после первоначального входа. Она может добавлять к позиции на основе заранее установленного процента отклонения цены и правил пирамиды. Стратегия также включает функции получения прибыли и отслеживания прибыли.
Стратегия сначала открывает длинную позицию по цене закрытия, как только она превышает 0 в течение временного периода обратного теста. Эта цена входа записывается как базовая цена bo_level. Затем она размещает все возможные ордера на выход на текущей свечи, если нет ордеров безопасности (так) существуют. В частности, цена ордера безопасности рассчитывается на основе последней цены ордера безопасности latest_so_level и шкалы шагов безопасности order safe_order_step_scale. Это цикл, пока не будет достигнут максимальный номер ордера безопасности count_maxsafe_order.
При удержании позиций, если размер позиции больше 0, цена take profit take_profit_level рассчитывается на основе базовой цены и целевого процента take profit. Если отключено отслеживание take profit, используется эта фиксированная цена take profit. В противном случае, наибольшая цена ttp_max обновляется на основе свечи, чтобы отслеживать цену take profit для отслеживания take profit.
Использует механизм DCA для среднего снижения стоимости при падении цен, хеджируя системные риски.
Поддерживает настраиваемые параметры для гибкой конфигурации правил входа и стратегии получения прибыли для различных активов и стилей торговли.
Имеет встроенные функции отслеживания прибыли для автоматической корректировки прибыли на основе ценового действия, избегая преждевременного запуска прибыли.
Гибкие настройки параметров обратного теста позволяют легко оценивать эффективность стратегии, тестируя данные различных временных рамок.
Можно напрямую настроить живых ботов на 3комы с использованием результатов обратных тестов без дополнительного кодирования.
DCA рискует еще больше увеличить позиции и убытки, если рынок продолжит снижаться.
Фиксированная процентная прибыль не может адаптироваться к волатильности рынка, риски преждевременного или позднего выхода.
Риск перегрузки с помощью обратных тестов, эффективность на живом экране, влияющая на затраты на транзакции и т. д. Требуется правильная оценка.
Риски для стабильности платформы.
Динамически корректируйте отклонение цены на основе волатильности различных активов для оптимизации правил пирамиды.
Включить показатели волатильности для определения более научного процента прибыли.
Установите разумные временные рамки для обратного тестирования на основе торговых сессий конкретных активов.
Ввести стоп-лосс для сокращения потерь при значительном снижении позиции.
Используйте машинное обучение для динамической оптимизации параметров.
В целом это очень практичный DCA-бактэстер. Он поддерживает большую настройку правил входа и получения прибыли. Отслеживание прибыли также хорошо дополняет фиксированную прибыль. Гибкие параметры бэкстеста позволяют тестировать различные активы и временные рамки. При правильной настройке параметров эта стратегия может давать отличные результаты для активов с высокой возможностью путем хеджирования системных рисков с DCA. Но риски, такие как пирамидация и получение прибыли, следует следить за ними в режиме реального времени, наряду со стабильностью платформы. Дальнейшие оптимизации, такие как динамические параметры, стоп-лосс, могут сделать этот чрезвычайно мощный DCA-торговый бот.
/*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)