Equity_v7_v1





//+------------------------------------------------------------------+
//|                                                    Equity_v7.mq4 |
//|                                         Copyright © 2009, Xupypr |
//|                              http://www.mql4.com/ru/users/Xupypr |
//|                                             Âåðñèÿ îò 09.09.2009 |
//|                                 http://codebase.mql4.com/ru/4455 |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, Xupypr"
#property link      "http://www.mql4.com/ru/users/Xupypr"

#property indicator_separate_window
#property indicator_buffers 4
#property indicator_color1 SteelBlue
#property indicator_color2 OrangeRed
#property indicator_color3 SlateGray
#property indicator_color4 ForestGreen
#property indicator_width1 1
#property indicator_width2 2
#property indicator_width3 1
#property indicator_width4 1

//------------- Ôèëüòð èñòîðèè òîðãîâ
extern bool     Only_Trade=false;   // Ó÷èòûâàòü òîëüêî ïîçèöèè, èñêëþ÷èâ ïîïîëíåíèå/ñíÿòèå ñðåäñòâ
extern string   Only_Magics="";     // Ó÷èòûâàòü òîëüêî ïîçèöèè ñ ìàãè÷åñêèìè íîìåðàìè (÷åðåç ëþáîé ðàçäåëèòåëü)
extern string   Only_Symbols="";    // Ó÷èòûâàòü òîëüêî ïîçèöèè ïî èíñòðóìåíòàì (÷åðåç ëþáîé ðàçäåëèòåëü)
extern string   Only_Comment="";    // Ó÷èòûâàòü òîëüêî ïîçèöèè ñ íàëè÷èåì êîììåíòàðèÿ (íàïðèìåð [sl] èëè [tp])
extern bool     Only_Current=false; // Ó÷èòûâàòü òîëüêî ïîçèöèè ïî òåêóùåìó èíñòðóìåíòó
extern bool     Only_Buys=false;    // Ó÷èòûâàòü òîëüêî ïîçèöèè íà ïîêóïêó
extern bool     Only_Sells=false;   // Ó÷èòûâàòü òîëüêî ïîçèöèè íà ïðîäàæó

//------------- Âíåøíèé âèä èíäèêàòîðà
extern bool     Show_Balance=true;  // Îòîáðàæàòü áàëàíñ
extern bool     Show_Margin=false;  // Îòîáðàæàòü çàëîã (òîëüêî â ðåæèìå ðåàëüíîãî âðåìåíè)
extern bool     Show_Free=false;    // Îòîáðàæàòü ñâîáîäíûå ñðåäñòâà (òîëüêî â ðåæèìå ðåàëüíîãî âðåìåíè)
extern bool     Show_Info=false;    // Îòîáðàæàòü äîïîëíèòåëüíóþ èíôîðìàöèþ î ïðîñàäêàõ, âêëþ÷àÿ ÔÂ

//------------- Íàñòðîéêà ñèãíàëîâ î ïðîñàäêå
extern double   Alert_Drawdown=0;   // Ïðåäóïðåæäàòü î ïðîñàäêå ñðåäñòâ â ïðîöåíòàõ çà ïåðèîä (0 - îòêëþ÷èòü)
extern double   Max_Drawdown=25;    // Ìàêñèìàëüíî äîïóñòèìàÿ ïðîñàäêà â ïðîöåíòàõ çà ïåðèîä ("êðàñíàÿ çîíà")
extern bool     Current_Day=true;   // Ïðîñàäêà áóäåò íàáëþäàòüñÿ òîëüêî çà òåêóùèé äåíü
extern datetime Begin_Monitoring=D'2009.08.17 00:00'; // Íà÷àëî íàáëþäåíèÿ çà ïðîñàäêîé (åñëè Current_Day=false)

//------------- Äðóãèå ïàðàìåòðû
extern bool     File_Write=false;   // Çàïèñü äàííûõ î ýêâèòè è áàëàíñå â ôàéë
extern datetime Draw_Begin=D'2001.01.01 00:00'; // Íà÷àëüíàÿ äàòà îòðèñîâêè èíäèêàòîðà

int      DrawBeginBar,Window;
string   ShortName,Unique;
double   Equity[],Balance[],Margin[],Free[];
double   StartBalance,CurrentBalance,MaxPeak,MaxProfit;
double   AbsDrawdown,MaxDrawdown,RelDrawdown,Drawdown,RecoveryFactor;

datetime OpenTime_Ticket[][2]; // âðåìÿ îòêðûòèÿ è íîìåð òèêåòà
int      OpenBar[];            // íîìåð áàðà îòêðûòèÿ
int      CloseBar[];           // íîìåð áàðà çàêðûòèÿ
int      Type[];               // òèï îïåðàöèè
string   Instrument[];         // èíñòðóìåíò
double   Lots[];               // êîëè÷åñòâî ëîòîâ
double   OpenPrice[];          // öåíà îòêðûòèÿ
double   ClosePrice[];         // öåíà çàêðûòèÿ
double   Commission[];         // êîìèññèÿ
double   Swap[];               // íàêîïëåííûé ñâîï
double   CurSwap[];            // òåêóùèé ñâîï
double   DaySwap[];            // äíåâíîé ñâîï
double   Profit[];             // ÷èñòàÿ ïðèáûëü

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
{
 if (Only_Magics=="" && Only_Symbols=="" && Only_Comment=="" && !Only_Current && !Only_Buys && !Only_Sells) ShortName="Total";
 else
 {
  if (Only_Magics!="")   ShortName=Only_Magics; else ShortName="";
  if (Only_Symbols!="")  ShortName=StringConcatenate(ShortName," ",Only_Symbols);
  else if (Only_Current) ShortName=StringConcatenate(ShortName," ",Symbol());
  if (Only_Comment!="")  ShortName=StringConcatenate(ShortName," ",Only_Comment);
  if (Only_Sells) Only_Buys=false;
  if (Only_Buys)  ShortName=StringConcatenate(ShortName," Buys");
  if (Only_Sells) ShortName=StringConcatenate(ShortName," Sells");
 }
 if (Only_Trade) ShortName=StringConcatenate(ShortName," Zero");
 SetIndexBuffer(0,Equity);
 SetIndexLabel(0,ShortName+" Equity");
 SetIndexStyle(0,DRAW_LINE);
 SetIndexBuffer(1,Balance);
 SetIndexLabel(1,ShortName+" Balance");
 SetIndexStyle(1,DRAW_LINE);
 SetIndexBuffer(2,Margin);
 SetIndexLabel(2,ShortName+" Margin");
 SetIndexStyle(2,DRAW_LINE);
 SetIndexBuffer(3,Free);
 SetIndexLabel(3,ShortName+" Free");
 SetIndexStyle(3,DRAW_LINE);
                   ShortName=StringConcatenate(ShortName," Equity");
 if (Show_Balance) ShortName=StringConcatenate(ShortName," Balance");
 if (Show_Margin)  ShortName=StringConcatenate(ShortName," Margin");
 if (Show_Free)    ShortName=StringConcatenate(ShortName," Free");
 Unique=DoubleToStr(GetTickCount()+MathRand(),0);
 DrawBeginBar=iBarShift(NULL,0,Draw_Begin);
 IndicatorDigits(2);
 return(0);
}
//+------------------------------------------------------------------+
//|  Custom indicator deinitialization function                      |
//+------------------------------------------------------------------+
int deinit()
{
 DeleteAll();
 return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
{
 static int anumber=-1;
 static bool first;
 static string minfosymbols;
 string filename,text,date,time;
 double profitloss,spread,lotsize;
 int handle,bar,i,j,start,startbar,total,historytotal,opentotal;
 //int tick=GetTickCount();

 if (anumber!=AccountNumber())
 {
  DeleteAll();
  IndicatorShortName(Unique);
  Window=WindowFind(Unique);
  IndicatorShortName(ShortName);
  ArrayInitialize(Balance,EMPTY_VALUE);
  ArrayInitialize(Equity,EMPTY_VALUE);
  ArrayInitialize(Margin,EMPTY_VALUE);
  ArrayInitialize(Free,EMPTY_VALUE);
  anumber=AccountNumber();
  minfosymbols="";
  first=true;
 }
 if (!OrderSelect(0,SELECT_BY_POS,MODE_HISTORY)) return(0);
 if (first)
 {
  first=false;
  MaxPeak=0.0;
  MaxProfit=0.0;
  AbsDrawdown=0.0;
  MaxDrawdown=0.0;
  RelDrawdown=0.0;
  if (Period()>PERIOD_D1)
  {
   Alert("Ïåðèîä íå ìîæåò áûòü áîëüøå D1"); 
   return(0);
  }
  historytotal=OrdersHistoryTotal();
  opentotal=OrdersTotal();
  total=historytotal+opentotal;
  ArrayResize(OpenTime_Ticket,total);
  for (i=0;i<historytotal;i++) if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
  {
   if (Select())
   {
    OpenTime_Ticket[i][0]=OrderOpenTime();
    OpenTime_Ticket[i][1]=OrderTicket();
   }
   else
   {
    OpenTime_Ticket[i][0]=EMPTY_VALUE;
    total--;
   }
  }
  if (opentotal>0)
  {
   for (i=0;i<opentotal;i++) if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
   {
    if (Select())
    {
     OpenTime_Ticket[historytotal+i][0]=OrderOpenTime();
     OpenTime_Ticket[historytotal+i][1]=OrderTicket();
    }
    else
    {
     OpenTime_Ticket[historytotal+i][0]=EMPTY_VALUE;
     total--;
    }
   }
  }
  ArraySort(OpenTime_Ticket);
  ArrayResize(OpenTime_Ticket,total);
  ArrayResize(OpenBar,total);
  ArrayResize(CloseBar,total);
  ArrayResize(Type,total);
  ArrayResize(Lots,total);
  ArrayResize(Instrument,total);
  ArrayResize(OpenPrice,total);
  ArrayResize(ClosePrice,total);
  ArrayResize(Commission,total);
  ArrayResize(Swap,total);
  ArrayResize(CurSwap,total);
  ArrayResize(DaySwap,total);
  ArrayResize(Profit,total);
  for (i=0;i<total;i++) if (OrderSelect(OpenTime_Ticket[i][1],SELECT_BY_TICKET)) ReadOrder(i);
  if (Type[0]<6 && !Only_Trade)
  {
   Alert("Èñòîðèÿ ñäåëîê çàãðóæåíà íå ïîëíîñòüþ");
   return(0);
  }
  if (File_Write)
  {
   filename=StringConcatenate(AccountNumber(),"_",Period(),".csv");
   handle=FileOpen(filename,FILE_CSV|FILE_WRITE);
   if (handle<0) Alert("Îøèáêà #",GetLastError()," ïðè îòêðûòèè ôàéëà");
   else if (FileWrite(handle,"Date","Time","Equity","Balance")<0) Print("Îøèáêà #",GetLastError()," ïðè çàïèñè â ôàéë");
  }
  start=0;
  StartBalance=0.0;
  CurrentBalance=0.0;
  for (i=OpenBar[0];i>=0;i--)
  {
   profitloss=0.0;
   for (j=start;j<total;j++)
   {
    if (OpenBar[j]<i) break;
    if (CloseBar[start]>i) start++;
    if (CloseBar[j]==i && ClosePrice[j]!=0) CurrentBalance+=Swap[j]+Commission[j]+Profit[j];
    else if (OpenBar[j]>=i && CloseBar[j]<=i)
    {
     if (Type[j]>5)
     {
      CurrentBalance+=Profit[j];
      if (i==OpenBar[0]) StartBalance=Profit[j];
      if (!Only_Trade && i<=DrawBeginBar)
      {
       text=StringConcatenate(Instrument[j],": ",DoubleToStr(Profit[j],2)," ",AccountCurrency());
       LineCreate("Balance "+TimeToStr(OpenTime_Ticket[j][0]),OBJ_VLINE,2,OrangeRed,text,Time[i],0);
      }
      continue;
     }
     if (i>DrawBeginBar) continue;
     if (MarketInfo(Instrument[j],MODE_POINT)==0)
     {
      if (StringFind(minfosymbols,Instrument[j])==-1)
      {
       Alert("Â îáçîðå ðûíêà íå õâàòàåò "+Instrument[j]);
       minfosymbols=StringConcatenate(minfosymbols," ",Instrument[j]);
      }
      continue;
     }
     bar=iBarShift(Instrument[j],0,Time[i]);
     if (TimeDayOfWeek(iTime(Instrument[j],0,bar))!=TimeDayOfWeek(iTime(Instrument[j],0,bar+1)) && OpenBar[j]!=bar)
     {
      switch (MarketInfo(Instrument[j],MODE_PROFITCALCMODE))
      {
       case 0:
       {
        if (TimeDayOfWeek(iTime(Instrument[j],0,bar))==4) CurSwap[j]+=3*DaySwap[j];
        else CurSwap[j]+=DaySwap[j];
       } break;
       case 1:
       {
        if (TimeDayOfWeek(iTime(Instrument[j],0,bar))==1) CurSwap[j]+=3*DaySwap[j];
        else CurSwap[j]+=DaySwap[j];
       }
      }
     }
     lotsize=LotSize(Instrument[j],Time[i]);
     if (Type[j]==OP_BUY) profitloss+=Commission[j]+CurSwap[j]+(iClose(Instrument[j],0,bar)-OpenPrice[j])*Lots[j]*lotsize;
     else
     {
      spread=MarketInfo(Instrument[j],MODE_POINT)*MarketInfo(Instrument[j],MODE_SPREAD);
      profitloss+=Commission[j]+CurSwap[j]+(OpenPrice[j]-iClose(Instrument[j],0,bar)-spread)*Lots[j]*lotsize;
     }
    }
   }
   if (i>DrawBeginBar) continue;
                     Equity[i]=NormalizeDouble(CurrentBalance+profitloss,2);
   if (Show_Balance) Balance[i]=NormalizeDouble(CurrentBalance,2);
   if (Show_Info)    Drawdown(CurrentBalance+profitloss);
   if (File_Write && handle>0)
   {
    date=TimeToStr(Time[i],TIME_DATE);
    time=TimeToStr(Time[i],TIME_MINUTES);
    if (FileWrite(handle,date,time,CurrentBalance+profitloss,CurrentBalance)<0) Print("Îøèáêà #",GetLastError()," ïðè çàïèñè â ôàéë");
   }
  }
  ArrayResize(OpenTime_Ticket,opentotal);
  if (opentotal>0) for (i=0;i<opentotal;i++) if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) OpenTime_Ticket[i][1]=OrderTicket();
  if (File_Write && handle>0) FileClose(handle);
 }
 else
 {
  if (Only_Magics=="" && Only_Symbols=="" && Only_Comment=="" && !Only_Current && !Only_Buys && !Only_Sells && !Only_Trade)
  {
                     Equity[0]=AccountEquity();
   if (Show_Balance) Balance[0]=AccountBalance();
   if (Show_Margin)  Margin[0]=AccountMargin();
   if (Show_Free)    Free[0]=AccountFreeMargin();
   if (Show_Info)    Drawdown(AccountEquity());
  }
  else
  {
   opentotal=ArraySize(OpenTime_Ticket);
   if (opentotal>0)
   {
    for (i=0;i<opentotal;i++)
    {
     if (!OrderSelect(OpenTime_Ticket[i][1],SELECT_BY_TICKET)) continue;
     if (OrderCloseTime()==0) continue;
     else if (Select()) CurrentBalance+=OrderCommission()+OrderSwap()+OrderProfit();
    }
   }
   profitloss=0.0;
   opentotal=OrdersTotal();
   if (opentotal>0)
   {
    for (i=0;i<opentotal;i++)
    {
     if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
     if (Select()) profitloss+=OrderCommission()+OrderSwap()+OrderProfit();
    }
   }
                     Equity[0]=NormalizeDouble(CurrentBalance+profitloss,2);
   if (Show_Balance) Balance[0]=NormalizeDouble(CurrentBalance,2);
   if (Show_Info)    Drawdown(CurrentBalance+profitloss);
   ArrayResize(OpenTime_Ticket,opentotal);
   if (opentotal>0) for (i=0;i<opentotal;i++) if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) OpenTime_Ticket[i][1]=OrderTicket();
  }
 }
 LineCreate("Equity Level",OBJ_HLINE,1,SteelBlue,"",0,Equity[0]);
 if (Show_Info)
 {
  if (MaxDrawdown>0)
  {
   RecoveryFactor=(Equity[0]-StartBalance)/MaxDrawdown;
   text=StringConcatenate(": ",DoubleToStr(RecoveryFactor,2));
   LabelCreate("Recovery Factor",text,10);
  }
  text=StringConcatenate(": ",DoubleToStr(AbsDrawdown,2)," ",AccountCurrency());
  LabelCreate("Absolute Drawdown",text,30);
  if (MaxPeak>0)
  {
   text=StringConcatenate(": ",DoubleToStr(MaxDrawdown,2)," ",AccountCurrency()," (",DoubleToStr(100*MaxDrawdown/MaxPeak,2),"%)");
   LabelCreate("Maximal Drawdown",text,50);
  }
  text=StringConcatenate(": ",DoubleToStr(RelDrawdown,2),"% (",DoubleToStr(Drawdown,2)," ",AccountCurrency(),")");
  LabelCreate("Relative Drawdown",text,70);
 }
 if (Alert_Drawdown>0) AlertDrawdown();
 //Print("Calculating - ",GetTickCount()-tick," ms");
 return(0);
}
//+------------------------------------------------------------------+
//|  Ñîçäàíèå òåêñòîâîé ìåòêè                                        |
//+------------------------------------------------------------------+
void LabelCreate(string name, string str, int y)
{
 string objectname=StringConcatenate(name," ",Unique);
 if (ObjectFind(objectname)==-1)
 {
  ObjectCreate(objectname,OBJ_LABEL,Window,0,0);
  ObjectSet(objectname,OBJPROP_XDISTANCE,10);
  ObjectSet(objectname,OBJPROP_YDISTANCE,y);
  ObjectSet(objectname,OBJPROP_CORNER,1);
  ObjectSet(objectname,OBJPROP_COLOR,SlateGray);
 }
 ObjectSetText(objectname,name+str);
}
//+------------------------------------------------------------------+
//|  Ñîçäàíèå ëèíèè                                                  |
//+------------------------------------------------------------------+
void LineCreate(string name, int type, int width, color clr, string str, datetime time1, double price1, datetime time2=0, double price2=0)
{
 string objectname=StringConcatenate(name," ",Unique);
 if (ObjectFind(objectname)==-1)
 {
  ObjectCreate(objectname,type,Window,time1,price1,time2,price2);
  ObjectSet(objectname,OBJPROP_WIDTH,width);
  if (type==OBJ_TREND) ObjectSet(objectname,OBJPROP_RAY,false);
  if (type==OBJ_HLINE) ObjectSet(objectname,OBJPROP_STYLE,STYLE_DOT);
 }
 ObjectSetText(objectname,str);
 ObjectSet(objectname,OBJPROP_COLOR,clr);
 ObjectSet(objectname,OBJPROP_TIME1,time1);
 ObjectSet(objectname,OBJPROP_PRICE1,price1);
 ObjectSet(objectname,OBJPROP_TIME2,time2);
 ObjectSet(objectname,OBJPROP_PRICE2,price2);
}
//+------------------------------------------------------------------+
//|  Óäàëåíèå îáúåêòîâ ïî ïðèçíàêó                                   |
//+------------------------------------------------------------------+
void DeleteAll()
{
 int total=ObjectsTotal()-1;
 for (int i=total;i>=0;i--)
 {
  string name=ObjectName(i);
  if (StringFind(name,Unique)!=-1) ObjectDelete(name);
 }
}
//+------------------------------------------------------------------+
//|  ×òåíèå äàííûõ îðäåðà                                            |
//+------------------------------------------------------------------+
void ReadOrder(int n)
{
 OpenBar[n]=iBarShift(NULL,0,OrderOpenTime());
 Type[n]=OrderType();
 if (OrderType()>5) Instrument[n]=OrderComment();
 else Instrument[n]=OrderSymbol();
 Lots[n]=OrderLots();
 OpenPrice[n]=OrderOpenPrice();
 if (OrderCloseTime()!=0)
 {
  CloseBar[n]=iBarShift(NULL,0,OrderCloseTime());
  ClosePrice[n]=OrderClosePrice();
 }
 else
 {
  CloseBar[n]=0;
  ClosePrice[n]=0.0;
 }
 Commission[n]=OrderCommission();
 Swap[n]=OrderSwap();
 Profit[n]=OrderProfit();
 if (OrderType()>5 && Only_Trade) Profit[n]=0.0;
 CurSwap[n]=0.0;
 int swapdays=0;
 for (int b=OpenBar[n]-1;b>=CloseBar[n];b--)
 {
  if (TimeDayOfWeek(iTime(NULL,0,b))!=TimeDayOfWeek(iTime(NULL,0,b+1)))
  {
   switch (MarketInfo(Instrument[n],MODE_PROFITCALCMODE))
   {
    case 0:
    {
     if (TimeDayOfWeek(iTime(NULL,0,b))==4) swapdays+=3;
     else swapdays++;
    } break;
    case 1:
    {
     if (TimeDayOfWeek(iTime(NULL,0,b))==1) swapdays+=3;
     else swapdays++;
    }
   }
  }
 }
 if (swapdays>0) DaySwap[n]=Swap[n]/swapdays; else DaySwap[n]=0.0;
 if (Lots[n]==0)
 {
  string ticket=StringSubstr(OrderComment(),StringFind(OrderComment(),"#")+1);
  if (OrderSelect(StrToInteger(ticket),SELECT_BY_TICKET,MODE_HISTORY)) Lots[n]=OrderLots();
 }
}
//+------------------------------------------------------------------+
//|  Ðàñ÷¸ò ïðîñàäêè íà âñåé èñòîðèè ñ÷¸òà                           |
//+------------------------------------------------------------------+
int Drawdown(double equity)
{
 double relative;
 if (equity<0) return(-1);
 if (AbsDrawdown<StartBalance-equity) AbsDrawdown=StartBalance-equity;
 if (equity>MaxProfit) MaxProfit=equity;
 if (MaxDrawdown<MaxProfit-equity)
 {
  MaxDrawdown=MaxProfit-equity;
  MaxPeak=MaxProfit;
  if (MaxPeak>0)
  {
   relative=100*MaxDrawdown/MaxPeak;
   if (RelDrawdown<relative)
   {
    RelDrawdown=relative;
    Drawdown=MaxDrawdown;
   }
  }
 }
}
//+------------------------------------------------------------------+
//|  Íàáëþäåíèå è ïðåäóïðåæäåíèå î ïðîñàäêàõ çà ïåðèîä               |
//+------------------------------------------------------------------+
int AlertDrawdown()
{
 static int day;
 static bool first=true;
 static double maxpeak,maxprofit,maxdrawdown,reldrawdown,drawdown,balanceDD,maxDD;
 static datetime time,timemaxprofit;
 int bar=0;
 double high,relative,level,curdrawdown;
 datetime timehigh,timelow;
 string drawdownstr,text;
 color clr;
   
 if (first)
 {
  first=false;
  day=Day();
  if (Current_Day) time=StrToTime(TimeToStr(Time[0],TIME_DATE));
  else time=Begin_Monitoring;
  if (time<Draw_Begin) time=Draw_Begin;
  if (time<OpenTime_Ticket[0][0]) time=OpenTime_Ticket[0][0];
  bar=iBarShift(NULL,0,time);
  maxprofit=0.0;
  maxdrawdown=0.0;
  reldrawdown=0.0;
  balanceDD=0.0;
  maxDD=Alert_Drawdown;
 }
 else if (Current_Day && Day()!=day) first=true;
 for (int i=bar;i>=0;i--)
 {
  if (Equity[i]<0) return(-1);
  high=Equity[i];
  if (high>maxprofit)
  {
   timemaxprofit=Time[i];
   maxprofit=high;
   maxdrawdown=0.0;
   reldrawdown=0.0;
   maxDD=Alert_Drawdown;
  }
  if (Show_Balance && balanceDD<Balance[i]-Equity[i]) balanceDD=Balance[i]-Equity[i];
  if (maxdrawdown<maxprofit-Equity[i])
  {
   maxdrawdown=maxprofit-Equity[i];
   maxpeak=maxprofit;
   timehigh=timemaxprofit;
   if (maxpeak>0)
   {
    relative=NormalizeDouble(100*maxdrawdown/maxpeak,1);
    if (reldrawdown<relative)
    {
     reldrawdown=relative;
     drawdown=maxdrawdown;
     timelow=Time[i];
    }
   }
  }
 }
 if (ObjectFind("up")>0)
 {
  if (ObjectGet("up",OBJPROP_PRICE1)<Equity[0])
  {
   Alert("Ýêâèòè âûøå ìàêñèìàëüíîãî óðîâíÿ");
   ObjectSet("up",OBJPROP_PRICE1,Equity[0]);
  }
 }
 if (ObjectFind("down")>0)
 {
  if (ObjectGet("down",OBJPROP_PRICE1)>Equity[0])
  {
   Alert("Ýêâèòè íèæå ìèíèìàëüíîãî óðîâíÿ");
   ObjectSet("down",OBJPROP_PRICE1,Equity[0]);
  }
 }
 if (reldrawdown>maxDD)
 {
  maxDD=reldrawdown;
  if (maxDD>Max_Drawdown)
  {
   text=StringConcatenate("Âíèìàíèå! Ïðåâûøåí óðîâåíü äîïóñòèìîé ïðîñàäêè íà ",DoubleToStr(maxDD-Max_Drawdown,1),"%\n");
   text=StringConcatenate(text,"Äîïóñòèìàÿ ïðîñàäêà çàäàíà íà óðîâíå ",DoubleToStr(Max_Drawdown,1),"%\n");
  }
  else
  {
   text=StringConcatenate("Ïðåâûøåí óðîâåíü ñèãíàëüíîé ïðîñàäêè íà ",DoubleToStr(maxDD-Alert_Drawdown,1),"%\n");
   text=StringConcatenate(text,"Ñèãíàëüíàÿ ïðîñàäêà çàäàíà íà óðîâíå ",DoubleToStr(Alert_Drawdown,1),"%\n");
  }
  drawdownstr=StringConcatenate(DoubleToStr(reldrawdown,1),"% (",DoubleToStr(drawdown,2)," ",AccountCurrency(),")");
  text=StringConcatenate(text,"Ïðîñàäêà â ñðåäñòâàõ çà òåêóùèé ïåðèîä ñîñòàâèëà ",drawdownstr,"\n");
  if (balanceDD>0) text=StringConcatenate(text,"Ïðîñàäêà îò áàëàíñà - ",DoubleToStr(balanceDD,2)," ",AccountCurrency(),"\n");
  text=StringConcatenate(text,"Íàçâàíèå èíäèêàòîðà: ",ShortName);
  Alert(text);
  if (maxDD>Max_Drawdown) clr=Red;
  else clr=DarkOrange;
  LineCreate("Drawdown Line",OBJ_TREND,2,clr,"       "+drawdownstr,timehigh,maxpeak,timelow,maxpeak-drawdown);
 }
 LineCreate("Begin Monitoring",OBJ_VLINE,1,SlateGray,"Begin Monitoring",time,0);
 level=NormalizeDouble(maxprofit,2);
 LineCreate("Max Profit",OBJ_TREND,1,DodgerBlue,"Max Profit",timemaxprofit,level,Time[0],level);
 level=NormalizeDouble(maxprofit*(1-Alert_Drawdown/100),2);
 LineCreate("Alert Drawdown",OBJ_TREND,1,DarkOrange,"Alert Drawdown "+DoubleToStr(Alert_Drawdown,1)+"%",timemaxprofit,level,Time[0],level);
 level=NormalizeDouble(maxprofit*(1-Max_Drawdown/100),2);
 LineCreate("Max Drawdown",OBJ_TREND,1,Red,"Max Drawdown "+DoubleToStr(Max_Drawdown,1)+"%",timemaxprofit,level,Time[0],level);
 if (Show_Info)
 {
  curdrawdown=maxprofit-Equity[0];
  text=StringConcatenate(": ",DoubleToStr(curdrawdown,2)," ",AccountCurrency()," (",DoubleToStr(100*curdrawdown/maxprofit,2),"%)");
  LabelCreate("Current Drawdown",text,90);
 }
}
//+------------------------------------------------------------------+
//|  Îïðåäåëåíèå ðàçìåðà êîíòðàêòà                                   |
//+------------------------------------------------------------------+
double LotSize(string symbol, datetime tbar)
{
 double size,close1,close2;
 string BQ,currency=AccountCurrency();
 switch (MarketInfo(symbol,MODE_PROFITCALCMODE))
 {
  case 0:
  {
   int sbar=iBarShift(symbol,0,tbar);
   size=MarketInfo(symbol,MODE_LOTSIZE);
   if (StringSubstr(symbol,3,3)=="USD") break;
   if (StringSubstr(symbol,0,3)=="USD")
   {
    close1=iClose(symbol,0,sbar);
    if (close1>0) size=size/close1;
   }
   else
   {
    BQ=StringSubstr(symbol,0,3)+"USD";
    if (iClose(BQ,0,0)==0) BQ="USD"+StringSubstr(symbol,0,3);
    if (iClose(BQ,0,0)==0) break;
    int BQbar=iBarShift(BQ,0,tbar);
    close1=iClose(symbol,0,sbar);
    close2=iClose(BQ,0,BQbar);
    if (close1>0 && close2>0)
    {
     if (StringSubstr(BQ,0,3)=="USD") size=size/close2/close1;
     else size=size*close2/close1;
    }
   }
  } break;
  case 1: size=MarketInfo(symbol,MODE_LOTSIZE); break;
  case 2: size=MarketInfo(symbol,MODE_TICKVALUE)/MarketInfo(symbol,MODE_TICKSIZE);
 }
 if (currency!="USD")
 {
  BQ=currency+"USD";
  if (iClose(BQ,0,0)==0)
  {
   BQ="USD"+currency;
   close1=iClose(BQ,0,iBarShift(BQ,0,tbar));
   if (close1>0) size*=close1;
  }
  else
  {
   close1=iClose(BQ,0,iBarShift(BQ,0,tbar));
   if (close1>0) size/=close1;
  }
 }
 return(size);
}
//+------------------------------------------------------------------+
//|  Âûáîð îðäåðà ïî êðèòåðèÿì                                       |
//+------------------------------------------------------------------+
bool Select()
{
 if (OrderType()>5) return(true);
 if (OrderType()>1) return(false);
 if (Only_Magics!="" && StringFind(Only_Magics,DoubleToStr(OrderMagicNumber(),0))==-1) return(false);
 if (Only_Symbols!="" && StringFind(Only_Symbols,OrderSymbol())==-1) return(false);
 else if (Only_Current && OrderSymbol()!=Symbol()) return(false);
 if (Only_Comment!="" && StringFind(OrderComment(),Only_Comment)==-1) return(false);
 if (Only_Buys && OrderType()!=OP_BUY) return(false);
 if (Only_Sells && OrderType()!=OP_SELL) return(false);
 return(true);
}
//+------------------------------------------------------------------+



Sample





Analysis



Market Information Used:

Series array that contains open time of each bar
Series array that contains close prices for each bar


Indicator Curves created:


Implements a curve of type DRAW_LINE

Indicators Used:



Custom Indicators Used:

Order Management characteristics:
Checks for the total of closed orders
Checks for the total of open orders

Other Features:

It issuies visual alerts to the screen
Uses files from the file system
It writes information to file