//+------------------------------------------------------------------+
//|                                               Alien stoch db.mq4 |
//|0322-5524899            Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
//Only Symbols. Alert when ADX period 7 and 21 are Lime or Red and all other ADX are dodger blue or orange on a particular timeframe. Included RSIOMA and DDS.

#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window

string _Comment_2 = "Preamble must be unique for evere instance in chart";
string objectpreamble = "alien_mini_db_";
sinput string _symbol = "EURUSD";
sinput int UpdateTimerInSeconds = 5;            // update time / frequency
//sinput ENUM_TIMEFRAMES  AlertTimeFrame = PERIOD_H1; 
sinput long chartId = 0;                        // window on chart to display the dashboard


//sinput bool show_stoch_1 = true;
sinput int kPeriod_1 = 8;
sinput int Slowing_1 = 3;
sinput int dPeriod_1 = 3;
sinput int maMethod_1 = 0;
sinput int priceField_1 = 1;

//sinput bool show_stoch_2 = true;
sinput int kPeriod_2 = 21;
sinput int Slowing_2 = 10;
sinput int dPeriod_2 = 10;
sinput int maMethod_2 = 0;
sinput int priceField_2 = 1;

//sinput bool show_stoch_3 = true;
sinput int kPeriod_3 = 100;
sinput int Slowing_3 = 10;
sinput int dPeriod_3 = 10;
sinput int maMethod_3 = 0;
sinput int priceField_3 = 1;

input double RsiOma_DDS_Opposite = 20.0; 

sinput int xAnchor = -20;                       // x position of db
sinput int yAnchor = 10;                        // y position of db
sinput int fontSizeText = 6;
sinput int smallPanelWidth = 20;                // width of 1 column
sinput int smallPanelheight = 18;               // height of 1 row
sinput int smallPanelSpace = 3;                 // spacing between columns/rows
sinput int textOffsetY = 3;                     // text positioning

                 

int panelWidth_1 = 75;

int widthColumn_2 = 40;
int offsetColumn_2 = panelWidth_1;
int widthColumn_3 = 40;
int offsetColumn_3 = offsetColumn_2 + widthColumn_2 + 2;
int widthColumn_4 = 40;
int offsetColumn_4 = offsetColumn_3 + widthColumn_3 + 2;

int widthColumn_5 = 98;
int offsetColumn_5 = offsetColumn_4 + widthColumn_4 + 12;

sinput color textColor = clrWhite;              // text color
sinput color dbBackgroundColor = clrBlack;      // background color
sinput color dbBorderColor = clrBlack;      // border color
sinput int dbBorderWidth = 1;                   // border line width

sinput color bullColor = clrLime;               // bull color
sinput color bearColor = clrRed;                // bear color
sinput color decreasebull = DodgerBlue;               // flat color, no bull no bear
sinput color decreasebear = Orange;  
sinput color flatColor = DimGray;

double stochUpperlevel = 80.0;
double stochLowerlevel = 20.0;
double stochMiddellevel = 50.0;

int yOffsetArrow;

string preamble;
int panelWidth;
int panelHeight;
bool showPips = true;

string panelName, labelName;
string strButton;

string strSupport;
string strResistance;

double supp, ress, supp_c, ress_c;
double myPoint, myDigits, myMultiplier;

static datetime updateRS;

int xInBetween = 30;

static datetime newM1_bar;
static datetime newM5_bar;
static datetime newM15_bar;
static datetime newM30_bar;
static datetime newH1_bar;
static datetime newH4_bar;
static datetime newD1_bar;
static datetime newW1_bar;

static datetime newM11_bar;

int A_M15_7, A_M15_21, A_M15_42, A_M15_89, A_M15_144;
int A_M15_Previous_Sum;

int A_Previous_DB_Sum ;

bool A_M15_all_green;
bool A_M15_all_red;

double tmpValue_7, tmpValue_8;


int xOffset; // = xAnchor;
int yOffset; // = yAnchor;
int stochOffset; // = 35;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   
//---
   preamble = objectpreamble +_symbol + "_";
   string name, s;
   s = preamble;
    for (int i = ObjectsTotal() - 1; i >= 0; i--)
    {
        name = ObjectName(i);
        if (StringSubstr(name, 0, StringLen(s)) == s)
        {
            ObjectDelete(name);
        }
    }
   EventSetTimer(UpdateTimerInSeconds);
          
   
  // panelHeight = (2 * smallPanelheight) + (3* smallPanelSpace);
  // panelWidth = fontSizeText * 3 + 7 * (smallPanelWidth + smallPanelSpace)- smallPanelWidth;
   
   myDigits = MarketInfo(_symbol,MODE_DIGITS);
   myPoint = MarketInfo(_symbol,MODE_POINT);
   if( myDigits == 3 || myDigits == 5 ) myPoint = myPoint * 10;
   myMultiplier = 1.0 / myPoint;
   
   updateRS = 0;
  
   xOffset = xAnchor;
   yOffset = yAnchor;
   stochOffset = 35;

   SetText(chartId, preamble + "header_1", _symbol, xOffset + stochOffset, yOffset + fontSizeText, textColor, 8);
  yOffset = yOffset + smallPanelheight;
        
   newM15_bar = 0;
   
   A_M15_Previous_Sum = 0;
   
   A_Previous_DB_Sum = 0;
   
   A_M15_all_green = false;
   A_M15_all_red = false;
     
   return(INIT_SUCCEEDED);
   
  }
  
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
   
   // delete objects
    string name;
    string s = preamble;
 
    for (int i = ObjectsTotal() - 1; i >= 0; i--)
    {
        name = ObjectName(i);
        if (StringSubstr(name, 0, StringLen(s)) == s)
        {
            ObjectDelete(name);
        }
    }
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   // calculate the rsioma values for all selected timeframes
   yOffset = yAnchor + smallPanelheight;
   xOffset = xAnchor;
   
  
   int stochOffset = 35;
   int pips;
   int alertSum = 0;

   int alertSum1 = 0;   
   // headers
   SetPanel(preamble + "panel_",chartId, xOffset, yOffset - 2 * fontSizeText, panelWidth+70, panelHeight,dbBackgroundColor,dbBorderColor,dbBorderWidth);
   
    
  
      yOffset = yOffset + smallPanelheight + smallPanelSpace;
      
      if (newM15_bar != iTime(_symbol, PERIOD_M15, 0))
      {
         newM15_bar = iTime(_symbol, PERIOD_M15, 0);
         
      
         double val1 = iADX(_symbol,PERIOD_M15,7, PRICE_CLOSE, MODE_MAIN, 0);
         double val2 = iADX(_symbol,PERIOD_M15,7, PRICE_CLOSE, MODE_MAIN,  1);
         double dmip = iADX(_symbol,PERIOD_M15,7, PRICE_CLOSE, MODE_PLUSDI, 0);
         double dmim = iADX(_symbol,PERIOD_M15,7, PRICE_CLOSE, MODE_MINUSDI, 0);
            
         
         labelName = preamble + "label_M15_7_" + _symbol;
    
         int fontSizeTest = 14;
         int offsetSquare = -3;
      
         if ((val1 > val2 ) && (dmip > dmim))
         { 
            A_M15_7 = 1;
         }
         else if ((val1 > val2 ) && (dmip < dmim) )
         {
            A_M15_7 = -1;
         }
        else if ((val1 < val2 ) && (dmip > dmim))
         { 
            
            A_M15_7 = 0;
         }
         else if ((val1 < val2 ) && (dmip < dmim) )
         {
            
            A_M15_7 = 0;
         }
      
         double val3 = iADX(_symbol,PERIOD_M15,21, PRICE_CLOSE, MODE_MAIN, 0);
         double val4 = iADX(_symbol,PERIOD_M15,21, PRICE_CLOSE, MODE_MAIN,  1);
         double dmip1 = iADX(_symbol,PERIOD_M15,21, PRICE_CLOSE, MODE_PLUSDI, 0);
         double dmim1 = iADX(_symbol,PERIOD_M15,21, PRICE_CLOSE, MODE_MINUSDI, 0);
      
         labelName = preamble + "label_M15_21_" + _symbol;
   
         if ((val3 > val4 ) && (dmip1 > dmim1))
         { 
            
            A_M15_21 = 1;
         }
         else if ((val3 > val4 ) && (dmip1 < dmim1) )
         {
           
            A_M15_21 = -1;
         }
         else if ((val3 < val4 ) && (dmip1 > dmim1))
         { 
            
            A_M15_21 = 0;
         }
         else if ((val3 < val4 ) && (dmip1 < dmim1) )
         {
            
            A_M15_21 = 0;
         }
      
         double val5 = iADX(_symbol,PERIOD_M15,42, PRICE_CLOSE, MODE_MAIN, 0);
         double val6 = iADX(_symbol,PERIOD_M15,42, PRICE_CLOSE, MODE_MAIN,  1);
         double dmip2 = iADX(_symbol,PERIOD_M15,42, PRICE_CLOSE, MODE_PLUSDI, 0);
         double dmim2 = iADX(_symbol,PERIOD_M15,42, PRICE_CLOSE, MODE_MINUSDI, 0);
      
         labelName = preamble + "label_M15_42_" + _symbol;
    
         if ((val5 > val6 ) && (dmip2 > dmim2))
         { 
            
            A_M15_42 = 1;
         }
         else if ((val5 > val6 ) && (dmip2 < dmim2) )
         {
            
            A_M15_42 = -1;
         }
         else if ((val5 < val6 ) && (dmip2 > dmim2))
         { 
            
            A_M15_42 = 0;
         }
         else if ((val5 < val6 ) && (dmip2 < dmim2))
         {
            
            A_M15_42 = 0;
         }
      
         double val7 = iADX(_symbol,PERIOD_M15,89, PRICE_CLOSE, MODE_MAIN, 0);
         double val8 = iADX(_symbol,PERIOD_M15,89, PRICE_CLOSE, MODE_MAIN,  1);
         double dmip3 = iADX(_symbol,PERIOD_M15,89, PRICE_CLOSE, MODE_PLUSDI, 0);
         double dmim3 = iADX(_symbol,PERIOD_M15,89, PRICE_CLOSE, MODE_MINUSDI, 0);
      
         labelName = preamble + "label_M15_89_" + _symbol;
      
         if ((val7 > val8 ) && (dmip3 > dmim3))
         { 
            
            A_M15_89 = 1;
         }
         else if ((val7 > val8 ) && (dmip3 < dmim3) )
         {
            
            A_M15_89 = -1;
         }
        else if ((val7 < val8) && (dmip3 > dmim3))
         { 
           
            A_M15_89 = 0;
         }
         else if ((val7 < val8 ) && (dmip3 < dmim3) )
         {
            
            A_M15_89 = 0;
         }
      
         double val9 = iADX(_symbol,PERIOD_M15,144, PRICE_CLOSE, MODE_MAIN, 0);
         double val10 = iADX(_symbol,PERIOD_M15,144, PRICE_CLOSE, MODE_MAIN,  1);
         double dmip4 = iADX(_symbol,PERIOD_M15,144, PRICE_CLOSE, MODE_PLUSDI, 0);
         double dmim4 = iADX(_symbol,PERIOD_M15,144, PRICE_CLOSE, MODE_MINUSDI, 0);
      
         labelName = preamble + "label_M15_144_" + _symbol;
      
         if ((val9 > val10 ) && (dmip4 > dmim4))
         { 
            
            A_M15_144 = 1;
         }
         else if ((val9 > val10 ) && (dmip4 < dmim4) )
         {
            
            A_M15_144 = -1;
         }
        else if ((val9 < val10 ) && (dmip4 > dmim4))
         { 
            
            A_M15_144 = 0;
         }
         else if ((val9 < val10 ) && (dmip4 < dmim4) )
         {
            
            A_M15_144 = 0;
         }
        
          
              
           double Dailyclose = iClose(_symbol,1440,0);
           double Prevclose = iClose(_symbol,1440,1); 
           double Change = (iClose(_symbol,1440,0))-(iClose(_symbol,1440,1)); 
           float Percent = (Change/(iClose(_symbol,1440,1)))*100;
           float ADX7 = val1;
           string var1=TimeToStr(TimeCurrent(),TIME_SECONDS);
           
                    
               alertSum = A_M15_7 + A_M15_21 + A_M15_42 + A_M15_89 + A_M15_144;
                             
               
            
            if (alertSum == 5)
            {
              Alert("Buy: " + _symbol+ " ; CMP=" +Dailyclose + " ; ADX7=" +ADX7 + " ; CurrentTime=" +var1);
            }
            else if (alertSum == -5)
            {
              Alert("Sell: " + _symbol+ " ; CMP=" +Dailyclose + " ; ADX7=" +ADX7+ " ; CurrentTime=" +var1);
            }
            
            
                    
            A_M15_Previous_Sum = alertSum;
      }
   
   }
   
   // check for whole db green or red
 
  

//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//---
   
  }
//+------------------------------------------------------------------+


void SetObjText(long chart_id, string name,string CharToStr,int x,int y,color colour,int fontsize=12)
  {
   if(ObjectFind(0,name)<0)
      ObjectCreate(0, name, OBJ_LABEL,chart_id, 0, 0);
   ObjectSetInteger(0,name,OBJPROP_FONTSIZE,fontsize);
   ObjectSetInteger(0,name,OBJPROP_COLOR,colour);
   ObjectSetInteger(0,name,OBJPROP_BACK,false);
   ObjectSetInteger(0,name,OBJPROP_XDISTANCE,x);
   ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y);
   ObjectSetString(0,name,OBJPROP_TEXT,CharToStr);
   ObjectSetString(0,name,OBJPROP_FONT,"Wingdings");
  }
  
  void SetText(long chart_id, string name,string text,int x,int y,color colour,int fontsize)
  {
   if (ObjectFind(0,name)<0)
      ObjectCreate(0,name,OBJ_LABEL,chart_id,0,0);
    ObjectSetInteger(0,name,OBJPROP_XDISTANCE,x);
    ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y);
    ObjectSetInteger(0,name,OBJPROP_COLOR,colour);
    ObjectSetInteger(0,name,OBJPROP_FONTSIZE,fontsize);
    ObjectSetInteger(0,name,OBJPROP_CORNER,CORNER_LEFT_UPPER);
    ObjectSetString(0,name,OBJPROP_FONT,"Arial");
    ObjectSetString(0,name,OBJPROP_TEXT,text);
  }
  
void SetPanel(string name,int chart_id,int x,int y,int width,int height,color bg_color,color border_clr,int border_width)
  {
   if (ObjectFind(0, name) < 0) ObjectCreate(0,name,OBJ_RECTANGLE_LABEL,chart_id,0,0);
      ObjectSetInteger(0,name,OBJPROP_XDISTANCE,x);
      ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y);
      ObjectSetInteger(0,name,OBJPROP_XSIZE,width);
      ObjectSetInteger(0,name,OBJPROP_YSIZE,height);
      ObjectSetInteger(0,name,OBJPROP_COLOR,border_clr);
      ObjectSetInteger(0,name,OBJPROP_BORDER_TYPE,BORDER_FLAT);
      ObjectSetInteger(0,name,OBJPROP_WIDTH,border_width);
      ObjectSetInteger(0,name,OBJPROP_CORNER,CORNER_LEFT_UPPER);
      ObjectSetInteger(0,name,OBJPROP_STYLE,STYLE_SOLID);
      ObjectSetInteger(0,name,OBJPROP_BACK,true);
      ObjectSetInteger(0,name,OBJPROP_SELECTABLE,false);
      ObjectSetInteger(0,name,OBJPROP_SELECTED,false);
      ObjectSetInteger(0,name,OBJPROP_HIDDEN,true);
      ObjectSetInteger(0,name,OBJPROP_ZORDER,0);
      ObjectSetInteger(0,name,OBJPROP_BGCOLOR,bg_color);
  }
  
void Create_Button(string but_name,string label,int xsize,int ysize,int xdist,int ydist,int bcolor,int fcolor)
{
   if(ObjectFind(0,but_name)<0)
   {
      if(!ObjectCreate(0,but_name,OBJ_BUTTON,0,0,0))
        {
         Print(__FUNCTION__,
               ": failed to create the button! Error code = ",GetLastError());
         return;
        }
      ObjectSetString(0,but_name,OBJPROP_TEXT,label);
      ObjectSetInteger(0,but_name,OBJPROP_XSIZE,xsize);
      ObjectSetInteger(0,but_name,OBJPROP_YSIZE,ysize);
      ObjectSetInteger(0,but_name,OBJPROP_CORNER,CORNER_LEFT_UPPER);     
      ObjectSetInteger(0,but_name,OBJPROP_XDISTANCE,xdist);      
      ObjectSetInteger(0,but_name,OBJPROP_YDISTANCE,ydist);         
      ObjectSetInteger(0,but_name,OBJPROP_BGCOLOR,bcolor);
      ObjectSetInteger(0,but_name,OBJPROP_COLOR,fcolor);
      ObjectSetInteger(0,but_name,OBJPROP_FONTSIZE,8);
      ObjectSetInteger(0,but_name,OBJPROP_HIDDEN,true);
      ObjectSetInteger(0,but_name,OBJPROP_SELECTABLE,true);
      //ObjectSetInteger(0,but_name,OBJPROP_BORDER_COLOR,ChartGetInteger(0,CHART_COLOR_FOREGROUND));
      ObjectSetInteger(0,but_name,OBJPROP_BORDER_TYPE,BORDER_RAISED);
      ChartRedraw();      
   }
}


double TLBMax_M01[];
double TLBMax_M05[];
double TLBMax_M15[];
double TLBMax_M30[];
double TLBMax_H01[];
double TLBMax_H04[];
double TLBMax_D01[];
double TLBMax_W01[];
double TLBMax_MN1[];

double TLBMin_M01[];
double TLBMin_M05[];
double TLBMin_M15[];
double TLBMin_M30[];
double TLBMin_H01[];
double TLBMin_H04[];
double TLBMin_D01[];
double TLBMin_W01[];
double TLBMin_MN1[];

double get_max( int mt4Period, int shift )
{
 switch( mt4Period )
 {
  case PERIOD_M1:  { return(TLBMax_M01[ shift ]); break; }
  case PERIOD_M5:  { return(TLBMax_M05[ shift ]); break; }
  case PERIOD_M15: { return(TLBMax_M15[ shift ]); break; }
  case PERIOD_M30: { return(TLBMax_M30[ shift ]); break; }
  case PERIOD_H1:  { return(TLBMax_H01[ shift ]); break; }
  case PERIOD_H4:  { return(TLBMax_H04[ shift ]); break; }
  case PERIOD_D1:  { return(TLBMax_D01[ shift ]); break; }
  case PERIOD_W1:  { return(TLBMax_W01[ shift ]); break; }
  case PERIOD_MN1: { return(TLBMax_MN1[ shift ]); break; }
 }
 return -1.0;
}


double get_min( int mt4Period, int shift )
{
 switch( mt4Period )
 {
  case PERIOD_M1:  { return(TLBMin_M01[ shift ]); break; }
  case PERIOD_M5:  { return(TLBMin_M05[ shift ]); break; }
  case PERIOD_M15: { return(TLBMin_M15[ shift ]); break; }
  case PERIOD_M30: { return(TLBMin_M30[ shift ]); break; }
  case PERIOD_H1:  { return(TLBMin_H01[ shift ]); break; }
  case PERIOD_H4:  { return(TLBMin_H04[ shift ]); break; }
  case PERIOD_D1:  { return(TLBMin_D01[ shift ]); break; }
  case PERIOD_W1:  { return(TLBMin_W01[ shift ]); break; }
  case PERIOD_MN1: { return(TLBMin_MN1[ shift ]); break; }
 }
 return -1.0;
}



//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Diap( int mt4Period, bool up, int C, int shift )
  { 
   int i;
   double MM;
   if(up)
     {
       MM = get_max( mt4Period, shift );
       for(i = 1; i < C; i++)
           if(get_max( mt4Period, shift-i ) > MM)
               MM = get_max( mt4Period, shift-i );  
     }
   if(!up)
     {
       MM = get_min( mt4Period, shift );
       for(i = 1; i < C; i++)
           if(get_min( mt4Period, shift-i ) < MM)
               MM = get_min( mt4Period, shift-i );  
     }  
  return(MM);
  }
  
  

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(doWhat+ " Time Frame ");
              Alert(message);
          
      }
}