MACD_CCIobos_mtf
Download scriptThis tool is designed to assist traders in identifying potential momentum shifts by combining two popular technical analysis indicators: the MACD (Moving Average Convergence Divergence) and the CCI (Commodity Channel Index). Instead of showing standard lines on a chart, this script identifies specific market conditions and marks them visually as arrows for easier interpretation.
Core Logic and Functionality
The tool operates by scanning historical price data based on specific mathematical parameters that you can customize. It looks for a "confluence" of signals—meaning it only triggers an alert when both indicators agree on the market direction simultaneously.
1. The Multi-Timeframe Approach One of the key features of this script is its ability to analyze higher timeframes while you are looking at a smaller one. This allows you to see the "big picture" trends (like hourly or daily movements) without switching back and forth between different charts.
2. The Two Primary Indicators
- MACD: This is used to determine the momentum of the price. The script compares current moving averages against previous ones to see if the strength of a move is increasing or decreasing.
- CCI: This measures the current price relative to its average price over a specific period. It is primarily used to identify "Overbought" or "Oversold" conditions—essentially telling you when a price has moved too far, too fast in one direction.
How the Signals are Generated
The script processes these two indicators together to produce three distinct visual markers:
- Bullish Momentum (Potential Buy): The tool looks for a situation where the CCI is above a specific "Overbought" threshold while the MACD shows an upward movement. When both conditions align, it marks a signal on the chart.
- Bearish Momentum (Potential Sell): Conversely, the tool looks for a situation where the CCI is below a specific "Oversold" threshold while the MACD shows a downward movement. When these align, it marks the opposite signal.
- Neutral/Other: If the conditions for a strong buy or sell are not met, the script remains neutral, filtering out the "noise" of the market to help you focus on high-probability areas.
Visual Presentation
Rather than cluttering your screen with complex lines, the script simplifies the data into clear arrows. This allows you to quickly glance at your chart and identify where the momentum is shifting based on the combined strength of both indicators.
//+------------------------------------------------------------------+
//| MACD_CCI.mq4 |
//| Copyright © 2009, challenger78 |
//+------------------------------------------------------------------+
//mod mtf
#property copyright "challenger78"
#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 RoyalBlue
#property indicator_color2 Red
#property indicator_color3 Orange
#property indicator_minimum 0
#property indicator_maximum 77
extern int TimeFrame=0;
extern int macdMAfast =144; //12
extern int macdMAslow =233; //26;
extern int macdSigMA =21; //9
extern int macdPrice =0;
extern int macdLnMode =0;
extern int CCIperiod = 50;
extern int CCIprice = 5;
extern int cciOBlevel = 100;
extern int cciOSlevel = -100;
extern double BarLevl = 5;
//0main;1signal
extern string MA_Method_Price = "SMA0 EMA1 SMMA2 LWMA3||0O,1C 2H3L,4Md 5Tp 6WghC: Md(HL/2)4,Tp(HLC/3)5,Wgh(HLCC/4)6||macdLnMode:0main 1sig";
extern string TimeFrames = "M1;5,15,30,60H1;240H4;1440D1;10080W1;43200MN|0-CurrentTF";
double buffer1[], buffer2[], buffer3[];
int init()
{
SetIndexStyle(0,DRAW_ARROW); SetIndexArrow(0,167); SetIndexBuffer(0,buffer1); SetIndexEmptyValue(0,EMPTY_VALUE);
SetIndexStyle(1,DRAW_ARROW); SetIndexArrow(1,167); SetIndexBuffer(1,buffer2); SetIndexEmptyValue(1,EMPTY_VALUE);
SetIndexStyle(2,DRAW_ARROW); SetIndexArrow(2,167); SetIndexBuffer(2,buffer3); SetIndexEmptyValue(2,EMPTY_VALUE);
TimeFrame=MathMax(TimeFrame,Period());
string name1= " macd: "+macdMAfast+","+macdMAslow+","+macdSigMA;
string name2= " cci: " +CCIperiod;
IndicatorShortName("MACDCCI_"+name1+name2+" "+TimeFrame);
return(0);
}
int start()
{
int i,limit;
int counted_bars = IndicatorCounted();
if(counted_bars < 0) return(-1);
if(counted_bars > 0) counted_bars--;
limit = Bars - counted_bars;
if(TimeFrame!=Period())
limit = MathMax(limit,TimeFrame/Period());
for (i=limit; i>= 0; i--)
{
int y =iBarShift(NULL,TimeFrame,Time[i]);
double macd0 =iMACD(NULL,TimeFrame,macdMAfast,macdMAslow,macdSigMA,macdPrice,macdLnMode,y);
double macd1 =iMACD(NULL,TimeFrame,macdMAfast,macdMAslow,macdSigMA,macdPrice,macdLnMode,y+1);
double cci =iCCI (NULL,TimeFrame,CCIperiod,CCIprice,y);
buffer1[i]=EMPTY_VALUE; buffer2[i]=EMPTY_VALUE; buffer3[i]=EMPTY_VALUE;
if (cci > cciOBlevel && macd0 > macd1 ) buffer1[i] = BarLevl;
else
if (cci < cciOSlevel && macd0 < macd1 ) buffer2[i] = BarLevl;
else buffer3[i] = BarLevl;
}
return(0);
}
Comments