Estratégia do ciclo de redução pela metade do Bitcoin

HALVING DCA CYCLE
Data de criação: 2025-10-09 11:10:40 última modificação: 2025-10-09 11:10:40
cópia: 10 Cliques: 166
2
focar em
319
Seguidores

Estratégia do ciclo de redução pela metade do Bitcoin Estratégia do ciclo de redução pela metade do Bitcoin

Estratégia de redução de meio ciclo: os dados históricos mostram que o rendimento médio é superior a 1000%

Esta não é mais uma estratégia de análise técnica, mas uma estrutura de investimento de longo prazo baseada no ciclo de semicomposição de 4 anos do Bitcoin. Os dados de retrospectiva mostram que os ganhos máximos em um único ciclo podem chegar a mais de 2000% se forem executados rigorosamente de acordo com o nó de semicomposição. Mas não fique entusiasmado, a estratégia requer uma grande capacidade de execução e tolerância ao risco.

A lógica central é simples e grosseira: comprar ao reduzir pela metade, lucrar em lotes após 40 a 80 semanas, reconstruir o armazém depois de 135 semanas. Parece fácil, mas isso requer uma força de vontade de aço.

Quadro de operação em três fases: escolha do momento com mais precisão do que a projeção tradicional

Fase I: redução do período de compra para metade (0-40 semanas) O ponto de entrada central de toda a estratégia é o acúmulo imediato após a ocorrência de um evento de redução pela metade. Os dados históricos mostram que o período de acumulação ideal é de 40 semanas após a redução pela metade, quando o sentimento do mercado geralmente não respondeu completamente aos efeitos da redução da oferta.

Fase II: Obtenção de benefícios no final do prazo (de 40 a 80 semanas) A janela de ouro de 40 a 80 semanas após a redução pela metade é a janela de ouro para a explosão do preço do bitcoin na história. A janela de ouro de 78 semanas após a redução pela metade de 2016 foi de mais de 3000% e a janela de tempo de 2020 foi semelhante. Esta janela de tempo não é uma conjectura, mas uma dedução matemática baseada em fundamentos de oferta e demanda.

Fase III: período de construção de uma bolsa de valores (depois de 135 semanas) Depois de 135 semanas de redução pela metade, geralmente entra em um mercado de baixa profunda, no momento em que a estratégia de DCA é iniciada. Este é um momento preferível para escolher o investimento a olho nu, pois evita o investimento ineficaz no pico do mercado de alta.

Controle de risco: não é uma estratégia de ganhar e ganhar, é uma disciplina

Maior risco: falta de execução O maior inimigo da estratégia não é a volatilidade do mercado, mas sim a natureza humana. Comprar ao meio requer uma operação inversa quando o mercado é pessimista, e lucrar ao fim requer manter a calma durante o carnaval. A história mostra que 90% das pessoas não conseguem executar completamente.

Requisitos de gestão de fundos Recomenda-se que o investimento único não exceda 20% do total dos ativos, pois um único ciclo pode enfrentar mais de 80% de retração. O mercado de ações em 2018 caiu de US \( 20.000 para US \) 3.200, mesmo que a compra seja feita no momento “certo”.

Risco de mudanças no cenário de mercado A estratégia é baseada em três ciclos completos de dados históricos, mas o mercado de Bitcoin está amadurecendo. Faturamento institucional, aprovação de ETFs e outros fatores podem alterar a lei do ciclo tradicional.

Configuração de parâmetros: julgamento baseado em modelos matemáticos e não subjetivos

40 semanas de lucroA taxa de crescimento do mercado de petróleo do país é de cerca de US\( 1 bilhão, o equivalente a US\) 1 bilhão em termos reais, e a taxa de crescimento é de US$ 1 bilhão em termos reais.

80 semanas de lucro terminadasOs dados históricos mostram que 80 semanas após a redução pela metade é um intervalo de alta probabilidade para o preço atingir o pico.

Iniciação da DCA na 135a semanaA melhor solução estatística para a região inferior do mercado de ações é quando o investimento começa a ter a melhor relação risco/recompensa.

Recomendações de combate: para investidores de longo prazo, não para operações de curto prazo

Esta estratégia é adequada para fundos com um ciclo de investimento de mais de 5 anos, não para investidores com necessidade urgente de dinheiro ou baixa tolerância ao risco. Um único ciclo requer um período de flutuação de 2 a 3 anos, o que é muito estressante.

A estratégia de vitória não está em prever o preço a curto prazo, mas em entender o ciclo de oferta e demanda a longo prazo. A redução da metade do Bitcoin é um evento de certeza, mas o tempo e a amplitude da reação do preço ainda são incerto.

Um lembrete importante.A estratégia de investimento de alto risco pode levar ao prejuízo total do capital. Os dados de retrospectiva históricos não garantem o retorno futuro.

Código-fonte da estratégia
/*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)