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

QFL DCA TP SL ATR ADX EMA SMA RSI MACD
Дата создания: 2024-04-12 17:12:07 Последнее изменение: 2024-04-12 17:12:07
Копировать: 5 Количество просмотров: 995
1
Подписаться
1617
Подписчики

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

Обзор

Эта стратегия является динамической 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)