//+------------------------------------------------------------------+
//|                                                     RJEJE_EA.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#resource "\\Indicators\\R_JEJE.ex4"

#include <stderror.mqh>
#include <stdlib.mqh>

#property copyright "Copyright 2015, Noiros Fx"
#property link      "oswaldjames79@gmail.com"
#property version   "1.00"
#property strict


enum  sl_tp
{
SL_And_TP=1,
TP_Only=2
};
input string BASIC_SETTINGS="Basic EA Settings";
input int magic=125422;
input double lot=0.1;
input bool   use_risk=false;
input double Risk_percent=2;
input double risk_pip=100;
input bool   use_tp_sl=false;
input sl_tp  SL_TP_Option=2;
input int    TP=60;
input int    SL=70;
input string TRAIL_SYSTEM = "Basic Trailing Settings";
input bool   Trail_stop=true;
input int    Trail_pips=50;
input int    Trail_step=2;
input bool   opposite_signal_exit=true;
input bool   Break_even_Trail=true; 
input int    BreakEvenPips=50;
input string TRADE_CONFIRMATION="Confirm Your Trades By Clicking Button";
input bool enable_Trade_confirmation=true;
input bool Sound_alert=true;
input bool Email_alert=false;
input bool Phone_alert=false;
input int InpAtrPeriod=14;
input int shift=0;
input ENUM_TIMEFRAMES HigherTF=PERIOD_D1;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
double p=Point; int confirm=0; datetime time,TIme; string period;

int OnInit()
  {
 if(Digits==3 || Digits==5) p=Point*10; 
//---
    ObjectCreate(ChartID(),"confirm",OBJ_BUTTON,0,0,0);
    ObjectSet("confirm",OBJPROP_BGCOLOR,LimeGreen);
    ObjectSet("confirm",OBJPROP_CORNER,0);
    ObjectSet("confirm",OBJPROP_YDISTANCE,20);
    ObjectSet("confirm",OBJPROP_XDISTANCE,10);
    ObjectSet("confirm",OBJPROP_XSIZE,120);
    ObjectSet("confirm",OBJPROP_YSIZE,40);   
    ObjectSetString(ChartID(),"confirm",OBJPROP_TEXT,"CONFIRM TRADE");
    ObjectSet("confirm",OBJPROP_COLOR,White);
    ObjectSet("confirm",OBJPROP_FONTSIZE,10);
    //-------------------------------------------------------------------------
    
    //--------------------------------------------------------------------------------------
     ObjectCreate(ChartID(),"label1",OBJ_LABEL,0,0,0);
     ObjectSetText("label1","RJEJE EA",18,NULL,Purple);
     ObjectSet("label1",OBJPROP_YDISTANCE,25);
     ObjectSet("label1",OBJPROP_XDISTANCE,10);
     ObjectSet("label1",OBJPROP_CORNER,2);
 //--------------------------------account infromation ---------------------------------------  
 
//--------------------------------------------------------------------------------------
     ObjectCreate(ChartID(),"label",OBJ_LABEL,0,0,0);
     ObjectSetText("label","© Noiros Forex Solutionts (oswaldjames79@gmail.com)",10,NULL,White);
     ObjectSet("label",OBJPROP_YDISTANCE,5);
     ObjectSet("label",OBJPROP_XDISTANCE,5);
     ObjectSet("label",OBJPROP_CORNER,2);
 //--------------------------------account infromation ---------------------------------------  

  if(Period()==1)   period="_M1";
  if(Period()==5)   period="_M5";
  if(Period()==15)  period="_M15";
  if(Period()==30)  period="_M30";
  if(Period()==60)  period="_H1";
  if(Period()==240) period="_H4";
  if(Period()==1440)period="_D1";
  if(Period()==10080) period="_W1";
  if(Period()==43200) period="_MN1";
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  ObjectsDeleteAll(ChartID(),0,OBJ_LABEL);
  ObjectsDeleteAll(ChartID(),0,OBJ_BUTTON);
  
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
  int buy=0; int sell=0; int buy1=0; int sell1=0; int sell2=0; int buy2=0; int signal=0;
  
  double regina_white=NormalizeDouble(iCustom(Symbol(),0,"::Indicators\\R_JEJE.ex4",1,shift),4);
  double regina_red=NormalizeDouble(iCustom(Symbol(),0,"::Indicators\\R_JEJE.ex4",2,shift),4);
  double regina_white1=NormalizeDouble(iCustom(Symbol(),0,"::Indicators\\R_JEJE.ex4",1,shift+1),4);
  double regina_red1=NormalizeDouble(iCustom(Symbol(),0,"::Indicators\\R_JEJE.ex4",2,shift+1),4);
  double regina_whiteH=NormalizeDouble(iCustom(Symbol(),HigherTF,"::Indicators\\R_JEJE.ex4",1,shift),4);
  double regina_redH=NormalizeDouble(iCustom(Symbol(),HigherTF,"::Indicators\\R_JEJE.ex4",2,shift),4);

  
  double ExtATRBuffer=(MathMax(High[shift],Close[shift+1])-MathMin(Low[shift],Close[shift+1]))/(MathMax(High[iHighest(Symbol(),Period(),MODE_HIGH,InpAtrPeriod,shift)],Close[shift])-MathMin(Low[iLowest(Symbol(),Period(),MODE_LOW,InpAtrPeriod,shift)],Close[shift]));
  //double ExtATRBuffer1=(MathMax(High[0],Close[1])-MathMin(Low[0],Close[1]))/(MathMax(High[iHighest(Symbol(),Period(),MODE_HIGH,InpAtrPeriod,0)],Close[0])-MathMin(Low[iLowest(Symbol(),Period(),MODE_LOW,InpAtrPeriod,0)],Close[0]));
     
  double risk=NormalizeDouble((Risk_percent*0.01*AccountEquity())/risk_pip,1); 
  double spread=MarketInfo(Symbol(),MODE_SPREAD);
 // double MA=NormalizeDouble(iMA(Symbol(),0,50,0,MODE_EMA,PRICE_CLOSE,MA_shift),Digits);
 if(risk>MarketInfo(Symbol(),MODE_MAXLOT)) risk=MarketInfo(Symbol(),MODE_MAXLOT);
 if(risk<MarketInfo(Symbol(),MODE_MINLOT)) risk=MarketInfo(Symbol(),MODE_MINLOT);
 
if(Close[shift]>Open[shift] && ExtATRBuffer>=0.5) buy2=1;
if(Close[shift]<Open[shift] && ExtATRBuffer>=0.5) sell2=1;
 
 if(regina_white>0 && regina_red1<0 && buy2>0 && regina_whiteH>0) buy=1;
 if(regina_white1>0 && regina_red<0 && sell2>0 && regina_redH<0) sell=1;
     
 if((regina_white>0 && regina_red1<0) || (buy2>0)) buy1=1;
 if((regina_white1>0 && regina_red<0) || (sell2>0)) sell1=1;
 


  int check=0;
  
 if(ordersTotal()<1)
 {
if(use_risk==true)
{
 if(buy>0  && AccountFreeMargin()>MarketInfo(Symbol(),MODE_MARGINREQUIRED))
 {
 if(enable_Trade_confirmation) alert("Confirmation Needed on Rjeje Buy Trade--"+Symbol()+period);
 if((enable_Trade_confirmation && confirm>0) || enable_Trade_confirmation==false)
 {
  if(use_tp_sl==false)
  if(OrderSend(Symbol(),OP_BUY,risk,Ask,3,0,0,NULL,magic,0,Blue)) time=Time[0];
  if(use_tp_sl==true)
   {
  if(SL_TP_Option==1)
  if(OrderSend(Symbol(),OP_BUY,risk,Ask,3,Ask-p*SL,Ask+p*TP,NULL,magic,0,Blue))time=Time[0];
  if(SL_TP_Option==2)
  if(OrderSend(Symbol(),OP_BUY,risk,Ask,3,0,Ask+p*TP,NULL,magic,0,Blue))time=Time[0];
   }
 }  
 }
  if(sell>0  && AccountFreeMargin()>MarketInfo(Symbol(),MODE_MARGINREQUIRED))
  { 
  if(enable_Trade_confirmation) alert("Confirmation Needed on Rjeje Sell Trade--"+Symbol()+period);
 if((enable_Trade_confirmation && confirm>0) || enable_Trade_confirmation==false)
 {
 
  if(use_tp_sl==false)
  if(OrderSend(Symbol(),OP_SELL,risk,Bid,3,0,0,NULL,magic,0,Red))time=Time[0];
  if(use_tp_sl==true)
   {
   if(SL_TP_Option==1)
   if(OrderSend(Symbol(),OP_SELL,risk,Bid,3,Bid+p*SL,Bid-p*TP,NULL,magic,0,Red))time=Time[0];
    if(SL_TP_Option==2)
   if(OrderSend(Symbol(),OP_SELL,risk,Bid,3,0,Bid-p*TP,NULL,magic,0,Red))time=Time[0];

   } 
  }
  }
 }
//---------------------------------- 
 if(use_risk==false)
 {
 if(buy>0  && AccountFreeMargin()>MarketInfo(Symbol(),MODE_MARGINREQUIRED))
 {
  if(enable_Trade_confirmation) alert("Confirmation Needed on Rjeje Buy Trade--"+Symbol()+period);
 if((enable_Trade_confirmation && confirm>0) || enable_Trade_confirmation==false)
 {
 
  if(use_tp_sl==false)
  if(OrderSend(Symbol(),OP_BUY,lot,Ask,3,0,0,NULL,magic,0,Blue))time=Time[0];
  if(use_tp_sl==true)
   {
  if(SL_TP_Option==1)
  if(OrderSend(Symbol(),OP_BUY,lot,Ask,3,Ask-p*SL,Ask+p*TP,NULL,magic,0,Blue))time=Time[0];
  if(SL_TP_Option==2)
  if(OrderSend(Symbol(),OP_BUY,lot,Ask,3,0,Ask+p*TP,NULL,magic,0,Blue))time=Time[0];
   }
   }
  }
  if(sell>0  && AccountFreeMargin()>MarketInfo(Symbol(),MODE_MARGINREQUIRED))
   {
 if(enable_Trade_confirmation) alert("Confirmation Needed on Rjeje Sell Trade--"+Symbol()+period);
 if((enable_Trade_confirmation && confirm>0) || enable_Trade_confirmation==false)
 {
  if(use_tp_sl==false)
  if(OrderSend(Symbol(),OP_SELL,lot,Bid,3,0,0,NULL,magic,0,Red))time=Time[0];
  if(use_tp_sl==true)
   {
   if(SL_TP_Option==1)
   if(OrderSend(Symbol(),OP_SELL,lot,Bid,3,Bid+p*SL,Bid-p*TP,NULL,magic,0,Red))time=Time[0];
    if(SL_TP_Option==2)
   if(OrderSend(Symbol(),OP_SELL,lot,Bid,3,0,Bid-p*TP,NULL,magic,0,Red))time=Time[0];
    }
   } 
  }
 } 
} 
 //--------------------------------------------------------------------------- 
  if(ordersTotal()>0)
  {
  confirm=0;
   if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES))
   {
    if(OrderType()==OP_BUY)
    {
     if((opposite_signal_exit==true || (opposite_signal_exit==false && use_tp_sl==false))  && sell1>0)
     {OrderClose(OrderTicket(),OrderLots(),Bid,Red);}
     if(Trail_stop==true && (Ask-p*(Trail_pips+Trail_step))>OrderStopLoss())
     {OrderModify(OrderTicket(),OrderOpenPrice(),Ask-p*Trail_pips,OrderTakeProfit(),0,Purple);}
     if(Break_even_Trail==true  && Ask-p*(BreakEvenPips)>=(OrderOpenPrice()) && OrderOpenPrice()>OrderStopLoss())
     {OrderModify(OrderTicket(),OrderOpenPrice(),Ask-p*BreakEvenPips,OrderTakeProfit(),0,Purple);} 
      
        
    } 
     if(OrderType()==OP_SELL )
     {
     
     if((opposite_signal_exit==true || (opposite_signal_exit==false && use_tp_sl==false)) && buy1>0 )
     {OrderClose(OrderTicket(),OrderLots(),Ask,Red);}
     if(Trail_stop==true && ((Bid+p*(Trail_pips+Trail_step))<OrderStopLoss() || OrderStopLoss()==0))
     {OrderModify(OrderTicket(),OrderOpenPrice(),Bid+p*Trail_pips,OrderTakeProfit(),0,Purple);}
     if(Break_even_Trail==true && Bid+p*(BreakEvenPips)<=(OrderOpenPrice()) && (OrderOpenPrice()<OrderStopLoss() || OrderStopLoss()==0))
     {OrderModify(OrderTicket(),OrderOpenPrice(),Bid+p*BreakEvenPips,OrderTakeProfit(),0,Purple);}
         
     }
   }
   }
//---
    
//---
   
  }
//+-------------------------------------------------------------------------------------------------------+
int alert(string message)
{
if(TIme!=Time[0])
{
if(Sound_alert)
{Alert(message); TIme=Time[0];}
if(Email_alert)
if(SendMail("RJEJE EA Trade Confirmation",message)) TIme=Time[0];
if(Phone_alert)
if(SendNotification(message)) TIme=Time[0];
}

return(0);
}
//+-------------------------------------Defining chart Events-------------------------------------------------------------------------+

void OnChartEvent(const int id,         // Event identifier  
                  const long& lparam,   // Event parameter of long type
                  const double& dparam, // Event parameter of double type
                  const string& sparam  // Event parameter of string type
                  )
  
  
  { 
  
     if (id==CHARTEVENT_OBJECT_CLICK )
     {
     if( sparam == "confirm") confirm=1; 
      
     }
   
}



//=================================================================================================================================

int ordersTotal()
{
int k=0;
for(int i=0; i<OrdersTotal(); i++)
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
if(OrderSymbol()==Symbol()) k++;
}
return(k);
}
//-----------------------------------------------------------------------------------------------------------------------------------