//+------------------------------------------------------------------+
//|                                             OrderBreakOut_v1.mq4 |
//|                                         Copyright 2014, Iwori Fx |
//|               https://login.mql5.com/en/users/iwori_fx/feedbacks |
//+------------------------------------------------------------------+
#property copyright   "Copyright 2014, Iwori Fx"
#property link        "https://login.mql5.com/en/users/iwori_fx/feedbacks"
#property version     "1.0"
#property description "Powered by: Iwory Fx"
#property description ""
#property description "https://login.mql5.com/en/users/iwori_fx/feedbacks"

#property strict

//--- input parameters
input int      MagicNumber=201401;
input bool     TradeFirstBar=true;
input double   Dist=15.0;
input double   Lots=0.1;
input double   TP=50.0;
input double   SL=15.0;
input bool     UseTrailingStop=false;
input int      TimeExp=4;
input bool     Inverse=false;
input bool     UseTimeFilter;
input int      Hour_Init = 0;
input int      Minute_Init = 0;
input int      Hour_End = 23;
input int      Minute_End = 59;
input int      Slippage = 6;

//--- Global Variables
double mult=1.0;
datetime TimeBar;
int Time_Init,Time_End;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
//---
   if(_Digits==3 || _Digits==5) mult=10.0;
   if (TradeFirstBar) TimeBar=0;
   else TimeBar=Time[0];
   
   Time_Init = Hour_Init*100 + Minute_Init;
   Time_End  = Hour_End*100  + Minute_End ;
   
//---
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
   Comment("");
}
//+------------------------------------------------------------------+
//| Function CheckTrailingStop                                       |
//+------------------------------------------------------------------+
void CheckTrailingStop()
{
   int _result;
   double _sl,_dir;
   for(int i=0;i<OrdersTotal();i++)
   {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
      if(OrderSymbol()==_Symbol && OrderMagicNumber()==MagicNumber)
      {
         _sl=OrderStopLoss();   if(OrderType()>1 || _sl==0.0) continue;   _dir=MathPow(-1.0,(double)OrderType());
         if(_dir*(Close[0]-_sl)>SL*_Point*mult)
            _result = OrderModify(OrderTicket(),OrderOpenPrice(),Close[0]-_dir*SL*_Point*mult,OrderTakeProfit(),0,clrNONE);
      }
   }
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
//---
   double _sl, _tp, _price, _dir;
   color _clrU,_clrD;
   int _typeU,_typeD;
   datetime _dtExp;
   int _result;
   
   if(UseTrailingStop) CheckTrailingStop();
   
   if(TimeBar==Time[0]) return;
   TimeBar=Time[0];
   
   if(UseTimeFilter)
   {
      int Time_Current = TimeHour(TimeCurrent())*100 + TimeMinute(TimeCurrent());
      if((Time_Init<=Time_End) && (Time_Current <  Time_Init || Time_Current >  Time_End)) return;
      if((Time_Init>Time_End)  && (Time_Current <= Time_Init && Time_Current >= Time_End)) return;
   }
   
   _dtExp=0;
   if(TimeExp>0) _dtExp=TimeBar+TimeExp*60*60-20;
   
   _sl=_tp=0.0;
   if(!Inverse) { _dir=1.0;   _typeU=OP_BUYSTOP;     _typeD=OP_SELLSTOP;   _clrU=clrBlue;   _clrD=clrRed;  }
   else         { _dir=-1.0;  _typeU=OP_SELLLIMIT;   _typeD=OP_BUYLIMIT;   _clrU=clrRed;    _clrD=clrBlue; }
    
   _price=Open[0]+Dist*_Point*mult;
   if(SL>0.0) _sl=_price-_dir*SL*_Point*mult;   if(TP>0.0) _tp=_price+_dir*TP*_Point*mult;
   _result=OrderSend(_Symbol,_typeU,Lots,_price,Slippage,_sl,_tp,(string)MagicNumber,MagicNumber,_dtExp,_clrU);
   _price=Open[0]-Dist*_Point*mult;
   if(SL>0.0) _sl=_price+_dir*SL*_Point*mult;   if(TP>0.0) _tp=_price-_dir*TP*_Point*mult;
   _result=OrderSend(_Symbol,_typeD,Lots,_price,Slippage,_sl,_tp,(string)MagicNumber,MagicNumber,_dtExp,_clrD);
}
//+------------------------------------------------------------------+
