FXSnipers_ErgodicCCI_SW_Arrow





//+------------------------------------------------------------------+
//|                                       Louw Coetzer aka FX Sniper |
//|                      Copyright © 2004, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//| FX_Sniper's_Ergodic_CCI_Trigger_Alert_Mod.mq4
//+------------------------------------------------------------------+
#property  copyright "Copyright © 2004, Fx Sniper."
#property  link      "http://www.dunno.net/"

//+------------------------------------------------------------------+
//| FX_Sniper's_Ergodic_CCI_&_Trigger_Alert_Fast      by      mladen |
//+------------------------------------------------------------------+
//2008fxtsd

#property copyright "mladen"
#property link      "mladenfx@gmail.com"



#property  indicator_separate_window
#property  indicator_buffers 2
#property  indicator_color1  Blue
#property  indicator_color2  Red
#property  indicator_width1  2
#property indicator_maximum 2
#property indicator_minimum 0
//
//
//
//
//

extern int  pq            =  1;
extern int  pr            =  7;
extern int  ps            =  3;
extern int  trigger       =  3;

extern int TimeFrame = 0;

extern bool    ShowArrow         = true;
extern double  IndicatorValue    = 1;
extern bool    alertsOn          = true;
extern bool    alertsSound       = true;
extern bool    alertsMessage     = true;
extern bool    alertsEmail       = false;

extern string  note_TimeFrames = "M1;5,15,30,60H1;240H4;1440D1;10080W1;43200MN|0-CurrentTF";
string IndicatorFileName;

double ErgoCCI[];
double MainCCI[];
double buffer[][8];


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+

int init()
{
   SetIndexBuffer(0,ErgoCCI); SetIndexLabel(0,"Ergodic CCI");
   SetIndexBuffer(1,MainCCI); SetIndexLabel(1,"Trigger Line");

if (ShowArrow) 
   {
   SetIndexBuffer(0,ErgoCCI);
   SetIndexStyle  (0,DRAW_ARROW); 
   SetIndexArrow  (0,167);
   SetIndexBuffer(1,MainCCI);
   SetIndexStyle  (1,DRAW_ARROW); 
   SetIndexArrow  (1,167);
   }
   
   TimeFrame=MathMax(TimeFrame, Period());

   string shortname = "FXSniper\'s_Ergodic ("+pq+","+pr+","+ps+"; "+trigger+") ["+TimeFrame+"]";
   IndicatorShortName (shortname);
   IndicatorFileName = WindowExpertName();


   return(0);
}

//
//
//
//
//

#define mtm    0
#define absmtm 1
#define var1   2
#define var2   3
#define var2a  4
#define var2b  5
#define var2c  6
#define var2d  7

//
//
//
//
//

int start()
{
   int i,r,limit,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]);
                  ErgoCCI[i] = iCustom(NULL,TimeFrame,IndicatorFileName,pq,pr,ps,trigger,0,alertsOn,alertsSound,alertsMessage, alertsEmail,0,y);
                  MainCCI[i] = iCustom(NULL,TimeFrame,IndicatorFileName,pq,pr,ps,trigger,0,alertsOn,alertsSound,alertsMessage, alertsEmail,1,y);

          }
if (ShowArrow)
   for(int shift =limit; shift>=0; shift--)
   {
       MainCCI[shift] = IndicatorValue; 
       ErgoCCI[shift] = IndicatorValue; 
      
       if (ErgoCCI[shift] > MainCCI[shift])
       {
       MainCCI[shift] = EMPTY_VALUE;
       ErgoCCI[shift] = IndicatorValue;
       }
       else if (ErgoCCI[shift] < MainCCI[shift])
       {
       MainCCI[shift] = IndicatorValue;
       ErgoCCI[shift] = EMPTY_VALUE;
       }
         return(0);         
      }


    if (ArrayRange(buffer,0) != Bars) ArrayResize(buffer,Bars);
 

   //
   //
   //
   //
   //
   

   double alphaPq = 2.0/(1.0+pq);
   double alphaPr = 2.0/(1.0+pr);
   double alphaPs = 2.0/(1.0+ps);
   double alphaTrigger = 2.0/(1.0+trigger);
   
   for(i=limit,r=Bars-limit-1; i >=0; i--,r++) 
   {
      buffer[r][mtm]    = Close[i]-Close[i+1];
      buffer[r][absmtm] = MathAbs(buffer[r][mtm]);
      buffer[r][var1]   = buffer[r-1][var1]  + alphaPq*(buffer[r][mtm]   -buffer[r-1][var1]);
      buffer[r][var2]   = buffer[r-1][var2]  + alphaPr*(buffer[r][var1]  -buffer[r-1][var2]);
      buffer[r][var2a]  = buffer[r-1][var2a] + alphaPq*(buffer[r][absmtm]-buffer[r-1][var2a]);
      buffer[r][var2b]  = buffer[r-1][var2b] + alphaPr*(buffer[r][var2a] -buffer[r-1][var2b]);
      buffer[r][var2c]  = buffer[r-1][var2c] + alphaPs*(buffer[r][var2]  -buffer[r-1][var2c]);
      buffer[r][var2d]  = buffer[r-1][var2d] + alphaPs*(buffer[r][var2b] -buffer[r-1][var2d]);
      if (buffer[r][var2d]!=0)
            ErgoCCI[i] = (500*buffer[r][var2c]/buffer[r][var2d]);
      else  ErgoCCI[i] = 0;
            MainCCI[i] = MainCCI[i+1] + alphaTrigger*(ErgoCCI[i]-MainCCI[i+1]);
      }
   
   }
   if (alertsOn)
      {
       if(MainCCI[1] <= ErgoCCI[1] && MainCCI[0] > ErgoCCI[0]) doAlert("short");
       if(MainCCI[1] >= ErgoCCI[1] && MainCCI[0] < ErgoCCI[0]) doAlert("long");
      }
   return(0);
}


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//
//
//
//
//

void doAlert(string doWhat)
{
   static string   previousAlert="nothing";
   static datetime previousTime;
   string message;
   
      if (previousAlert != doWhat || previousTime != Time[0]) {
          previousAlert  = doWhat;
          previousTime   = Time[0];

          //
          //
          //
          //
          //

          message =  StringConcatenate(Symbol()," M",Period()," at ",TimeToStr(TimeLocal(),TIME_SECONDS)," ergodic ",doWhat);
             if (alertsSound)   PlaySound("ok.wav");//alert2
             if (alertsMessage) Alert(message);
             if (alertsEmail)   SendMail(StringConcatenate(Symbol()," ergodic crossing"),message);
      }
}



Sample





Analysis



Market Information Used:

Series array that contains open time of each bar
Series array that contains close prices for each bar


Indicator Curves created:



Indicators Used:




Custom Indicators Used:
IndicatorFileName

Order Management characteristics:

Other Features:

It issuies visual alerts to the screen
It plays sound alerts
It sends emails