//+------------------------------------------------------------------+ //| iBalans.mq4 | //+------------------------------------------------------------------+ #property copyright "Yurich" #property link "" //---- indicator settings #property indicator_separate_window #property indicator_buffers 3 #property indicator_color1 Green #property indicator_color2 Gold #property indicator_width1 2 #property indicator_width2 2 //---- indicator parameters extern int Days=0; extern bool Show_info=true; //---- indicator buffers double iB[]; double iS[]; double iT[]; //---- indicator var int wh; datetime prevtime; double prevbalans, midlevel, minlevel, maxlevel; #define names "iBalans_" //+------------------------------------------------------------------+ int init() { SetIndexBuffer(0,iB); SetIndexBuffer(1,iS); SetIndexBuffer(2,iT); SetIndexStyle(0,DRAW_LINE); SetIndexStyle(1,DRAW_LINE); SetIndexStyle(2,DRAW_NONE); IndicatorDigits(2); IndicatorShortName(names+"("+Days+")"); SetIndexLabel(0,"Total balans"); SetIndexLabel(1,NULL); SetIndexLabel(2,NULL); //---- prevbalans=0; midlevel=0; minlevel=0; maxlevel=0; if(Days<0) Days=0; return(0); } //+------------------------------------------------------------------+ int start() { int i, j=0, pt=0, lt=0, st=0, spt=0, slt=0; int htm[][2]; double cp, mnl, mxl; double sb=0.0, gp=0.0, gl=0.0, sgp=0.0, sgl=0.0; datetime now=iTime(NULL,0,0); if(now!=prevtime) { prevtime=now; prevbalans=0; } double sbalans=AccountBalance(); if(prevbalans==sbalans)return(0); prevbalans=sbalans; datetime stday=iTime(Symbol(), PERIOD_D1,0)-Days*PERIOD_D1*60; //---- int oht=OrdersHistoryTotal(); ArrayResize(htm,oht); for(i=0; i<oht; i++) if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) if(OrderType()<=OP_SELL && (OrderCloseTime()>stday || Days==0)) { htm[j][0]=OrderCloseTime(); htm[j][1]=OrderTicket(); j++; } ArrayResize(htm,j); ArraySort(htm); mxl=sbalans; mnl=sbalans; iB[0]=sbalans; for(i=1; i<=j; i++) { OrderSelect(htm[j-i][1],SELECT_BY_TICKET); cp=OrderProfit()+OrderCommission()+OrderSwap(); iB[i]=iB[i-1]-cp; if(cp>=0) { pt++; gp+=cp;} else { lt++; gl+=-cp;} if(iB[i]>mxl) mxl=iB[i]; if(iB[i]<mnl) mnl=iB[i]; if(OrderSymbol()==Symbol()) { iS[i-1]=iB[i-1]; iS[i]=iB[i]; sb+=cp; if(cp>=0) { spt++; sgp+=cp;} else { slt++; sgl+=-cp;} st++; } else iS[i]=EMPTY_VALUE; } sbalans=iB[i-1]; if(sbalans!=midlevel) { midlevel=sbalans; SetLevelValue(0,midlevel); } if(mxl!=maxlevel) { maxlevel=MathMax(mxl,midlevel); SetLevelValue(1,maxlevel); iT[0]=maxlevel+0.1*(maxlevel-minlevel); } if(mnl!=minlevel) { minlevel=MathMin(mnl,midlevel); SetLevelValue(2,minlevel); iT[1]=minlevel-0.1*(maxlevel-minlevel); } //---- if(!Show_info) return(0); wh=WindowFind(names+"("+Days+")"); show(0, Lime, "Total Balans "+DoubleToStr(AccountBalance(),2)); show(1, Lime, "Gross Profit "+DoubleToStr(gp,2) +" Gross Loss "+DoubleToStr(gl,2) +" Net Profit "+DoubleToStr(gp-gl,2)); show(2, Lime, "Total Trades "+j+" Profit Trades "+pt+" Loss Trades "+lt); show(3, Gold, "Net Profit "+Symbol()+" "+DoubleToStr(sb,2)); show(4, Gold, "Gross Profit "+DoubleToStr(sgp,2) +" Gross Loss "+DoubleToStr(sgl,2)); show(5, Gold, Symbol()+" Trades "+st+" Profit Trades "+spt+" Loss Trades "+slt); //---- return(0); } //+------------------------------------------------------------------+ void show(int line, color col, string str) { string sobj=names+line; int cw=ObjectFind(sobj); if(cw!=wh) { if(cw>=0) ObjectDelete(sobj); ObjectCreate(sobj,OBJ_LABEL,wh,0,0); ObjectSet(sobj,OBJPROP_CORNER,0); ObjectSet(sobj,OBJPROP_XDISTANCE,3); ObjectSet(sobj,OBJPROP_YDISTANCE,25+line*12); } ObjectSetText(sobj,str,8,"",col); } //+------------------------------------------------------------------+ int deinit() { for(int i=0; i<=5; i++) ObjectDelete(names+i); return(0); } //+------------------------------------------------------------------+
Sample
Analysis
Market Information Used:
Indicator Curves created:
Implements a curve of type DRAW_LINE
Implements a curve of type DRAW_NONE
Indicators Used:
Custom Indicators Used:
Order Management characteristics:
Checks for the total of closed orders
Other Features: