//+------------------------------------------------------------------+ //| data.mqh | //| Rafael Morgado Silva | //| | //+------------------------------------------------------------------+ #property copyright "Rafael Morgado Silva" class DataArray { public: MqlDateTime today; int positions; double closesymbolref,equity,balance,floatprofit,invested,volbuy,volsell,profitbuy,profitsell,effbuy,effsell; DataArray(void) { positions=0; closesymbolref=0; equity=0; balance=0; floatprofit=0; invested=0; volbuy=0; volsell=0; profitbuy=0; profitsell=0; effbuy=0; effsell=0; } }; class DataAquisition { string StructToString(MqlDateTime &today) { return(IntegerToString(today.year)+"-"+IntegerToString(today.mon)+"-"+IntegerToString(today.day)+" "+ IntegerToString(today.hour)+":"+IntegerToString(today.min)+":"+IntegerToString(today.sec)); } // string FormatDouble(double number,int digits=2) // { // string numberstr=DoubleToString(number,digits); // int pos=StringFind(numberstr,"."); // if (pos>=0) StringSetCharacter(numberstr,StringFind(numberstr,"."),StringGetCharacter(",",0)); // return(numberstr); // } double calc_volumes(bool type) { MqlDateTime thisday; TimeLocal(thisday); thisday.hour=0; thisday.min=0; thisday.sec=0; datetime today=StructToTime(thisday); HistorySelect(today,TimeLocal()); int total=HistoryDealsTotal(); double varday=0; for (int i=0;i0)?"cyan":"pink")+"}"+DoubleToString(yearlyrets[year-yearini],2)+"\\%"); FileClose(dataoutput); } void SaveTable1b(int yearini,int yearend,double &yearlyrets[],double &yearlyvols[]) { int dataoutput=FileOpen("reporttable1b.csv",FILE_WRITE|FILE_COMMON|FILE_CSV|FILE_ANSI,';',CP_UTF8); double avg=0,sigma=0,sharpe=0,posyears=0,negyears=0,avgvol=0; double count=0; for (int year=yearini;year<=yearend;year++) { avg+=yearlyrets[year-yearini]; sigma+=yearlyrets[year-yearini]*yearlyrets[year-yearini]; if (yearlyrets[year-yearini]>0)posyears++; else negyears++; avgvol+=yearlyvols[year-yearini]; count++; } avg/=(double)count; sigma=((count>1)?sqrt((sigma-count*avg*avg)/(count-1)):sqrt((sigma-count*avg*avg)/count));//desvio padrão da amostra sharpe=avg/sigma; posyears/=(double)count; negyears/=(double)count; avgvol/=(double)count; //avgvol=(ReportData[0].equity!=0)?100*(avgvol/ReportData[0].equity):0; avgvol=avgvol/(double)1000; FileWrite(dataoutput,"Avg",DoubleToString(avg,2)+"\\%"); FileWrite(dataoutput,"Ann avg",DoubleToString(avg,2)+"\\%"); FileWrite(dataoutput,"Ann \\sigma",DoubleToString(sigma,2)+"\\%"); FileWrite(dataoutput,"Sharpe",DoubleToString(sharpe,2)); FileWrite(dataoutput,"Pos years",DoubleToString(100*posyears,2)+"\\%"); FileWrite(dataoutput,"Neg years",DoubleToString(100*negyears,2)+"\\%"); FileWrite(dataoutput,"Avg volume",DoubleToString(avgvol,2)+"k"); FileClose(dataoutput); } void SaveTable2a(int yearini,int yearend,double &monthlyrets[],double &monthlyvols[]) { int dataoutput=FileOpen("reporttable2a.csv",FILE_WRITE|FILE_COMMON|FILE_CSV|FILE_ANSI,';',CP_UTF8); int nyears=yearend-yearini+1; int size=ArraySize(ReportData); ArrayResize(monthlyrets,12*nyears); ArrayFill(monthlyrets,0,12*nyears,0); ArrayResize(monthlyvols,12*nyears); ArrayFill(monthlyvols,0,12*nyears,0); for (int month=1;month<=12;month++) for (int year=yearini;year<=yearend;year++) for (int i=0;i0)?"cyan":"pink")+"}"+DoubleToString(monthlyrets[month-1+12*(year-yearini)],2)+"\\%"); FileWriteString(dataoutput," \n"); } FileClose(dataoutput); } void SaveTable2b(int yearini,int yearend,double &monthlyrets[],double &monthlyvols[]) { int dataoutput=FileOpen("reporttable2b.csv",FILE_WRITE|FILE_COMMON|FILE_CSV|FILE_ANSI,';',CP_UTF8); double avg=0,sigma=0,sharpe=0,posyears=0,negyears=0,avgvol=0; double count=0; for (int month=1;month<=12;month++) for (int year=yearini;year<=yearend;year++) { avg+=monthlyrets[month-1+12*(year-yearini)]; sigma+=monthlyrets[month-1+12*(year-yearini)]*monthlyrets[month-1+12*(year-yearini)]; if (monthlyrets[month-1+12*(year-yearini)]>0)posyears++; else negyears++; avgvol+=monthlyvols[month-1+12*(year-yearini)]; count++; } avg/=(double)count; sigma=((count>1)?sqrt((sigma-count*avg*avg)/(count-1)):sqrt((sigma-count*avg*avg)/count));//desvio padrão da amostra sharpe=(pow(avg/100+1,12)-1)/(sqrt(12)*sigma/100); posyears/=(double)count; negyears/=(double)count; avgvol/=(double)count; // avgvol=(ReportData[0].equity!=0)?100*(avgvol/ReportData[0].equity):0; avgvol=avgvol/(double)1000; FileWrite(dataoutput,"Avg",DoubleToString(avg,2)+"\\%"); FileWrite(dataoutput,"Ann avg",DoubleToString(100*(pow(avg/100+1,12)-1),2)+"\\%"); FileWrite(dataoutput,"Ann \\sigma",DoubleToString(sqrt(12)*sigma,2)+"\\%"); FileWrite(dataoutput,"Sharpe",DoubleToString(sharpe,2)); FileWrite(dataoutput,"Pos months",DoubleToString(100*posyears,2)+"\\%"); FileWrite(dataoutput,"Neg months",DoubleToString(100*negyears,2)+"\\%"); FileWrite(dataoutput,"Avg volume",DoubleToString(avgvol,2)+"k"); FileClose(dataoutput); } void SaveTable3() { int size=ArraySize(ReportData); int dataoutput=FileOpen("reporttable3a.csv",FILE_WRITE|FILE_COMMON|FILE_CSV|FILE_ANSI,';',CP_UTF8); double avg=0,sigma=0,sharpe=0,posyears=0,negyears=0,avgvol=0; double count=0; double avgbprofit=0,avgsprofit=0,buyeff=0,selleff=0,avgprofit=0,avgeff=0; for (int i=1;i0) posyears++; else if (returns<0) negyears++; avgvol+=ReportData[i].volbuy+ReportData[i].volsell; count++; avgbprofit+=ReportData[i].profitbuy; avgsprofit+=ReportData[i].profitsell; buyeff+=ReportData[i].effbuy; selleff+=ReportData[i].effsell; } avg/=(double)count; sigma=((count>1)?sqrt((sigma-count*avg*avg)/(count-1)):sqrt((sigma-count*avg*avg)/count));//desvio padrão da amostra sharpe=(pow(avg/100+1,252)-1)/(sqrt(252)*sigma/100); posyears/=(double)count; negyears/=(double)count; avgvol/=(double)count; avgbprofit/=(double)count; avgsprofit/=(double)count; buyeff/=(double)count; selleff/=(double)count; avgprofit=avgbprofit+avgsprofit; avgeff=(avgvol!=0)?(100*avgprofit/avgvol):0; //avgvol=(ReportData[0].equity!=0)?100*(avgvol/ReportData[0].equity):0; avgvol=avgvol/(double)1000; FileWrite(dataoutput,"Avg",DoubleToString(avg,2)+"\\%"); FileWrite(dataoutput,"Ann avg",DoubleToString(100*(pow(avg/100+1,252)-1),2)+"\\%"); FileWrite(dataoutput,"Ann \\sigma",DoubleToString(sqrt(252)*sigma,2)+"\\%"); FileWrite(dataoutput,"Sharpe",DoubleToString(sharpe,2)); FileWrite(dataoutput,"Pos days",DoubleToString(100*posyears,2)+"\\%"); FileWrite(dataoutput,"Neg days",DoubleToString(100*negyears,2)+"\\%"); FileWrite(dataoutput,"Avg volume",DoubleToString(avgvol,2)+"k"); FileClose(dataoutput); dataoutput=FileOpen("reporttable3b.csv",FILE_WRITE|FILE_COMMON|FILE_CSV|FILE_ANSI,';',CP_UTF8); //avgbprofit=(ReportData[0].equity!=0)?100*(avgbprofit/ReportData[0].equity):0; //avgsprofit=(ReportData[0].equity!=0)?100*(avgsprofit/ReportData[0].equity):0; //avgprofit=(ReportData[0].equity!=0)?100*(avgprofit/ReportData[0].equity):0; FileWrite(dataoutput,"Avg buy profit",DoubleToString(avgbprofit,2)+""); FileWrite(dataoutput,"Avg sell profit",DoubleToString(avgsprofit,2)+""); FileWrite(dataoutput,"Buy efficiency",DoubleToString(buyeff,2)+"\\%"); FileWrite(dataoutput,"Sell efficiency",DoubleToString(selleff,2)+"\\%"); FileWrite(dataoutput,"Avg profit",DoubleToString(avgprofit,2)+""); FileWrite(dataoutput,"Avg efficiency",DoubleToString(avgeff,2)+"\\%"); FileClose(dataoutput); } void ArrayToFile(string myname="") { int size=ArraySize(ReportData); MqlDateTime tini=ReportData[0].today,tend=ReportData[size-1].today; double yearlyrets[],yearlyvols[]; double monthlyrets[],monthlyvols[]; SaveProcessedData(myname+DataFname); SaveSymbol(); SaveTable1a(tini.year,tend.year,yearlyrets,yearlyvols); SaveTable1b(tini.year,tend.year,yearlyrets,yearlyvols); SaveTable2a(tini.year,tend.year,monthlyrets,monthlyvols); SaveTable2b(tini.year,tend.year,monthlyrets,monthlyvols); SaveTable3(); } void FileToFile(string myname="")//rotina usada exclusivamente no report diário { int datainput=FileOpen(myname+DataFname,FILE_READ|FILE_CSV|FILE_ANSI,';',CP_UTF8);//report diário, diretorio de dados int i=0; ArrayResize(ReportData,0,10000); MyPrint("Processing "+myname+DataFname); while(!FileIsEnding(datainput)) { if (i==0)//Header { FileReadDatetime(datainput); FileReadNumber(datainput); FileReadNumber(datainput); FileReadNumber(datainput); FileReadNumber(datainput); FileReadNumber(datainput); FileReadNumber(datainput); FileReadNumber(datainput); FileReadNumber(datainput); FileReadNumber(datainput); FileReadNumber(datainput); FileReadNumber(datainput); FileReadNumber(datainput); } else { ArrayResize(ReportData,i,10000); TimeToStruct(FileReadDatetime(datainput),ReportData[i-1].today); ReportData[i-1].closesymbolref=FileReadNumber(datainput); ReportData[i-1].equity=FileReadNumber(datainput); ReportData[i-1].balance=FileReadNumber(datainput); ReportData[i-1].floatprofit=FileReadNumber(datainput); ReportData[i-1].positions=(int)FileReadNumber(datainput); ReportData[i-1].invested=FileReadNumber(datainput); ReportData[i-1].volbuy=FileReadNumber(datainput); ReportData[i-1].volsell=FileReadNumber(datainput); ReportData[i-1].profitbuy=FileReadNumber(datainput); ReportData[i-1].profitsell=FileReadNumber(datainput); ReportData[i-1].effbuy=FileReadNumber(datainput); ReportData[i-1].effsell=FileReadNumber(datainput); //Print(i," ",ReportData[i].closesymbolref," ",ReportData[i].equity); } i++; } FileClose(datainput); SaveProcessedData(myname+"-dailyreport.csv"); } };