Динамическая стратегия DCA на основе объема

Автор:Чао Чжан, Дата: 2024-04-12 17:12:07
Тэги:QFLDCAТПSLATRADXЕМАSMAРСИMACD

img

Обзор

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

Принципы стратегии

  1. Используйте функцию ta.pivotlow() для определения последнего низкого уровня цены и обращайтесь с ним как с уровнем поддержки.
  2. Вычислить исторические проценты падения цен после прорыва уровня поддержки и взять медиану в качестве отсчета для безопасного расстояния и процента прибыли.
  3. Включает сигнал формирования позиции, когда цена проходит ниже уровня поддержки и относительный объем торгов больше установленного кратного.
  4. На основе установленного общего количества позиций, разделите общие фонды в равных пропорциях. Каждый раз, когда позиция создается, динамически корректируйте размер позиции на основе текущего количества позиций, достигая экспоненциального роста размера позиции.
  5. В процессе формирования позиций, если плавающий убыток достигает установленного порога, продолжается добавление позиций до достижения общего количества позиций.
  6. Когда цена поднимется до цены выигрыша, закрыть все позиции.

Преимущества стратегии

  1. Динамическая корректировка размера позиции: путем динамической корректировки размера каждой позиции на основе плавающего убытка во время снижения цены стратегия контролирует риск, а также обеспечивает большую прибыль при восстановлении цены.
  2. Установка параметров на основе исторических данных: путем расчета медианы исторических процентов падения цен после прорыва уровня поддержки и использования ее в качестве ориентира для безопасного расстояния и процента получения прибыли, параметры стратегии более тесно согласовываются с фактическими рыночными условиями.
  3. Ограничение общего количества позиций: путем установления общего количества позиций стратегия контролирует свою общую рисковую позицию и избегает чрезмерных потерь в результате чрезмерного позиционирования.

Стратегические риски

  1. Риск неудачи уровня поддержки: если на рынке наблюдаются экстремальные условия, и цена продолжает резко падать после преодоления уровня поддержки, механизм увеличения позиции стратегии может привести к значительным потерям.
  2. Установка параметров риска: эффективность стратегии во многом зависит от параметров, если параметры установлены неправильно, это может привести к плохой эффективности стратегии.
  3. Риск установления цены на получение прибыли: если цена на получение прибыли установлена слишком высоко, потенциальная прибыль может быть упущена. Если она установлена слишком низко, позиции могут быть закрыты слишком рано, упуская возможности полностью извлечь выгоду из ценового отскока.

Направления оптимизации стратегии

  1. Введение большего количества индикаторов: при определении сигнала формирования позиции можно вводить более технические индикаторы, такие как RSI и MACD, чтобы улучшить точность сигнала.
  2. Оптимизировать управление деньгами: на основе таких факторов, как волатильность рынка и толерантность к риску счета, динамически корректировать долю средств для каждой позиции для лучшего контроля риска.
  3. адаптивная прибыль и стоп-лосс: динамическая корректировка процентов прибыли и стоп-лосса на основе изменений волатильности рынка для лучшего адаптации к изменениям рынка.

Резюме

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


/*backtest
start: 2024-04-04 00:00:00
end: 2024-04-11 00:00:00
period: 1m
basePeriod: 1m
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/
// © AHMEDABDELAZIZZIZO

//@version=5

strategy("Qfl Dca strategy", overlay=true)

// Parameters
swing = input(3 , title = "Swing Points")
mediandropmult = input.float(1.1, "Median drop Mult", step=0.1 , tooltip = "The script Calculate The Median Drop for all last Bases That Was cracked you can Increase or decrease it")
floatinglossvalue = input(-5 , "Floating Loss" , tooltip = "Position Floating Loss to start firs DCA order")
num_orders = input(5 , "Number of all orders" , tooltip = " The number of orders is including the base order and the DCA orders the script will alculate every order qty based on the orders number So that the position size doubles with every order")
length = input(20, title="Length of relative volume" ,tooltip =  " the length of relative volume indicator")
mult = input(2.0, title="Volume Multiplier" , tooltip = "you can adjust the relative volume multiplier to find best parameter")
tpmult = input.float(1, step=0.1 ,title = "Take Profit Multiplier" ,tooltip =  " By default, the script is set to take profits based on the same median drop percent you can adjust it as you like")



// Pivot Calculation
p = ta.pivotlow(low, swing, swing)
v = ta.valuewhen(p, low[swing], 0)

// Variables
var float[] lows = array.new_float()
var float chn = na

// Calculate drops
if v < v[1]
    chn := (v[1] - v) / v[1] * 100
    if array.size(lows) < 4000
        array.push(lows, chn)
    else
        array.shift(lows)
        array.push(lows, chn)

mediandrop = array.avg(lows)
maxdrop = array.max(lows)
mindrop = array.min(lows)

// Table display
textcolor = color.white
// tabl = table.new(position=position.top_right, columns=4, rows=4)
// table.cell(table_id=tabl, column=1, row=1, text="Avg Drop %", width=15, text_color=textcolor)
// table.cell(table_id=tabl, column=2, row=1, text="Min Drop %", width=15, text_color=textcolor)
// table.cell(table_id=tabl, column=3, row=1, text="Max Drop %", width=15, text_color=textcolor)
// table.cell(table_id=tabl, column=1, row=2, text=str.tostring(mediandrop), width=10, text_color=textcolor)
// table.cell(table_id=tabl, column=2, row=2, text=str.tostring(mindrop), width=10, text_color=textcolor)
// table.cell(table_id=tabl, column=3, row=2, text=str.tostring(maxdrop), width=10, text_color=textcolor)

// Plot support
t = fixnan(ta.pivotlow(low, swing, swing))
plot(t, color=ta.change(t) ? na : #03f590b6, linewidth=3, offset=-(swing), title="Support")

// Calculate relative volume
avgVolume = ta.sma(volume, length)
relVolume = volume / avgVolume

// Base Activation
var bool baseisactive = na
if not na(p)
    baseisactive := true

// Buy Signal Calculation
buyprice = v * (1 - (mediandrop / 100) * mediandropmult)
signal = close <= buyprice and relVolume > mult and baseisactive

// Take Profit Calculation
tpsl = (mediandrop / 100)
tp = (strategy.position_avg_price * (1 + (tpsl * tpmult)))

// Position Sizing
capital_per_order(num_orders, equity) =>
    equity / math.pow(2, (num_orders - 1))

equity_per_order = capital_per_order(num_orders, strategy.equity)

qty_per_order(equity_per_order, order_number) =>
    equity_per_order * order_number / close

// Calculate floating loss
floatingLoss = ((close - strategy.position_avg_price) / strategy.position_avg_price) * 100

// Strategy Entries
if signal and strategy.opentrades == 0
    strategy.entry("Buy", strategy.long, qty=qty_per_order(equity_per_order, 1))
    baseisactive := false

for i = 1 to num_orders -1
    if signal and strategy.opentrades == i and floatingLoss <= floatinglossvalue
        strategy.entry("Buy", strategy.long, qty=qty_per_order(equity_per_order, i), comment="DCA Order" + str.tostring(i))
        baseisactive := false

// Strategy Exit
strategy.exit("exit", "Buy", limit=tp)

// Plot
plot(strategy.position_avg_price, color=color.rgb(238, 255, 0), style=plot.style_linebr, linewidth=2)


Связанные

Больше