Strategi DCA dinamis berbasis volume

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

img

Gambaran umum

Strategi ini adalah strategi DCA dinamis berbasis volume yang menggunakan price breakout. Strategi ini mengidentifikasi harga terendah terbaru dan mulai membangun posisi ketika harga terbalik di bawah harga terendah dan volume perdagangan meningkat. Saat harga terus turun, strategi secara dinamis menyesuaikan jumlah setiap posisi berdasarkan ukuran kerugian mengambang sampai mencapai jumlah total posisi yang ditetapkan. Pada saat yang sama, strategi menetapkan harga take-profit berdasarkan median persentase penurunan harga historis.

Prinsip Strategi

  1. Gunakan fungsi ta.pivotlow() untuk mengidentifikasi harga terendah terbaru dan memperlakukannya sebagai level support.
  2. Menghitung persentase penurunan harga historis setelah memecahkan level dukungan dan mengambil median sebagai referensi untuk jarak aman dan persentase keuntungan.
  3. Trigger sinyal pembentukan posisi ketika harga menembus di bawah level support dan volume perdagangan relatif lebih besar dari kelipatan yang ditetapkan.
  4. Berdasarkan jumlah total posisi yang ditetapkan, bagi total dana menjadi proporsi yang sama. Setiap kali posisi dibangun, secara dinamis menyesuaikan ukuran posisi berdasarkan jumlah posisi saat ini, mencapai pertumbuhan eksponensial dalam ukuran posisi.
  5. Selama proses pembentukan posisi, jika kerugian variabel mencapai ambang batas yang ditetapkan, lanjutkan menambahkan posisi sampai jumlah total posisi tercapai.
  6. Ketika harga naik ke harga take profit, tutup semua posisi.

Keuntungan Strategi

  1. Penyesuaian ukuran posisi dinamis: Dengan menyesuaikan ukuran setiap posisi secara dinamis berdasarkan kerugian mengambang selama penurunan harga, strategi mengendalikan risiko sekaligus memungkinkan keuntungan yang lebih besar ketika harga bangkit.
  2. Pengaturan parameter berdasarkan data historis: Dengan menghitung median persentase penurunan harga historis setelah memecahkan level dukungan dan menggunakannya sebagai referensi untuk jarak aman dan persentase mengambil keuntungan, parameter strategi lebih selaras dengan kondisi pasar yang sebenarnya.
  3. Membatasi jumlah total posisi: Dengan menetapkan jumlah total posisi, strategi mengontrol eksposur risiko keseluruhan dan menghindari kerugian yang berlebihan karena over-positioning.

Risiko Strategi

  1. Risiko kegagalan level support: Jika pasar mengalami kondisi ekstrem dan harga terus turun tajam setelah memecahkan level support, mekanisme penambahan posisi strategi dapat menyebabkan kerugian yang signifikan.
  2. Pengaturan risiko parameter: Kinerja strategi sangat tergantung pada pengaturan parameter.
  3. Risiko penentuan harga take-profit: Jika harga take-profit ditetapkan terlalu tinggi, potensi keuntungan mungkin terlewatkan. Jika ditetapkan terlalu rendah, posisi mungkin ditutup terlalu dini, kehilangan peluang untuk memanfaatkan sepenuhnya harga rebound.

Arah Optimasi Strategi

  1. Memperkenalkan lebih banyak indikator: Dalam menentukan sinyal pembentukan posisi, lebih banyak indikator teknis seperti RSI dan MACD dapat diperkenalkan untuk meningkatkan akurasi sinyal.
  2. Mengoptimalkan pengelolaan uang: Berdasarkan faktor-faktor seperti volatilitas pasar dan toleransi risiko akun, secara dinamis menyesuaikan proporsi dana untuk setiap posisi untuk mengontrol risiko dengan lebih baik.
  3. Adaptive take-profit dan stop-loss: Sesuaikan persentase take-profit dan stop-loss secara dinamis berdasarkan perubahan volatilitas pasar untuk lebih beradaptasi dengan perubahan pasar.

Ringkasan

Dengan menyesuaikan secara dinamis ukuran posisi dan menetapkan parameter berdasarkan data historis, strategi ini bertujuan untuk mengendalikan risiko sambil mencari keuntungan yang lebih besar selama rebound harga. Namun, kinerja strategi sebagian besar tergantung pada pengaturan parameter dan kondisi pasar, dan risiko masih ada. Dengan memperkenalkan lebih banyak indikator, mengoptimalkan manajemen uang, dan menggunakan adaptif mengambil keuntungan dan stop-loss, kinerja strategi dapat ditingkatkan lebih lanjut.


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