//+------------------------------------------------------------------+ //| EmailStatus.mq4 | //| Paul Hampton-Smith | //| | //+------------------------------------------------------------------+ #include #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); }