Estrategia del ciclo de reducción a la mitad de Bitcoin

HALVING DCA CYCLE
Fecha de creación: 2025-10-09 11:10:40 Última modificación: 2025-10-09 11:10:40
Copiar: 10 Número de Visitas: 166
2
Seguir
319
Seguidores

Estrategia del ciclo de reducción a la mitad de Bitcoin Estrategia del ciclo de reducción a la mitad de Bitcoin

Estrategia de reducción de la mitad del ciclo: los datos históricos muestran un rendimiento promedio de más del 1000%

Esta no es otra estrategia de análisis técnico, sino un marco de inversión a largo plazo basado en el ciclo de mediación de 4 años de Bitcoin. Los datos de retrospectiva muestran que las compras y ventas se realizan estrictamente en los nodos de mediación, con un máximo de ganancias de un ciclo de más del 2000%. Pero no se entusiasme, esta estrategia requiere una gran capacidad de ejecución y capacidad de asumir riesgos.

La lógica central es simple y grosera: comprar a la mitad, obtener ganancias por lotes después de 40 a 80 semanas, reconstruir el almacén después de 135 semanas. Suena fácil, pero requiere una fuerza de voluntad de acero.

Marco operativo en tres etapas: una selección de tiempo más precisa que el pronóstico tradicional

Fase 1: Reducción a la mitad del período de compra (de 0 a 40 semanas) El punto de entrada central de toda la estrategia es la acumulación inmediata después de un evento de reducción de la mitad. Los datos históricos muestran que el período de acumulación óptimo es de 40 semanas después de la reducción de la mitad, momento en el que el sentimiento del mercado generalmente no ha respondido completamente a la reducción de la oferta.

Fase II: Se obtiene el vencimiento (de 40 a 80 semanas) Las 40 a 80 semanas después de la reducción a la mitad son la ventana de oro en la que el precio de Bitcoin ha estallado históricamente. Después de la reducción a la mitad en 2016, el aumento de Bitcoin en 78 semanas superó el 3000%, similar a la reducción a la mitad en 2020. Esta ventana de tiempo no es una conjetura, sino una inferencia matemática basada en fundamentos de la oferta y la demanda.

Fase III: período de construcción de la bolsa de valores (después de 135 semanas) Después de la reducción a la mitad, las 135 semanas generalmente entran en un mercado bajista profundo, momento en el que se inicia la estrategia DCA. Este momento es preferible a la inversión a ciegas, ya que se evita la inversión ineficaz en los picos del mercado alcista.

Control de riesgos: no es una estrategia de ganar y ganar, requiere disciplina

El mayor riesgo: la falta de ejecución El mayor enemigo de la estrategia no son las fluctuaciones del mercado, sino la naturaleza humana. Comprar a la mitad requiere operar de manera inversa cuando el mercado es pesimista, y obtener ganancias requiere mantener la calma durante la fiesta. La historia muestra que el 90% de las personas no pueden ejecutar completamente.

Requisitos de gestión de fondos Se recomienda no invertir más del 20% de los activos totales en una sola vez, ya que un solo ciclo puede enfrentar más del 80% de retroceso. El mercado bajista de 2018 cayó de \( 20,000 a \) 3,200, incluso con grandes pérdidas en las compras en el momento “correcto”.

Riesgo de cambios en el entorno del mercado La estrategia se basa en tres ciclos completos de datos históricos, pero el mercado de Bitcoin está madurando. Factores como el flujo de fondos institucionales, la aprobación de ETFs pueden cambiar las leyes de ciclo tradicionales. El rendimiento pasado no representa los beneficios futuros, no es una tontería.

Ajuste de parámetros: basado en modelos matemáticos y no en juicios subjetivos

40 semanas de gananciasEn el caso de las inversiones en el sector de la construcción, la tendencia es que el precio de la construcción sea más bajo que el precio de la construcción.

Fin de las 80 semanas de gananciaLos datos históricos muestran que 80 semanas después de la reducción a la mitad es un período de alta probabilidad de que los precios alcancen su punto máximo.

Inicio de las 135 semanas de DCAEn la zona baja del mercado de los osos, el riesgo-beneficio de la inversión es el mejor.

Recomendaciones de combate: para inversionistas a largo plazo, no para operaciones a corto plazo

Esta estrategia es adecuada para los fondos con un ciclo de inversión de más de 5 años, no para los inversores que necesitan dinero o tienen una baja tolerancia al riesgo. Un solo ciclo requiere soportar un período de fluctuación de 2-3 años, y la presión psicológica es alta.

La estrategia de éxito no consiste en predecir el precio a corto plazo, sino en comprender el ciclo de oferta y demanda a largo plazo. La reducción a la mitad de Bitcoin es un evento de certeza, pero el tiempo y la magnitud de la reacción del precio siguen siendo inciertos.

Un recordatorio importanteEs una estrategia de inversión de alto riesgo, con la posibilidad de perder todo el capital. Los datos de retroalimentación histórica no garantizan los beneficios futuros. Antes de invertir, evalúe completamente su capacidad de soportar el riesgo.

Código Fuente de la Estrategia
/*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)