// Id: 19093
//+------------------------------------------------------------------+
//|                          Advanced_Fractal_Envelopes_Strategy.mq4 |
//|                               Copyright © 2017, Gehtsoft USA LLC |
//|                                            http://fxcodebase.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2017, Gehtsoft USA LLC"
#property link      "http://fxcodebase.com"
#property version   "1.00"
#property strict

#define MAGICMA  2337436

input int Average_Period = 5;

input double Lots=0.1;
input bool Set_Stop=true;
input int Stop=50;
input bool Set_Limit=true;
input int Limit=100;
input bool Show_Alert=true;
input bool Play_Sound=false;
input string Sound_File="";
input bool Send_Email=false;

datetime LastBar;

int OnInit()
{
     double temp = iCustom(NULL, 0, "Advanced_Fractal_Envelopes", 0, 0);
   if (GetLastError() == ERR_INDICATOR_CANNOT_LOAD)
   {
       Alert("Please, install the 'Advanced_Fractal_Envelopes' indicator");
       return INIT_FAILED;
   }
   LastBar=0;
 
 return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason)
{

}
  
void CloseAll()
{
 bool res;
 int OT=OrdersTotal();
 for (int i=OT-1;i>=0;i--)
 {
  if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
  if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
  {
   if(OrderType()==OP_BUY)  res=OrderClose(OrderTicket(), OrderLots(), Bid, 5);
   if(OrderType()==OP_SELL) res=OrderClose(OrderTicket(), OrderLots(), Ask, 5);
  }
 }
 
}  

void _Alert(string op)
{
 if (Show_Alert)
 {
  Alert(Symbol()+" :"+op);
 } 
 
 if (Play_Sound)
 {
  PlaySound(Sound_File);
 }
 
 if (Send_Email)
 {
  SendMail(Symbol()+" :", op);
 }
}

int CalculateOrders()
{
 int Count=0;
 for(int i=0;i<OrdersTotal();i++)
 {
  if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
  if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
  {
   if(OrderType()==OP_BUY) Count++;
   if(OrderType()==OP_SELL) Count--;
  }
 }
 return (Count);  
}

void OnTick()
{
 if (LastBar==Time[1])
 {
  return;
 }
 LastBar=Time[1];
 
 double T0, T1, B0, B1, M0, M1;
 double C0, C1;
 
 T0=iCustom(NULL, 0, "Advanced_Fractal_Envelopes", Average_Period, false, false, 200, 0, 1);
 T1=iCustom(NULL, 0, "Advanced_Fractal_Envelopes", Average_Period, false, false, 200, 0, 2);
 B0=iCustom(NULL, 0, "Advanced_Fractal_Envelopes", Average_Period, false, false, 200, 1, 1);
 B1=iCustom(NULL, 0, "Advanced_Fractal_Envelopes", Average_Period, false, false, 200, 1, 2);
 M0=iCustom(NULL, 0, "Advanced_Fractal_Envelopes", Average_Period, false, false, 200, 2, 1);
 M1=iCustom(NULL, 0, "Advanced_Fractal_Envelopes", Average_Period, false, false, 200, 2, 2);
 
 C0=Close[1];
 C1=Close[2];
 
 int CO;
 CO=CalculateOrders();
 
 if (CO>0)
 {
  if (C0<T0 && C1>T1)
  {
   CloseAll();
  }
 }
 
 if (CO<0)
 {
  if (C0>B0 && C1<B1)
  {
   CloseAll();
  }
 }

 int res;
 double SL, TP;
 
 if (C0>M0 && C1<M1)
 {
  if (Set_Stop)
  {
   SL=NormalizeDouble(Bid-Stop*Point, Digits);
  }
  else
  {
   SL=0.;
  } 
  if (Set_Limit)
  {
   TP=NormalizeDouble(Bid+Limit*Point, Digits);
  }
  else
  {
   TP=0.;
  }
  res=OrderSend(Symbol(), OP_BUY, Lots, Ask, 5, SL, TP, "", MAGICMA, 0, Blue); 
 }
 
 if (C0<M0 && C1>M1)
 {
  if (Set_Stop)
  {
   SL=NormalizeDouble(Ask+Stop*Point, Digits);
  }
  else
  {
   SL=0.;
  } 
  if (Set_Limit)
  {
   TP=NormalizeDouble(Ask-Limit*Point, Digits);
  }
  else
  {
   TP=0.;
  }
  res=OrderSend(Symbol(), OP_SELL, Lots, Bid, 5, SL, TP, "", MAGICMA, 0, Blue); 
 }
 
}

void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{

}
  