
Idea utama strategi ini adalah untuk menjejaki harga purata rendah secara berkala selepas penurunan jangka pendek berakhir. Khususnya, strategi akan mengenal pasti ketika penurunan jangka pendek berakhir pada akhir setiap bulan, dan oleh itu menambah kedudukan secara berkala; dan juga keluar dari kedudukan pada penutupan K terakhir.
Di atas adalah proses dan prinsip dasar strategi. Perlu diperhatikan bahawa strategi ini secara default menggunakan pengesanan dana \( 1,000 setiap bulan, yang akan diperluaskan kepada 33 bulan dalam backtest, iaitu sebanyak \) 33,000 secara keseluruhan.
Kelebihan terbesar strategi ini adalah dapat membuat simpanan secara berkala di tahap rendah, dalam jangka masa panjang dapat memperoleh kos pembelian yang lebih baik, menghasilkan kadar keuntungan yang lebih tinggi. Selain itu, penggunaan penunjuk MACD untuk mengenal pasti titik pembelian jangka pendek juga lebih dipercayai dan jelas, tidak akan tersesat di jalan buntu, yang juga dapat mengelakkan kerugian hingga tahap tertentu.
Secara keseluruhannya, ia adalah satu strategi kos-nilai yang sesuai untuk pemegang talian panjang dan sederhana yang membeli secara berkala dan mendapat pulangan yang memuaskan.
Risiko utama strategi ini adalah ketidakupayaan untuk menentukan dengan tepat titik akhir penurunan jangka pendek, MACD mungkin mempunyai kelewatan masa untuk menentukan akhir penurunan, yang akan menyebabkan kos tidak dapat dibeli pada optimum. Selain itu, pelaburan modal yang tersebar juga meningkatkan kos operasi.
Anda boleh mempertimbangkan untuk memasukkan lebih banyak petunjuk untuk menilai trend, seperti garis Brin, KDJ, dan lain-lain, yang dapat menentukan masa pembalikan lebih awal. Anda juga boleh mengoptimumkan jumlah modal yang dimasukkan setiap bulan untuk mengurangkan kesan kos operasi terhadap pendapatan.
Strategi ini boleh dioptimumkan dengan cara berikut:
Mengoptimumkan kitaran masa pengesanan berkala, seperti pengesanan berkala setiap dua bulan, dan lain-lain, untuk mengurangkan masalah transaksi yang terlalu kerap.
Dengan lebih banyak petunjuk untuk menentukan kapan penurunan jangka pendek berakhir, titik beli lebih dekat dengan titik terendah.
Untuk mengoptimumkan jumlah wang yang akan dibelanjakan setiap bulan, anda perlu mencari peruntukan yang optimum.
Cuba untuk memasukkan strategi berhenti kerugian untuk mengelakkan kerugian akibat jatuh terlalu jauh.
Uji kesan jangka masa pegangan yang berbeza terhadap pendapatan dan cari hari pegangan yang optimum.
Strategi harga rata-rata lembah yang mengikuti strategi keseluruhan dengan jelas dan mudah difahami, dengan penambahan secara berkala dan penghakiman jangka pendek, harga kos yang lebih baik dapat diperoleh. Pemegang strategi ini dapat memperoleh keuntungan yang stabil, sesuai untuk pelabur yang mencari nilai pelaburan jangka panjang.
/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © BHD_Trade_Bot
// @version=5
strategy(
shorttitle = 'DCA After Downtrend v2',
title = 'DCA After Downtrend v2 (by BHD_Trade_Bot)',
overlay = true,
calc_on_every_tick = false,
calc_on_order_fills = false,
use_bar_magnifier = false,
pyramiding = 1000,
initial_capital = 0,
default_qty_type = strategy.cash,
default_qty_value = 1000,
commission_type = strategy.commission.percent,
commission_value = 1.1)
// Backtest Time Period
start_year = input(title='Start year' ,defval=2017)
start_month = input(title='Start month' ,defval=1)
start_day = input(title='Start day' ,defval=1)
start_time = timestamp(start_year, start_month, start_day, 00, 00)
end_year = input(title='end year' ,defval=2050)
end_month = input(title='end month' ,defval=1)
end_day = input(title='end day' ,defval=1)
end_time = timestamp(end_year, end_month, end_day, 23, 59)
window() => time >= start_time and time <= end_time ? true : false
h1_last_bar = (math.min(end_time, timenow) - time)/1000/60/60 < 2
// EMA
ema50 = ta.ema(close, 50)
ema200 = ta.ema(close, 200)
// EMA_CD
emacd = ema50 - ema200
emacd_signal = ta.ema(emacd, 20)
hist = emacd - emacd_signal
// BHD Unit
bhd_unit = ta.rma(high - low, 200) * 2
bhd_upper = ema200 + bhd_unit
bhd_upper2 = ema200 + bhd_unit * 2
bhd_upper3 = ema200 + bhd_unit * 3
bhd_upper4 = ema200 + bhd_unit * 4
bhd_upper5 = ema200 + bhd_unit * 5
bhd_lower = ema200 - bhd_unit
bhd_lower2 = ema200 - bhd_unit * 2
bhd_lower3 = ema200 - bhd_unit * 3
bhd_lower4 = ema200 - bhd_unit * 4
bhd_lower5 = ema200 - bhd_unit * 5
// Count n candles after x long entries
var int nPastCandles = 0
var int entryNumber = 0
if window()
nPastCandles := nPastCandles + 1
// ENTRY CONDITIONS
// 24 * 30 per month
entry_condition1 = nPastCandles > entryNumber * 24 * 30
// End of downtrend
entry_condition2 = emacd < 0 and hist < 0 and hist > hist[2]
ENTRY_CONDITIONS = entry_condition1 and entry_condition2
if ENTRY_CONDITIONS
entryNumber := entryNumber + 1
entryId = 'Long ' + str.tostring(entryNumber)
strategy.entry(entryId, strategy.long)
// CLOSE CONDITIONS
// Last bar
CLOSE_CONDITIONS = barstate.islast or h1_last_bar
if CLOSE_CONDITIONS
strategy.close_all()
// Draw
colorRange(src) =>
if src > bhd_upper5
color.rgb(255,0,0)
else if src > bhd_upper4
color.rgb(255,150,0)
else if src > bhd_upper3
color.rgb(255,200,0)
else if src > bhd_upper2
color.rgb(100,255,0)
else if src > bhd_upper
color.rgb(0,255,100)
else if src > ema200
color.rgb(0,255,150)
else if src > bhd_lower
color.rgb(0,200,255)
else if src > bhd_lower2
color.rgb(0,150,255)
else if src > bhd_lower3
color.rgb(0,100,255)
else if src > bhd_lower4
color.rgb(0,50,255)
else
color.rgb(0,0,255)
bhd_upper_line = plot(bhd_upper, color=color.new(color.teal, 90))
bhd_upper_line2 = plot(bhd_upper2, color=color.new(color.teal, 90))
bhd_upper_line3 = plot(bhd_upper3, color=color.new(color.teal, 90))
bhd_upper_line4 = plot(bhd_upper4, color=color.new(color.teal, 90))
bhd_upper_line5 = plot(bhd_upper5, color=color.new(color.teal, 90))
bhd_lower_line = plot(bhd_lower, color=color.new(color.teal, 90))
bhd_lower_line2 = plot(bhd_lower2, color=color.new(color.teal, 90))
bhd_lower_line3 = plot(bhd_lower3, color=color.new(color.teal, 90))
bhd_lower_line4 = plot(bhd_lower4, color=color.new(color.teal, 90))
bhd_lower_line5 = plot(bhd_lower5, color=color.new(color.teal, 90))
// fill(bhd_upper_line5, bhd_lower_line5, color=color.new(color.teal, 95))
plot(ema50, color=color.orange, linewidth=3)
plot(ema200, color=color.teal, linewidth=3)
plot(close, color=color.teal, linewidth=1)
plot(close, color=colorRange(close), linewidth=3, style=plot.style_circles)