Strategi Pembinaan Kedudukan Dinamik

Penulis:ChaoZhang, Tarikh: 2024-02-20 14:16:30
Tag:

img

Ringkasan

Idea utama strategi ini adalah untuk membina kedudukan secara dinamik berdasarkan isyarat sistem dalam pasaran bull untuk mengawal risiko dan mendapatkan harga kemasukan purata yang lebih rendah.

Logika Strategi

Strategi ini mula-mula menetapkan modal permulaan dan peratusan DCA. Pada setiap penutupan bar, ia mengira peratusan yang disesuaikan berdasarkan perubahan harga. Jika harga naik, ia menurunkan peratusan. Jika harga turun, ia meningkatkan peratusan. Ini membolehkan menambah kedudukan pada harga yang lebih rendah. Ia kemudian mengira saiz pesanan berdasarkan peratusan yang disesuaikan dan baki modal. Pada setiap penutupan bar, ia meletakkan pesanan untuk membina kedudukan sehingga modal permulaan habis.

Oleh itu, ia boleh mengawal risiko dan mendapatkan harga kemasukan purata yang lebih rendah semasa tindakan harga turun naik. Sementara itu, ia mengesan harga kemasukan purata dan harga median untuk menilai keadaan kemasukan semasa.

Analisis Kelebihan

Strategi ini mempunyai kelebihan berikut:

  1. Ia boleh skala secara dinamik dalam kedudukan, meningkatkan peruntukan pada penurunan dan mengurangkan peruntukan pada perhimpunan untuk mengawal risiko.

  2. Ia mendapat harga kemasukan purata yang lebih rendah berbanding harga median, yang membolehkan potensi keuntungan yang lebih besar.

  3. Ia sesuai dengan pasaran bull dengan turun naik untuk nisbah risiko-balasan yang lebih baik.

  4. Ia membolehkan menetapkan modal permulaan dan peratusan DCA untuk mengawal risiko saiz kedudukan.

  5. Ia menyediakan statistik mengenai purata harga kemasukan dan harga median untuk penilaian yang jelas mengenai kualiti kemasukan.

Analisis Risiko

Terdapat juga beberapa risiko:

  1. Dalam pasaran yang merosot, ia akan terus menambah kedudukan, membawa kepada kerugian besar.

  2. Jika harga melonjak dengan cepat, skala akan berkurangan, mungkin kehilangan banyak kenaikan. Isyarat LSI lain kemudian diperlukan.

  3. Konfigurasi parameter yang tidak betul juga menimbulkan bahaya. Modal permulaan yang berlebihan dan peratusan DCA yang tinggi akan memperbesar kerugian.

Arahan pengoptimuman

Beberapa cara untuk mengoptimumkan strategi:

  1. Tambah logik stop loss untuk menghentikan skala dalam jualan berat.

  2. Sesuaikan secara dinamik peratusan DCA berdasarkan turun naik atau metrik lain.

  3. Menggabungkan model pembelajaran mesin untuk meramalkan harga dan membimbing keputusan skala.

  4. Gabungkan penunjuk lain untuk mengenal pasti perubahan struktur pasaran untuk skala titik keluar.

  5. Tambah peraturan pengurusan modal kepada pesanan saiz dinamik berdasarkan nilai akaun.

Kesimpulan

Ini adalah strategi skala kedudukan dinamik yang sangat praktikal. Ia menyesuaikan saiz kedudukan dengan fleksibel berdasarkan turun naik harga untuk mencapai kemasukan purata yang baik dalam pasaran lembu, sambil menyekat risiko melalui parameter yang boleh dikonfigurasikan. Menggabungkannya dengan penunjuk atau model lain dapat meningkatkan prestasi. Ia sesuai untuk pelabur yang mencari keuntungan jangka panjang.


/*backtest
start: 2024-01-20 00:00:00
end: 2024-02-19 00:00:00
period: 1h
basePeriod: 15m
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/
// © RWCS_LTD

//@version=5
strategy("DCA IN Calculator {RWCS}", overlay=true, pyramiding=999, default_qty_type=strategy.cash, initial_capital=10000, commission_value=0.02)

// User inputs
backtestStartDate = input(timestamp("1 Jan 2024"), 
     title="Start Date", group="Backtest Time Period",
     tooltip="This start date is in the time zone of the exchange " + 
     "where the chart's instrument trades. It doesn't use the time " + 
     "zone of the chart or of your computer.")
start_date = true
starting_capital = input.float(defval=5000, title="Starting Capital")
dca_allocation_percentage = input.int(defval=10, title="DCA Allocation Percentage")

// Calculate DCA allocation based on price change
price_change_percentage = ((close - close[1]) / close[1]) * 100
adjusted_allocation_percentage = close > close[1] ? dca_allocation_percentage - price_change_percentage : dca_allocation_percentage + price_change_percentage // If price action is negative, increase allocations
adjusted_allocation_percentage1 = dca_allocation_percentage - price_change_percentage // If price action is positive, reduce allocations

// Calculate order size based on adjusted allocation percentage
order_size = (adjusted_allocation_percentage / 100) * starting_capital

// Track remaining capital
var remaining_capital = starting_capital

// Long on the close of every bar
if true
    // Ensure the order size doesn't exceed remaining capital or adjusted allocation
    order_size := math.min(order_size, remaining_capital, adjusted_allocation_percentage / 100 * starting_capital)
    // Ensure order size is not negative
    order_size := math.max(order_size, 0)
    
    strategy.entry("DCA", strategy.long, qty = order_size)
    remaining_capital := remaining_capital - order_size

// Plot average entry price
var float total_entry_price = 0.0
var int total_signals = 0

if start_date
    total_entry_price := total_entry_price + close
    total_signals := total_signals + 1

avg_entry_price = total_entry_price / total_signals

// Calculate and plot median price
var float median_price = na

if start_date
    var float sum_prices = 0.0
    var int num_prices = 0
    
    for i = 0 to bar_index
        if (time[i] >= backtestStartDate)
            sum_prices := sum_prices + close[i]
            num_prices := num_prices + 1
    
    median_price := sum_prices / num_prices

// Reset variables at the start of each day
if (dayofweek != dayofweek[1])
    total_entry_price := 0.0
    total_signals := 0

//table colors
borders_col = color.new(color.black, 90)
top_row_col = color.new(color.gray, 90)
size = input.string(defval='Normal', options=['Tiny', 'Small', 'Normal', 'Large'], title='Table size', inline='design', group='Table Design')
table_size = size == 'Tiny' ? size.tiny : size == 'Small' ? size.small : size == 'Normal' ? size.normal : size == 'Large' ? size.large : na

var tablee = table.new(position=position.top_right, columns=2, rows=3, frame_color=borders_col, frame_width=4, border_color=borders_col, border_width=4)

table.cell(tablee, 0, 0, "Average Entry Price", bgcolor=top_row_col, text_color=color.white, text_size=table_size)
table.cell(tablee, 1, 0, str.tostring(avg_entry_price, '#.##'), text_color=color.white, text_size=table_size)
table.cell(tablee, 0, 1, "Median Price", bgcolor=top_row_col, text_color=color.white, text_size=table_size)
table.cell(tablee, 1, 1, str.tostring(median_price, '#.##'), text_color=color.white, text_size=table_size)
table.cell(tablee, 0, 2, "Remaining Capital", bgcolor=top_row_col, text_color=color.white, text_size=table_size)
table.cell(tablee, 1, 2, str.tostring(remaining_capital, '#.##'), text_color=color.white, text_size=table_size)



Lebih lanjut