sSaveSetFunctions





//+------------------------------------------------------------------+
//|                                            sSaveSetFunctions.mq4 |
//|                                                                * |
//|                                                                * |
//+------------------------------------------------------------------+

/*
   Ñêðèïò ãåíåðàòîð êîäà ôóíêöèè, ñîõðàíÿþùåé ôàéëû íàñòðîåê ñîâåòíèêà îò êàæäîãî ïðîãîíà
   ïðè îïòèìèçàöèè.
   
   Çàïóñêàåì ñêðèïò, ââîäèì èìÿ ôàéëà ýñïåðòà, ïîëó÷àåì ôàéë ñ êîäîì è èíñòðóêöèÿìè ïî
   åãî âñòàâêå â êîä ñîâåòíèêà (âñòàâèòü íå ñëîæíî).
   
   Â ïðîöåññå îïòèìèçàöèè, ïîñëå êàæäîãî ïðîõîäà, â êàòàëîãå 
   ...tester\files\SaveSet [èìÿ ýêñïåðòà] ñîõðàíÿþòñÿ
   ïðîíóìåðîâàííûå ôàéëû *.set, äåëàåòñÿ çàïèñü â ôàéë
   Report.htm î ðåçóëüòàòàõ êàæäîãî ïðîõîäà îïòèìèçàöèè (ïðèáûëü, 
   êîëè÷åñòâî ñäåëîê è ò.ï.) è äåëàåòñÿ êîïèÿ ôàéëà 
   [èìÿ ýêñïåðòà].ini (÷òîáû ìîæíî áûëî â äàëüíåéøåì âîñïðîèçâåñòè 
   ïàðàìåòðû îïòèìèçàöèè, íóæíî çàìåíèòü ôàéë ini íàõîäÿùèéñÿ â
   êàòàëîãå tester). Òàêèì îáðàç, ïîëå ïðîâåäåííîé îïòèìèçàöèè
   âñåãäà ìîæíî âåðíóòüñÿ ê åå ðåçóëüòàòì.
      
   
*/


#property copyright "http://dmffx.com"
#property link      "http://dmffx.com"
#import "kernel32.dll"
   int CopyFileA (string lpExistingFileName,string lpNewFileName,int bFailIfExists);
#import

#property show_inputs
extern string ExpFileName="";

//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start(){

      if(fCreateSaveSetFunction(ExpFileName)){
         Alert("Ok! See file "+"\"SaveSet "+ExpFileName+".txt\"");
      }
   return(0);
}
//+------------------------------------------------------------------+

bool fCreateSaveSetFunction(string aExpertFileName){
   string tVarList[][3];
      if(!fGetExtVarList(aExpertFileName,tVarList)){
         return(false);
      }
   int th=FileOpen("SaveSet "+aExpertFileName+".txt",FILE_CSV|FILE_WRITE);

    FileWrite(th,"//+------------------------------------------------------------------+");
    FileWrite(th,"// Insert next to the most top of EA code:");
    FileWrite(th,"// Âñòàâüòå ñëåäóþùåå â ñàìûé âåðõ êîäà ýêñïåðòà:");
    FileWrite(th,"//+------------------------------------------------------------------+");
    FileWrite(th,"");    
    FileWrite(th,"#import \"kernel32.dll\"");
    FileWrite(th,"   int CopyFileA (string lpExistingFileName,string lpNewFileName,int bFailIfExists);");
    FileWrite(th,"#import");
    FileWrite(th,"");    
    FileWrite(th,"");  
    FileWrite(th,"");   
              
    FileWrite(th,"//+------------------------------------------------------------------+");              
    FileWrite(th,"// Insert next to the top or bottom of deinit() function code:");
    FileWrite(th,"// Âñòàâüòå ñëåäóþùåå ñâåðõó èëè ñíèçó â êîä ôóíêöèè deinit():");
    FileWrite(th,"//+------------------------------------------------------------------+");
    FileWrite(th,"");  
    FileWrite(th,"fSaveSet_CreateSetFile();");      
    FileWrite(th,"");    
    FileWrite(th,"");  
    FileWrite(th,"");                 
              
    FileWrite(th,"//+------------------------------------------------------------------+");                
    FileWrite(th,"// Insert next to the most top of start() function code:");
    FileWrite(th,"// Âñòàâüòå ñëåäóþùåå â ñàìûé âåðõ êîäà ôóíêöèè start():");
    FileWrite(th,"//+------------------------------------------------------------------+");
    FileWrite(th,"");  
    FileWrite(th,"fSaveSet_MaximalDrawDown();");      
    FileWrite(th,"");    
    FileWrite(th,"");  
    FileWrite(th,"");       
    
    FileWrite(th,"//+------------------------------------------------------------------+");
    FileWrite(th,"// Insert next to the most bottom of EA code: ");
    FileWrite(th,"// Âñòàâüòå ñëåäóþùåå â ñàìûé íèç êîäà ýêñïåðòà: ");
    FileWrite(th,"//+------------------------------------------------------------------+");
    FileWrite(th,"");    
    FileWrite(th,"void fSaveSet_CreateSetFile(){");
    FileWrite(th,"    CopyFileA(TerminalPath()+\"/tester/\"+WindowExpertName()+\".ini\",TerminalPath()+\"/tester/files/\"+\"SaveSet \"+WindowExpertName()+\"/\"+WindowExpertName()+\".ini\",0);");
    FileWrite(th,"    int th=FileOpen(\"SaveSet \"+WindowExpertName()+\"/\"+\"cnt.txt\",FILE_CSV|FILE_READ|FILE_WRITE);");
    FileWrite(th,"    int tCnt=StrToInteger(FileReadString(th))+1;");
    FileWrite(th,"    FileClose(th);");
    FileWrite(th,"    th=FileOpen(\"SaveSet \"+WindowExpertName()+\"/\"+\"cnt.txt\",FILE_CSV|FILE_WRITE);");
    FileWrite(th,"    FileWrite(th,tCnt);");
    FileWrite(th,"    FileClose(th);");
    FileWrite(th,"    double tProfit;");
    FileWrite(th,"    int tTotalTrades;");
    FileWrite(th,"    double tProfitFactor;");
    FileWrite(th,"    double tExpectedPayoff;");
    FileWrite(th,"    datetime tDateFrom;");
    FileWrite(th,"    datetime tDateTo;");
    FileWrite(th,"    fSaveSet_ShortTradeReport(tProfit,tTotalTrades,tProfitFactor,tExpectedPayoff,tDateFrom,tDateTo);");
    FileWrite(th,"    th=FileOpen(\"SaveSet \"+WindowExpertName()+\"/Report.htm\",FILE_CSV|FILE_READ|FILE_WRITE,\"\t\");");
    FileWrite(th,"        if(FileSize(th)==0){");
    FileWrite(th,"            FileWrite(th,\"<style>\");");
    FileWrite(th,"            FileWrite(th,\"p{background-color: #FFFFFF; font-family: Arial; font-size: 10pt; color: #000000}\");");
    FileWrite(th,"            FileWrite(th,\"A:visited{color: #0000FF; text-decoration: none;}\");");
    FileWrite(th,"            FileWrite(th,\"A:link{color: #0000FF; text-decoration: none;}\");");
    FileWrite(th,"            FileWrite(th,\"A:hover{color: #FF0000; text-decoration: none;}\");");
    FileWrite(th,"            FileWrite(th,\"A:active{color: #FF0000; text-decoration: none;}\");");
    FileWrite(th,"            FileWrite(th,\"tr.h{background-color: #E0E0E0; font-family: Arial; font-size: 8pt; font-weight: bold; color: #000000;}\");");
    FileWrite(th,"            FileWrite(th,\"tr.c{background-color: #F0F0F0; font-family: Arial; font-size: 8pt; color: #000000}</style>\");");
    FileWrite(th,"            FileWrite(th,\"<p class=p1><b>Expert:</b> \"+WindowExpertName()+\"<br><b>Chart:</b> \"+Symbol()+\" \"+Period()+\"<br><b>Time:</b> \"+TimeToStr(fSaveSet_StartTime())+\"-\"+TimeToStr(fSaveSet_EndTime())+\"</p>\");");
    FileWrite(th,"            FileWrite(th,\"<table border=0 cellspacing=2 cellpadding=1><tr class=h><td>¹</td><td>Profit</td><td>Total trades</td><td>Frofit factor</td><td>Expected Payoff</td><td>Drawdown $</td><td>Drawdown %</td><td>Set file</td></tr>\");");
    FileWrite(th,"        }");
      
    FileWrite(th,"    FileSeek(th,0,SEEK_END);");
    FileWrite(th,"    string tCntStr=tCnt;");
    FileWrite(th,"        while(StringLen(tCntStr)<8){");
    FileWrite(th,"            tCntStr=\"0\"+tCntStr;");
    FileWrite(th,"        }");
    string tstr;
    tstr="    FileWrite(th,\"<tr class=c><td>\"+tCnt+\"</td><td>\"+DoubleToStr(tProfit,2)+\"</td><td>\"+tTotalTrades+\"</td><td>\"+DoubleToStr(tProfitFactor,2)+\"</td><td>\"+DoubleToStr(tExpec";
    tstr=tstr+"tedPayoff,2)+\"</td><td>\"+DoubleToStr(fSaveSet_MaximalDrawDown(),2)+\"</td><td>\"+DoubleToStr(fSaveSet_MaximalDrawDownPerc(),2)+\"</td><td><a href=\"+tCntStr+\".set\"+\">\"+tCntStr+\".set\"+\"</a></td></tr>\");";
    FileWrite(th,tstr);
    FileWrite(th,"    FileClose(th);");
    FileWrite(th,"    th=FileOpen(\"SaveSet \"+WindowExpertName()+\"/\"+tCntStr+\".set\",FILE_CSV|FILE_WRITE);");
      for(int ti=0;ti<ArraySize(tVarList)/3;ti++){
         FileWrite(th,"    FileWrite(th,"+"\""+tVarList[ti][1]+"=\"+"+tVarList[ti][1]+");");
      }
   FileWrite(th,"}");      
   FileWrite(th,"");       


   FileWrite(th,"double fSaveSet_MaximalProfit(){");
   FileWrite(th,"   static double sMaxProfit=0;");
   FileWrite(th,"   sMaxProfit=MathMax(sMaxProfit,AccountEquity());");
   FileWrite(th,"   return(sMaxProfit);");
   FileWrite(th,"}");
   FileWrite(th,"");
   FileWrite(th,"double fSaveSet_MaximalDrawDown(){");
   FileWrite(th,"   static double sMaximalDrawDown=0;");
   FileWrite(th,"   sMaximalDrawDown=MathMax(sMaximalDrawDown,fSaveSet_MaximalProfit()-AccountEquity());");
   FileWrite(th,"   fSaveSet_StartTime();");
   FileWrite(th,"   fSaveSet_EndTime();");
   FileWrite(th,"   return(sMaximalDrawDown);");
   FileWrite(th,"}");
   FileWrite(th,"");
   FileWrite(th,"double fSaveSet_MaximalDrawDownPerc(){");
   FileWrite(th,"   return(100.0*fSaveSet_MaximalDrawDown()/fSaveSet_MaximalProfit());");
   FileWrite(th,"}");
   FileWrite(th,"");
   FileWrite(th,"datetime fSaveSet_StartTime(){");
   FileWrite(th,"   static datetime sStartTime=0;");
   FileWrite(th,"   if(sStartTime==0)sStartTime=TimeCurrent();");
   FileWrite(th,"   return(sStartTime);");
   FileWrite(th,"}");
   FileWrite(th,"");
   FileWrite(th,"datetime fSaveSet_EndTime(){");
   FileWrite(th,"   static datetime sEndTime=0;");
   FileWrite(th,"   sEndTime=MathMax(sEndTime,TimeCurrent());");
   FileWrite(th,"   return(sEndTime);");
   FileWrite(th,"}");
   FileWrite(th,"");
   FileWrite(th,"void fSaveSet_ShortTradeReport(double & aProfit, int & aTotalTrades,double & aProfitFactor,double & aExpectedPayoff,datetime & aDateFrom,datetime & aDateTo){");
   FileWrite(th,"   aProfit=0;");   
   FileWrite(th,"   aTotalTrades=0;");
   FileWrite(th,"   double tGrossProfit=0;");
   FileWrite(th,"   double tGrossLoss=0;");   
   FileWrite(th,"   double tProfitTrades=0;");
   FileWrite(th,"   double tLossTrades=0;");
   FileWrite(th,"   aDateFrom=0;");
   FileWrite(th,"   aDateTo=0;");
   FileWrite(th,"      for(int ti=0;ti<OrdersHistoryTotal();ti++){");
   FileWrite(th,"         OrderSelect(ti,SELECT_BY_POS,MODE_HISTORY);");
   FileWrite(th,"            if(OrderType()==OP_BUY || OrderType()==OP_SELL){");
   FileWrite(th,"                  if(aDateFrom==0){");
   FileWrite(th,"                     aDateFrom=OrderOpenTime();");
   FileWrite(th,"                  }");
   FileWrite(th,"               aDateTo=MathMax(aDateTo,OrderCloseTime());");
   FileWrite(th,"               double tProfit=OrderProfit()+OrderCommission()+OrderSwap();");
   FileWrite(th,"               aProfit+=tProfit;");
   FileWrite(th,"               aTotalTrades++;");
   FileWrite(th,"                  if(tProfit>0){");
   FileWrite(th,"                     tGrossProfit+=tProfit;");
   FileWrite(th,"                     tProfitTrades++;");
   FileWrite(th,"                  }");
   FileWrite(th,"                  if(tProfit<0){");
   FileWrite(th,"                     tGrossLoss+=-tProfit;");
   FileWrite(th,"                     tLossTrades++;");
   FileWrite(th,"                  }");
   FileWrite(th,"            }");
   FileWrite(th,"      }");
   FileWrite(th,"   aProfitFactor=-1;");
   FileWrite(th,"      if(NormalizeDouble(tGrossLoss,2)!=0){");
   FileWrite(th,"         aProfitFactor=tGrossProfit/tGrossLoss;");
   FileWrite(th,"      }");
   FileWrite(th,"   aExpectedPayoff=-1;");
   FileWrite(th,"      if(aTotalTrades!=0 && tProfitTrades!=0 && tLossTrades!=0){");
   FileWrite(th,"         aExpectedPayoff=(tProfitTrades/aTotalTrades)*(tGrossProfit/tProfitTrades)-(tLossTrades/aTotalTrades)*(tGrossLoss/tLossTrades);");
   FileWrite(th,"      }");
   FileWrite(th,"}");    
   FileClose(th);   
   return(true);   
}

bool fGetExtVarList(string aExpertFileName,string & aVarList[][3]){
   ArrayResize(aVarList,0);
   int tSize=0;
      if(!IsDllsAllowed()){
         Alert("Allow DLL");
         return(false);
      }
   string tFrom=TerminalPath()+"\\experts\\"+aExpertFileName;
   string tTo=TerminalPath()+"\\experts\\files\\tmp.tmp";
   int z=CopyFileA(tFrom,tTo,0);
         if(z==0){
            Alert("No file \""+tFrom+"\"");
            return(false);
         }
      int th=FileOpen("tmp.tmp",FILE_CSV|FILE_READ);
         while(!FileIsEnding(th)){
            string str=FileReadString(th);
            str=fStrTrim(str);
               if(str!=""){
                  if(StringFind(str,"extern",0)==0){
                     str=StringSubstr(str,6,StringLen(str)-6);
                     str=fStrTrim(str);
                     string tType="";
                     string tDefVal;
                        if(StringFind(str,"int",0)==0){
                           tType="int";
                           tDefVal="0";
                        }
                        if(StringFind(str,"double",0)==0){
                           tType="double";
                           tDefVal="0.0";
                        }
                        if(StringFind(str,"bool",0)==0){
                           tType="bool";
                           tDefVal="false";
                        }
                        if(StringFind(str,"string",0)==0){
                           tType="string";
                           tDefVal="";
                        }
                        if(StringFind(str,"color",0)==0){
                           tType="color";
                           tDefVal="CLR_NONE";
                        }
                        if(StringFind(str,"datetime",0)==0){
                           tType="datetime";
                           tDefVal="0";
                        }
                     str=StringSubstr(str,StringLen(tType),StringLen(str)-StringLen(tType));
                     str=fStrTrim(str);
                     string tmp3[];
                        if(tType=="string"){                           
                           str=fReplaceStrContent(str,tmp3);
                        }
                     string tmp[];
                     fStrSplit(str,tmp,",");
                     int tj=0;
                        for(int ti=0;ti<ArraySize(tmp);ti++){
                           ArrayResize(aVarList,tSize+1);
                           aVarList[tSize][0]=tType;
                           string tmp2[];
                           fStrSplit(tmp[ti],tmp2,"=");
                           aVarList[tSize][1]=fStrTrim(tmp2[0]);
                              if(tType=="string"){
                                 if(ArraySize(tmp2)>1){
                                    aVarList[tSize][2]=tmp3[tj];
                                    tj++; 
                                 }
                                 else{
                                    aVarList[tSize][2]=tDefVal;
                                 }                              
                              }
                              else{
                                 if(ArraySize(tmp2)>1){
                                    aVarList[tSize][2]=fStrTrim(tmp2[1]);
                                       if(tType=="bool"){
                                          if(aVarList[tSize][2]=="FALSE"){
                                             aVarList[tSize][2]="false";
                                          }
                                          if(aVarList[tSize][2]=="TRUE"){
                                             aVarList[tSize][2]="true";
                                          }                                          
                                       }
                                 }
                                 else{
                                    aVarList[tSize][2]=tDefVal;
                                 }
                              }
                           tSize++;   
                        }                        
                     

                  }

               }
         }
   FileClose(th);         
   FileDelete("tmp.tmp"); 
   return(true);           
}

string fReplaceStrContent(string aString,string & aArray[]){
   ArrayResize(aArray,0);
   int tQuteCounter=0;
   int tStart;
   int tEnd;
   string tStr=""; 
      for(int ti=0;ti<StringLen(aString);ti++){
         string tChar=StringSubstr(aString,ti,1);
               if(tChar=="\""){
                     if(tQuteCounter==0){
                        tStart=ti+1;
                     }
                     if(StringSubstr(aString,ti-1,1)!="\\"){
                        tQuteCounter++;
                           if(tQuteCounter==2){
                              tEnd=ti;
                              tQuteCounter=0;
                              tStr=tStr+"x";
                              ArrayResize(aArray,ArraySize(aArray)+1);
                                 if(tEnd-tStart==0){
                                    aArray[ArraySize(aArray)-1]="";
                                 }
                                 else{
                                    aArray[ArraySize(aArray)-1]=StringSubstr(aString,tStart,tEnd-tStart);
                                 }
                           }
                     }
                  continue;
               } 
               if(tQuteCounter==0){
                  tStr=tStr+tChar;        
               }
      }
   return(tStr);
}

void fStrSplit(string aString,string & aArray[],string aDelimiter){
   int tCounter=0;
   int tDelimiterLength=StringLen(aDelimiter);
   ArrayResize(aArray,tCounter);
   int tPos1=0;
   int tPos2=StringFind(aString,aDelimiter,0);
      while(tPos2!=-1){
            if(tPos2>=tPos1){
               tCounter++;
               ArrayResize(aArray,tCounter);
                  if(tPos2-tPos1==0){
                     aArray[tCounter-1]="";
                  }
                  else{
                     aArray[tCounter-1]=StringSubstr(aString,tPos1,tPos2-tPos1);
                  }
            }
         tPos1=tPos2+tDelimiterLength;
         tPos2=StringFind(aString,aDelimiter,tPos1);
      }
   tPos2=StringLen(aString);      
      if(tPos2>=tPos1){
         tCounter++;   
         ArrayResize(aArray,tCounter);
            if(tPos2-tPos1==0){
               aArray[tCounter-1]="";
            }
            else{
               aArray[tCounter-1]=StringSubstr(aString,tPos1,tPos2-tPos1);      
            }
      }
}

string fStrTrim(string aString){
   return(StringTrimLeft(StringTrimRight(aString)));
}



Sample





Analysis



Market Information Used:



Indicator Curves created:


Indicators Used:



Custom Indicators Used:
kernel32

Order Management characteristics:
Checks for the total of closed orders

Other Features:

It issuies visual alerts to the screen
Uses files from the file system
It writes information to file
It reads information from a file