Стратегия бота DCA

Автор:Чао Чжан, Дата: 2023-09-26 17:28:27
Тэги:

Обзор

Это стратегия обратного тестирования на механизме средней стоимости доллара (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)


Больше