//+------------------------------------------------------------------+ //| Tester2Graph.mq4 | //| Copyright © 2010, FXMaster.de | //| код - Сергеев Алексей (profy.mql@gmail.com) | //+------------------------------------------------------------------+ #property copyright "Copyright © 2010, FXMaster.de" #property link "profy.mql@gmail.com | Сергеев Алексей" //+------ ИНСТРУКЦИЯ -------------------------------------------------------------------------+ //| 1. Скопируйте отчет тестера из Html в Excel | //| - копируйте только данные таблицы (без шапки таблицы) | //| - затем сохраните файл в формате CSV | //| 2. Положите получившийся файла папку /experts/files | //| 3. В параметрах индикатора укажите в поле File имя вашего получившегося файла | //| 4. Если вы хотите видеть на графике линии сделок, то поставьте ShowDeal=true | //| 5. Индикатор вычисляет свои данные только при инициализации (чтоб не тормозить компьютер) | //+-------------------------------------------------------------------------------------------+ #property indicator_separate_window #property indicator_buffers 2 #property indicator_color1 LimeGreen #property indicator_color2 Red #property indicator_style1 STYLE_SOLID #property indicator_style2 STYLE_DOT #property indicator_width1 2 #property indicator_width2 1 extern string File="file.csv"; // имя файла-отчета extern double StartDepo=10000; // стартовый баланс (для правильного отображения конечной прибыли) extern int HourShift=0; // смещение часового пояса (для синхронизации вашего брокера и брокера из отчета) extern double Pnt=0.1; // множитель для пятизнаков (для вычисления правильной прибыли) extern bool ShowDeal=true; // надо ли показывать линии сделок на графике double B0[], E0[]; bool first; //------------------------------------------------------- init int init() { first=true; int i; i=0; SetIndexBuffer(i, B0); SetLevelValue(i, StartDepo); SetIndexStyle(i, DRAW_LINE); SetIndexLabel(i, "Balance "+File); i++; SetIndexBuffer(i, E0); SetIndexStyle(i, DRAW_LINE); SetIndexLabel(i, "Equity "+File); return(0); } //------------------------------------------------------- start int start() { if (!first) return; // если уже вычисляли, то выходим first=false; int f, i, bar, h, j, max=0, min=-1; datetime dt; double val, dprof, tp, sl, dlot; string sn, stype, stick, slot, ssl, stp, spr, sdt, sval, sprof; double type[], lot[], op[], cl[], prof[], opT[], clT[], opP[], clP[]; ArrayResize(lot, Bars+1); ArrayResize(op, Bars+1); ArrayResize(cl, Bars+1); ArrayResize(prof, Bars+1); ArrayResize(type, 10000); ArrayResize(opT, 10000); ArrayResize(clT, 10000); ArrayResize(opP, 10000); ArrayResize(clP, 10000); ArraySetAsSeries(lot, true); ArraySetAsSeries(op, true); ArraySetAsSeries(cl, true); ArraySetAsSeries(prof, true); ArrayInitialize(B0, EMPTY_VALUE); ArrayInitialize(E0, EMPTY_VALUE); h=FileOpen(File, FILE_READ|FILE_CSV, ';'); if (h<=0) return; ArrayInitialize(lot, 0); ArrayInitialize(op, -1); ArrayInitialize(cl, -1); ArrayInitialize(prof, 0); ArrayInitialize(type, 0); ArrayInitialize(opT, 0); ArrayInitialize(clT, 0); ArrayInitialize(opP, 0); ArrayInitialize(clP, 0); while (!FileIsEnding(h)) { sn=FileReadString(h); i=StrToInteger(sn);// номер if (FileIsEnding(h)) break; sdt=FileReadString(h); dt=StrToTime(sdt); bar=iBarShift(Symbol(), Period(), dt); // дата/бар if (sdt=="") break; if (maxbar || min<0) min=bar; stype=FileReadString(h); // тип buy/sell/close/ t/p / s/l stick=FileReadString(h); // тикет slot=FileReadString(h); // объем spr=FileReadString(h); // цена операции stp=FileReadString(h); // уровень ТП ssl=FileReadString(h); // уровень СЛ sprof=FileReadString(h); // прибыль sval=FileReadString(h); val=StrToDouble(Clear(sval)); // баланс счета while (!FileIsLineEnding(h)) sval=FileReadString(h); i=StrToInteger(stick); cl[bar]=Close[bar]; tp=StrToDouble(stp); sl=StrToDouble(ssl); if (stype=="buy" || stype=="sell") { type[i]=IIF(stype=="buy", 1, -1); dlot=StrToDouble(slot); op[bar]=StrToDouble(spr); opP[i]=op[bar]; opT[i]=dt+HourShift*60*60; for (j=bar; j>=0; j--) { lot[j]=lot[j]+dlot*type[i]; op[j]=op[bar]; } if (ShowDeal) { SetArrow("open"+i, opT[i], opP[i], IIF(type[i]>0, Blue, Red), 1, 0, "open #"+i+" @"+TTS(opT[i])+" | op="+DTS(opP[i])+" t/p="+DTS(tp)+" s/l="+DTS(sl)+" lot="+DTS(dlot)); if (tp>0) SetArrow("t/p"+i, opT[i], tp, IIF(type[i]>0, Blue, Red), 4, 0, "t/p #"+i+" ="+DTS(tp)); if (sl>0) SetArrow("s/l"+i, opT[i], sl, IIF(type[i]>0, Blue, Red), 4, 0, "s/l #"+i+" ="+DTS(sl)); } } if (stype=="close" || stype=="t/p" || stype=="s/l") { dlot=type[i]*StrToDouble(slot); cl[bar]=StrToDouble(spr); clP[i]=cl[bar]; clT[i]=dt+HourShift*60*60; for (j=bar; j>=0; j--) lot[j]=lot[j]-dlot; dprof=(clP[i]-opP[i])/(Point*Pnt); dprof*=dlot; for (j=bar; j>=0; j--) prof[j]=prof[j]+dprof; if (ShowDeal) { SetArrow("close"+i, clT[i], clP[i], IIF(type[i]>0, Blue, Red), 3, 0, "close #"+i+" @"+TTS(clT[i])+" | op="+DTS(opP[i])+" t/p="+DTS(tp)+" s/l="+DTS(sl)+" lot="+DTS(dlot)); SetLine("line"+i, opT[i], opP[i], clT[i], clP[i], IIF(type[i]>0, Blue, Red), 1, STYLE_DOT, ""); } } } FileClose(h); for(i=Bars-2; i>=0; i--) if (cl[i]<0) { cl[i]=Close[i]; op[i]=op[i+1]; lot[i]=lot[i+1]; } for(i=max; i>=min; i--) // баланс { val=(cl[i]-op[i])/(Point*Pnt); val*=lot[i]; val+=prof[i]; B0[i]=prof[i]; E0[i]=val; } for (i=min; i<=max; i++) { if (B0[i]!=EMPTY_VALUE) B0[i]+=StartDepo; if (E0[i]!=EMPTY_VALUE) E0[i]+=StartDepo; } return(0); } //------------------------------------------------------- Clear string Clear(string st) { int i, n=StringLen(st); string st0=""; for (i=0; i