# B4 Indicator # # Free for use for non commercial. Header credits must be included when any form of the code included in this package is used. # User assumes all risk. Author not responsible for errors or use of tool. # Copyright (c) 2021 B4 Signals # # Get support at: https://b4signals.com # Join us at: https://discord.gg/kD3pKE2CQd # # # v3.0 - barbros / chuck - official release # BETA - christoper84 - new squeeze logic # v3.1 - barbaros - squeeze integration, added squeeze dots, changed squeeze label text and color declare lower; input ShowMarketForecastLabel = yes; #hint ShowMarketForecastLabel: Show the intermediate Market Forecast label input ShowMACDBBLabel = yes; #hint ShowMACDBBLabel: Show the MACDBB based Trend label input ShowMACDBBCloud = no; #hint ShowMACDBBCloud: Show the MACDBB cloud shaded between BB input ShowRSMCloud = no; #hint ShowRSMCloud: Show the vertical cloud based on RSM input ShowHMALabel = yes; #hint ShowHMALabel: Show HUll Moving Average based Divergence label input ShowSQZSqueezeLabel = yes; #hint ShowSQZSqueezeLabel: Show Stochastic Scalper based squeeze label input ShowSQZSqueezeCloud = yes; #hint ShowSQZSqueezeCloud: Show Stochastic Scalper based squeeze cloud between BB input ShowBullBearVerticalLines = yes; #hint ShowBullBearVerticalLines: Show vertical lines for bullish or bearish direction AddLabel(yes, "B4 Indicator", Color.WHITE); ### Market Forecast def pIntermediate = MarketForecast().Intermediate; AddLabel(ShowMarketForecastLabel, "Market Forecast " + if pIntermediate >= 80 then "Bullish" else if pIntermediate <= 20 then "Bearish" else if pIntermediate > pIntermediate[1] then "Rising" else if pIntermediate < pIntermediate[1] then "Falling" else "Neutral", if pIntermediate >= 80 then Color.DARK_GREEN else if pIntermediate <= 20 then Color.DARK_RED else if pIntermediate > pIntermediate[1] then Color.GREEN else if pIntermediate < pIntermediate[1] then Color.RED else Color.GRAY ); ### MACDBB input MACDBB_FastLength = 12; input MACDBB_SlowLength = 26; input MACDBB_BandLength = 15; input MACDBB_NumDev = 1.0; def MACDBB_Data = MACD(fastLength = MACDBB_FastLength, slowLength = MACDBB_SlowLength, MACDLength = 5); plot MACDBB_Upper = reference BollingerBands(price = MACDBB_Data, length = MACDBB_BandLength, Num_Dev_Dn = -MACDBB_NumDev, Num_Dev_Up = MACDBB_NumDev).UpperBand; MACDBB_Upper.SetDefaultColor(Color.RED); MACDBB_Upper.HideTitle(); MACDBB_Upper.HideBubble(); plot MACDBB_Lower = reference BollingerBands(price = MACDBB_Data, length = MACDBB_BandLength, Num_Dev_Dn = -MACDBB_NumDev, Num_Dev_Up = MACDBB_NumDev).Lowerband; MACDBB_Lower.SetDefaultColor(Color.GREEN); MACDBB_Lower.HideTitle(); MACDBB_Lower.HideBubble(); plot MACDBB_Midline = reference BollingerBands(price = MACDBB_Data, length = MACDBB_BandLength, Num_Dev_Dn = -MACDBB_NumDev, Num_Dev_Up = MACDBB_NumDev).MidLine; MACDBB_Midline.SetDefaultColor(Color.LIGHT_RED); MACDBB_Midline.SetStyle(Curve.FIRM); MACDBB_MidLine.HideTitle(); MACDBB_MidLine.HideBubble(); plot MACDBB_Line = MACDBB_Data; MACDBB_Line.AssignValueColor( if MACDBB_Line > MACDBB_Line[1] and MACDBB_Line >= MACDBB_Upper then Color.GREEN else if MACDBB_Line < MACDBB_Line[1] and MACDBB_Line >= MACDBB_Upper then Color.DARK_GREEN else if MACDBB_Line < MACDBB_Line[1] and MACDBB_Line <= MACDBB_Lower then Color.RED else if MACDBB_Line > MACDBB_Line[1] and MACDBB_Line <= MACDBB_Lower then Color.DARK_RED else Color.GRAY ); MACDBB_Line.SetLineWeight(1); plot MACDBB_Dots = MACDBB_Data; MACDBB_Dots.AssignValueColor( if MACDBB_Line > MACDBB_Line[1] and MACDBB_Line > MACDBB_Upper then Color.GREEN else if MACDBB_Line < MACDBB_Line[1] and MACDBB_Line > MACDBB_Upper then Color.DARK_GREEN else if MACDBB_Line < MACDBB_Line[1] and MACDBB_Line < MACDBB_Lower then Color.RED else if MACDBB_Line > MACDBB_Line[1] and MACDBB_Line < MACDBB_Lower then Color.DARK_RED else Color.GRAY ); MACDBB_Dots.SetPaintingStrategy(PaintingStrategy.LINE_VS_POINTS); MACDBB_Dots.SetLineWeight(1); MACDBB_Dots.HideTitle(); MACDBB_Dots.HideBubble(); input MACDBB_CrossFromAboveAlert = {default "Zero", "Lower", "Middle", "Upper"}; input MACDBB_CrossFromBelowAlert = {default "Zero", "Lower", "Middle", "Upper"}; def MACDBB_CrossFromAboveVal = if MACDBB_CrossFromAboveAlert == MACDBB_CrossFromAboveAlert.Lower then MACDBB_Lower else if MACDBB_CrossFromAboveAlert == MACDBB_CrossFromAboveAlert.Upper then MACDBB_Upper else 0; def MACDBB_CrossFromBelowVal = if MACDBB_CrossFromBelowAlert == MACDBB_CrossFromBelowAlert.Lower then MACDBB_Lower else if MACDBB_CrossFromBelowAlert == MACDBB_CrossFromBelowAlert.Upper then MACDBB_Upper else 0; def MACDBB_Buy = MACDBB_Data > MACDBB_Upper; def MACDBB_Sell = MACDBB_Data <= MACDBB_Lower; AddLabel(ShowMACDBBLabel, "Trend " + if MACDBB_Line > MACDBB_Line[1] and MACDBB_Line > MACDBB_Upper then "Bullish" else if MACDBB_Line < MACDBB_Line[1] and MACDBB_Line > MACDBB_Upper then "Bullish (reversing)" else if MACDBB_Line < MACDBB_Line[1] and MACDBB_Line < MACDBB_Lower then "Bearish" else if MACDBB_Line > MACDBB_Line[1] and MACDBB_Line < MACDBB_Lower then "Bearish (reversing)" else "Neutral", if MACDBB_Line > MACDBB_Line[1] and MACDBB_Line > MACDBB_Upper then Color.GREEN else if MACDBB_Line < MACDBB_Line[1] and MACDBB_Line > MACDBB_Upper then Color.DARK_GREEN else if MACDBB_Line < MACDBB_Line[1] and MACDBB_Line < MACDBB_Lower then Color.RED else if MACDBB_Line > MACDBB_Line[1] and MACDBB_Line < MACDBB_Lower then Color.DARK_RED else Color.GRAY ); AddCloud(if ShowMACDBBCloud then MACDBB_Upper else MACDBB_Lower, MACDBB_Lower, Color.LIGHT_RED); ### RSI/STOCASTIC/MACD CONFLUENCE COMBO plot RSM_MACD_Diff = reference MACD("fast length" = 12, "slow length" = 26, "macd length" = 9).Diff; RSM_MACD_Diff.SetDefaultColor(GetColor(5)); RSM_MACD_Diff.SetPaintingStrategy(PaintingStrategy.HISTOGRAM); RSM_MACD_Diff.SetLineWeight(4); RSM_MACD_Diff.DefineColor("Positive and Up", Color.GREEN); RSM_MACD_Diff.DefineColor("Positive and Down", Color.DARK_GREEN); RSM_MACD_Diff.DefineColor("Negative and Down", Color.RED); RSM_MACD_Diff.DefineColor("Negative and Up", Color.DARK_RED); RSM_MACD_Diff.AssignValueColor( if RSM_MACD_Diff >= 0 then if RSM_MACD_Diff > RSM_MACD_Diff[1] then RSM_MACD_Diff.Color("Positive and Up") else RSM_MACD_Diff.Color("Positive and Down") else if RSM_MACD_Diff < RSM_MACD_Diff[1] then RSM_MACD_Diff.Color("Negative and Down") else RSM_MACD_Diff.Color("Negative and Up") ); plot RSM_MACD_ZeroLine = 0; RSM_MACD_ZeroLine.SetDefaultColor(Color.DARK_GRAY); RSM_MACD_ZeroLine.HideTitle(); RSM_MACD_ZeroLine.HideBubble(); def RSM_RSI = reference RSI(length = 7).RSI; def RSM_Stoch_Val = 100 * (close - lowest(low, 14)) / (highest(high, 14) - lowest(low, 14)); def RSM_StochSlowK = SimpleMovingAvg(SimpleMovingAvg(RSM_Stoch_Val,3),3); def RSM_rsiGreen = RSM_RSI >= 50; def RSM_rsiRed = RSM_RSI < 50; def RSM_stochGreen = RSM_StochSlowK >= 50; def RSM_stochRed = RSM_StochSlowK < 50; def RSM_macdGreen = RSM_MACD_Diff >= 0; def RSM_macdRed = RSM_MACD_Diff < 0; def RSM_Buy = RSM_rsiGreen and RSM_stochGreen and RSM_macdGreen; def RSM_Sell = RSM_rsiRed and RSM_stochRed and RSM_macdRed; # Shade areas based on criteria; adjust as needed AddCloud( if ShowRSMCloud and RSM_rsiGreen and RSM_stochGreen and RSM_macdGreen then Double.POSITIVE_INFINITY else Double.NaN, if ShowRSMCloud and RSM_rsiGreen and RSM_stochGreen and RSM_macdGreen then Double.NEGATIVE_INFINITY else Double.NaN, Color.LIGHT_GREEN ); AddCloud( if ShowRSMCloud and RSM_rsiRed and RSM_stochRed and RSM_macdRed then Double.POSITIVE_INFINITY else Double.NaN, if ShowRSMCloud and RSM_rsiRed and RSM_stochRed and RSM_macdRed then Double.NEGATIVE_INFINITY else Double.NaN, Color.LIGHT_RED ); ### Divergance input HMA_Length = 55; input HMA_Lookback = 2; def HMA = HullMovingAvg(price = HL2, length = HMA_Length); def HMA_delta = HMA[1] - HMA[HMA_Lookback + 1]; def HMA_delta_per_bar = HMA_delta / HMA_Lookback; def HMA_next_bar = HMA[1] + HMA_delta_per_bar; def HMA_concavity = if HMA > HMA_next_bar then 1 else -1; def HMA_MA_Max = if HMA[-1] < HMA and HMA > HMA[1] then HMA else Double.NaN; def HMA_MA_Min = if HMA[-1] > HMA and HMA < HMA[1] then HMA else Double.NaN; def HMA_divergence = HMA - HMA_next_bar; AddLabel(ShowHMALabel, "Divergence " + if HMA_concavity < 0 then if HMA_divergence[1] > HMA_divergence then "Bearish" else "Bearish (reversing)" else if HMA_divergence[1] < HMA_divergence then "Bullish" else "Bullish (reversing)", if HMA_concavity < 0 then if HMA_divergence[1] > HMA_divergence then Color.RED else Color.DARK_RED else if HMA_divergence[1] < HMA_divergence then Color.GREEN else Color.DARK_GREEN ); ### Squeeze input SQZ_SqueezeLength = 30; def SQZ_Bandwidth = MACDBB_Upper - MACDBB_Lower; def SQZ_Squeeze_Low = Lowest(SQZ_Bandwidth, SQZ_SqueezeLength); def SQZ_Squeeze = SQZ_Bandwidth == SQZ_Squeeze_Low; def SQZ_squeeze_signal = !SQZ_squeeze[1] and SQZ_squeeze; plot SQZ_Dot = if SQZ_Squeeze then 0 else Double.NaN; SQZ_Dot.setPaintingStrategy(PaintingStrategy.POINTS); SQZ_Dot.setLineWeight(2); SQZ_Dot.setDefaultColor(color.WHITE); SQZ_Dot.HideTitle(); SQZ_Dot.HideBubble(); AddCloud(if ShowSQZSqueezeCloud and SQZ_squeeze then MACDBB_Upper else Double.NaN, if ShowSQZSqueezeCloud and SQZ_squeeze then MACDBB_Lower else Double.NaN, Color.YELLOW); AddLabel(ShowSQZSqueezeLabel, "Squeeze Alert", if SQZ_squeeze then Color.WHITE else Color.DARK_GRAY); ### RSI IFT def RSI_IFT_R = reference RSI(5, close) - 50; def RSI_IFT_AvgRSI = MovingAverage(AverageType.Exponential,RSI_IFT_R,9); def RSI_IFT_InverseRSI = (Power(Double.E, 2 * RSI_IFT_AvgRSI) - 1) / (Power(Double.E, 2 * RSI_IFT_AvgRSI) + 1); def RSI_IFT_Direction = if BarNumber() == 0 then 0 else if (RSI_IFT_InverseRSI[1] > 0) and (RSI_IFT_InverseRSI < 0) then -1 else if (RSI_IFT_InverseRSI > 0) and (RSI_IFT_InverseRSI[1] < 0) then 1 else RSI_IFT_Direction[1]; ### Fibonacci SuperTrend input FST_Length = 11; input FST_Retrace = 23.6; input FST_UseHighLow = yes; def FST_h = if FST_UseHighLow then high else close; def FST_l = if FST_UseHighLow then low else close; def FST_minL = Lowest(FST_l, FST_Length); def FST_maxH = Highest(FST_h, FST_Length); def FST_hh = if FST_h > FST_maxH[1] then FST_h else FST_hh[1]; def FST_ll = if FST_l < FST_minL[1] then FST_l else FST_ll[1]; def FST_trend = if FST_h > FST_maxH[1] then 1 else if FST_l < FST_minL[1] then -1 else FST_trend[1]; def FST_Direction = if BarNumber() == 0 then 0 else if FST_trend != 1 then -1 else if FST_trend == 1 then 1 else FST_Direction[1]; ### Bar Color input BarColor = { "None", default "RSM", "FibonacciSuperTrend" }; #hint BarColor: Paint bars with RSM or Fibonacci SuperTrend direction AssignPriceColor( if BarColor == BarColor.FibonacciSuperTrend then if FST_trend == 1 then Color.GREEN else Color.RED else if BarColor == BarColor.RSM then if RSM_Buy then Color.GREEN else if RSM_Sell then Color.RED else Color.DARK_GRAY else Color.CURRENT ); ### Strategy input BullBear_Include_FST = yes; #hint BullBear_Include_FST: Include Fibonacci SuperTrend in the vertical line strategy input BullBear_Include_RSI_IFT = yes; #hint BullBear_Include_RSI_IFT: Include RSI IFT in the vertical line strategy def BullBear_Buy = (!BullBear_Include_FST or FST_Direction == 1) and (!BullBear_Include_RSI_IFT or RSI_IFT_Direction == 1); def BullBear_Sell = (!BullBear_Include_FST or FST_Direction == -1) and (!BullBear_Include_RSI_IFT or RSI_IFT_Direction == -1); AddVerticalLine(ShowBullBearVerticalLines and BullBear_Buy and !BullBear_Buy[1], AsDollars(close), Color.GREEN, Curve.SHORT_DASH); AddVerticalLine(ShowBullBearVerticalLines and BullBear_Sell and !BullBear_Sell[1], AsDollars(close), Color.RED, Curve.SHORT_DASH); def Strategy_Buy = BullBear_Buy and MACDBB_Buy and RSM_Buy; def Strategy_Sell = BullBear_Sell and MACDBB_Sell and RSM_Sell; def Strategy_BuySignal = Strategy_Buy and !Strategy_Buy[1]; def Strategy_SellSignal = Strategy_Sell and !Strategy_Sell[1]; plot BuyArrow = if Strategy_BuySignal then 0 else Double.NaN; BuyArrow.SetPaintingStrategy(PaintingStrategy.ARROW_UP); BuyArrow.SetDefaultColor(Color.WHITE); BuyArrow.HideTitle(); BuyArrow.HideBubble(); plot SellArrow = if Strategy_SellSignal then 0 else Double.NaN; SellArrow.SetPaintingStrategy(PaintingStrategy.ARROW_DOWN); SellArrow.SetDefaultColor(Color.WHITE); SellArrow.HideTitle(); SellArrow.HideBubble(); ### Alerts Alert(Strategy_BuySignal, "Long Entry", Alert.BAR, Sound.DING); Alert(Strategy_SellSignal, "Short Entry", Alert.BAR, Sound.DING); Alert(MACDBB_Line crosses above MACDBB_CrossFromAboveVal, "MACDBB Crossed Up", Alert.BAR, Sound.DING); Alert(MACDBB_Line crosses below MACDBB_CrossFromBelowVal, "MACDBB Crossed Down", Alert.BAR, Sound.DING); Alert(SQZ_squeeze_signal, "Squeeze Alert", Alert.BAR, Sound.DING);