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