//+------------------------------------------------------------------+ //| MT4MailStatus.mq4 | //| Moggy | //| moggylew@hotmail.com | //+------------------------------------------------------------------+ #property copyright "Moggy" #property link "moggylew@hotmail.com" #property version "1.00" #property strict extern long sendmininterval = 3600;//interval(S)(>60) datetime lastreporttime = 0; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { printf("OnInit called to init timer"); if(!EventSetTimer(2)) { printf("OnInit EventSetTimer error:" + (string)GetLastError()); } if(sendmininterval < 60) { printf("OnInit Failed,sendmininterval should more than 60 seconds"); return INIT_FAILED; } return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- destroy timer EventKillTimer(); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { } //+------------------------------------------------------------------+ //| Timer function | //+------------------------------------------------------------------+ void OnTimer() { //--- datetime nowtime = TimeCurrent(); //send report if(IsEnoughTimePassed(lastreporttime,nowtime,sendmininterval) && (OrdersTotal() > 0)) { string mailcontent = ""; mailcontent += "" + (string)nowtime + "\n"; mailcontent += "###Orders begin###\n"; for(int ordidx = 0; ordidx < OrdersTotal(); ordidx++) { if(OrderSelect(ordidx,SELECT_BY_POS,MODE_TRADES)==false) break; double ordask = MarketInfo(OrderSymbol(),MODE_ASK); double ordbid = MarketInfo(OrderSymbol(),MODE_BID); int ordtype = OrderType(); string typestr = ""; switch(ordtype) { case OP_BUY: typestr = " buy "; break; case OP_SELL: typestr = " sell "; break; case OP_BUYLIMIT: typestr = " buylimit "; break; case OP_SELLLIMIT: typestr = " selllimit "; break; case OP_BUYSTOP: typestr = " buystop "; break; case OP_SELLSTOP: typestr = " sellstop "; break; default: break; } mailcontent += "Ticket:" + (string)OrderTicket() + " " + OrderSymbol() + typestr + " at " + (string)OrderOpenPrice() + "\nSL:" + (string)OrderStopLoss() + " TP:" + (string)OrderTakeProfit() + "\nAsk:" + (string)ordask + " Bid:" + (string)ordbid + "\nLots:" + (string)OrderLots() + " profit:" + (string)OrderProfit() + "\n\n"; } mailcontent += "###Orders end###\n"; if(SendMail("Status Reports", mailcontent)) { lastreporttime = nowtime; }else { WriteToLogFile("SendMail failed error code:" + (string)GetLastError()); } } printf("OnTimer is here~"); } //+------------------------------------------------------------------+ //| Tester function | //+------------------------------------------------------------------+ double OnTester() { double ret=0.0; printf("OnTester called"); return(ret); } //+------------------------------------------------------------------+ //| ChartEvent function | //+------------------------------------------------------------------+ void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) { } //+------------------------------------------------------------------+ //| judge if enough time passed | //+------------------------------------------------------------------+ bool IsEnoughTimePassed(datetime oldtime, datetime newtime, long timepassed) { if ((newtime > oldtime) && (newtime - oldtime > timepassed)) { return true; } else { return false; } } //+------------------------------------------------------------------+ //| Write usefull log to file | //+------------------------------------------------------------------+ void WriteToLogFile(string logstring) { int handle; string filedatestr = "" + (string)TimeYear(TimeCurrent()) + "_" + (string)TimeMonth(TimeCurrent()) + "_" + (string)TimeDay(TimeCurrent()) + ""; handle = FileOpen("mylog_" + filedatestr + ".txt", FILE_READ|FILE_WRITE); if(handle > 0) { FileSeek(handle, 0, SEEK_END); FileWrite(handle,logstring); FileClose(handle); } }