Ajuste dinâmico da estratégia DCA com base no volume de negociação

QFL DCA TP SL ATR ADX EMA SMA RSI MACD
Data de criação: 2024-04-12 17:12:07 última modificação: 2024-04-12 17:12:07
cópia: 5 Cliques: 995
1
focar em
1617
Seguidores

Ajuste dinâmico da estratégia DCA com base no volume de negociação

Visão geral

A estratégia é uma estratégia de DCA dinâmica baseada em volume de transações e rupturas de preço. Ela identifica o ponto mais baixo de preço mais recente e começa a criar uma posição quando o preço ultrapassa esse ponto baixo e o volume de transações aumenta.

Princípio da estratégia

  1. Identifica os pontos baixos mais recentes através da função ta.pivotlow (()) e usa-os como suporte.
  2. Calcule o declínio após a ruptura do suporte histórico e use os dígitos como referência para a distância de segurança e para a paralisação.
  3. Quando o preço ultrapassa o nível de suporte e o volume de negociação relativo é maior do que o múltiplo definido, um sinal de construção de posição é acionado.
  4. De acordo com o número total de construção de armazéns, divida o capital total em várias partes de proporção igual, cada vez que o armazém é construído, ajuste o número de armazéns construídos de acordo com a dinâmica do número atual de construção de armazéns, para alcançar o crescimento indexado da posição.
  5. Durante a construção do depósito, se os prejuízos flutuantes atingirem o limiar definido, continue a adicionar depósitos até atingir o número total de depósitos construídos.
  6. Quando o preço sobe até o preço de parada, elimine todas as posições.

Vantagens estratégicas

  1. Ajuste dinâmico do número de posições criadas: De acordo com os perdas flutuantes durante a queda dos preços, ajuste dinâmico do número de posições criadas a cada vez, ao mesmo tempo em que controla o risco, também pode obter mais lucros quando os preços se recuperam.
  2. Parâmetros de configuração de dados históricos de referência: para aproximar os parâmetros de estratégia da situação real do mercado, utilize os dígitos da queda após a ruptura do suporte histórico dos preços como referência para a distância de segurança e a amplitude de parada.
  3. Limitar o número total de posições: Ao definir o número total de posições, controle a abertura de risco total da estratégia e evite os prejuízos causados pelo excesso de posições.

Risco estratégico

  1. Risco de fracasso do nível de suporte: se o mercado estiver em um cenário extremo, o preço continuará a cair fortemente após a ruptura do nível de suporte, e o mecanismo de armazenamento estratégico pode causar grandes perdas.
  2. Risco de configuração de parâmetros: o desempenho da estratégia depende muito da configuração dos parâmetros, e se os parâmetros forem mal definidos, isso pode levar ao mau desempenho da estratégia.
  3. Risco de configuração de preço de parada: se o preço de parada for muito alto, você pode perder parte do lucro; se for muito baixo, você pode fechar a posição prematuramente e não aproveitar ao máximo a oportunidade de um rebote no preço.

Direção de otimização da estratégia

  1. Introdução de mais indicadores: No julgamento de sinais de armazenamento, pode-se introduzir mais indicadores técnicos, como RSI, MACD, etc., para melhorar a precisão do sinal.
  2. Gerenciamento de fundos otimizado: pode-se ajustar dinamicamente a proporção de fundos em cada posição, de acordo com fatores como a volatilidade do mercado e a capacidade de tolerância ao risco da conta, para melhor controlar o risco.
  3. Stop Loss Adaptação: Adaptação de Stop Loss de acordo com a variação da volatilidade do mercado, para melhor se adaptar às mudanças no mercado.

Resumir

A estratégia procura obter mais lucro quando o preço se reverte, ao mesmo tempo que controla o risco, ajustando dinamicamente a quantidade de posições criadas e os parâmetros de configuração com referência a dados históricos. No entanto, o desempenho da estratégia depende muito da configuração dos parâmetros e da situação do mercado.

Código-fonte da estratégia
/*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)