I found the code on the internet, it will take me a while to go through it though.
It looks like what you are looking for.
//+------------------------------------------------------------------+
//| TrendMagic.mq4 |
//| Tidied up by TudorGirl 28 May 2009 |
//| ******@****.com |
//+------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Blue
#property indicator_width1 2
#property indicator_color2 Red
#property indicator_width2 2
//+------------------------------------------------------------------+
//---- indicator parameters
extern int CCI = 50;
extern int ATR = 5;
//---- indicator parameters
//-------------------------------------------------------------------
//extern int TRIX_Period = 3;
//extern int Signal_Period = 0;
extern bool Signals = false;
extern int CountBars = 1500;
//-------------------------------------------------------------------
//+------------------------------------------------------------------+
double bufferUp[];
double bufferDn[];
//---- variables
static bool TurnedUp = false;
static bool TurnedDown = false;
//+------------------------------------------------------------------+
int init()
{
SetIndexStyle(0, DRAW_LINE, STYLE_SOLID, 2);
SetIndexBuffer(0, bufferUp);
SetIndexStyle(1, DRAW_LINE, STYLE_SOLID, 2);
SetIndexBuffer(1, bufferDn);
return (0);
}
//+------------------------------------------------------------------+
int deinit()
{
return (0);
}
//+------------------------------------------------------------------+
int start()
{
double thisCCI;
double lastCCI;
int counted_bars = IndicatorCounted();
if (counted_bars < 0) return (-1);
if (counted_bars > 0) counted_bars--;
int limit = Bars - counted_bars;
for (int shift = limit; shift >= 0; shift--)
{
thisCCI = iCCI(NULL, 0, CCI, PRICE_TYPICAL, shift);
lastCCI = iCCI(NULL, 0, CCI, PRICE_TYPICAL, shift + 1);
if (thisCCI >= 0 && lastCCI < 0) bufferUp[shift + 1] = bufferDn[shift + 1];
if (thisCCI <= 0 && lastCCI > 0) bufferDn[shift + 1] = bufferUp[shift + 1];
if (thisCCI >= 0)
{
bufferUp[shift] = Low[shift] - iATR(NULL, 0, ATR, shift);
if (bufferUp[shift] < bufferUp[shift + 1])
bufferUp[shift] = bufferUp[shift + 1];
}
else
{
if (thisCCI <= 0)
{
bufferDn[shift] = High[shift] + iATR(NULL, 0, ATR, shift);
if (bufferDn[shift] > bufferDn[shift + 1])
bufferDn[shift] = bufferDn[shift + 1];
}
}
}
//---- signals
shift=limit-1;
while(shift>=0)
{
// if (bufferUp > bufferDn && bufferUp[shift] > bufferDn[shift + 1] && TurnedUp==true);
//if (bufferUp < bufferDn && bufferUp[shift] < bufferDn[shift + 1] && TurnedUp==false);
// if (ind_buffer2a<ind_buffer1a && ind_buffer2a[i+1]>=ind_buffer1a[i+1]) ind_buffer3=ind_buffer2a-0.0001;
// if (ind_buffer2a>ind_buffer1a && ind_buffer2a[i+1]<=ind_buffer1a[i+1]) ind_buffer4=ind_buffer2a+0.0001;
// if (ind_buffer3[0]==ind_buffer2a[0]-0.0001 && TurnedUp==false)
{
Alert("Trend Magic Buy: ",Symbol()," - ",Period()," at ", Close[0]," - ", TimeToStr(CurTime(),TIME_SECONDS));
TurnedDown = false;
TurnedUp = true;
}
// if (ind_buffer4[0]==ind_buffer2a[0]+0.0001 && TurnedDown==false)
{
Alert("Trend Magic SELL: ",Symbol()," - ",Period()," at ", Close[0]," - ", TimeToStr(CurTime(),TIME_SECONDS));
TurnedUp = false;
TurnedDown = true;
}
}
shift--;
return (0);
}