この戦略の主な考えは,短期的な下落が終了した後,低平均価格を定期的に追跡することです.具体的には,戦略は,毎月の終わりに短期的な下落の終焉を特定し,定期的にポジションを追加し,同時に,最後のKラインが閉じるときにポジションをクリアします.
正規の追跡信号判断: 24*30K線 (1ヶ月を表す) 後に,正規の追跡点に達し,最初の信号が出ていることが決定されます.
短期下落判断の終了:傾向を決定するためにMACD指標を使用します.MACDの分散が発生し,MACDが信号線を下回ると,短期下落が終了したと判断されます.
入場規則: 通常の追跡信号と短期的な減少信号の終了が同時に起動すると,追跡信号が放出され,ロングポジションが開かれます.
出口規則: 最後のK線が閉ざされると,すべての位置をクリアします.
戦略の基本取引流と原則です. 戦略は,追跡をデフォルトで行うことに注意してください.総投資は33ヶ月まで拡大される.33,000.
この戦略の最大の利点は,低水準で定期的にポジションを構築できるということです.長期的観点から,高いリターンを生むために比較的手頃な平均コスト価格を得ることができます.さらに,短期的な購入ポイントを特定するためにMACD指標を使用することは,かなり信頼性と明確で,ある程度行き詰まりを避けることができ,また損失を一定程度避けることができます.
一般的には,これはコスト平均化戦略であり,中長期保有者が満足のいく収益を得るために定期的に批量を購入するのに適しています.
この戦略の主なリスクは,短期的な下落の終焉を正確に判断できないことである. MACD指標の下落の終焉判断は遅れる可能性があるため,最適な点に入れないことになる. さらに,資金の分散投資は,運用コストも増加させる.
傾向を決定するために,ボリンジャー帯,KDJなど,より多くの指標を追加することを検討してください.これらの指標は,逆転タイミングを事前に予測することができます.同時に,毎月投資する資金の量は,収益に対する運用コストの影響を減らすために最適化できます.
戦略は以下の方向でさらに最適化できます.
定期的なトラッキングサイクルを最適化して,例えば2ヶ月に1回トラッキングして,過剰な頻繁な取引の問題を軽減します.
より多くの指標を組み込み 短期的な減少の終焉を決定し 低点に近づくようにします
最適な設定を見つけるために毎月投資する資金の量を最適化します.
ストップ・ロスの戦略を組み込もう. 価格が落ちすぎると過剰な損失を避ける.
保有期間が収益に与える影響をテストし,最適な保有日を決定する.
ダウントレンド戦略の後のドルコスト平均化の全体的な考え方は明確で理解しやすい.定期的な補給と短期的判断を組み合わせることで,より手頃な平均コスト価格を得ることができます.この戦略の中期および長期保有は安定した収益を生むことができ,長期的な投資価値を追求する投資家に適しています.同時に,戦略をさらに改善するために最適化できるいくつかの方向性があり,そのパフォーマンスが1レベル向上することができます.
/*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)