//+------------------------------------------------------------------+
//| 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)));
}
Comments