بٹ کوائن کو ہلانے کی سائیکل کی حکمت عملی

HALVING DCA CYCLE
تخلیق کی تاریخ: 2025-10-09 11:10:40 آخر میں ترمیم کریں: 2025-10-09 11:10:40
کاپی: 10 کلکس کی تعداد: 166
2
پر توجہ دیں
319
پیروکار

بٹ کوائن کو ہلانے کی سائیکل کی حکمت عملی بٹ کوائن کو ہلانے کی سائیکل کی حکمت عملی

نصف دورانیہ کی حکمت عملی: تاریخی اعداد و شمار سے پتہ چلتا ہے کہ اوسط منافع 1000٪ سے زیادہ ہے

یہ ایک اور تکنیکی تجزیہ کی حکمت عملی نہیں ہے ، بلکہ یہ ایک طویل مدتی سرمایہ کاری کا فریم ورک ہے جو بٹ کوائن کے 4 سالہ نصف دورانیے پر مبنی ہے۔ ریٹرننگ کے اعداد و شمار سے پتہ چلتا ہے کہ خرید و فروخت کو سختی سے نصف وقت کے نوڈس کے مطابق انجام دیا جاتا ہے ، ایک ہی دورانیے میں زیادہ سے زیادہ منافع 2000٪ سے زیادہ ہوسکتا ہے۔

بنیادی منطق سادہ اور غیر معمولی ہے: آدھے وقت میں خریدیں ، 40-80 ہفتوں کے بعد بیچوں میں منافع کمائیں ، اور 135 ہفتوں کے بعد دوبارہ اسٹاک بنائیں۔ یہ آسان لگتا ہے ، لیکن اس کے لئے اسٹیل کی طرح کی مرضی کی ضرورت ہے۔

تین مرحلوں پر مشتمل آپریشنل فریم ورک: وقت کا انتخاب جو روایتی اندازے سے زیادہ درست ہے

پہلا مرحلہ: خریداری کی مدت کو آدھا کرنا (0-40 ہفتوں) نصف ہونے کے واقعے کے فوراً بعد ذخیرہ اندوزی کرنا پوری حکمت عملی کا مرکزی داخلی نقطہ ہے۔ تاریخی اعداد و شمار سے پتہ چلتا ہے کہ نصف ہونے کے بعد 40 ہفتوں کے اندر بہترین جمع ہونے کی مدت ہوتی ہے ، اس وقت مارکیٹ کا جذبہ عام طور پر سپلائی میں کمی کے اثرات کا مکمل طور پر جواب نہیں دیتا ہے۔

مرحلہ II: منافع کی میعاد ختم ہوگئی ((40-80 ہفتوں) آدھے حصے کے بعد 40-80 ہفتوں میں بٹ کوائن کی قیمتوں میں تاریخی دھماکے کی سنہری کھڑکی ہے۔ 2016 میں آدھے حصے کے بعد 78 ہفتوں میں بٹ کوائن میں 3000 فیصد سے زیادہ اضافہ ہوا۔ 2020 میں آدھے حصے کے بعد بھی ایسا ہی ہے۔ یہ وقت کی کھڑکی قیاس آرائی نہیں ہے ، یہ فراہمی اور طلب کی بنیادی باتوں پر مبنی ریاضی کا نتیجہ ہے۔

مرحلہ III: بیج مارکیٹ میں ذخیرہ اندوزی کی مدت ((135 ہفتوں کے بعد) نصف ہونے کے بعد 135 ہفتوں کے بعد عام طور پر گہری ریچھ کی مارکیٹ میں داخل ہوتا ہے ، اس وقت ڈی سی اے حکمت عملی کو چالو کرنا۔ یہ وقت کا انتخاب اندھے فاریکس ٹریڈنگ کیا ہے؟ فاریکس ٹریڈنگ کے فوائد سے بہتر ہے ، کیونکہ بیل کی اونچائی میں غیر موثر سرمایہ کاری سے بچا جاتا ہے۔

خطرے پر قابو پانا: ایک مضبوط جیت کی حکمت عملی نہیں ، بلکہ سخت نظم و ضبط کی ضرورت ہے

سب سے بڑا خطرہ: ناقص عملدرآمد حکمت عملی کا سب سے بڑا دشمن مارکیٹ کی اتار چڑھاؤ نہیں ہے ، بلکہ انسانی فطرت ہے۔ جب مارکیٹ میں مایوسی ہوتی ہے تو خریدنے کے لئے ریورس آپریشن کی ضرورت ہوتی ہے ، جب مارکیٹ میں مایوسی ہوتی ہے تو منافع ہوتا ہے اور اس کے نتیجے میں پرسکون رہنے کی ضرورت ہوتی ہے۔ تاریخ نے دکھایا ہے کہ 90٪ لوگ مکمل طور پر عمل درآمد نہیں کرسکتے ہیں۔

فنڈ مینجمنٹ کی ضروریات ایک بار میں کل اثاثوں کا 20 فیصد سے زیادہ سرمایہ کاری کرنے کی سفارش نہیں کی جاتی ہے ، کیونکہ ایک ہی دور میں 80 فیصد سے زیادہ کی واپسی کا سامنا کرنا پڑ سکتا ہے۔ 2018 میں ریچھ کا بازار 20،000 ڈالر سے 3،200 ڈالر تک گر گیا ، یہاں تک کہ اگر “صحیح” وقت میں خریدا گیا تو بھی بڑے پیمانے پر خسارے کا سامنا کرنا پڑا۔

مارکیٹ کے ماحول میں تبدیلی کا خطرہ حکمت عملی تاریخی 3 مکمل سائیکل کے اعداد و شمار پر مبنی ہے ، لیکن بٹ کوائن مارکیٹ پختہ ہورہی ہے۔ ادارہ جاتی فنڈز کی آمد ، ای ٹی ایف کی منظوری اور دیگر عوامل روایتی سائیکل قوانین کو تبدیل کرسکتے ہیں۔ ماضی کی کارکردگی مستقبل کی آمدنی کی نمائندگی نہیں کرتی ، یہ کوئی بات نہیں ہے۔

پیرامیٹرز کی ترتیب: ریاضیاتی ماڈل کی بنیاد پر غیر موضوعی فیصلے

40 ہفتوں کے منافع کا آغازاس کے علاوہ ، یہ بھی کہا گیا ہے کہ اس کی وجہ یہ ہے کہ اس کی وجہ سے اس کی وجہ سے اس کی وجہ سے اس کی وجہ سے اس کی وجہ سے اس کی وجہ سے اس کی وجہ سے اس کی وجہ سے اس کی وجہ سے اس کی وجہ سے اس کی وجہ سے اس کی وجہ سے اس کی وجہ سے اس کی وجہ سے اس کی وجہ سے ہے.

80 ہفتوں کے منافع کا خاتمہتاریخ کے اعداد و شمار سے پتہ چلتا ہے کہ 80 ہفتوں کے بعد قیمتوں میں کمی کے بعد قیمتوں میں اضافے کا ایک اعلی امکان ہے.

135 ہفتہ DCA شروعبیئر مارکیٹ کے نچلے حصے میں اعداد و شمار کا بہترین حل ، اس وقت سرمایہ کاری کا بہترین خطرہ / منافع کا تناسب۔

عملی مشورہ: طویل مدتی سرمایہ کاروں کے لئے موزوں ، مختصر تجارت کے لئے نہیں

یہ حکمت عملی 5 سال سے زیادہ کی سرمایہ کاری کے دورانیے کے ساتھ فنڈز کے لئے موزوں ہے ، اور ان سرمایہ کاروں کے لئے موزوں نہیں ہے جن کو پیسہ کی ضرورت ہے یا ان کی خطرہ برداشت کرنے کی صلاحیت کم ہے۔ ایک ہی دورانیے میں 2-3 سال کی اتار چڑھاؤ کی مدت برداشت کرنا پڑتی ہے ، جس سے نفسیاتی دباؤ ہوتا ہے۔

حکمت عملی کی جیت مختصر مدت کی قیمت کی پیش گوئی میں نہیں ہے ، بلکہ طویل مدتی سپلائی اور طلب کے چکر کو سمجھنے میں ہے۔ بٹ کوائن کا نصف ہونا ایک یقینی واقعہ ہے ، لیکن قیمت کے رد عمل کا وقت اور اس کی شدت ابھی بھی غیر یقینی ہے۔

اہم یاد دہانی: یہ ایک اعلی خطرہ سرمایہ کاری کی حکمت عملی ہے ، جس میں سرمایہ کی مکمل کمی کا امکان ہے۔ تاریخی جائزہ لینے والے اعداد و شمار مستقبل کی آمدنی کی ضمانت نہیں دیتے ہیں۔ سرمایہ کاری سے پہلے اپنی خطرے کی برداشت کی صلاحیت کا مکمل اندازہ لگائیں۔

حکمت عملی کا ماخذ کوڈ
/*backtest
start: 2017-08-17 08:00:00
end: 2025-10-07 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Binance","currency":"BTC_USDT","balance":500000}]
*/

//@version=6
strategy(title='Bitcoin Halving Cycle Profit - Backtesting', shorttitle='BTC Halv', overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=10000, commission_type=strategy.commission.percent, commission_value=0.1)

// ════════════════════════════════════════════════════════════════════════════════════════════════
// CONFIGURATION & INPUTS
// ════════════════════════════════════════════════════════════════════════════════════════════════

// Backtesting Settings
enableBacktesting = input.bool(true, "Enable Backtesting", group="Backtesting Settings")
enableShortTrades = input.bool(true, "Enable Short Trades", group="Backtesting Settings")
positionSize = input.float(100, "Position Size (%)", minval=10, maxval=100, group="Backtesting Settings")
slippage = input.float(0.05, "Slippage (%)", minval=0, maxval=1, group="Backtesting Settings")

// Main Settings
showHalvingLines = input.bool(true, "Show Halving Lines", group="Display Options")
showProfitZones = input.bool(true, "Show Profit Zones", group="Display Options")
showBackgroundGradient = input.bool(true, "Show Background Gradient", group="Display Options")
showLabels = input.bool(true, "Show Labels", group="Display Options")
showDCAZone = input.bool(true, "Show DCA Zone", group="Display Options")
showInfoTable = input.bool(true, "Show Info Table", group="Display Options")
showTradeSignals = input.bool(true, "Show Trade Signals", group="Display Options")

// Table Settings
tablePosition = input.string("Top Right", "Table Position", options=["Top Left", "Top Right", "Bottom Left", "Bottom Right"], group="Table Settings")
tableSize = input.string("Normal", "Table Size", options=["Small", "Normal", "Large"], group="Table Settings")
tableTransparency = input.int(10, "Table Transparency", minval=0, maxval=50, group="Table Settings")

// Professional Dark Theme Color Scheme
colorHalving = input.color(color.new(#ff6b35, 0), "Halving Line Color", group="Colors")
colorProfitStart = input.color(color.new(#4ecdc4, 0), "Profit Start Color", group="Colors")
colorProfitEnd = input.color(color.new(#ff6b6b, 0), "Profit End Color", group="Colors")
colorDCA = input.color(color.new(#ffd93d, 0), "DCA Color", group="Colors")
colorBackground = input.color(color.new(#4ecdc4, 92), "Background Color", group="Colors")

// Timing Settings
profitStartWeeks = input.int(40, "Profit Start (Weeks)", minval=1, group="Timing")
profitEndWeeks = input.int(80, "Profit End (Weeks)", minval=1, group="Timing")
dcaStartWeeks = input.int(135, "DCA Start (Weeks)", minval=1, group="Timing")

// ════════════════════════════════════════════════════════════════════════════════════════════════
// HELPER FUNCTIONS
// ════════════════════════════════════════════════════════════════════════════════════════════════

// Get table position
getTablePosition() =>
    switch tablePosition
        "Top Left" => position.top_left
        "Top Right" => position.top_right
        "Bottom Left" => position.bottom_left
        "Bottom Right" => position.bottom_right
        => position.top_right

// Get table text size
getTableTextSize() =>
    switch tableSize
        "Small" => size.tiny
        "Normal" => size.small
        "Large" => size.normal
        => size.small

// Get table header text size
getTableHeaderSize() =>
    switch tableSize
        "Small" => size.small
        "Normal" => size.normal
        "Large" => size.large
        => size.normal

// Calculate weeks from halving date
weeksFromHalving(halvingTimestamp) =>
    (time - halvingTimestamp) / (7 * 24 * 60 * 60 * 1000)

// Check if current time is within profit zone
inProfitZone(halvingTimestamp) =>
    weeks = weeksFromHalving(halvingTimestamp)
    weeks >= profitStartWeeks and weeks <= profitEndWeeks

// Check if current time is within DCA zone  
inDCAZone(halvingTimestamp) =>
    weeks = weeksFromHalving(halvingTimestamp)
    weeks >= dcaStartWeeks

// ════════════════════════════════════════════════════════════════════════════════════════════════
// HALVING DATES & DATA
// ════════════════════════════════════════════════════════════════════════════════════════════════

// Historical halving dates
halving1 = timestamp(2012, 11, 28)
halving2 = timestamp(2016, 7, 9)
halving3 = timestamp(2020, 5, 11)
halving4 = timestamp(2024, 4, 19)

// Store halving data
type HalvingData
    float timestamp
    string label
    string emoji
    color lineColor

halvings = array.new<HalvingData>()
array.push(halvings, HalvingData.new(halving1, "1st Halving\n2012", "⛏️", colorHalving))
array.push(halvings, HalvingData.new(halving2, "2nd Halving\n2016", "⛏️⛏️", colorHalving))
array.push(halvings, HalvingData.new(halving3, "3rd Halving\n2020", "⛏️⛏️⛏️", colorHalving))
array.push(halvings, HalvingData.new(halving4, "4th Halving\n2024", "⛏️⛏️⛏️⛏️", colorHalving))

// Get current cycle status
getCurrentCycleStatus() =>
    var string result = "⏳ Pre-Halving Phase"
    for i = array.size(halvings) - 1 to 0 by 1
        halvingData = array.get(halvings, i)
        if time >= halvingData.timestamp
            weeks = weeksFromHalving(halvingData.timestamp)
            if weeks <= profitStartWeeks
                result := "🔶 Accumulation Phase"
                break
            else if weeks <= profitEndWeeks
                result := "🟢 Profit Taking Phase"
                break
            else if weeks <= dcaStartWeeks
                result := "⚠️ Bear Market Phase"
                break
            else
                result := "🟡 DCA Phase"
                break
    result

// Get weeks until next phase
getWeeksUntilNextPhase() =>
    var float result = na
    for i = array.size(halvings) - 1 to 0 by 1
        halvingData = array.get(halvings, i)
        if time >= halvingData.timestamp
            weeks = weeksFromHalving(halvingData.timestamp)
            if weeks <= profitStartWeeks
                result := profitStartWeeks - weeks
                break
            else if weeks <= profitEndWeeks
                result := profitEndWeeks - weeks
                break
            else if weeks <= dcaStartWeeks
                result := dcaStartWeeks - weeks
                break
            else
                result := na
                break
    result

// Get next phase date
getNextPhaseDate() =>
    var float result = na
    for i = array.size(halvings) - 1 to 0 by 1
        halvingData = array.get(halvings, i)
        if time >= halvingData.timestamp
            weeks = weeksFromHalving(halvingData.timestamp)
            if weeks <= profitStartWeeks
                result := halvingData.timestamp + (profitStartWeeks * 7 * 24 * 60 * 60 * 1000)
                break
            else if weeks <= profitEndWeeks
                result := halvingData.timestamp + (profitEndWeeks * 7 * 24 * 60 * 60 * 1000)
                break
            else if weeks <= dcaStartWeeks
                result := halvingData.timestamp + (dcaStartWeeks * 7 * 24 * 60 * 60 * 1000)
                break
            else
                result := na
                break
    result

// Get current phase name
getCurrentPhaseName() =>
    var string result = "Pre-Halving"
    for i = array.size(halvings) - 1 to 0 by 1
        halvingData = array.get(halvings, i)
        if time >= halvingData.timestamp
            weeks = weeksFromHalving(halvingData.timestamp)
            if weeks <= profitStartWeeks
                result := "Accumulation"
                break
            else if weeks <= profitEndWeeks
                result := "Profit Taking"
                break
            else if weeks <= dcaStartWeeks
                result := "Bear Market"
                break
            else
                result := "DCA"
                break
    result

// Get next phase name
getNextPhaseName() =>
    var string result = "Accumulation"
    for i = array.size(halvings) - 1 to 0 by 1
        halvingData = array.get(halvings, i)
        if time >= halvingData.timestamp
            weeks = weeksFromHalving(halvingData.timestamp)
            if weeks <= profitStartWeeks
                result := "Profit Taking"
                break
            else if weeks <= profitEndWeeks
                result := "Bear Market"
                break
            else if weeks <= dcaStartWeeks
                result := "DCA"
                break
            else
                result := "Next Halving"
                break
    result

// Get phase countdown variables
getPhaseCountdown() =>
    var float currentHalvingTimestamp = na
    var float profitStartWeeksLeft = na
    var float profitEndWeeksLeft = na
    var float dcaStartWeeksLeft = na
    var string profitStartDateText = "N/A"
    var string profitEndDateText = "N/A"
    var string dcaStartDateText = "N/A"
    var string nextPhaseName = "N/A"
    var string nextPhaseDateText = "N/A"
    
    for i = array.size(halvings) - 1 to 0 by 1
        halvingData = array.get(halvings, i)
        if time >= halvingData.timestamp
            currentHalvingTimestamp := halvingData.timestamp
            weeks = weeksFromHalving(halvingData.timestamp)
            
            // Calculate countdowns
            profitStartWeeksLeft := profitStartWeeks - weeks
            profitEndWeeksLeft := profitEndWeeks - weeks
            dcaStartWeeksLeft := dcaStartWeeks - weeks
            
            // Calculate dates
            profitStartDate = halvingData.timestamp + (profitStartWeeks * 7 * 24 * 60 * 60 * 1000)
            profitEndDate = halvingData.timestamp + (profitEndWeeks * 7 * 24 * 60 * 60 * 1000)
            dcaStartDate = halvingData.timestamp + (dcaStartWeeks * 7 * 24 * 60 * 60 * 1000)
            
            profitStartDateText := str.format("{0,date,yyyy-MM-dd}", profitStartDate)
            profitEndDateText := str.format("{0,date,yyyy-MM-dd}", profitEndDate)
            dcaStartDateText := str.format("{0,date,yyyy-MM-dd}", dcaStartDate)
            
            // Get next phase
            if weeks <= profitStartWeeks
                nextPhaseName := "Profit Taking"
                nextPhaseDateText := profitStartDateText
                break
            else if weeks <= profitEndWeeks
                nextPhaseName := "Bear Market"
                nextPhaseDateText := profitEndDateText
                break
            else if weeks <= dcaStartWeeks
                nextPhaseName := "DCA"
                nextPhaseDateText := dcaStartDateText
                break
            else
                nextPhaseName := "Next Halving"
                nextPhaseDateText := "N/A"
                break
    
    [profitStartWeeksLeft, profitEndWeeksLeft, dcaStartWeeksLeft, profitStartDateText, profitEndDateText, dcaStartDateText, nextPhaseName, nextPhaseDateText]

// ════════════════════════════════════════════════════════════════════════════════════════════════
// BACKTESTING LOGIC
// ════════════════════════════════════════════════════════════════════════════════════════════════

// Variables for tracking signals
var bool longSignal = false
var bool shortSignal = false
var bool buyAtHalving = false
var bool buyAtDCA = false
var bool sellAtProfitEnd = false
var bool shortAtProfitEnd = false
var bool coverAtDCA = false

// Reset signals
longSignal := false
shortSignal := false
buyAtHalving := false
buyAtDCA := false
sellAtProfitEnd := false
shortAtProfitEnd := false
coverAtDCA := false

// Check for buy signals (Halving and DCA zones)
for i = 0 to array.size(halvings) - 1
    halvingData = array.get(halvings, i)
    weeks = weeksFromHalving(halvingData.timestamp)
    
    // Buy at halving (within 1 week of halving)
    if math.abs(weeks) < 1 and weeks >= 0
        buyAtHalving := true
        longSignal := true
    
    // Buy at DCA start
    if math.abs(weeks - dcaStartWeeks) < 0.5
        buyAtDCA := true
        longSignal := true
    
    // Sell at profit end
    if math.abs(weeks - profitEndWeeks) < 0.5
        sellAtProfitEnd := true
        if enableShortTrades
            shortAtProfitEnd := true
            shortSignal := true
    
    // Cover short at DCA (same time as long entry)
    if math.abs(weeks - dcaStartWeeks) < 0.5 and enableShortTrades
        coverAtDCA := true

// Execute trades
if enableBacktesting
    // Long entries
    if longSignal and (buyAtHalving or buyAtDCA)
        strategy.close("SHORT", comment="Cover Short")
        strategy.entry("LONG", strategy.long, qty=positionSize/100 * strategy.equity/close, comment=buyAtHalving ? "Buy at Halving" : "Buy at DCA")
    
    // Long exit and short entry
    if sellAtProfitEnd and strategy.position_size > 0
        strategy.close("LONG", comment="Sell at Profit End")
        if enableShortTrades and shortAtProfitEnd
            strategy.entry("SHORT", strategy.short, qty=positionSize/100 * strategy.equity/close, comment="Short at Profit End")
    
    // Short cover (already handled above with long entry)

// ════════════════════════════════════════════════════════════════════════════════════════════════
// VISUAL ELEMENTS
// ════════════════════════════════════════════════════════════════════════════════════════════════

// Trade signals visualization
if showTradeSignals
    if longSignal and buyAtHalving
        label.new(bar_index, low, "🟢 BUY\nHALVING", style=label.style_label_up, color=color.new(color.green, 0), textcolor=color.white, size=size.normal)
    
    if longSignal and buyAtDCA
        label.new(bar_index, low, "🟢 BUY\nDCA", style=label.style_label_up, color=color.new(color.green, 0), textcolor=color.white, size=size.normal)
    
    if sellAtProfitEnd
        label.new(bar_index, high, "🔴 SELL\nPROFIT END", style=label.style_label_down, color=color.new(color.red, 0), textcolor=color.white, size=size.normal)
    
    if shortAtProfitEnd and enableShortTrades
        label.new(bar_index, high, "🔴 SHORT\nPROFIT END", style=label.style_label_down, color=color.new(color.orange, 0), textcolor=color.white, size=size.normal)

// Background gradient for profit zones
var bool showBgGradient = false
if showBackgroundGradient
    for i = 0 to array.size(halvings) - 1
        halvingData = array.get(halvings, i)
        if inProfitZone(halvingData.timestamp)
            showBgGradient := true
            break
        else
            showBgGradient := false

bgcolor(showBackgroundGradient and showBgGradient ? colorBackground : na)


// ════════════════════════════════════════════════════════════════════════════════════════════════
// PROFESSIONAL DARK THEME TABLE - ALWAYS VISIBLE
// ════════════════════════════════════════════════════════════════════════════════════════════════

// Get position variables
var string currentPosition = "FLAT"
var color positionColor = color.new(#cccccc, 0)
var string positionEmoji = "⚪"

// Update position variables
currentPosition := strategy.position_size > 0 ? "LONG" : strategy.position_size < 0 ? "SHORT" : "FLAT"
positionColor := strategy.position_size > 0 ? color.new(#00ff88, 0) : strategy.position_size < 0 ? color.new(#ff4444, 0) : color.new(#cccccc, 0)
positionEmoji := strategy.position_size > 0 ? "🟢" : strategy.position_size < 0 ? "🔴" : "⚪"

// Get phase countdown data
[profitStartWeeksLeft, profitEndWeeksLeft, dcaStartWeeksLeft, profitStartDateText, profitEndDateText, dcaStartDateText, nextPhaseName, nextPhaseDateText] = getPhaseCountdown()

// ════════════════════════════════════════════════════════════════════════════════════════════════
// ALERTS
// ════════════════════════════════════════════════════════════════════════════════════════════════

// Enhanced alerts with trade signals
for i = 0 to array.size(halvings) - 1
    halvingData = array.get(halvings, i)
    weeks = weeksFromHalving(halvingData.timestamp)
    
    if math.abs(weeks) < 0.1 and weeks >= 0
        alert("🟢 Bitcoin Halving Cycle: BUY SIGNAL at halving event!", alert.freq_once_per_bar)
    
    if math.abs(weeks - profitEndWeeks) < 0.1
        alert("🔴 Bitcoin Halving Cycle: SELL SIGNAL - Last call for profit taking! (" + str.tostring(profitEndWeeks) + " weeks post-halving)", alert.freq_once_per_bar)
    
    if math.abs(weeks - dcaStartWeeks) < 0.1
        alert("🟡 Bitcoin Halving Cycle: BUY SIGNAL - DCA accumulation phase has begun! (" + str.tostring(dcaStartWeeks) + " weeks post-halving)", alert.freq_once_per_bar)