OPEN-SOURCE SCRIPT
laurent

//version=5
indicator("Big Candle + Squeeze Dots (ATR + RSI + MACD + BB)", overlay=true, timeframe="", timeframe_gaps=true)
//---------------------------
// Inputs
//---------------------------
lenATR = input.int(14, "Période ATR")
multATR = input.float(2.5, "Grosse bougie : range > ATR * X", step=0.1)
lenBodyMA = input.int(20, "Période moyenne de corps")
useBodyMA = input.bool(true, "Filtrer par corps > moyenne")
// RSI / MACD
lenRSI = input.int(14, "Période RSI")
rsiOB = input.float(60, "RSI haussier min")
rsiOS = input.float(40, "RSI baissier max")
fastMACD = input.int(12, "MACD fast")
slowMACD = input.int(26, "MACD slow")
sigMACD = input.int(9, "MACD signal")
// Squeeze Bollinger
bbLen = input.int(20, "Période Bollinger")
bbMult = input.float(2.0, "Ecart-type Bollinger", step=0.1)
squeezeLen = input.int(20, "Période moyenne largeur BB")
squeezeMult = input.float(0.7, "Seuil squeeze (largeur BB < moyenne * X)", step=0.05)
// Filtres
requireMomentum = input.bool(true, "Exiger RSI + MACD")
requireSqueeze = input.bool(true, "Exiger un squeeze juste avant")
squeezeLookback = input.int(5, "Nb de bougies max depuis squeeze", minval=1, maxval=50)
//---------------------------
// Calculs de base
//---------------------------
atr = ta.atr(lenATR)
rangeC = high - low
body = math.abs(close - open)
// moyenne de corps
bodyMA = ta.sma(body, lenBodyMA)
// RSI
rsi = ta.rsi(close, lenRSI)
// MACD
macdVal = ta.ema(close, fastMACD) - ta.ema(close, slowMACD)
macdSig = ta.ema(macdVal, sigMACD)
macdHist = macdVal - macdSig
//---------------------------
// Bollinger Bands + Squeeze
//---------------------------
basis = ta.sma(close, bbLen)
dev = bbMult * ta.stdev(close, bbLen)
upper = basis + dev
lower = basis - dev
bbWidth = (upper - lower) / basis
bbWidthMA = ta.sma(bbWidth, squeezeLen)
// squeeze = largeur BB inférieure à une fraction de sa moyenne
isSqueeze = bbWidth < bbWidthMA * squeezeMult
// Nombre de barres depuis le dernier squeeze
barsSinceSqueeze = ta.barssince(isSqueeze)
// Condition : on considère qu'on sort d'une zone de squeeze récente
hadRecentSqueeze = barsSinceSqueeze >= 0 and barsSinceSqueeze <= squeezeLookback
//---------------------------
// Conditions Wide Range Candle
//---------------------------
// 1) Bougie large vs ATR
wideByATR = rangeC > atr * multATR
// 2) Bougie large vs moyenne de corps (optionnel)
wideByBody = useBodyMA ? body > bodyMA : true
wideCandle = wideByATR and wideByBody
//---------------------------
// Direction + momentum
//---------------------------
bullBody = close > open
bearBody = close < open
bullMomentum = (rsi > rsiOB) and (macdHist > 0)
bearMomentum = (rsi < rsiOS) and (macdHist < 0)
condMomentumBull = requireMomentum ? bullMomentum : true
condMomentumBear = requireMomentum ? bearMomentum : true
condSqueeze = requireSqueeze ? hadRecentSqueeze : true
bullCond = wideCandle and bullBody and condMomentumBull and condSqueeze
bearCond = wideCandle and bearBody and condMomentumBear and condSqueeze
//---------------------------
// Affichage des points discrets
//---------------------------
// Petit point vert sous la bougie = grosse bougie haussière
plotshape(bullCond, title="Big Bull Candle (Squeeze + Mom.)", style=shape.circle,
location=location.belowbar, color=color.new(color.lime, 0), size=size.tiny)
// Petit point rouge au-dessus de la bougie = grosse bougie baissière
plotshape(bearCond, title="Big Bear Candle (Squeeze + Mom.)", style=shape.circle,
location=location.abovebar, color=color.red, size=size.tiny)
indicator("Big Candle + Squeeze Dots (ATR + RSI + MACD + BB)", overlay=true, timeframe="", timeframe_gaps=true)
//---------------------------
// Inputs
//---------------------------
lenATR = input.int(14, "Période ATR")
multATR = input.float(2.5, "Grosse bougie : range > ATR * X", step=0.1)
lenBodyMA = input.int(20, "Période moyenne de corps")
useBodyMA = input.bool(true, "Filtrer par corps > moyenne")
// RSI / MACD
lenRSI = input.int(14, "Période RSI")
rsiOB = input.float(60, "RSI haussier min")
rsiOS = input.float(40, "RSI baissier max")
fastMACD = input.int(12, "MACD fast")
slowMACD = input.int(26, "MACD slow")
sigMACD = input.int(9, "MACD signal")
// Squeeze Bollinger
bbLen = input.int(20, "Période Bollinger")
bbMult = input.float(2.0, "Ecart-type Bollinger", step=0.1)
squeezeLen = input.int(20, "Période moyenne largeur BB")
squeezeMult = input.float(0.7, "Seuil squeeze (largeur BB < moyenne * X)", step=0.05)
// Filtres
requireMomentum = input.bool(true, "Exiger RSI + MACD")
requireSqueeze = input.bool(true, "Exiger un squeeze juste avant")
squeezeLookback = input.int(5, "Nb de bougies max depuis squeeze", minval=1, maxval=50)
//---------------------------
// Calculs de base
//---------------------------
atr = ta.atr(lenATR)
rangeC = high - low
body = math.abs(close - open)
// moyenne de corps
bodyMA = ta.sma(body, lenBodyMA)
// RSI
rsi = ta.rsi(close, lenRSI)
// MACD
macdVal = ta.ema(close, fastMACD) - ta.ema(close, slowMACD)
macdSig = ta.ema(macdVal, sigMACD)
macdHist = macdVal - macdSig
//---------------------------
// Bollinger Bands + Squeeze
//---------------------------
basis = ta.sma(close, bbLen)
dev = bbMult * ta.stdev(close, bbLen)
upper = basis + dev
lower = basis - dev
bbWidth = (upper - lower) / basis
bbWidthMA = ta.sma(bbWidth, squeezeLen)
// squeeze = largeur BB inférieure à une fraction de sa moyenne
isSqueeze = bbWidth < bbWidthMA * squeezeMult
// Nombre de barres depuis le dernier squeeze
barsSinceSqueeze = ta.barssince(isSqueeze)
// Condition : on considère qu'on sort d'une zone de squeeze récente
hadRecentSqueeze = barsSinceSqueeze >= 0 and barsSinceSqueeze <= squeezeLookback
//---------------------------
// Conditions Wide Range Candle
//---------------------------
// 1) Bougie large vs ATR
wideByATR = rangeC > atr * multATR
// 2) Bougie large vs moyenne de corps (optionnel)
wideByBody = useBodyMA ? body > bodyMA : true
wideCandle = wideByATR and wideByBody
//---------------------------
// Direction + momentum
//---------------------------
bullBody = close > open
bearBody = close < open
bullMomentum = (rsi > rsiOB) and (macdHist > 0)
bearMomentum = (rsi < rsiOS) and (macdHist < 0)
condMomentumBull = requireMomentum ? bullMomentum : true
condMomentumBear = requireMomentum ? bearMomentum : true
condSqueeze = requireSqueeze ? hadRecentSqueeze : true
bullCond = wideCandle and bullBody and condMomentumBull and condSqueeze
bearCond = wideCandle and bearBody and condMomentumBear and condSqueeze
//---------------------------
// Affichage des points discrets
//---------------------------
// Petit point vert sous la bougie = grosse bougie haussière
plotshape(bullCond, title="Big Bull Candle (Squeeze + Mom.)", style=shape.circle,
location=location.belowbar, color=color.new(color.lime, 0), size=size.tiny)
// Petit point rouge au-dessus de la bougie = grosse bougie baissière
plotshape(bearCond, title="Big Bear Candle (Squeeze + Mom.)", style=shape.circle,
location=location.abovebar, color=color.red, size=size.tiny)
Açık kaynak kodlu komut dosyası
Gerçek TradingView ruhuyla, bu komut dosyasının mimarı, yatırımcıların işlevselliğini inceleyip doğrulayabilmesi için onu açık kaynaklı hale getirdi. Yazarı tebrik ederiz! Ücretsiz olarak kullanabilseniz de, kodu yeniden yayınlamanın Topluluk Kurallarımıza tabi olduğunu unutmayın.
Feragatname
Bilgiler ve yayınlar, TradingView tarafından sağlanan veya onaylanan finansal, yatırım, alım satım veya diğer türden tavsiye veya öneriler anlamına gelmez ve teşkil etmez. Kullanım Koşulları bölümünde daha fazlasını okuyun.
Açık kaynak kodlu komut dosyası
Gerçek TradingView ruhuyla, bu komut dosyasının mimarı, yatırımcıların işlevselliğini inceleyip doğrulayabilmesi için onu açık kaynaklı hale getirdi. Yazarı tebrik ederiz! Ücretsiz olarak kullanabilseniz de, kodu yeniden yayınlamanın Topluluk Kurallarımıza tabi olduğunu unutmayın.
Feragatname
Bilgiler ve yayınlar, TradingView tarafından sağlanan veya onaylanan finansal, yatırım, alım satım veya diğer türden tavsiye veya öneriler anlamına gelmez ve teşkil etmez. Kullanım Koşulları bölümünde daha fazlasını okuyun.