input SignalsOn = {default "BB 2nd Dev", "BB 1st Dev", "Zero Cross", "Signal Cross"};
input ShowSignalsOnZoneEntry = yes;
input ShowSignalsOnZoneExit = no;
input ShowDotsInsideZone = no;
input ShowIndicatorValueLabel = no;
input AverageType = {default EMA, SMA};
input MACDPrice = close;
input FastLength = 12;
input SlowLength = 26;
input MACDLength = 9;
input SignalLength = 3;
input SignalType = {default SMA, EMA, LWMA, Wilder};
input Smoothing = 1;
input SmoothingType = {default SMA, EMA, LWMA, Wilder};
input BBDisplace = 0;
input BBPeriod = 19;
input BBDeviationUp1 = 1.0;
input BBDeviationDn1 = -1.0;
input BBDeviationUp2 = 2.0;
input BBDeviationDn2 = -2.0;
input BBType = {default SMA, EMA, LWMA, Wilder};
#--------------------------------------------------------------
def MACD;
#--------------------------------------------------------------
switch (AverageType)
{
case SMA:
MACD = MACD(FastLength, SlowLength, MACDLength, AverageType).Diff;
case EMA:
MACD = MACD(FastLength, SlowLength, MACDLength, AverageType).Diff;
}
#--------------------------------------------------------------
def MACDSmoothed;
def Ma;
#--------------------------------------------------------------
switch (SmoothingType)
{
case LWMA:
MACDSmoothed = WMA(MACD, Smoothing);
case SMA:
MACDSmoothed = Average(MACD, Smoothing);
case EMA:
MACDSmoothed = ExpAverage(MACD, Smoothing);
case Wilder:
MACDSmoothed = WildersAverage(MACD, Smoothing);
}
switch (SignalType)
{
case LWMA:
Ma = WMA(MACDSmoothed, SignalLength);
case SMA:
Ma = Average(MACDSmoothed, SignalLength);
case EMA:
Ma = ExpAverage(MACDSmoothed, SignalLength);
case Wilder:
Ma = WildersAverage(MACDSmoothed, SignalLength);
}
#--------------------------------------------------------------
def sDev = StDev(MACDSmoothed[-BBDisplace], BBPeriod);
#--------------------------------------------------------------
def MidLine;
#--------------------------------------------------------------
switch (BBType)
{
case LWMA:
MidLine = WMA(MACDSmoothed[-BBDisplace], BBPeriod);
case SMA:
MidLine = Average(MACDSmoothed[-BBDisplace], BBPeriod);
case EMA:
MidLine = ExpAverage(MACDSmoothed[-BBDisplace], BBPeriod);
case Wilder:
MidLine = WildersAverage(MACDSmoothed[-BBDisplace], BBPeriod);
}
#--------------------------------------------------------------
def LoLowerBand = MidLine + BBDeviationDn2 * sDev;
def LowerBand = MidLine + BBDeviationDn1 * sDev;
def UpperBand = MidLine + BBDeviationUp1 * sDev;
def UpUpperBand = MidLine + BBDeviationUp2 * sDev;
#--------------------------------------------------------------
def OverboughtCond;
def OversoldCond;
#--------------------------------------------------------------
switch (SignalsOn)
{
case "BB 2nd Dev":
OverboughtCond = if MACDSmoothed >= UpUpperBand then 1 else 0;
OversoldCond = if MACDSmoothed <= LoLowerBand then 1 else 0;
case "BB 1st Dev":
OverboughtCond = if MACDSmoothed >= UpperBand then 1 else 0;
OversoldCond = if MACDSmoothed <= LowerBand then 1 else 0;
case "Zero Cross":
OversoldCond = if MACDSmoothed > 0 then 1 else 0;
OverboughtCond = if MACDSmoothed < 0 then 1 else 0;
case "Signal Cross":
OversoldCond = if MACDSmoothed >= Ma then 1 else 0;
OverboughtCond = if MACDSmoothed <= Ma then 1 else 0;
}
#--------------------------------------------------------------
plot EntersOverbought;
plot LeavesOverbought;
plot EntersOversold;
plot LeavesOversold;
#--------------------------------------------------------------
switch (SignalsOn)
{
case "BB 2nd Dev":
EntersOverbought = MACDSmoothed crosses above UpUpperBand;
LeavesOverbought = MACDSmoothed crosses below UpUpperBand;
EntersOversold = MACDSmoothed crosses below LoLowerBand;
LeavesOversold = MACDSmoothed crosses above LoLowerBand;
case "BB 1st Dev":
EntersOverbought = MACDSmoothed crosses above UpperBand;
LeavesOverbought = MACDSmoothed crosses below UpperBand;
EntersOversold = MACDSmoothed crosses below LowerBand;
LeavesOversold = MACDSmoothed crosses above LowerBand;
case "Zero Cross":
EntersOversold = MACDSmoothed crosses above 0;
LeavesOverbought = Double.NaN;
EntersOverbought = MACDSmoothed crosses below 0;
LeavesOversold = Double.NaN;
case "Signal Cross":
EntersOversold = MACDSmoothed crosses above Ma;
LeavesOverbought = Double.NaN;
EntersOverbought = MACDSmoothed crosses below Ma;
LeavesOversold = Double.NaN;
}
#--------------------------------------------------------------
EntersOverbought.SetPaintingStrategy(PaintingStrategy.BOOLEAN_ARROW_DOWN);
LeavesOverbought.SetPaintingStrategy(PaintingStrategy.BOOLEAN_ARROW_DOWN);
EntersOversold.SetPaintingStrategy(PaintingStrategy.BOOLEAN_ARROW_UP);
LeavesOversold.SetPaintingStrategy(PaintingStrategy.BOOLEAN_ARROW_UP);
EntersOverbought.SetDefaultColor(Color.RED);
LeavesOverbought.SetDefaultColor(Color.ORANGE);
EntersOversold.SetDefaultColor(Color.GREEN);
LeavesOversold.SetDefaultColor(Color.DARK_GREEN);
EntersOverbought.SetHiding(!ShowSignalsOnZoneEntry);
LeavesOverbought.SetHiding(!ShowSignalsOnZoneExit);
EntersOversold.SetHiding(!ShowSignalsOnZoneEntry);
LeavesOversold.SetHiding(!ShowSignalsOnZoneExit);
EntersOverbought.SetLineWeight(5);
LeavesOverbought.SetLineWeight(5);
EntersOversold.SetLineWeight(5);
LeavesOversold.SetLineWeight(5);
#--------------------------------------------------------------
#--------------------------------------------------------------
Alert((ShowSignalsOnZoneEntry and EntersOverbought) or (ShowSignalsOnZoneExit and LeavesOverbought), "", Alert.BAR, Sound.Ding);
Alert((ShowSignalsOnZoneEntry and EntersOversold) or (ShowSignalsOnZoneExit and LeavesOversold), "", Alert.BAR, Sound.Ding);
#--------------------------------------------------------------
def DotsOverbought = OverboughtCond;
def DotsOversold = OversoldCond;
#--------------------------------------------------------------