#property copyright "Viatcheslav Suvorov" #property link "slava_suvorov@list.ru" #property show_inputs #define arraysize 193 string reportname = "StrategyTester.htm"; string MTpath = "D:\Program Files\MetaTrader - North Finance"; int price=PRICE_CLOSE; //int barsbehinde=96; //int barsafter=96; double bestprofit=0.3; double bestloss=0.3; int Hour_shift=0; #include <WinUser32.mqh> #import "mt4excel.dll" bool ExcelOpenFile(string FileName);//Îòêðûâàåò ôàéë Excel bool ExcelClose();//Çàêðûâàåò Excel bool ExcelSetFormula(string Value);//Çàïèñàòü ôîðìóëó â ÿ÷åéêó bool ExcelSetRange(string Range);//Çàïîìíèòü äèàïàçîí bool ExcelSetValueCell(int X,int Y,double Value);//Çàïèñàòü ÷èñëî â ÿ÷åéêó bool ExcelSetTextCell(int X,int Y,string Value);//Çàïèñàòü òåêñò â ÿ÷åéêó bool ExcelSetDiagramma(int TypeD,string Title,string XRange,string YRange,int Left,int Top,int Riht,int Bottom);//Äîáàâëÿåò äèàãðàìó string ExcelGetLastErrorText();//Òåêñò ïîñëåäíåé îøèáêè Excel #import string results[0][9]; string StringCutAndPaste(string source, string cut, string paste){ int p=StringFind(source,cut,0); if (p==-1) return(source); return(StringSubstr(source,0,p)+paste+StringSubstr(source,p+StringLen(cut))); }//StringCutAndPaste string IntToA1(int c){ switch(c){ case 1: return("A"); break; case 2: return("B"); break; case 3: return("C"); break; case 4: return("D"); break; case 5: return("E"); break; case 6: return("F"); break; case 7: return("G"); break; case 8: return("H"); break; case 9: return("I"); break; case 10: return("J"); break; case 11: return("K"); break; case 12: return("L"); break; case 13: return("M"); break; case 14: return("N"); break; case 15: return("O"); break; case 16: return("P"); break; case 17: return("Q"); break; case 18: return("R"); break; case 19: return("S"); break; case 20: return("T"); break; case 21: return("U"); break; case 22: return("V"); break; case 23: return("W"); break; case 24: return("X"); break; case 25: return("Y"); break; case 26: return("Z"); break; }//switch }//IntToA1 string R1C1toA1(string r1c1){ int p=StringFind(r1c1,"C",0); if (p==-1) return("error"); string c1=StringSubstr(r1c1,p+1); string r1=StringSubstr(r1c1,1,p-1); int c1int=StrToDouble(c1); int c11=MathFloor(c1int/27); int c12=c1int-c11*27; if (c11>0) c12++; return(IntToA1(c11)+IntToA1(c12)+r1); }//R1C1toA1 bool WriteStatisticToFile(int h,double data[][]){ int arrpos=ArrayRange(data,0); int barsbehinde=(arraysize-1)/2; int barsafter=(arraysize-1)-barsbehinde; FileWriteString(h,"Âðåìÿ(ìèí);",StringLen("Âðåìÿ(ìèí);")); if (arrpos>0) for (int kk=0;kk<arraysize;kk++){ string txt=DoubleToStr((kk-barsbehinde)*Period(),0)+";"; txt=StringCutAndPaste(txt,".",","); FileWriteString(h,txt, StringLen(txt)); }//for FileWriteString(h,"\r\n", StringLen("\r\n")); FileWriteString(h,"Ñðåäíÿÿ(ïóíêòû);",StringLen("Ñðåäíÿÿ(ïóíêòû);")); double mo[arraysize]; for (int jj=0;jj<arrpos;jj++) for (kk=0;kk<arraysize;kk++) mo[kk]=mo[kk]+data[jj,kk]; if (arrpos>0) for (kk=0;kk<arraysize;kk++){ mo[kk]=mo[kk]/arrpos; txt=DoubleToStr(mo[kk],2)+";"; txt=StringCutAndPaste(txt,".",","); FileWriteString(h,txt, StringLen(txt)); }//for FileWriteString(h,"\r\n", StringLen("\r\n")); FileWriteString(h,"ÑÊÎ;",StringLen("ÑÊÎ;")); double sko[arraysize]; for (jj=0;jj<arrpos;jj++) for (kk=0;kk<arraysize;kk++) sko[kk]=sko[kk]+MathSqrt(MathPow(data[jj,kk]-mo[kk],2)); if (arrpos>0) for (kk=0;kk<arraysize;kk++){ sko[kk]=sko[kk]/arrpos; txt=DoubleToStr(sko[kk],2)+";"; txt=StringCutAndPaste(txt,".",","); FileWriteString(h,txt, StringLen(txt)); }//for FileWriteString(h,"\r\n", StringLen("\r\n")); double sko1[arraysize]; double sko1count[arraysize]; for (jj=0;jj<arrpos;jj++) for (kk=0;kk<arraysize;kk++) if (data[jj,kk]>=mo[kk]){ sko1count[kk]++; sko1[kk]=sko1[kk]+MathSqrt(MathPow(data[jj,kk]-mo[kk],2)); }//if if (arrpos>0) for (kk=0;kk<arraysize;kk++) if (sko1count[kk]>0) sko1[kk]=sko1[kk]/sko1count[kk]; else sko1[kk]=0; double sko2[arraysize]; double sko2count[arraysize]; for (jj=0;jj<arrpos;jj++) for (kk=0;kk<arraysize;kk++) if (data[jj,kk]<mo[kk]){ sko2count[kk]++; sko2[kk]=sko2[kk]+MathSqrt(MathPow(data[jj,kk]-mo[kk],2)); }//if if (arrpos>0) for (kk=0;kk<arraysize;kk++) if (sko2count[kk]>0) sko2[kk]=sko2[kk]/sko2count[kk]; else sko2[kk]=0; FileWriteString(h,"Âåðõíÿÿ ãðàíèöà;",StringLen("Âåðõíÿÿ ãðàíèöà;")); if (arrpos>0) for (kk=0;kk<arraysize;kk++){ txt=DoubleToStr(mo[kk]+3*sko1[kk],2)+";"; txt=StringCutAndPaste(txt,".",","); FileWriteString(h,txt, StringLen(txt)); }//for FileWriteString(h,"\r\n", StringLen("\r\n")); FileWriteString(h,"Íèæíÿÿ ãðàíèöà;",StringLen("Íèæíÿÿ ãðàíèöà;")); if (arrpos>0) for (kk=0;kk<arraysize;kk++){ txt=DoubleToStr(mo[kk]-3*sko2[kk],2)+";"; txt=StringCutAndPaste(txt,".",","); FileWriteString(h,txt, StringLen(txt)); }//for FileWriteString(h,"\r\n", StringLen("\r\n")); }//WriteStatisticToFile double Profit(int num){ for(int all=0;all<ArraySize(results);all++){ //check all entry of one trade int curnum=StrToDouble(results[all][3]); if(results[all][2]=="s/l" || results[all][2]=="t/p" || results[all][2]=="close" || results[all][2]=="close at stop") if (curnum==num) { // Print(results[all][8]); return(StrToDouble(results[all][8])); } }//for }//Profit void start() { int barsbehinde=(arraysize-1)/2; int barsafter=(arraysize-1)-barsbehinde; double short[][arraysize]; double long[][arraysize]; bool FlagCont=true; string var,piece,value; int row,begin,end,cnt,cntOrders,all; double orders[]; double stoploss,takeprofit; string description,lots; string ticket; string opentime; string type; double openprice; string closetime; double closeprice; int count=0; string name; int handle=FileOpen(reportname,FILE_READ,0x7F); if(handle<0) { Alert("File "+reportname+" does not exist !"); return; } FileSeek(handle,0,SEEK_SET); int handle1=FileOpen("enrypoints.csv",FILE_BIN|FILE_WRITE); if(handle1<1) { Print("Íå óäàåòñÿ ñîçäàòü ôàéë enrypoints.csv ïîñëåäíÿÿ îøèáêà ", GetLastError()); return(false); } while(FlagCont) { var=FileReadString(handle); piece=StringSubstr(var,29,6); if(piece=="Symbol") { piece=StringSubstr(var,54,6); if(piece!=Symbol()) { Alert("Strategy was testing on ",piece," chart. It is not possible to draw results to ",Symbol()," chart !"); return; } } piece=StringSubstr(var,0,11); if(piece=="<tr bgcolor") FlagCont=false; } while(FileIsEnding(handle)==false) { while (FileIsLineEnding(handle)) { ArrayResize(results,row+1); var=FileReadString(handle); if(var=="") break; begin=StringFind(var, "<td>",0)+4; //Position of action end=StringFind(var, "</td>",begin); //Find the end of position value = StringSubstr(var, begin, end-begin); //Read the value results[row][0]= value; //number of action //----------------- begin=StringFind(var, "date>",end)+5; //Find the beginning of the position end=StringFind(var, "</td>",begin); //Find the end of position value = StringSubstr(var, begin, end-begin); //Read the value results[row][1]= value; //time of action //----------------- begin=StringFind(var, "<td>",end)+4; //Find the beginning of the position end=StringFind(var, "</td>",begin); //Find the end of position value = StringSubstr(var, begin, end-begin); //Read the value results[row][2]= value; //type of action //----------------- begin=StringFind(var, "<td>",end)+4; //Find the beginning of the position end=StringFind(var, "</td>",begin); //Find the end of position value = StringSubstr(var, begin, end-begin); //Read the value results[row][3]= value; //order's number //----------------- begin=StringFind(var, "mspt>",end)+5; //Find the beginning of the position end=StringFind(var, "</td>",begin); //Find the end of position value = StringSubstr(var, begin, end-begin); //Read the value results[row][4]= value; //lot size //----------------- if(Digits==4) begin=StringFind(var, "0\.0000;",end)+10; //Find the beginning of the position else begin=StringFind(var, "0\.00;",end)+8; end=StringFind(var, "</td>",begin); //Find the end of position value = StringSubstr(var, begin, end-begin); //Read the value results[row][5]= value; //open price //----------------- begin=StringFind(var, "right>",end)+6; //Find the beginning of the position end=StringFind(var, "</td>",begin); //Find the end of position value = StringSubstr(var, begin, end-begin); //Read the value results[row][6]= value; //stoploss //----------------- begin=StringFind(var, "right>",end)+6; //Find the beginning of the position end=StringFind(var, "</td>",begin); //Find the end of position value = StringSubstr(var, begin, end-begin); //Read the value results[row][7]= value; //take profit //----------------- begin=StringFind(var, "mspt>",end)+5; //Find the beginning of the position end=StringFind(var, "</td>",begin); //Find the end of position value = StringSubstr(var, begin, end-begin); //Read the value results[row][8]= value; //profit size row++; } break; } Comment("First trade opened - ",results[0][1], " last trade closed - ",results[row-1][1]); for(cnt=1;cnt<=row;cnt++) { ArrayResize(orders,cnt); orders[cnt-1]=StrToInteger(results[cnt-1][3]); } cntOrders=orders[ArrayMaximum(orders)]; int totalShort; FileWriteString(handle1,"Âñå Long\r\n", StringLen("Âñå Long\r\n")); for(cnt=1;cnt<=cntOrders;cnt++) // check all trades { for(all=0;all<ArraySize(results);all++) //check all entry of one trade { if(cnt!=StrToInteger(results[all][3])) continue; if(results[all][2]=="buy") { type=results[all][2]; opentime=results[all][1]; lots=results[all][4]; openprice=StrToDouble(results[all][5]); ticket=cnt; stoploss=StrToDouble(results[all][6]); takeprofit=StrToDouble(results[all][7]); description=StringConcatenate("#",ticket," lots:",lots," time:",opentime," SL:",results[all][6]," TP:",results[all][7]); name="Open trade - Object Nr. "+DoubleToStr(count,0); count++; int position=iBarShift(NULL,0,StrToTime(opentime)+Hour_shift*3600); int startcykle=position+barsbehinde; int endcykle=position-barsafter; totalShort++; int arrpos=totalShort; ArrayResize(long,arrpos+1); for (int jj=startcykle;jj>=endcykle;jj--) if (jj==position) // FileWriteString(handle1, "0;", 2); long[arrpos,jj-startcykle]=0; else { int val=(iOpen(NULL,0,jj)-openprice)/Point; long[arrpos,startcykle-jj]=val; }//if } /* if(results[all][2]=="s/l" || results[all][2]=="t/p" || results[all][2]=="close" || results[all][2]=="close at stop") { closetime=results[all][1]; closeprice=StrToDouble(results[all][5]); name="Close trade - Object Nr. "+DoubleToStr(count,0); count++; ObjectCreate(name, OBJ_ARROW, 0, StrToTime(closetime)+Hour_shift*3600, closeprice); ObjectSet(name, OBJPROP_ARROWCODE, 242); if(type=="buy")ObjectSet(name, OBJPROP_COLOR, Aqua); else ObjectSet(name, OBJPROP_COLOR, Tomato); ObjectSetText(name, description,10,"Arial", Blue); name="Connection - Object Nr. "+DoubleToStr(count,0); count++; ObjectCreate(name, OBJ_TREND, 0, StrToTime(opentime)+Hour_shift*3600, openprice,StrToTime(closetime), closeprice); ObjectSet(name, OBJPROP_RAY, false); ObjectSet(name, OBJPROP_STYLE, STYLE_DOT); if(type=="buy")ObjectSet(name, OBJPROP_COLOR, Aqua); else ObjectSet(name, OBJPROP_COLOR, Tomato); ObjectSetText(name, StringConcatenate("#",ticket," ",openprice," --> ",closeprice),10,"Arial", Blue); } if(results[all][2]=="modify") { name="Modify SL - Object Nr. "+DoubleToStr(count,0); count++; ObjectCreate(name, OBJ_TREND, 0, StrToTime(opentime)+Hour_shift*3600, StrToDouble(results[all][6]),StrToTime(opentime)+Period()*60, StrToDouble(results[all][6])); ObjectSet(name, OBJPROP_RAY, false); ObjectSet(name, OBJPROP_STYLE, STYLE_SOLID); if(type=="buy")ObjectSet(name, OBJPROP_COLOR, Teal); else ObjectSet(name, OBJPROP_COLOR, YellowGreen); ObjectSetText(name, StringConcatenate("#",ticket," modify SL"),10,"Arial", Blue); name="Modify TP- Object Nr. "+DoubleToStr(count,0); count++; ObjectCreate(name, OBJ_TREND, 0, StrToTime(opentime)+Hour_shift*3600, StrToDouble(results[all][7]),StrToTime(opentime)+Period()*60, StrToDouble(results[all][7])); ObjectSet(name, OBJPROP_RAY, false); ObjectSet(name, OBJPROP_STYLE, STYLE_SOLID); if(type=="buy")ObjectSet(name, OBJPROP_COLOR, OrangeRed); else ObjectSet(name, OBJPROP_COLOR, Peru); ObjectSetText(name, StringConcatenate("#",ticket," modify TP"),10,"Arial", Blue); } */ } // end -check all entry of one trade } //end - check all trades WriteStatisticToFile(handle1,long); int totalLong; FileWriteString(handle1,"Âñå Short\r\n", StringLen("Âñå Short\r\n")); for(cnt=1;cnt<=cntOrders;cnt++) // check all trades { for(all=0;all<ArraySize(results);all++) //check all entry of one trade { if(cnt!=StrToInteger(results[all][3])) continue; if(results[all][2]=="sell") { type=results[all][2]; opentime=results[all][1]; lots=results[all][4]; openprice=StrToDouble(results[all][5]); ticket=cnt; stoploss=StrToDouble(results[all][6]); takeprofit=StrToDouble(results[all][7]); description=StringConcatenate("#",ticket," lots:",lots," time:",opentime," SL:",results[all][6]," TP:",results[all][7]); name="Open trade - Object Nr. "+DoubleToStr(count,0); count++; position=iBarShift(NULL,0,StrToTime(opentime)+Hour_shift*3600); startcykle=position+barsbehinde; endcykle=position-barsafter; totalLong++; arrpos=totalLong; ArrayResize(short,arrpos+1); for (jj=startcykle;jj>=endcykle;jj--) if (jj==position) short[arrpos,jj-startcykle]=0; else { val=(iOpen(NULL,0,jj)-openprice)/Point; short[arrpos,startcykle-jj]=val; }//if }//if } // end -check all entry of one trade } //end - check all trades WriteStatisticToFile(handle1,short); totalShort=0; FileWriteString(handle1,"Ïðèáûëüíûå Long\r\n", StringLen("Ïðèáûëüíûå Long\r\n")); for(cnt=1;cnt<=cntOrders;cnt++) // check all trades { for(all=0;all<ArraySize(results);all++) //check all entry of one trade { if(cnt!=StrToInteger(results[all][3])) continue; //if(results[all][2]=="buy") Print("¹=",results[all][3]); if((results[all][2]=="buy") && (Profit(StrToDouble(results[all][3]))>0)) { type=results[all][2]; opentime=results[all][1]; lots=results[all][4]; openprice=StrToDouble(results[all][5]); ticket=cnt; stoploss=StrToDouble(results[all][6]); takeprofit=StrToDouble(results[all][7]); description=StringConcatenate("#",ticket," lots:",lots," time:",opentime," SL:",results[all][6]," TP:",results[all][7]); name="Open trade - Object Nr. "+DoubleToStr(count,0); count++; position=iBarShift(NULL,0,StrToTime(opentime)+Hour_shift*3600); startcykle=position+barsbehinde; endcykle=position-barsafter; totalShort++; arrpos=totalShort; ArrayResize(long,arrpos+1); for (jj=startcykle;jj>=endcykle;jj--) if (jj==position) long[arrpos,jj-startcykle]=0; else { val=(iOpen(NULL,0,jj)-openprice)/Point; long[arrpos,startcykle-jj]=val; }//if } } // end -check all entry of one trade } //end - check all trades WriteStatisticToFile(handle1,long); totalLong=0; FileWriteString(handle1,"Ïðèáûëüíûå Short\r\n", StringLen("Ïðèáûëüíûå Short\r\n")); for(cnt=1;cnt<=cntOrders;cnt++) // check all trades { for(all=0;all<ArraySize(results);all++) //check all entry of one trade { if(cnt!=StrToInteger(results[all][3])) continue; if((results[all][2]=="sell") && (Profit(StrToDouble(results[all][3]))>0)) { type=results[all][2]; opentime=results[all][1]; lots=results[all][4]; openprice=StrToDouble(results[all][5]); ticket=cnt; stoploss=StrToDouble(results[all][6]); takeprofit=StrToDouble(results[all][7]); description=StringConcatenate("#",ticket," lots:",lots," time:",opentime," SL:",results[all][6]," TP:",results[all][7]); name="Open trade - Object Nr. "+DoubleToStr(count,0); count++; position=iBarShift(NULL,0,StrToTime(opentime)+Hour_shift*3600); startcykle=position+barsbehinde; endcykle=position-barsafter; totalLong++; arrpos=totalLong; ArrayResize(short,arrpos+1); for (jj=startcykle;jj>=endcykle;jj--) if (jj==position) short[arrpos,jj-startcykle]=0; else { val=(iOpen(NULL,0,jj)-openprice)/Point; short[arrpos,startcykle-jj]=val; }//if }//if } // end -check all entry of one trade } //end - check all trades WriteStatisticToFile(handle1,short); totalShort=0; FileWriteString(handle1,"Óáûòî÷íûå Long\r\n", StringLen("Óáûòî÷íûå Long\r\n")); for(cnt=1;cnt<=cntOrders;cnt++) // check all trades { for(all=0;all<ArraySize(results);all++) //check all entry of one trade { if(cnt!=StrToInteger(results[all][3])) continue; if((results[all][2]=="buy") && (Profit(StrToDouble(results[all][3]))<0)) { type=results[all][2]; opentime=results[all][1]; lots=results[all][4]; openprice=StrToDouble(results[all][5]); ticket=cnt; stoploss=StrToDouble(results[all][6]); takeprofit=StrToDouble(results[all][7]); description=StringConcatenate("#",ticket," lots:",lots," time:",opentime," SL:",results[all][6]," TP:",results[all][7]); name="Open trade - Object Nr. "+DoubleToStr(count,0); count++; position=iBarShift(NULL,0,StrToTime(opentime)+Hour_shift*3600); startcykle=position+barsbehinde; endcykle=position-barsafter; totalShort++; arrpos=totalShort; ArrayResize(long,arrpos+1); for (jj=startcykle;jj>=endcykle;jj--) if (jj==position) long[arrpos,jj-startcykle]=0; else { val=(iOpen(NULL,0,jj)-openprice)/Point; long[arrpos,startcykle-jj]=val; }//if } } // end -check all entry of one trade } //end - check all trades WriteStatisticToFile(handle1,long); totalLong=0; FileWriteString(handle1,"Óáûòî÷íûå Short\r\n", StringLen("Óáûòî÷íûå Short\r\n")); for(cnt=1;cnt<=cntOrders;cnt++) // check all trades { for(all=0;all<ArraySize(results);all++) //check all entry of one trade { if(cnt!=StrToInteger(results[all][3])) continue; if((results[all][2]=="sell") && (Profit(StrToDouble(results[all][3]))<0)) { type=results[all][2]; opentime=results[all][1]; lots=results[all][4]; openprice=StrToDouble(results[all][5]); ticket=cnt; stoploss=StrToDouble(results[all][6]); takeprofit=StrToDouble(results[all][7]); description=StringConcatenate("#",ticket," lots:",lots," time:",opentime," SL:",results[all][6]," TP:",results[all][7]); name="Open trade - Object Nr. "+DoubleToStr(count,0); count++; position=iBarShift(NULL,0,StrToTime(opentime)+Hour_shift*3600); startcykle=position+barsbehinde; endcykle=position-barsafter; totalLong++; arrpos=totalLong; ArrayResize(short,arrpos+1); for (jj=startcykle;jj>=endcykle;jj--) if (jj==position) short[arrpos,jj-startcykle]=0; else { val=(iOpen(NULL,0,jj)-openprice)/Point; short[arrpos,startcykle-jj]=val; }//if }//if } // end -check all entry of one trade } //end - check all trades WriteStatisticToFile(handle1,short); FileClose(handle); FileClose(handle1); if (ExcelOpenFile(MTpath+"\experts\files\enrypoints.csv")) Print("Ócïåøíî îòêðûëè Excel"); else Print("Íå îòêðûâàåòñÿ Excel:",ExcelGetLastErrorText());//Îòêðûâàåì Excel ExcelSetDiagramma(88,"Òðåéäû ëîíã, ðàçâåðòêà ïî âðåìåíè",R1C1toA1("R2C2")+":"+R1C1toA1("R2C194"),R1C1toA1("R3C2")+":"+R1C1toA1("R3C194")+";"+R1C1toA1("R5C2")+":"+R1C1toA1("R6C194"),0,0,400,200); ExcelSetDiagramma(88,"Òðåéäû øîðò, ðàçâåðòêà ïî âðåìåíè",R1C1toA1("R8C2")+":"+R1C1toA1("R8C194"),R1C1toA1("R9C2")+":"+R1C1toA1("R9C194")+";"+R1C1toA1("R11C2")+":"+R1C1toA1("R12C194"),400,0,400,200); ExcelSetDiagramma(88,"Ïðèáûëüíûå òðåéäû ëîíã, ðàçâåðòêà ïî âðåìåíè",R1C1toA1("R14C2")+":"+R1C1toA1("R14C194"),R1C1toA1("R15C2")+":"+R1C1toA1("R15C194")+";"+R1C1toA1("R17C2")+":"+R1C1toA1("R18C194"),0,200,400,200); ExcelSetDiagramma(88,"Ïðèáûëüíûå òðåéäû øîðò, ðàçâåðòêà ïî âðåìåíè",R1C1toA1("R20C2")+":"+R1C1toA1("R20C194"),R1C1toA1("R21C2")+":"+R1C1toA1("R21C194")+";"+R1C1toA1("R23C2")+":"+R1C1toA1("R24C194"),400,200,400,200); ExcelSetDiagramma(88,"Óáûòî÷íûå òðåéäû ëîíã, ðàçâåðòêà ïî âðåìåíè",R1C1toA1("R26C2")+":"+R1C1toA1("R26C194"),R1C1toA1("R27C2")+":"+R1C1toA1("R27C194")+";"+R1C1toA1("R29C2")+":"+R1C1toA1("R30C194"),0,400,400,200); ExcelSetDiagramma(88,"Óáûòî÷íûå òðåéäû øîðò, ðàçâåðòêà ïî âðåìåíè",R1C1toA1("R32C2")+":"+R1C1toA1("R32C194"),R1C1toA1("R33C2")+":"+R1C1toA1("R33C194")+";"+R1C1toA1("R35C2")+":"+R1C1toA1("R36C194"),400,400,400,200); Print(ExcelGetLastErrorText()); }
Sample
Analysis
Market Information Used:
Series array that contains open prices of each bar
Indicator Curves created:
Indicators Used:
Custom Indicators Used:
mt4excel
Order Management characteristics:
Other Features:
It writes information to file
Uses files from the file system
It issuies visual alerts to the screen
It reads information from a file