//+------------------------------------------------------------------+
//|                                     BrokerStat Generic A-TLP.mq4 |
//|                                                       master_255 |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "master_255"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+

double PositiveSlip[];
double NegativeSlip[];
double Delay[];
double DelayClose[];

void OnStart(){   
   int file_handle=FileOpen("BrokerStat.csv", FILE_CSV|FILE_READ);
   string slips;
   double slip;
   double delay;
   string openclose="";
   int ssize;
   if (file_handle!=INVALID_HANDLE){
      while(!FileIsEnding(file_handle)){
         FileReadString(file_handle); //dat
         FileReadString(file_handle);   //symb
         FileReadString(file_handle);  //ticket
         openclose=FileReadString(file_handle);   //openclose
         FileReadString(file_handle);   //sltp
         slips=FileReadString(file_handle);   //slips
         StringReplace(slips,",",".");
         slip = StringToDouble(slips);
         //Print(slip);
         if(slip>=0){
            ssize = ArraySize(PositiveSlip);
            ArrayResize(PositiveSlip, ssize+1);
            PositiveSlip[ssize]=slip;
         }else{
            ssize = ArraySize(NegativeSlip);
            ArrayResize(NegativeSlip, ssize+1);
            NegativeSlip[ssize]=slip*-1;
         }
         delay = StringToDouble(FileReadString(file_handle)); //delay
         if(delay>0){
            if(openclose=="open"){
               ssize = ArraySize(Delay);
               ArrayResize(Delay, ssize+1);
               Delay[ssize]=delay;
            }else{
               ssize = ArraySize(DelayClose);
               ArrayResize(DelayClose, ssize+1);
               DelayClose[ssize]=delay; 
            }
         }
         FileReadString(file_handle);  //worktime
      }
   }
   
   if(ArraySize(PositiveSlip)==0){ ArrayResize(PositiveSlip, 1); PositiveSlip[0]=0;}
   if(ArraySize(NegativeSlip)==0){ ArrayResize(NegativeSlip, 1); NegativeSlip[0]=0;}
   if(ArraySize(Delay)==0){ ArrayResize(Delay, 1); Delay[0]=0;}
   if(ArraySize(DelayClose)==0){ ArrayResize(DelayClose, 1); DelayClose[0]=0;}
   
   double ps,ns,sum;
   ps = ArraySize(PositiveSlip);
   ns = ArraySize(NegativeSlip);
   sum = ps+ns;

   string Info="";
   Info+=StringConcatenate("=========== Проскальзывание ============\n"+
         /*"Максимум против нас:\t",PositiveSlip[ArrayMaximum(PositiveSlip)]," пунктов\n"+
         "Максимум в нашу сторону:\t",NegativeSlip[ArrayMaximum(NegativeSlip)]," пунктов\n"+
         "\n"+
         "Среднее против нас:\t",ArrayAvg(PositiveSlip)," пунктов\n"+
         "Среднее в нашу сторону:\t",ArrayAvg(NegativeSlip)," пунктов\n"+
         "\n"+
         "Количество против нас:\t",ps," (",DoubleToStr(ps/sum*100,0)," %)\n"+
         "Количество в нашу сторону:",ns," (",DoubleToStr(ns/sum*100,0)," %)\n"+
         "Среднее общее:\t\t",ArrayAvg2(NegativeSlip,PositiveSlip)," пунктов\n"+*/
         "\t\tПротив нас\tВ нашу сторону\n"+
         "Количество\t",ps," (",DoubleToStr(ps/sum*100,0)," %)\t\t",ns," (",DoubleToStr(ns/sum*100,0)," %)\n"+
         "Среднее\t\t",ArrayAvg(PositiveSlip)," pips\t\t",ArrayAvg(NegativeSlip)," pips\n"+
         "Максимум\t",PositiveSlip[ArrayMaximum(PositiveSlip)]," pips\t\t",NegativeSlip[ArrayMaximum(NegativeSlip)]," pips\n\n"+
         "Среднее общее\t",ArrayAvg2(NegativeSlip,PositiveSlip)," pips\n"+
         "\n====== Задержка исполнения для Open =======\n"+
         "Минимальная\t",Delay[ArrayMinimum(Delay)]," ms\n"+
         "Средняя\t\t",ArrayAvg(Delay)," ms\n"+
         "Максимальная\t",Delay[ArrayMaximum(Delay)]," ms\n"+
         "\n====== Задержка исполнения для Close =======\n"+
         "Минимальная\t",DelayClose[ArrayMinimum(DelayClose)]," ms\n"+
         "Средняя\t\t",ArrayAvg(DelayClose)," ms\n"+
         "Максимальная\t",DelayClose[ArrayMaximum(DelayClose)]," ms\n");
   
   
   MessageBox(Info, "Broker Stat", MB_OK);
}

double ArrayAvg(double &x[]){
   double ArraySum=0;
   for(int ArrayIndex = ArraySize(x) - 1; ArrayIndex >= 0; ArrayIndex--)
      ArraySum += x[ArrayIndex];

   return NormalizeDouble(ArraySum/ArraySize(x),1);
}

double ArrayAvg2(double &x[], double &y[]){
   double ArraySum=0;
   for(int ArrayIndex = ArraySize(x) - 1; ArrayIndex >= 0; ArrayIndex--)
      ArraySum += x[ArrayIndex];
   for(int ArrayIndex = ArraySize(y) - 1; ArrayIndex >= 0; ArrayIndex--)
      ArraySum += y[ArrayIndex];

   return NormalizeDouble(ArraySum/(ArraySize(x)+ArraySize(y)),1);
}
//+------------------------------------------------------------------+
