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.
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.
Strategi ini mempunyai kelebihan berikut:
Ia boleh skala secara dinamik dalam kedudukan, meningkatkan peruntukan pada penurunan dan mengurangkan peruntukan pada perhimpunan untuk mengawal risiko.
Ia mendapat harga kemasukan purata yang lebih rendah berbanding harga median, yang membolehkan potensi keuntungan yang lebih besar.
Ia sesuai dengan pasaran bull dengan turun naik untuk nisbah risiko-balasan yang lebih baik.
Ia membolehkan menetapkan modal permulaan dan peratusan DCA untuk mengawal risiko saiz kedudukan.
Ia menyediakan statistik mengenai purata harga kemasukan dan harga median untuk penilaian yang jelas mengenai kualiti kemasukan.
Terdapat juga beberapa risiko:
Dalam pasaran yang merosot, ia akan terus menambah kedudukan, membawa kepada kerugian besar.
Jika harga melonjak dengan cepat, skala akan berkurangan, mungkin kehilangan banyak kenaikan. Isyarat LSI lain kemudian diperlukan.
Konfigurasi parameter yang tidak betul juga menimbulkan bahaya. Modal permulaan yang berlebihan dan peratusan DCA yang tinggi akan memperbesar kerugian.
Beberapa cara untuk mengoptimumkan strategi:
Tambah logik stop loss untuk menghentikan skala dalam jualan berat.
Sesuaikan secara dinamik peratusan DCA berdasarkan turun naik atau metrik lain.
Menggabungkan model pembelajaran mesin untuk meramalkan harga dan membimbing keputusan skala.
Gabungkan penunjuk lain untuk mengenal pasti perubahan struktur pasaran untuk skala titik keluar.
Tambah peraturan pengurusan modal kepada pesanan saiz dinamik berdasarkan nilai akaun.
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)