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.
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.
Strategi ini memiliki keuntungan berikut:
Hal ini dapat secara dinamis skala dalam posisi, meningkatkan alokasi pada dips dan mengurangi alokasi pada rally untuk mengendalikan risiko.
Ini mendapatkan harga masuk rata-rata yang lebih rendah dibandingkan dengan harga median, memungkinkan potensi keuntungan yang lebih besar.
Ini cocok dengan pasar bull dengan volatilitas untuk rasio risiko-imbalan yang lebih baik.
Hal ini memungkinkan untuk mengatur modal awal dan persentase DCA untuk mengendalikan risiko ukuran posisi.
Ini menyediakan statistik tentang harga masuk rata-rata dan harga median untuk penilaian yang jelas tentang kualitas masuk.
Ada juga beberapa risiko:
Dalam pasar yang jatuh, akan terus menambah posisi, yang mengarah pada kerugian besar.
Jika harga melonjak dengan cepat, skala akan berkurang, mungkin kehilangan banyak reli.
Konfigurasi parameter yang tidak tepat juga menimbulkan bahaya. modal awal yang berlebihan dan persentase DCA yang tinggi akan memperbesar kerugian.
Beberapa cara untuk mengoptimalkan strategi:
Tambahkan logika stop loss untuk menghentikan skala pada penjualan berat.
Adaptasi persentase DCA secara dinamis berdasarkan volatilitas atau metrik lainnya.
Menggabungkan model pembelajaran mesin untuk memprediksi harga dan memandu keputusan skala.
Gabungkan indikator lain untuk mengidentifikasi perubahan struktur pasar untuk skala titik keluar.
Tambahkan aturan manajemen modal untuk pesanan ukuran dinamis berdasarkan nilai akun.
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)