//+------------------------------------------------------------------+
//|                                                        hhbjh.mq4 |
//|                         Copyright 2017, Abubakar Kajiru Mohamed. |
//|                              https://www.mql5.com/issar_abubakar |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, Abubakar Kajiru Mohamed."
#property link      "https://www.mql5.com/issar_abubakar"
#property version   "1.00"
#property strict


int semafor;
bool upper_sun;
bool lower_sun;
bool upper_yellow;
bool lower_yellow;
datetime old_time;
int open_trade;
double level;
double stop_loss;
double price;
double my_close;
int ticket;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
  
  old_time = iTime(Symbol(),PERIOD_CURRENT,0);//variable to store current time before new time.
  ticket = 0;
//--- create timer
   EventSetTimer(60);
      
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+

 //---Function to get value from #4X 3 Semafor Alert
       int get_semafor_signal (int bar) 
        {
        
         //--- Get value for lower green circle
         double buy_L1 = iCustom(Symbol(),Period(),"#4X 3 Semafor Alert - repaired",5.0,12.0,35.0,"5,3","5,3","5,3",159,159,82,"",false,false,false,false,false,false,0,bar);
         //-- If lower green circle doesn't appear set value to 0
         if (buy_L1 == EMPTY || buy_L1 == EMPTY_VALUE)      buy_L1 = 0;
         
         //--- Get value for lower yellow circle
         double buy_L2 = iCustom(Symbol(),Period(),"#4X 3 Semafor Alert - repaired",5.0,12.0,35.0,"5,3","5,3","5,3",159,159,82,"",false,false,false,false,false,false,2,bar);
         //-- If yellow circle doesn't appear set value to 0
         if (buy_L2 == EMPTY || buy_L2 == EMPTY_VALUE)      buy_L2 = 0;
         
         //--- Get value for lower sun circle
         double buy_L3 = iCustom(Symbol(),Period(),"#4X 3 Semafor Alert - repaired",5.0,12.0,35.0,"5,3","5,3","5,3",159,159,82,"",false,false,false,false,false,false,4,bar);
         //-- If sun circle doesn't appear set value to 0
         if (buy_L3 == EMPTY || buy_L3 == EMPTY_VALUE)      buy_L3 = 0;
         
         //--- Get value for upper green circle
         double sell_L1 = iCustom(Symbol(),Period(),"#4X 3 Semafor Alert - repaired",5.0,12.0,35.0,"5,3","5,3","5,3",159,159,82,"",false,false,false,false,false,false,1,bar);
         //-- If upper green circle doesn't appear set value to 0
         if (sell_L1 == EMPTY || sell_L1 == EMPTY_VALUE)    sell_L1 = 0;
         
         //--- Get value for upper yellow circle
         double sell_L2 = iCustom(Symbol(),Period(),"#4X 3 Semafor Alert - repaired",5.0,12.0,35.0,"5,3","5,3","5,3",159,159,82,"",false,false,false,false,false,false,3,bar);
         //-- If upper yellow circle doesn't appear set value to 0
         if (sell_L2 == EMPTY || sell_L2 == EMPTY_VALUE)    sell_L2 = 0;
         
         //--- Get value for upper sun circle
         double sell_L3 = iCustom(Symbol(),Period(),"#4X 3 Semafor Alert - repaired",5.0,12.0,35.0,"5,3","5,3","5,3",159,159,82,"",false,false,false,false,false,false,5,bar);
         //-- If upper green circle doesn't appear set value to 0
         if (sell_L3 == EMPTY || sell_L3 == EMPTY_VALUE)    sell_L3 = 0;
         
         
         int signal = 0;//--- initialise value for signal
         
         if (buy_L3>0)   signal = 3;    else//---value for lower sun circle
         if (buy_L2>0)   signal = 2;    else//---value or lower yellow circle
         if (buy_L1>0)   signal = 1;    else//--value for lower green circle
         if (sell_L3>0)  signal = -3;   else//--value or upper sun circle
         if (sell_L2>0)  signal = -2;   else//--value for upper yellow circle
         if (sell_L1>0)  signal = -1;//-- value for upper green circle
         return(signal);
         }
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
      
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
        
        
        
               
   //--- Get value for #4x3semafor alert
      semafor = get_semafor_signal(0);
      
      if(semafor == 3)
        {
            
            lower_sun = true;//--if lower sun present
            lower_yellow = false;
            upper_sun = false;
            upper_yellow = false;  
        }else if(semafor == 2)
                {
                     
                     lower_yellow = true;//--if lower sun present
                     upper_sun = false;
                     upper_yellow = false;
                     lower_sun = false;
                }else if(semafor == -3)
                        {
                           
                           upper_sun = true;//--if upper sun present
                           upper_yellow = false;
                           lower_yellow = false;
                           lower_sun =false;
                            
                        }else if(semafor == -2)
                                {
                                   upper_yellow = true;//--if upper yellow is present
                                   upper_sun = false;
                                   lower_sun =false;
                                   lower_yellow =false;
                                }
                                   
        if(lower_sun == true && open_trade == 0)
          {
            if(iSAR(NULL,0,0.02,0.2,0)<Close[1])
              {
                  level = iSAR(NULL,0,0.02,0.2,0);
                  stop_loss = NormalizeDouble(level,Digits);
                  price = Ask;
                                       
                  //--- place market order to buy 1 lot
                  ticket = OrderSend(Symbol(),OP_BUY,0.01,price,3,stop_loss,0,"Order after LOWER SUN circle",16384,0,clrGreen);
                  if(ticket>0)
                     {
                         
                         
                         if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
                             {
                                  open_trade = 1;
                                  lower_sun = false;
                                  Print("Lower Sun, Buy order opened : ",OrderOpenPrice());
                             }
                              else 
                                 {
                                      Print("Error opening SELL order : ",GetLastError());
                                 }
                     }//end ticket if
              }
          }else if(upper_sun == true && open_trade == 0)
                  {
                     if(iSAR(NULL,0,0.02,0.2,0)>Close[1])
                       {
                           level = iSAR(NULL,0,0.02,0.2,0);
                           stop_loss = NormalizeDouble(level,Digits);
                           price = Bid;
                                       
                            //--- place market order to buy 1 lot
                            ticket = OrderSend(Symbol(),OP_SELL,0.01,price,3,stop_loss,0,"Order after UPPER SUN circle",16384,0,clrGreen);
                            if(ticket>0)
                               {
                                    
                                  
                                  if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
                                    {
                                         Print("Upper Sun, SELL order opened : ",OrderOpenPrice());
                                          open_trade = 2; 
                                          upper_sun = false;//set upper_sun to false so it does not confuse other settings     
                                    }
                                     else 
                                         {
                                              Print("Error opening SELL order : ",GetLastError());
                                         }
                                }//end ticket if  
                       }
                  }else if(upper_yellow == true && open_trade == 0)
                          {
                              if(iSAR(NULL,0,0.02,0.2,0)>Close[1])
                                {
                                     level = iSAR(NULL,0,0.02,0.2,0);
                                     stop_loss = NormalizeDouble(level,Digits);
                                     price = Bid;
                                          
                                      //--- place market order to buy 1 lot
                                      ticket = OrderSend(Symbol(),OP_SELL,0.01,price,3,stop_loss,0,"Order after UPPER YELLOW circle",16384,0,clrGreen);
                                      if(ticket>0)
                                         {
                                            
                                            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
                                                {
                                                   Print(" Upper Yellow, SELL order opened : ",OrderOpenPrice());
                                                   open_trade = 2;
                                                   upper_yellow = false;
                                                }
                                                else 
                                                {
                                                   Print("Error opening SELL order : ",GetLastError());
                                                }
                                          }//end ticket if
                                }
                          }else if(lower_yellow == true && open_trade == 0)
                                  {
                                       if(iSAR(NULL,0,0.02,0.2,0)<Close[1])
                                         {
                                              level = iSAR(NULL,0,0.02,0.2,0);
                                              stop_loss = NormalizeDouble(level,Digits);
                                              price = Ask;
                                          
                                             //--- place market order to buy 1 lot
                                             ticket = OrderSend(Symbol(),OP_BUY,0.01,price,3,stop_loss,0,"Order after LOWER YELLOW circle",16384,0,clrGreen);
                                             if(ticket>0)
                                               {
                                                   
                                                   
                                                   if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
                                                   {
                       
                                                      open_trade = 1;
                                                      lower_yellow = false;
                                                      Print("Lower Yellow, Buy order opened : ",OrderOpenPrice());
                                                   }
                                                   else 
                                                   {
                                                      Print("Error opening SELL order : ",GetLastError());
                                                   }
                                                }//end ticket if
                                         }
                                  }
                                  
          if(open_trade == 1 && upper_yellow == true)
          {
               if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
               {
                     if(OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet))
                     {
                        Print("Congratulations the order just closed.");
                        open_trade = 0;
                     }
                     else 
                       {
                           Print("Sorry an error occurred: ", GetLastError());
                       }
               }
               else
                 {
                   Print("Order Select Failed..");
                 }
          }else if(open_trade == 1 && upper_sun == true)
                  {
                     if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
                      {
                        if(OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet))
                        {
                           Print("Congratulations the order just closed.");
                           open_trade = 0;
                        }
                        else
                          {
                              Print("Sorry an error occurred: ", GetLastError());
                          }
                      }
                      else
                       {
                         Print("Order Select Failed..");
                       }
                  }else if(open_trade == 2 && lower_sun == true)
                          {
                              if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
                               {
                                 if(OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet))
                                 {
                                    Print("Congratulations the order just closed.");
                                    open_trade = 0;
                                 }
                                 else
                                   {
                                       Print("Sorry an error occurred: ", GetLastError());
                                   }
                               }
                               else
                                {
                                  Print("Order Select Failed..");
                                }
                          }
                          else if(open_trade == 2 && lower_yellow == true)
                                 {
                                    if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
                                       {
                                             if(OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet))
                                             {
                                                open_trade = 0;
                                                Print("Congratulations the order just closed.");
                                             }
                                             else
                                               {
                                                   Print("Sorry an error occurred: ", GetLastError());
                                               }
                                       }
                                       else
                                         {
                                           Print("Order Select Failed..");
                                         }
                                 }
             
                                
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
      
   
  }
//+------------------------------------------------------------------+
//| Tester function                                                  |
//+------------------------------------------------------------------+
double OnTester()
  {
//---
   double ret=0.0;
//---

//---
   return(ret);
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//---
   
  }
//+------------------------------------------------------------------+
