''Outils''

//@version=5 indicator("Altseason Trigger Tracker v2.9A - Seuil EMA ou Manuel", overlay=true) // === 📊 INPUTS === useEMADominance = input.bool(true, title="🎯 Utiliser l'EMA comme seuil de dominance BTC ?") dominanceThresholdManual = input.float(52.0, title="Seuil fixe BTC Dominance (%)", step=0.1) showBTCdominance = input.bool(true, title="Afficher BTC Dominance") showETHBTC = input.bool(true, title="Afficher ETH/BTC") showRSI = input.bool(true, title="Afficher RSI ETH/BTC") showDashboard = input.bool(true, title="Afficher le tableau Altseason") lookback = input.int(30, title="Période moyenne (MA/EMA)") // === 📈 DATA === btcDominance = request.security("CRYPTOCAP:BTC.D", timeframe.period, close) btcDomEMA = ta.ema(btcDominance, lookback) btcThreshold = useEMADominance ? btcDomEMA : dominanceThresholdManual ethPrice = request.security("BINANCE:ETHUSDT", timeframe.period, close) btcPrice = request.security("BINANCE:BTCUSDT", timeframe.period, close) ethbtcRatio = ethPrice / btcPrice ethbtcMA = ta.sma(ethbtcRatio, lookback) ethbtcRSI = ta.rsi(ethbtcRatio, 14) // === 🔁 CONDITIONS altseasonNow = btcDominance < btcThreshold and ethbtcRatio > ethbtcMA preAltseason = (btcDominance < btcThreshold and ethbtcRatio > ethbtcMA * 0.99) and not altseasonNow // === 🔔 ALERTES alertcondition(altseasonNow, title="Déclenchement Altseason", message="🟢 Altseason détectée : BTC.D < seuil et ETH/BTC > MA") // === 📊 AFFICHAGE plot(showBTCdominance ? btcDominance : na, color=color.orange, title="BTC Dominance (%)") plot(showBTCdominance and useEMADominance ? btcDomEMA : na, color=color.red, title="BTC Dominance EMA", linewidth=1) plot(showETHBTC ? ethbtcRatio : na, color=color.blue, title="ETH/BTC Ratio") plot(showETHBTC ? ethbtcMA : na, color=color.purple, title="ETH/BTC MA", linewidth=1) // === 🧾 TABLEAU DASHBOARD EN COIN SUPÉRIEUR DROIT === var table altTable = table.new(position=position.top_right, columns=1, rows=5, border_width=1) if bar_index == 1 table.cell(altTable, 0, 0, "ALTSEASON STATUS", text_color=color.white, bgcolor=color.gray, text_size=size.normal) statusColor = altseasonNow ? color.green : preAltseason ? color.yellow : color.red statusText = altseasonNow ? "🟢 ALTSEASON EN COURS" : preAltseason ? "🟡 Pré-altseason" : "🔴 BTC dominant" if showDashboard table.cell(altTable, 0, 1, statusText, bgcolor=statusColor, text_color=color.white, text_size=size.normal) btcInfo = useEMADominance ? "BTC.D : " + str.tostring(btcDominance, '#.##') + " (EMA " + str.tostring(btcDomEMA, '#.##') + ")" : "BTC.D : " + str.tostring(btcDominance, '#.##') + " (Seuil < " + str.tostring(dominanceThresholdManual, '#.##') + ")" table.cell(altTable, 0, 2, btcInfo, text_color=color.white) table.cell(altTable, 0, 3, "ETH/BTC : " + str.tostring(ethbtcRatio, '#.###') + " (MA " + str.tostring(ethbtcMA, '#.###') + ")", text_color=color.white) if showRSI rsiColor = ethbtcRSI > 55 ? color.green : ethbtcRSI < 45 ? color.red : color.yellow table.cell(altTable, 0, 4, "RSI (ETH/BTC) : " + str.tostring(ethbtcRSI, '#.##'), bgcolor=rsiColor, text_color=color.white)

//@version=5 strategy("UT Bot Strategy V1.0 (Testable)", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100) // === INPUTS === sensitivity = input.float(1.5, minval=0.1, step=0.1, title="Sensibilité (xATR)") atrPeriod = input.int(15, minval=1, title="Période ATR") tpPerc = input.float(1.5, title="Take Profit (%)") slPerc = input.float(1.0, title="Stop Loss (%)") // === SOURCE === src = close // === CALCULS === xATR = ta.atr(atrPeriod) nLoss = sensitivity xATR var float trailStop = na trailStop := src > nz(trailStop[1]) and src[1] > nz(trailStop[1]) ? math.max(nz(trailStop[1]), src - nLoss) : src < nz(trailStop[1]) and src[1] < nz(trailStop[1]) ? math.min(nz(trailStop[1]), src + nLoss) : src > nz(trailStop[1]) ? src - nLoss : src + nLoss // === SIGNALS === buySignal = src > trailStop and src[1] <= trailStop[1] sellSignal = src < trailStop and src[1] >= trailStop[1] // === STRATÉGIE ENTRÉES === if (buySignal) strategy.entry("Long", strategy.long) if (sellSignal) strategy.entry("Short", strategy.short) // === STRATÉGIE SORTIES === if (strategy.position_size > 0) strategy.exit("TP/SL Long", from_entry="Long", limit=src (1 + tpPerc/100), stop=src (1 - slPerc/100)) if (strategy.position_size < 0) strategy.exit("TP/SL Short", from_entry="Short", limit=src (1 - tpPerc/100), stop=src * (1 + slPerc/100)) // === AFFICHAGE === plot(trailStop, color=color.orange, title="Trailing Stop ATR") barcolor(buySignal ? color.green : sellSignal ? color.red : na) plotshape(buySignal, title="Buy", location=location.belowbar, style=shape.labelup, color=color.green, text="Buy") plotshape(sellSignal, title="Sell", location=location.abovebar, style=shape.labeldown, color=color.red, text="Sell")