// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © Halving32 // _ _ _ _ ____ ___ // | | | | | | (_) |___ \__ \ // | |__| | __ _| |_ ___ _ __ __ _ __) | ) | // | __ |/ _` | \ \ / / | '_ \ / _` ||__ < / / // | | | | (_| | |\ V /| | | | | (_| |___) / /_ // |_| |_|\__,_|_| \_/ |_|_| |_|\__, |____/____| // __/ | // |___/ //@version=6 indicator("Binance FR (Estilo Dual)", shorttitle="Binance FR Dual", format=format.percent, precision=6, overlay=false) // --- Entradas --- interestRate = input.float(0.01, "Tasa Base (%)", step=0.01) / 100 manualSymbol = input.string("", "Símbolo Manual") noiseReduction = input.float(0.85, "Factor de Suavizado", minval=0.1, maxval=1.0) barOffset = input.int(1, "Desplazamiento (Offset)", minval=-5, maxval=5) // NUEVO: Selector de Estilo chartStyle = input.string("Original (Barras)", "Estilo de Gráfico", options=["Original (Barras)", "Estilo Binance (Línea)"]) // --- Datos --- cleanTicker(ticker) => string[] parts = str.split(ticker, ".") array.get(parts, 0) string baseSymbol = manualSymbol != "" ? manualSymbol : cleanTicker(syminfo.ticker) string premiumTicker = "BINANCE:" + baseSymbol + "_PREMIUM" // --- Cálculo Intrabar --- float[] internalCandles = request.security_lower_tf(premiumTicker, "1", close, ignore_invalid_symbol=true) float avgPremium = na if not na(internalCandles) and array.size(internalCandles) > 0 avgPremium := array.median(internalCandles) else avgPremium := request.security(premiumTicker, timeframe.period, close) // --- Fórmula --- float fundingRate = na if not na(avgPremium) float diff = interestRate - avgPremium float clampedDiff = math.max(-0.05/100, math.min(diff, 0.05/100)) float rawValue = (avgPremium + clampedDiff) * 100 if math.abs(rawValue) > 0.01 fundingRate := rawValue * noiseReduction else fundingRate := rawValue // --- Visualización Condicional --- // 1. Estilo Original (Barras) // Solo se dibuja si seleccionas "Original (Barras)" color barColor = fundingRate >= 0 ? color.teal : color.maroon if math.abs(fundingRate) > 0.03 barColor := fundingRate > 0 ? color.lime : color.red plot(chartStyle == "Original (Barras)" ? fundingRate : na, "FR Barras", color=barColor, style=plot.style_columns, linewidth=15, offset=barOffset) // 2. Estilo Binance (Línea Amarilla con Puntos) // Solo se dibuja si seleccionas "Estilo Binance (Línea)" // Color amarillo típico de Binance (#F0B90B) color binanceYellow = #F0B90B plot(chartStyle == "Estilo Binance (Línea)" ? fundingRate : na, "FR Línea", color=binanceYellow, style=plot.style_linebr, linewidth=2, offset=barOffset) // Dibujamos los círculos (puntos) sobre la línea plot(chartStyle == "Estilo Binance (Línea)" ? fundingRate : na, "FR Puntos", color=binanceYellow, style=plot.style_circles, linewidth=3, offset=barOffset) // --- Líneas de Referencia --- hline(0.01, "Base", color=color.gray, linestyle=hline.style_dotted) hline(0, "Cero", color=color.white) // --- Etiqueta --- var label infoLabel = na if barstate.islast and not na(fundingRate) label.delete(infoLabel) string txt = "Tasa Actual: " + str.tostring(fundingRate, "#.######") + "%" // El color de la etiqueta depende del estilo color labelColor = chartStyle == "Original (Barras)" ? barColor : binanceYellow color textColor = chartStyle == "Original (Barras)" ? color.white : color.black infoLabel := label.new(bar_index + barOffset, fundingRate, txt, color=labelColor, style=label.style_label_down, textcolor=textColor)