
Основная идея этой стратегии заключается в том, чтобы наращивать позиции в динамике системных сигналов, постепенно создавая позиции в бычьем рынке, чтобы контролировать риск и получить более низкую среднюю цену входа.
Сначала в стратегии устанавливается стартовый капитал и процентная конфигурация DCA. При закрытии каждой K-линии он рассчитывает процентную конфигурацию, скорректированную в зависимости от изменения цены. Если цена повышается, он снижает процентную конфигурацию; если цена падает, он увеличивает процентную конфигурацию.
Таким образом, он может контролировать риск и получать более низкую среднюю цену входа в случае колебаний рынка. В то же время он также будет статистически оценивать среднюю цену входа и среднюю цену, чтобы определить текущую ситуацию входа.
Эта стратегия имеет следующие преимущества:
Можно динамически наращивать позиции, увеличивая позиции при падении рынка, уменьшая позиции при росте рынка, таким образом, контролируя риск.
Получение средней цены за вход ниже средней цены, что способствует получению более высоких доходов.
Поскольку рыночная активность в Китае в основном зависит от рыночных показателей, в этом случае рыночная активность в Китае в основном зависит от рыночных показателей.
Можно заранее задать стартовый капитал и процент DCA, контролировать количество капитала при каждом пополнении и избегать чрезмерного риска.
Для того, чтобы оценить, насколько хорош или плох билет, можно использовать статистику средней и средней цены на билеты.
Однако эта стратегия несет в себе определенные риски:
В случае краха рынка, эта стратегия будет продолжать наращивать позиции, что может привести к значительным потерям средств. Можно установить стоп-лосс, чтобы контролировать риск.
В случае быстрого роста рынка, прибавка к риску в этой стратегии снижается, и большая часть возможностей для роста может быть упущена. В этом случае необходимо использовать другие сигналы для быстрого LSI.
Неправильная настройка параметров также несет определенный риск. Слишком большие стартовые деньги и слишком высокий процент DCA могут увеличить убытки.
Эта стратегия также может быть оптимизирована в следующих аспектах:
Можно добавить логику остановки убытков, чтобы остановить наращивание позиций при резком падении.
Процент DCA может быть динамически скорректирован в зависимости от волатильности или других показателей.
Модели машинного обучения могут быть добавлены для прогнозирования ценовых изменений, что может помочь в принятии решений о повышении запаса.
В сочетании с другими техническими показателями можно определить структуру рынка, остановить наложение в момент структурного переворота.
Модуль управления капиталом может быть добавлен, чтобы динамически корректировать сумму каждого депозита в зависимости от состояния средств на счету.
Эта стратегия является очень практичной динамической стратегией наращивания позиций. Она позволяет гибко корректировать позиции в зависимости от колебаний рынка, получая более низкую среднюю цену входа в бычьем рынке. В то же время она встроена в параметры, чтобы контролировать риск.
/*backtest
start: 2024-01-20 00:00:00
end: 2024-02-19 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © RWCS_LTD
//@version=5
strategy("DCA IN Calculator {RWCS}", overlay=true, pyramiding=999, default_qty_type=strategy.cash, initial_capital=10000, commission_value=0.02)
// User inputs
backtestStartDate = input(timestamp("1 Jan 2024"),
title="Start Date", group="Backtest Time Period",
tooltip="This start date is in the time zone of the exchange " +
"where the chart's instrument trades. It doesn't use the time " +
"zone of the chart or of your computer.")
start_date = true
starting_capital = input.float(defval=5000, title="Starting Capital")
dca_allocation_percentage = input.int(defval=10, title="DCA Allocation Percentage")
// Calculate DCA allocation based on price change
price_change_percentage = ((close - close[1]) / close[1]) * 100
adjusted_allocation_percentage = close > close[1] ? dca_allocation_percentage - price_change_percentage : dca_allocation_percentage + price_change_percentage // If price action is negative, increase allocations
adjusted_allocation_percentage1 = dca_allocation_percentage - price_change_percentage // If price action is positive, reduce allocations
// Calculate order size based on adjusted allocation percentage
order_size = (adjusted_allocation_percentage / 100) * starting_capital
// Track remaining capital
var remaining_capital = starting_capital
// Long on the close of every bar
if true
// Ensure the order size doesn't exceed remaining capital or adjusted allocation
order_size := math.min(order_size, remaining_capital, adjusted_allocation_percentage / 100 * starting_capital)
// Ensure order size is not negative
order_size := math.max(order_size, 0)
strategy.entry("DCA", strategy.long, qty = order_size)
remaining_capital := remaining_capital - order_size
// Plot average entry price
var float total_entry_price = 0.0
var int total_signals = 0
if start_date
total_entry_price := total_entry_price + close
total_signals := total_signals + 1
avg_entry_price = total_entry_price / total_signals
// Calculate and plot median price
var float median_price = na
if start_date
var float sum_prices = 0.0
var int num_prices = 0
for i = 0 to bar_index
if (time[i] >= backtestStartDate)
sum_prices := sum_prices + close[i]
num_prices := num_prices + 1
median_price := sum_prices / num_prices
// Reset variables at the start of each day
if (dayofweek != dayofweek[1])
total_entry_price := 0.0
total_signals := 0
//table colors
borders_col = color.new(color.black, 90)
top_row_col = color.new(color.gray, 90)
size = input.string(defval='Normal', options=['Tiny', 'Small', 'Normal', 'Large'], title='Table size', inline='design', group='Table Design')
table_size = size == 'Tiny' ? size.tiny : size == 'Small' ? size.small : size == 'Normal' ? size.normal : size == 'Large' ? size.large : na
var tablee = table.new(position=position.top_right, columns=2, rows=3, frame_color=borders_col, frame_width=4, border_color=borders_col, border_width=4)
table.cell(tablee, 0, 0, "Average Entry Price", bgcolor=top_row_col, text_color=color.white, text_size=table_size)
table.cell(tablee, 1, 0, str.tostring(avg_entry_price, '#.##'), text_color=color.white, text_size=table_size)
table.cell(tablee, 0, 1, "Median Price", bgcolor=top_row_col, text_color=color.white, text_size=table_size)
table.cell(tablee, 1, 1, str.tostring(median_price, '#.##'), text_color=color.white, text_size=table_size)
table.cell(tablee, 0, 2, "Remaining Capital", bgcolor=top_row_col, text_color=color.white, text_size=table_size)
table.cell(tablee, 1, 2, str.tostring(remaining_capital, '#.##'), text_color=color.white, text_size=table_size)