Pelarasan dinamik strategi DCA berdasarkan volum dagangan

QFL DCA TP SL ATR ADX EMA SMA RSI MACD
Tarikh penciptaan: 2024-04-12 17:12:07 Akhirnya diubah suai: 2024-04-12 17:12:07
Salin: 5 Bilangan klik: 995
1
fokus pada
1617
Pengikut

Pelarasan dinamik strategi DCA berdasarkan volum dagangan

Gambaran keseluruhan

Strategi ini adalah strategi DCA yang dinamik berdasarkan jumlah dagangan dan harga yang pecah. Ia bermula dengan mengenal pasti harga yang paling rendah dan mula meletakkan kedudukan apabila harga melampaui titik rendah itu dan jumlah dagangan meningkat.

Prinsip Strategi

  1. Menggunakan fungsi ta.pivotlow (()) untuk mengenal pasti harga rendah terkini dan menggunakannya sebagai sokongan.
  2. Hitung kadar penurunan selepas harga bersejarah melepasi tahap sokongan, dan gunakan angka tersebut sebagai rujukan untuk jarak selamat dan penangguhan kenaikan.
  3. Apabila harga melepasi tahap sokongan dan jumlah dagangan relatif lebih besar daripada kelipatan yang ditetapkan, isyarat binaan kedudukan akan dicetuskan.
  4. Berdasarkan jumlah gudang yang ditetapkan, jumlah modal akan dibahagikan kepada beberapa bahagian yang sama rata, setiap kali gudang dibina, jumlah gudang akan disesuaikan dengan dinamik jumlah gudang yang dibina pada masa ini, untuk mencapai pertumbuhan indeks kedudukan.
  5. Dalam proses pembinaan gudang, jika kerugian terapung mencapai nilai terhad yang ditetapkan, teruskan pembinaan gudang sehingga mencapai jumlah keseluruhan pembinaan gudang.
  6. Apabila harga naik ke harga henti, semua kedudukan akan dipadamkan.

Kelebihan Strategik

  1. Dinamik menyesuaikan jumlah kedudukan yang dibina: Mengikut kerugian terapung dalam proses penurunan harga, secara dinamik menyesuaikan jumlah setiap kedudukan yang dibina, sambil mengawal risiko, juga dapat memperoleh lebih banyak keuntungan apabila harga bangkit.
  2. Rujukan parameter persediaan data sejarah: Dengan mengira penurunan harga sejarah selepas penembusan tahap sokongan, ambil digitnya sebagai rujukan jarak selamat dan amplitudo penangguhan, agar parameter strategi lebih dekat dengan keadaan sebenar pasaran.
  3. Hadkan jumlah jumlah penempatan: Dengan menetapkan jumlah jumlah penempatan, mengawal pintu risiko keseluruhan strategi, dan mengelakkan kerugian yang disebabkan oleh penempatan berlebihan.

Risiko Strategik

  1. Risiko kegagalan tahap sokongan: Jika pasaran mengalami keadaan yang melampau, harga akan terus menurun dengan ketara selepas penembusan tahap sokongan, dan mekanisme peleburan strategi mungkin membawa kerugian yang besar.
  2. Risiko tetapan parameter: Prestasi strategi sangat bergantung pada tetapan parameter, dan jika parameter tidak ditetapkan dengan betul, ia boleh menyebabkan prestasi strategi yang buruk.
  3. Risiko menetapkan harga berhenti: Jika harga berhenti terlalu tinggi, anda mungkin akan kehilangan sebahagian keuntungan; jika terlalu rendah, anda mungkin akan menutup kedudukan terlalu awal dan tidak dapat memanfaatkan peluang untuk membalikkan harga.

Arah pengoptimuman strategi

  1. Memperkenalkan lebih banyak petunjuk: Dalam penilaian isyarat gudang, lebih banyak petunjuk teknikal boleh diperkenalkan, seperti RSI, MACD dan lain-lain, untuk meningkatkan ketepatan isyarat.
  2. Pengurusan dana yang optimum: boleh menyesuaikan secara dinamik bahagian dana setiap kali anda menubuhkan akaun, berdasarkan faktor seperti turun naik pasaran dan kemampuan menanggung risiko akaun, untuk mengawal risiko dengan lebih baik.
  3. Stop loss yang disesuaikan: Sesuai dengan perubahan dalam turun naik pasaran, anda boleh menyesuaikan stop loss anda secara dinamik untuk menyesuaikan diri dengan perubahan pasaran.

ringkaskan

Strategi ini berusaha untuk mendapatkan lebih banyak keuntungan apabila harga berpatah balik dengan cara menyesuaikan jumlah kedudukan yang dibina secara dinamik dan parameter yang ditetapkan berdasarkan data sejarah, sambil mengawal risiko. Walau bagaimanapun, prestasi strategi sangat bergantung pada pengaturan parameter dan keadaan pasaran, masih ada risiko tertentu.

Kod 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)