Strategi Pembangunan Posisi Dinamis

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

img

Gambaran umum

Ide utama dari strategi ini adalah untuk membangun posisi secara dinamis berdasarkan sinyal sistem di pasar bull untuk mengendalikan risiko dan mendapatkan harga masuk rata-rata yang lebih rendah.

Logika Strategi

Strategi ini pertama-tama menetapkan modal awal dan persentase DCA. Pada penutupan setiap bar, ia menghitung persentase yang disesuaikan berdasarkan perubahan harga. Jika harga naik, ia menurunkan persentase. Jika harga turun, ia meningkatkan persentase. Ini memungkinkan untuk menambahkan ke posisi dengan harga yang lebih rendah. Kemudian ia menghitung ukuran pesanan berdasarkan persentase yang disesuaikan dan sisa modal. Pada setiap bar tutup, ia menempatkan pesanan untuk membangun posisi sampai modal awal habis.

Dengan demikian, ia dapat mengendalikan risiko dan mendapatkan harga masuk rata-rata yang lebih rendah selama tindakan harga yang berfluktuasi. Sementara itu, ia melacak harga masuk rata-rata dan harga median untuk menilai situasi masuk saat ini.

Analisis Keuntungan

Strategi ini memiliki keuntungan berikut:

  1. Hal ini dapat secara dinamis skala dalam posisi, meningkatkan alokasi pada dips dan mengurangi alokasi pada rally untuk mengendalikan risiko.

  2. Ini mendapatkan harga masuk rata-rata yang lebih rendah dibandingkan dengan harga median, memungkinkan potensi keuntungan yang lebih besar.

  3. Ini cocok dengan pasar bull dengan volatilitas untuk rasio risiko-imbalan yang lebih baik.

  4. Hal ini memungkinkan untuk mengatur modal awal dan persentase DCA untuk mengendalikan risiko ukuran posisi.

  5. Ini menyediakan statistik tentang harga masuk rata-rata dan harga median untuk penilaian yang jelas tentang kualitas masuk.

Analisis Risiko

Ada juga beberapa risiko:

  1. Dalam pasar yang jatuh, akan terus menambah posisi, yang mengarah pada kerugian besar.

  2. Jika harga melonjak dengan cepat, skala akan berkurang, mungkin kehilangan banyak reli.

  3. Konfigurasi parameter yang tidak tepat juga menimbulkan bahaya. modal awal yang berlebihan dan persentase DCA yang tinggi akan memperbesar kerugian.

Arahan Optimasi

Beberapa cara untuk mengoptimalkan strategi:

  1. Tambahkan logika stop loss untuk menghentikan skala pada penjualan berat.

  2. Adaptasi persentase DCA secara dinamis berdasarkan volatilitas atau metrik lainnya.

  3. Menggabungkan model pembelajaran mesin untuk memprediksi harga dan memandu keputusan skala.

  4. Gabungkan indikator lain untuk mengidentifikasi perubahan struktur pasar untuk skala titik keluar.

  5. Tambahkan aturan manajemen modal untuk pesanan ukuran dinamis berdasarkan nilai akun.

Kesimpulan

Ini adalah strategi skala posisi dinamis yang sangat praktis. Ini secara fleksibel menyesuaikan ukuran posisi berdasarkan fluktuasi harga untuk mencapai entri rata-rata yang baik di pasar bull, sambil membatasi risiko melalui parameter yang dapat dikonfigurasi. Menggabungkannya dengan indikator atau model lain dapat lebih meningkatkan kinerjanya. Ini cocok untuk investor 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 banyak