Эта стратегия является методом отсчета торгов с использованием принципа долларового расчета (DCA). После первоначального открытия позиции она может добавлять позиции в соответствии с установленными правилами процента отклонения от цены и количества пополнений. Кроме того, стратегия также включает в себя стратегию остановки и функцию отслеживания остановки.
Стратегия сначала открывает позицию в течение отсчетного времени, когда цена закрытия в тот же день превышает 0, а цена открытия является базовой ценой bo_level. Затем, если нет безопасных заказов (((), все возможные ордера на убыль помещаются на текущий столбик в зависимости от процента отклонения от установленной цены и количества пополнений. В частности, цена безопасных заказов будет основана на последней цене безопасных заказов.
На стадии хранения позиции, если количество позиций больше 0, то цена стоп-стопа будет рассчитываться на основе базовой цены и целевого стоп-процента. Если функция отслеживания стоп-стопа отключена, то используется эта фиксированная стоп-цена; в противном случае, максимальная цена, отслеживаемая стоп-стопом, будет постоянно обновляться на основе максимальной цены стоп-стопа, и соответственно корректировать цену стоп-стопа, чтобы реализовать отслеживание стоп-стопа.
Используя стратегию DCA, можно автоматически наращивать позиции после падения цены, снижать среднюю стоимость хранения позиции, хеджировать системный риск.
Поддержка настраиваемых параметров, гибкая конфигурация правил открытия и закрытия позиций в зависимости от разных видов и стилей торговли.
Встроенная функция отслеживания остановки, которая может автоматически регулировать положение остановки в зависимости от ситуации, чтобы предотвратить преждевременное срабатывание остановки.
Гибкая настройка параметров отслеживания позволяет легко тестировать данные для разных периодов времени и оценивать эффективность стратегии.
В сочетании с платформой 3commas, реальный робот может быть сконфигурирован непосредственно с помощью результатов обратной связи, без дополнительной разработки.
В DCA-стратегии присутствует риск набора позиций, если рыночная ситуация продолжит снижаться, то количество позиций будет увеличиваться и убытки будут увеличиваться. Требуется разумная конфигурация правил набора.
Фиксированный процентный стоп не может корректироваться в зависимости от колебаний рынка, может быть преждевременно остановлен или остановлен. Необходимо настроить отслеживание стопа.
Оценка рисков: существует риск соответствия, а эффективность реального диска зависит от таких факторов, как стоимость сделки.
Необходимо обратить внимание на системную стабильность бирж и 3commas, чтобы избежать неудач в реализации запланированных сделок.
В зависимости от динамики колебаний различных сортов, цены могут отклоняться от процентов, оптимизируя правила набора запасов.
В сочетании с показателями волатильности можно определить более научный стоп-процент.
В зависимости от разных торговых периодов конкретного сорта, можно установить разумное время отсчета.
Можно ввести стратегию остановки убытков и выйти из нее при крупных убытках.
Можно использовать алгоритмы машинного обучения для динамической оптимизации параметров стратегии.
В целом, эта стратегия является очень практичной 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)