exp_statusbot

Author: Leonid Salavatov [MUSTADDON]� 2010
Price Data Components
Series array that contains open time of each bar
Orders Execution
Checks for the total of open ordersChecks for the total of closed orders
Miscellaneous
Uses files from the file systemIt writes information to file
0 Views
0 Downloads
0 Favorites
exp_statusbot
//+------------------------------------------------------------------+
//|                                                exp_statusbot.mq4 |
//|                               Leonid Salavatov [MUSTADDON]© 2010 |
//+------------------------------------------------------------------+
#property copyright "Leonid Salavatov [MUSTADDON]© 2010"
//---- externs
extern string statusfilename = "status.txt";
extern string spamfilename   = "notify.txt";
extern string reportfilename = "report.txt";
//---- vars
string expname = "statusbot";
int    ord_tickets[];
int    ord_tickets_past[];
int    ord_tickets_changing_open[];
int    ord_tickets_changing_close[];
double curbalance = 0.0;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   WriteReport();
   WriteStatus();
//----
   string filename = expname+"/"+spamfilename;
   int filehandle=FileOpen(filename,FILE_WRITE);  
   if(filehandle>0)
     {FileWrite(filehandle,"Starting expert "+expname);
      FileClose(filehandle);
     }
   else Print("Íå óäàëîñü ñîçäàòü ôàéë ",spamfilename,", Error:",GetLastError()); 
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   FileDelete(expname+"/"+statusfilename);
   FileDelete(expname+"/"+spamfilename);
   FileDelete(expname+"/"+reportfilename);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//---- ñîáèðàåì ñòàòèñòèêó è ïèøåì ôàéë report.txt
   WriteReport();
//---- ñîáèðàåì èíôó è ïèøåì ôàéë status.txt
   WriteStatus();
//---- ñîáèðàåì èíôó è ïèøåì ôàéë notify.txt
   WriteNotify();
//----
   return(0);
  }
//+------------------------------------------------------------------+
void WriteStatus()
  {int profit;
   ArrayResize(ord_tickets, 0);
   string filename = expname+"/"+statusfilename;
   string abzac ="-----------";
   int filehandle=FileOpen(filename,FILE_WRITE,"  "); 
   if(filehandle>0)
     {FileWrite(filehandle,"Balance =",DoubleToStr(AccountBalance(),2),AccountCurrency());
      if(OrdersTotal()>0)
        {FileWrite(filehandle,abzac);
         for(int i=0;i<OrdersTotal();i++)
            {if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)     break;
             ArrayResize(ord_tickets, i+1);
             ord_tickets[i]=OrderTicket();
             if(OrderType()==OP_BUY)
               {profit=(MarketInfo(OrderSymbol(),MODE_BID)-OrderOpenPrice())/MarketInfo(OrderSymbol(),MODE_POINT);
                FileWrite(filehandle,OrderSymbol(),"buy",DoubleToStr(OrderLots(),2),profit,"pips");
               }
             if(OrderType()==OP_SELL)
               {profit=(OrderOpenPrice()-MarketInfo(OrderSymbol(),MODE_ASK))/MarketInfo(OrderSymbol(),MODE_POINT);
                FileWrite(filehandle,OrderSymbol(),"sell",DoubleToStr(OrderLots(),2),profit,"pips");
               }
            }
         FileWrite(filehandle,"summa =",DoubleToStr(AccountProfit(),2),AccountCurrency());  
         FileWrite(filehandle,abzac);
         FileWrite(filehandle,"Equity =",DoubleToStr(AccountEquity(),2),AccountCurrency());
        }    
      FileClose(filehandle);
     }
   else Print("Íå óäàëîñü ñîçäàòü ôàéë ",statusfilename,", Error:",GetLastError());
  }
void WriteNotify()
  {//---- ïðîâåðÿåì äîáàâëåíèå/óäàëåíèå îðäåðîâ
   int size = 0;
   int profit;
   ArrayResize(ord_tickets_changing_open, ArraySize(ord_tickets));
   ArrayResize(ord_tickets_changing_close, ArraySize(ord_tickets_past));
   
   for(int j=0;j<ArraySize(ord_tickets);j++)
     {for(int i=0;i<ArraySize(ord_tickets_past);i++)
         {if(ord_tickets[j]==ord_tickets_past[i]) break;}
      if(i==ArraySize(ord_tickets_past) && ArraySize(ord_tickets_changing_open)>0){ord_tickets_changing_open[size]=ord_tickets[j];size++;}
     }
   ArrayResize(ord_tickets_changing_open, size); 
   size=0;
   for(j=0;j<ArraySize(ord_tickets_past);j++)
     {for(i=0;i<ArraySize(ord_tickets);i++)
        {if(ord_tickets[i]==ord_tickets_past[j]) break;}
      if(i==ArraySize(ord_tickets) && ArraySize(ord_tickets_changing_close)>0){ord_tickets_changing_close[size]=ord_tickets_past[j];size++;}
     }
   ArrayResize(ord_tickets_changing_close, size);
   ArrayResize(ord_tickets_past, ArraySize(ord_tickets));
   if(ArraySize(ord_tickets)>0) ArrayCopy(ord_tickets_past,ord_tickets,0,0,WHOLE_ARRAY);
   if(ArraySize(ord_tickets_changing_open)==0 && ArraySize(ord_tickets_changing_close)==0) return;
   //---- åñëè åñòü èçìåíåíèÿ òî ïèøåì notify.txy
   string addoninfo;
   string filename = expname+"/"+spamfilename;
   int    filehandle=FileOpen(filename,FILE_WRITE,"  "); 
   if(filehandle>0)
     {for(j=0;j<ArraySize(ord_tickets_changing_open);j++)
        {addoninfo="[order added]";
         if(OrderSelect(ord_tickets_changing_open[j],SELECT_BY_TICKET,MODE_TRADES)==true)
           {if(OrderType()==OP_BUY)
              {profit=(MarketInfo(OrderSymbol(),MODE_BID)-OrderOpenPrice())/MarketInfo(OrderSymbol(),MODE_POINT);
               FileWrite(filehandle,addoninfo,OrderSymbol(),"buy",DoubleToStr(OrderLots(),2),profit,"pips");
              }
            if(OrderType()==OP_SELL)
              {profit=(OrderOpenPrice()-MarketInfo(OrderSymbol(),MODE_ASK))/MarketInfo(OrderSymbol(),MODE_POINT);
               FileWrite(filehandle,addoninfo,OrderSymbol(),"sell",DoubleToStr(OrderLots(),2),profit,"pips");
              }
           }
        }
      for(j=0;j<ArraySize(ord_tickets_changing_close);j++)
        {addoninfo="[order closed]";
         if(OrderSelect(ord_tickets_changing_close[j],SELECT_BY_TICKET,MODE_HISTORY)==true)
            {if(OrderType()==OP_BUY)
               {profit=(OrderClosePrice()-OrderOpenPrice())/MarketInfo(OrderSymbol(),MODE_POINT);
                FileWrite(filehandle,addoninfo,OrderSymbol(),"buy",DoubleToStr(OrderLots(),2),profit,"pips");
               }
             if(OrderType()==OP_SELL)
               {profit=(OrderOpenPrice()-OrderClosePrice())/MarketInfo(OrderSymbol(),MODE_POINT);
                FileWrite(filehandle,addoninfo,OrderSymbol(),"sell",DoubleToStr(OrderLots(),2),profit,"pips");
               }
            }
        }
      FileClose(filehandle);
     }
   else Print("Íå óäàëîñü ñîçäàòü ôàéë ",spamfilename,", Error:",GetLastError()); 
  }
void WriteReport()
  {if(AccountBalance()==curbalance) return;
   if(OrdersHistoryTotal()<=0) return;
   string report_buffer[];
   string report_buffer_sorted[];
   ArrayResize(report_buffer,OrdersHistoryTotal());
   int report_size = 0;
   string rts = "|";
   string opentime,type,size,item,openprice,loss_lim,profit_lim,closetime,closeprice,commision,swap,profit;
   //---- ñîáèðàåì èñòîðèþ
   for(int i=0;i<OrdersHistoryTotal();i++)
     {if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)  break;
      if(OrderType()!=OP_BUY && OrderType()!=OP_SELL)       continue;
      if(OrderType()==OP_BUY) type="buy";
      if(OrderType()==OP_SELL)type="sell";
      opentime   = TimeToStr(OrderOpenTime(),TIME_DATE|TIME_MINUTES);
      size       = DoubleToStr(OrderLots(),2);
      item       = OrderSymbol();
      openprice  = DoubleToStr(OrderOpenPrice(),MarketInfo(OrderSymbol(),MODE_DIGITS));
      loss_lim   = DoubleToStr(OrderStopLoss(),MarketInfo(OrderSymbol(),MODE_DIGITS));
      profit_lim = DoubleToStr(OrderTakeProfit(),MarketInfo(OrderSymbol(),MODE_DIGITS));
      closetime  = TimeToStr(OrderCloseTime(),TIME_DATE|TIME_MINUTES);
      closeprice = DoubleToStr(OrderOpenPrice(),MarketInfo(OrderSymbol(),MODE_DIGITS));
      commision  = DoubleToStr(OrderCommission(),2);
      swap       = DoubleToStr(OrderSwap(),2);
      profit     = DoubleToStr(OrderProfit(),2);
      report_buffer[report_size] = opentime+rts+type+rts+size+rts+item+rts+openprice+rts+loss_lim+rts+profit_lim+rts+closetime+rts+closeprice+rts+commision+rts+swap+rts+profit;
      report_size++;
     }
   //---- ñîðòèðóåì ïî äàòå çàêðûòèÿ
   ArrayResize(report_buffer_sorted,report_size);
   datetime mindate;
   datetime curdate;
   int      minid;
   int      firstid=-1;
   int      startpos,endpos;
   for(i=0;i<report_size;i++)
     {for(int j=0;j<report_size;j++)
         {if(report_buffer[j]=="") continue;
          startpos=0;
          for(int k=1;k<8;k++)
             {startpos=StringFind(report_buffer[j],rts,startpos)+1;
              endpos=StringFind(report_buffer[j],rts,startpos);
             }
          curdate=StrToTime(StringSubstr(report_buffer[j],startpos,endpos-startpos));
          if(firstid<0) {mindate=curdate;minid=j;firstid=j;continue;}
          if(curdate<mindate) {mindate=curdate;minid=j;}
         }
      report_buffer_sorted[i]=report_buffer[minid];
      report_buffer[minid]="";
      firstid=-1;
     }
   //---- ïèøåì report.txt
   string filename = expname+"/"+reportfilename;
   int filehandle=FileOpen(filename,FILE_CSV|FILE_WRITE,rts);  
   if(filehandle>0)
     {for(i=0;i<report_size;i++)
        {
         FileWrite(filehandle,"@",report_buffer_sorted[i]);
        }
      FileWrite(filehandle,"#",DoubleToStr(AccountBalance(),2),AccountCurrency());
      FileClose(filehandle);
      curbalance=AccountBalance();
     }
   else Print("Íå óäàëîñü ñîçäàòü ôàéë ",reportfilename,", Error:",GetLastError()); 
  }
//+------------------------------------------------------------------+

Comments