EmailStatus





//+------------------------------------------------------------------+
//|                                                  EmailStatus.mq4 |
//|                                               Paul Hampton-Smith |
//|                                                                  |
//+------------------------------------------------------------------+

#include <TimeGMT.mqh>

#property indicator_chart_window
//---- input parameters
extern int       EmailHourStart=9;
extern int       EmailHourEnd=18;

datetime dtLastReport = 0;


//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
{
	// set last report time as 3 days ago
	dtLastReport = TimeLocal()-3*24*3600;	
	start();
   return(0);
}


//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
{
	static int nLastHourLocal = -1;

	int nHourLocal = TimeHour(TimeLocal());
	if (nHourLocal != nLastHourLocal &&
		nHourLocal >= EmailHourStart && 
		nHourLocal <= EmailHourEnd) 
	{
		EmailStatus();
		nLastHourLocal	= nHourLocal;
	}
	return(0);
}
//+------------------------------------------------------------------+

void EmailStatus()
{
	double dblOpenProfit = 0.0;
	for (int i = 0 ; i < OrdersTotal() ; i++)
	{
		OrderSelect(i, SELECT_BY_POS);
		dblOpenProfit += OrderProfit() + OrderSwap();
	}
	string strBody = StringConcatenate(
		  "Balance     ",RightJustifyDblToStr(AccountBalance(),6,0),
		"\nEquity      ",RightJustifyDblToStr(AccountEquity(),6,0),
		"\nMargin      ",RightJustifyDblToStr(AccountMargin(),6,0),
		"\nFree margin ",RightJustifyDblToStr(AccountFreeMargin(),6,0),
		"\nOpen profit ",RightJustifyDblToStr(dblOpenProfit,6,0),"\n\n");

	if (OrdersTotal() == 0)
	{
		strBody = strBody + "No open or pending orders";
	}
	else
	{
		strBody = strBody + OrderReport(false); // open orders
		strBody = strBody + "\n\n" + OrderReport(true); // pending orders
	}

	strBody = strBody + "\n\n" + ClosedOrdersSinceLastReport();
	
	SendMail("Progress", strBody);
}	

string OrderReport(bool bPending)
{
	string strReport;
	if (bPending) 
		strReport = "Pending orders\n\n";
	else
		strReport = "Open orders\n\n";

	strReport = strReport + "  Open time local         Type  Lots Symbol  Price   S/L    T/P    Now Profit Comment\n";
	strReport = strReport + "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~";
	
	for (int i = 0 ; i < OrdersTotal() ; i++)
	{
		OrderSelect(i, SELECT_BY_POS);
		
		if (bPending && (OrderType() <= OP_SELL)) continue;
		if (!bPending && (OrderType() > OP_SELL)) continue;
		double dblDigits = MarketInfo(OrderSymbol(),MODE_DIGITS);
		strReport = StringConcatenate(strReport,"\n",
			TimeToStr(ServerToLocal(OrderOpenTime()),TIME_DATE|TIME_SECONDS)," ",
			CmdToStrFixed(OrderType())," ",
			RightJustifyDblToStr(OrderLots(),5,2)," ",
			OrderSymbol()," ", 
			DoubleToStr(OrderOpenPrice(),dblDigits)," ",
			RightJustifyDblToStr(OrderStopLoss(),6,dblDigits)," ",
			RightJustifyDblToStr(OrderTakeProfit(),6,dblDigits)," ", 
			DoubleToStr(MarketInfo(OrderSymbol(),MODE_BID),dblDigits)," ", 
			RightJustifyDblToStr(OrderProfit(),5,0)," ",
			OrderComment());
	}
	return(strReport);
}			

string ClosedOrdersSinceLastReport()
{
	string strReport = "";
	
	for (int i = OrdersHistoryTotal()-1 ; i >= 0 ; i--)
	{
		OrderSelect(i, SELECT_BY_POS, MODE_HISTORY);
		// only orders since last report
		if (ServerToLocal(OrderCloseTime()) < dtLastReport ) continue;

		double dblDigits = MarketInfo(OrderSymbol(),MODE_DIGITS);
		strReport = StringConcatenate(strReport,"\n",
			TimeToStr(ServerToLocal(OrderOpenTime()),TIME_DATE|TIME_SECONDS)," ",
			CmdToStrFixed(OrderType())," ",
			RightJustifyDblToStr(OrderLots(),5,2)," ",
			OrderSymbol()," ", 
			DoubleToStr(OrderOpenPrice(),dblDigits)," ",
			RightJustifyDblToStr(OrderStopLoss(),6,dblDigits)," ",
			RightJustifyDblToStr(OrderTakeProfit(),6,dblDigits)," ", 
			TimeToStr(ServerToLocal(OrderCloseTime()),TIME_DATE|TIME_SECONDS)," ",
			DoubleToStr(OrderClosePrice(),dblDigits)," ", 
			RightJustifyDblToStr(OrderProfit(),5,0)," ",
			OrderComment());
	}
	
	if (strReport == "")
	{
		return("No closed orders since local time " + TimeToStr(dtLastReport,TIME_DATE|TIME_SECONDS));
	}
	else
	{
		strReport = StringConcatenate(
			"Orders closed since local time ",TimeToStr(dtLastReport,TIME_DATE|TIME_SECONDS),
			"\n\n",
			"  Open time local         Type  Lots Symbol  Price   S/L    T/P   Close time local   Close Profit Comment\n",
			"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
			strReport);
		dtLastReport = TimeLocal();
		return(strReport);
	}
}			


string CmdToStrFixed(int cmd)
{
   switch(cmd)
   {
   case OP_BUY:       return("       Buy");
   case OP_SELL:      return("      Sell");
   case OP_BUYSTOP:   return("  Buy stop");
   case OP_SELLSTOP:  return(" Sell stop");
   case OP_BUYLIMIT:  return(" Buy limit");
   case OP_SELLLIMIT: return("Sell limit");
   default: return("OP_UNKNOWN");
   }
}      
	
string RightJustifyDblToStr(double dbl, int nWidth, int nDecimals) 
{ 
	string strRet = DoubleToStr(dbl,nDecimals); 
   int nLen = StringLen(strRet); 
   for (int i = nLen ; i < nWidth ; i++) strRet = " " + strRet; 
   return(strRet); 
} 
        
datetime ServerToLocal(datetime dtServer)
{
	return(dtServer+(-TimeZoneServer()+TimeZoneLocal())*3600);
}



Sample





Analysis



Market Information Used:



Indicator Curves created:


Indicators Used:



Custom Indicators Used:

Order Management characteristics:
Checks for the total of open orders

Checks for the total of closed orders

Other Features:

It sends emails