Strategi DCA dinamik berasaskan jumlah

Penulis:ChaoZhang, Tarikh: 2024-04-12 17:12:07
Tag:QFLDCATPSLATRADXEMASMARSIMACD

img

Ringkasan

Strategi ini adalah strategi DCA dinamik berasaskan jumlah yang menggunakan penembusan harga. Ia mengenal pasti harga terendah terkini dan mula membina kedudukan apabila harga memecahkan di bawah yang rendah dan jumlah dagangan meningkat. Apabila harga terus jatuh, strategi secara dinamik menyesuaikan kuantiti setiap kedudukan berdasarkan saiz kerugian terapung sehingga ia mencapai jumlah keseluruhan kedudukan yang ditetapkan. Pada masa yang sama, strategi menetapkan harga mengambil keuntungan berdasarkan purata peratusan penurunan harga sejarah.

Prinsip Strategi

  1. Gunakan fungsi ta.pivotlow() untuk mengenal pasti harga terendah terkini dan memperlakukannya sebagai tahap sokongan.
  2. Mengira peratusan penurunan harga sejarah selepas memecahkan tahap sokongan dan mengambil median sebagai rujukan untuk jarak selamat dan peratusan keuntungan.
  3. Memicu isyarat pembinaan kedudukan apabila harga memecahkan di bawah tahap sokongan dan jumlah dagangan relatif lebih besar daripada kelipatan yang ditetapkan.
  4. Berdasarkan jumlah kedudukan yang ditetapkan, membahagikan jumlah dana ke dalam perkadaran yang sama. Setiap kali kedudukan dibina, secara dinamik menyesuaikan saiz kedudukan berdasarkan bilangan kedudukan semasa, mencapai pertumbuhan eksponensial dalam saiz kedudukan.
  5. Semasa proses pembinaan kedudukan, jika kerugian terapung mencapai ambang yang ditetapkan, teruskan menambah kedudukan sehingga jumlah keseluruhan kedudukan dicapai.
  6. Apabila harga naik ke harga mengambil keuntungan, tutup semua kedudukan.

Kelebihan Strategi

  1. Penyesuaian saiz kedudukan dinamik: Dengan menyesuaikan saiz setiap kedudukan secara dinamik berdasarkan kerugian terapung semasa penurunan harga, strategi mengawal risiko sambil juga membolehkan keuntungan yang lebih besar apabila harga bangkit.
  2. Penetapan parameter berdasarkan data sejarah: Dengan mengira purata peratusan penurunan harga sejarah selepas memecahkan tahap sokongan dan menggunakannya sebagai rujukan untuk jarak selamat dan peratusan mengambil keuntungan, parameter strategi lebih sejajar dengan keadaan pasaran sebenar.
  3. Mengehadkan jumlah keseluruhan kedudukan: Dengan menetapkan jumlah keseluruhan kedudukan, strategi mengawal pendedahan risiko keseluruhannya dan mengelakkan kerugian yang berlebihan akibat terlalu banyak kedudukan.

Risiko Strategi

  1. Risiko kegagalan tahap sokongan: Jika pasaran mengalami keadaan yang melampau dan harga terus jatuh tajam selepas memecahkan tahap sokongan, mekanisme penambahan kedudukan strategi boleh membawa kepada kerugian yang ketara.
  2. Parameter menetapkan risiko: Prestasi strategi sangat bergantung pada tetapan parameter.
  3. Risiko penetapan harga mengambil keuntungan: Jika harga mengambil keuntungan ditetapkan terlalu tinggi, potensi keuntungan mungkin terlepas. Jika ia ditetapkan terlalu rendah, kedudukan mungkin ditutup terlalu awal, kehilangan peluang untuk memanfaatkan sepenuhnya kenaikan harga.

Arahan Pengoptimuman Strategi

  1. Memperkenalkan lebih banyak penunjuk: Dalam menentukan isyarat pembinaan kedudukan, lebih banyak penunjuk teknikal seperti RSI dan MACD boleh diperkenalkan untuk meningkatkan ketepatan isyarat.
  2. Mengoptimumkan pengurusan wang: Berdasarkan faktor-faktor seperti turun naik pasaran dan toleransi risiko akaun, secara dinamik menyesuaikan perkadaran dana untuk setiap kedudukan untuk mengawal risiko dengan lebih baik.
  3. Amalan mengambil keuntungan dan menghentikan kerugian: Sesuaikan secara dinamik peratusan mengambil keuntungan dan menghentikan kerugian berdasarkan perubahan dalam turun naik pasaran untuk menyesuaikan diri dengan perubahan pasaran.

Ringkasan

Dengan menyesuaikan saiz kedudukan secara dinamik dan menetapkan parameter berdasarkan data sejarah, strategi ini bertujuan untuk mengawal risiko sambil mencari keuntungan yang lebih besar semasa kenaikan harga. Walau bagaimanapun, prestasi strategi ini sebahagian besarnya bergantung kepada tetapan parameter dan keadaan pasaran, dan risiko masih wujud. Dengan memperkenalkan lebih banyak penunjuk, mengoptimumkan pengurusan wang, dan menggunakan mengambil keuntungan dan berhenti rugi yang adaptif, prestasi strategi dapat ditingkatkan lagi.


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


Berkaitan

Lebih lanjut