O recurso está a ser carregado... Carregamento...

Estratégia dinâmica de DCA baseada no volume

Autora:ChaoZhang, Data: 2024-04-12 17:12:07
Tags:QFLDCATPSLATRADXEMASMARSIMACD

img

Resumo

Esta estratégia é uma estratégia dinâmica de DCA baseada em volume que usa breakouts de preço. Ela identifica o preço mais baixo recente e começa a construir posições quando o preço quebra abaixo desse baixo e o volume de negociação aumenta. À medida que o preço continua a cair, a estratégia ajusta dinamicamente a quantidade de cada posição com base no tamanho da perda flutuante até atingir o número total de posições definido. Ao mesmo tempo, a estratégia define o preço de take-profit com base na mediana das porcentagens históricas de queda de preço.

Princípios de estratégia

  1. Utilize a função ta.pivotlow() para identificar o nível mais baixo do preço mais recente e tratá-lo como um nível de suporte.
  2. Calcular as percentagens históricas de queda dos preços após a quebra do nível de apoio e tomar a mediana como referência para a distância segura e a percentagem de lucro.
  3. Ativar o sinal de construção de posição quando o preço ultrapassar o nível de suporte e o volume relativo de negociação for superior ao múltiplo definido.
  4. Com base no número total de posições definidas, divida o total de fundos em proporções iguais.
  5. Durante o processo de construção de posições, se a perda flutuante atingir o limiar estabelecido, continuar a adicionar posições até que o número total de posições seja atingido.
  6. Quando o preço subir para o preço de take-profit, feche todas as posições.

Vantagens da estratégia

  1. Ajuste dinâmico do tamanho da posição: Ao ajustar dinâmicamente o tamanho de cada posição com base na perda flutuante durante a queda do preço, a estratégia controla o risco e também permite maiores lucros quando o preço se recupera.
  2. A definição de parâmetros baseada em dados históricos: ao calcular a mediana das percentagens históricas de queda de preços após a quebra do nível de apoio e utilizá-la como referência para a distância segura e a percentagem de lucro, os parâmetros da estratégia estão mais alinhados com as condições reais do mercado.
  3. Limitar o número total de posições: ao fixar um número total de posições, a estratégia controla a sua exposição ao risco global e evita perdas excessivas devido a um excesso de posicionamento.

Riscos estratégicos

  1. Risco de falha do nível de suporte: se o mercado apresentar condições extremas e o preço continuar a cair acentuadamente após a quebra do nível de suporte, o mecanismo de acréscimo de posição da estratégia pode conduzir a perdas significativas.
  2. A definição dos parâmetros de risco: o desempenho da estratégia depende em grande parte das definições dos parâmetros.
  3. Risco de fixação do preço de take-profit: se o preço de take-profit for fixado muito alto, os lucros potenciais podem ser perdidos.

Orientações para a otimização da estratégia

  1. Introduzir mais indicadores: na determinação do sinal de construção de posição, podem ser introduzidos mais indicadores técnicos, como RSI e MACD, para melhorar a precisão do sinal.
  2. Otimizar a gestão de fundos: com base em fatores como a volatilidade do mercado e a tolerância ao risco da conta, ajustar dinamicamente a proporção de fundos para cada posição para melhor controlar o risco.
  3. A taxa de preenchimento e stop-loss adaptável: ajustar dinamicamente as percentagens de take-profit e stop-loss com base nas alterações da volatilidade do mercado para melhor se adaptar às alterações do mercado.

Resumo

Ao ajustar dinamicamente os tamanhos das posições e definir parâmetros com base em dados históricos, esta estratégia visa controlar o risco enquanto busca maiores lucros durante os rebotes de preços. No entanto, o desempenho da estratégia depende em grande parte das configurações dos parâmetros e das condições do mercado, e os riscos ainda existem. Ao introduzir mais indicadores, otimizar a gestão de dinheiro e usar o take-profit e o stop-loss adaptativos, o desempenho da estratégia pode ser melhorado ainda mais.


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


Relacionados

Mais.