//+------------------------------------------------------------------+
//|                                        OzFX smD1 iSignals v1.mq4 |
//|                                                         SwingMan |
//+------------------------------------------------------------------+
#property copyright "SwingMan"

#property indicator_chart_window


#property indicator_buffers 6
#property indicator_color1 Blue  // EntryLong 1
#property indicator_color2 Red   // EntryShort 1
#property indicator_color3 Blue  // EntryLong 2
#property indicator_color4 Red   // EntryShort 2
#property indicator_color5 Green   // avg long
#property indicator_color6 Crimson // avg short

//---- extern inputs -------------------------------------------------
extern int ShiftEntry = 0;
extern int offsetArrows = 30;
//--------------------------------------------------------------------

//---- constants

int Period_avg = 5;
int Mode_avg = MODE_SMA;
int Price_avg =PRICE_TYPICAL;
//---- buffers
double OzFX_RegularLong[], OzFX_RegularShort[];
double OzFX_AESLong[], OzFX_AESShort[];
double avg[], avgLong[], avgShort[];
double trend[];

//---- variables
int iLastRegular;
double dLastAES;
int k;


//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   Comment("OzFX smD1 iSignals v1");
//---- signals
   SetIndexBuffer(0, OzFX_RegularLong);
   SetIndexBuffer(1, OzFX_RegularShort);   
   SetIndexBuffer(2, OzFX_AESLong);     
   SetIndexBuffer(3, OzFX_AESShort);  
   
   SetIndexStyle(0,DRAW_ARROW,EMPTY,2);      
   SetIndexStyle(1,DRAW_ARROW,EMPTY,2);
   SetIndexStyle(2,DRAW_ARROW,EMPTY,2);      
   SetIndexStyle(3,DRAW_ARROW,EMPTY,2);
   
   SetIndexArrow(0, 233); // regular
   SetIndexArrow(1, 234);
   SetIndexArrow(2, 241); // AES
   SetIndexArrow(3, 242);
   
   SetIndexLabel(0, "LONG regular"); // regular
   SetIndexLabel(1, "SHORT regular");
   SetIndexLabel(2, "LONG AES"); // AES
   SetIndexLabel(3, "SHORT AES");
   
//---- mavg      
   ArraySetAsSeries(avg,true);
   ArraySetAsSeries(trend,true);
   
   SetIndexBuffer(4, avgLong);
   SetIndexBuffer(5, avgShort);
   
   SetIndexStyle(4,DRAW_LINE,STYLE_SOLID,2);
   SetIndexStyle(5,DRAW_LINE,STYLE_SOLID,2);
   
   SetIndexLabel(4, "avgLong");
   SetIndexLabel(5, "avgShort");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
  
  
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   ArrayResize(avg,Bars);
   ArrayResize(trend,Bars);
   
   int    counted_bars=IndicatorCounted();
//----
   for (k = Bars - 205; k >= 0; k --)
   {

/*  OZFX REGULAR CODE  Yellow */
/*---------------------*/
      OzFX_RegularLong[k] = 0;
      OzFX_RegularShort[k] = 0;
      if (iAC(Symbol(), 0, k + ShiftEntry) > 0 &&
          iAC(Symbol(), 0, k + ShiftEntry) > iAC(Symbol(), 0, k + 1 + ShiftEntry) &&
          iStochastic(Symbol(), 0, 5, 3, 3, MODE_SMA, 0, MODE_MAIN, k + ShiftEntry) > 50)
      {
         if (iLastRegular != 1) OzFX_RegularLong[k] = Low[k] - offsetArrows*Point;
         iLastRegular = 1;
      }   
      
      if (iAC(Symbol(), 0, k + ShiftEntry) < 0 &&
          iAC(Symbol(), 0, k + ShiftEntry) < iAC(Symbol(), 0, k + 1 + ShiftEntry) &&
          iStochastic(Symbol(), 0, 5, 3, 3, MODE_SMA, 0, MODE_MAIN, k + ShiftEntry) < 50)
      {
         if (iLastRegular != -1) OzFX_RegularShort[k] = High[k] + offsetArrows*Point;
         iLastRegular = -1;
      }   

/*  OZFX AES CODE  DodgerBlue */
/*-----------------*/
      OzFX_AESLong[k] = 0;
      OzFX_AESShort[k] = 0;
      if (iAC(Symbol(), 0, k + ShiftEntry) > iAC(Symbol(), 0, k + 1 + ShiftEntry) &&
          iStochastic(Symbol(), 0, 5, 3, 3, MODE_SMA, 0, MODE_MAIN, k + ShiftEntry)
          > iStochastic(Symbol(), 0, 5, 3, 3, MODE_SMA, 0, MODE_SIGNAL, k + ShiftEntry))
      {
         if (dLastAES != 0.7) OzFX_AESLong[k] = Low[k] - offsetArrows*Point;
         dLastAES = 0.7;
      }   
      
      if (iAC(Symbol(), 0, k + ShiftEntry) < iAC(Symbol(), 0, k + 1 + ShiftEntry) &&
          iStochastic(Symbol(), 0, 5, 3, 3, MODE_SMA, 0, MODE_MAIN, k + ShiftEntry)
          < iStochastic(Symbol(), 0, 5, 3, 3, MODE_SMA, 0, MODE_SIGNAL, k + ShiftEntry))
      {
         if (dLastAES != -0.7) OzFX_AESShort[k] = High[k] + offsetArrows*Point;
         dLastAES = -0.7;
      }   
      
/*  average */
/*-----------------*/      
      avg[k] = iMA(Symbol(), 0, Period_avg, 0, Mode_avg, Price_avg, k);
/*  average colored */
/*-----------------*/               
        trend[k] = trend[k+1];
        if (avg[k]> avg[k+1]) trend[k] =1;
        if (avg[k]< avg[k+1]) trend[k] =-1;

      if (trend[k]>0)
        { 
          avgLong[k] = avg[k];       
          if (trend[k+1]<0) avgLong[k+1]=avg[k+1]; 
          avgShort[k] = EMPTY_VALUE;
        }
      else              
      {
      if (trend[k]<0)
        { 
          avgShort[k] = avg[k]; 
          if (trend[k+1]>0) avgShort[k+1]=avg[k+1];
          avgLong[k] = EMPTY_VALUE;
        }              
      }
   }   
//----
   return(0);
  }
//+------------------------------------------------------------------+