Основная идея этой стратегии заключается в том, чтобы регулярно отслеживать низкие средние цены после окончания краткосрочных спадов.
Определение регулярного сигнала отслеживания: после 24*30 K-линий (которые представляют один месяц) определяется, что нормальная точка отслеживания достигнута, и выводится первый сигнал.
Конец краткосрочного падения: используйте индикатор MACD для определения тренда. Когда происходит дивергенция MACD и MACD опускается ниже линии сигнала, определяется, что краткосрочное падение закончилось.
Правила входа: когда одновременно запускается регулярный сигнал отслеживания и конец краткосрочного сигнала снижения, выпускается сигнал отслеживания и открываются длинные позиции.
Правила выхода: когда последняя линия К. закрывается, освободите все позиции.
Выше приведены основные торговые потоки и принципы стратегии.\(1000 в месяц на обратные тесты, которые будут расширены до 33 месяцев, т.е. общий объем инвестиций33,000.
Наибольшее преимущество этой стратегии заключается в том, что она может регулярно строить позиции на низких уровнях. С долгосрочной точки зрения она может получить относительно доступную среднюю стоимость, чтобы генерировать высокую доходность. Кроме того, использование индикатора MACD для определения краткосрочных точек покупки также достаточно надежно и ясно, что может избежать попадания в тупик в некоторой степени, а это также может избежать потерь в некоторой степени.
В целом, это стратегия среднего расхода, более подходящая для владельцев среднесрочных и долгосрочных партий, которые регулярно покупают партии, чтобы получить удовлетворительную прибыль.
Основной риск стратегии заключается в невозможности точно определить конец краткосрочного спада. Суждение индикатора MACD о конце спада может задержаться, что приведет к невозможности выхода в оптимальную точку. Кроме того, рассредоточенное инвестирование средств также увеличивает эксплуатационные затраты.
Подумайте о добавлении дополнительных индикаторов для определения тенденций, таких как полосы Боллинджера, KDJ и т. Д. Эти индикаторы могут заранее предвидеть время обращения. В то же время сумму средств, инвестируемых каждый месяц, можно оптимизировать для снижения влияния операционных затрат на доходность.
Стратегия может быть дополнительно оптимизирована в следующих направлениях:
Оптимизировать регулярный цикл отслеживания, например, один раз в два месяца, чтобы уменьшить проблему чрезмерной частоты торговли.
Включите больше показателей, чтобы определить конец краткосрочного спада, приблизив точку входа к самой низкой точке.
Оптимизируйте сумму средств, вложенных каждый месяц, чтобы найти оптимальную конфигурацию.
Постарайтесь использовать стратегии стоп-лосса, чтобы избежать чрезмерных потерь, когда цены падают слишком низко.
Проверить влияние различных периодов хранения на доходы, чтобы найти оптимальные дни хранения.
Общая идея этой средней стоимости доллара после стратегии нисходящего тренда ясна и легко понятна. Объединив регулярное пополнение и краткосрочное суждение, можно получить более доступную среднюю стоимость. Средне- и долгосрочное владение этой стратегией может генерировать стабильные доходы и подходит для инвесторов, преследующих долгосрочную инвестиционную ценность. В то же время есть некоторые направления, которые можно оптимизировать для дальнейшего улучшения стратегии, чтобы ее производительность могла подняться на один уровень.
/*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)