Penyesuaian dinamis strategi DCA berdasarkan volume perdagangan

QFL DCA TP SL ATR ADX EMA SMA RSI MACD
Tanggal Pembuatan: 2024-04-12 17:12:07 Akhirnya memodifikasi: 2024-04-12 17:12:07
menyalin: 5 Jumlah klik: 995
1
fokus pada
1617
Pengikut

Penyesuaian dinamis strategi DCA berdasarkan volume perdagangan

Ringkasan

Strategi ini adalah strategi DCA dinamis yang didasarkan pada volume perdagangan dan harga yang terobosan. Strategi ini dimulai dengan mengidentifikasi titik rendah harga terbaru dan memulai posisi ketika harga melampaui titik rendah dan volume perdagangan meningkat.

Prinsip Strategi

  1. Menggunakan fungsi ta.pivotlow (()) untuk mengidentifikasi titik rendah harga terbaru dan menggunakannya sebagai level dukungan.
  2. Menghitung penurunan harga historis setelah melewati level dukungan, dan mengambil digitnya sebagai referensi untuk jarak aman dan stop-loss.
  3. Ketika harga melewati level dukungan dan volume perdagangan relatif lebih besar dari kelipatan yang ditetapkan, sinyal posisi akan dipicu.
  4. Sesuai dengan jumlah total gudang yang ditetapkan, total modal dibagi menjadi beberapa bagian yang proporsional, setiap kali gudang dibangun, jumlah gudang dibangun disesuaikan dengan dinamika jumlah gudang yang dibangun saat ini, untuk mencapai pertumbuhan indeks posisi.
  5. Dalam proses pembuatan gudang, jika kerugian yang mengambang mencapai batas yang ditetapkan, maka teruslah untuk menambah gudang sampai mencapai jumlah total gudang yang dibuat.
  6. Ketika harga naik ke harga stop, semua posisi dihapus.

Keunggulan Strategis

  1. Dinamis menyesuaikan jumlah posisi yang dibuat: Berdasarkan kerugian yang mengambang dalam proses penurunan harga, secara dinamis menyesuaikan jumlah setiap kali posisi dibuat, sekaligus mengendalikan risiko, juga dapat memperoleh lebih banyak keuntungan ketika harga bangkit.
  2. Referensi parameter pengaturan data historis: Dengan menghitung penurunan harga historis setelah melewati level dukungan, ambil digitnya sebagai referensi untuk jarak aman dan amplitudo penghentian, agar parameter strategi lebih dekat dengan situasi pasar yang sebenarnya.
  3. Batasi jumlah total penempatan: Dengan mengatur jumlah total penempatan, kendalikan celah risiko total strategi, dan hindari kerugian yang disebabkan oleh penempatan yang berlebihan.

Risiko Strategis

  1. Resiko kegagalan level dukungan: Jika pasar mengalami tren ekstrem, dan harga terus turun secara signifikan setelah melewati level dukungan, mekanisme strategi penargetan dapat menyebabkan kerugian besar.
  2. Risiko pengaturan parameter: Kinerja strategi sangat bergantung pada pengaturan parameter, dan jika parameter tidak diatur dengan benar, itu dapat menyebabkan kinerja strategi yang buruk.
  3. Stop-Price Setup Risk: Jika Stop-Price setup terlalu tinggi, Anda mungkin akan kehilangan sebagian dari keuntungan; Jika setup terlalu rendah, Anda mungkin akan terlambat dan tidak dapat memanfaatkan peluang harga untuk bangkit.

Arah optimasi strategi

  1. Masukkan lebih banyak indikator: Dalam penilaian sinyal gudang, lebih banyak indikator teknis dapat diperkenalkan, seperti RSI, MACD, dll, untuk meningkatkan akurasi sinyal.
  2. Pengelolaan dana yang optimal: Anda dapat secara dinamis menyesuaikan proporsi dana setiap kali Anda membangun posisi, berdasarkan faktor-faktor seperti volatilitas pasar dan kemampuan akun untuk menanggung risiko, untuk mengendalikan risiko dengan lebih baik.
  3. Stop Loss Adaptif: Sesuai dengan perubahan volatilitas pasar, tingkat stop loss disesuaikan secara dinamis agar lebih sesuai dengan perubahan pasar.

Meringkaskan

Strategi ini berusaha untuk mendapatkan lebih banyak keuntungan ketika harga membalik dengan cara menyesuaikan parameter pengaturan jumlah posisi dan referensi data historis secara dinamis, sambil mengendalikan risiko. Namun, kinerja strategi sangat tergantung pada pengaturan parameter dan kondisi pasar, tetap ada beberapa risiko. Kinerja strategi dapat ditingkatkan lebih lanjut dengan memperkenalkan lebih banyak indikator, mengoptimalkan manajemen dana, dan menyesuaikan stop loss.

Kode Sumber Strategi
/*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)