Динамическая стратегия построения позиции

Автор:Чао Чжан, Дата: 2024-02-20 14:16:30
Тэги:

img

Обзор

Основная идея этой стратегии заключается в динамическом построении позиции на основе системных сигналов на бычьем рынке для контроля рисков и получения более низкой средней входной цены.

Логика стратегии

Стратегия сначала устанавливает стартовый капитал и процент DCA. При закрытии каждого бара она рассчитывает скорректированный процент на основе изменения цены. Если цена растет, она снижает процент. Если цена падает, она увеличивает процент. Это позволяет добавлять к позиции по более низким ценам. Затем она рассчитывает размер ордера на основе скорректированного процента и оставшегося капитала. При закрытии каждого бара она размещает заказы на построение позиции, пока стартовый капитал не будет использован.

Таким образом, он может контролировать риски и получать более низкую среднюю цену входа во время колебаний цены.

Анализ преимуществ

Стратегия имеет следующие преимущества:

  1. Он может динамически масштабироваться в позиции, увеличивая распределение при падении и уменьшая распределение при подъеме для контроля рисков.

  2. Он получает более низкую среднюю входную цену по сравнению со средней ценой, что позволяет получить больший потенциал прибыли.

  3. Он подходит для бычьих рынков с волатильностью для улучшения коэффициента риска и прибыли.

  4. Он позволяет заранее установить стартовый капитал и процент DCA для контроля риска размещения позиций.

  5. Он предоставляет статистические данные о средней цене входа и средней цене для четкого определения качества входа.

Анализ рисков

Существуют также некоторые риски:

  1. В случае падения рынка, он будет продолжать увеличивать позицию, что приведет к большим потерям.

  2. Если цена быстро поднимается, скалирование уменьшится, возможно, пропустит большую часть ралли.

  3. Неправильная конфигурация параметров также представляет опасность: чрезмерный стартовый капитал и высокий процент DCA увеличат потери.

Руководство по оптимизации

Некоторые способы оптимизации стратегии:

  1. Добавьте логику стоп-лосса, чтобы прекратить масштабировать большие продажи.

  2. Динамически адаптировать процент DCA на основе волатильности или других показателей.

  3. Включить модели машинного обучения для прогнозирования цен и руководства решениями по масштабированию.

  4. Объединить другие показатели для выявления изменений структуры рынка для масштабирования точек выхода.

  5. Добавление правил управления капиталом к динамически размещаемым ордерам на основе значений счетов.

Заключение

Это очень практичная динамическая стратегия масштабирования позиций. Она гибко регулирует размер позиции на основе колебаний цен для достижения хороших средних входов на бычьих рынках, ограничивая при этом риск с помощью настраиваемых параметров. Сочетание ее с другими индикаторами или моделями может еще больше улучшить ее эффективность. Она подходит для инвесторов, ищущих долгосрочные прибыли.


/*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)



Больше