Equity_v8





//+------------------------------------------------------------------+
//|                                                    Equity_v8.mq4 |
//|                                         Copyright © 2008, Xupypr |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2008, Xupypr"

#property indicator_separate_window
#property indicator_buffers 8
#property indicator_color1 LightSteelBlue
#property indicator_color2 SteelBlue
#property indicator_color3 Black
#property indicator_color4 LightSteelBlue
#property indicator_color5 SteelBlue
#property indicator_color6 Black
#property indicator_color7 SteelBlue
#property indicator_color8 OrangeRed
#property indicator_width1 3
#property indicator_width2 3
#property indicator_width3 3
#property indicator_width4 1
#property indicator_width5 1
#property indicator_width6 3
#property indicator_width7 1
#property indicator_width8 2

extern string Only_Comment="";    // Ó÷èòûâàòü îðäåðà òîëüêî ñ íàëè÷èåì óêàçàííîãî êîììåíòàðèÿ (íàïðèìåð [sl] èëè [tp])
extern string Only_Magics="";     // Ó÷èòûâàòü îðäåðà òîëüêî ñ óêàçàííûìè ìàãè÷åñêèìè íîìåðàìè (÷åðåç ëþáîé ðàçäåëèòåëü)
extern string Only_Symbols="";    // Ó÷èòûâàòü òîëüêî óêàçàííûå èíñòðóìåíòû (÷åðåç ëþáîé ðàçäåëèòåëü)
extern bool   Only_Current=false; // Ó÷èòûâàòü òîëüêî òåêóùèé èíñòðóìåíò
extern bool   Only_Buys=false;    // Ó÷èòûâàòü îðäåðà òîëüêî íà ïîêóïêó
extern bool   Only_Sells=false;   // Ó÷èòûâàòü îðäåðà òîëüêî íà ïðîäàæó
extern bool   Show_Balance=true; // Îòîáðàæàòü áàëàíñ
extern bool   Show_Equity=true;  // Îòîáðàæàòü ñðåäñòâà
extern bool   Show_Info=false;   // Îòîáðàæàòü äîïîëíèòåëüíóþ èíôîðìàöèþ
extern bool   File_Write=false;  // Çàïèñü äàííûõ â ôàéë

int      ANumber,Window;
bool     First;
double   EquityBodyUp[],EquityBodyDown[],MaskBody[],EquityShadeUp[],EquityShadeDown[],MaskShade[],EquityLine[],Balance[];
double   CurrentBalance,MaxProfit,Drawdown,MaxPeak,RecoveryFactor;
string   ShortName;
datetime TimeBar;

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

//+----------------------------------------------------------------------------+
//|  Custom indicator initialization function                                  |
//+----------------------------------------------------------------------------+
int init()
{
 if (Only_Comment=="" && Only_Magics=="" && Only_Symbols=="" && !Only_Current && !Only_Buys && !Only_Sells) ShortName="Total";
 else
 {
  if (Only_Comment!="") ShortName=Only_Comment; else ShortName="";
  if (Only_Magics!="")  ShortName=StringConcatenate(ShortName," ",Only_Magics);
  if (Only_Symbols!="") ShortName=StringConcatenate(ShortName," ",Only_Symbols);
  else if (Only_Current) ShortName=StringConcatenate(ShortName," ",Symbol());
  if (Only_Sells) Only_Buys=false;
  if (Only_Buys)  ShortName=StringConcatenate(ShortName," Buys");
  if (Only_Sells) ShortName=StringConcatenate(ShortName," Sells");
 }
 SetIndexBuffer(0,EquityBodyUp);
 SetIndexLabel(0,ShortName+" Equity");
 SetIndexStyle(0,DRAW_HISTOGRAM);
 SetIndexBuffer(1,EquityBodyDown);
 SetIndexLabel(1,ShortName+" Equity");
 SetIndexStyle(1,DRAW_HISTOGRAM);
 SetIndexBuffer(2,MaskBody);
 SetIndexLabel(2,"Mask");
 SetIndexStyle(2,DRAW_HISTOGRAM);
 SetIndexBuffer(3,EquityShadeUp);
 SetIndexLabel(3,ShortName+" Equity");
 SetIndexStyle(3,DRAW_HISTOGRAM);
 SetIndexBuffer(4,EquityShadeDown);
 SetIndexLabel(4,ShortName+" Equity");
 SetIndexStyle(4,DRAW_HISTOGRAM);
 SetIndexBuffer(5,MaskShade);
 SetIndexLabel(5,"Mask");
 SetIndexStyle(5,DRAW_HISTOGRAM);
 SetIndexBuffer(6,EquityLine);
 SetIndexLabel(6,ShortName+" Equity");
 SetIndexStyle(6,DRAW_LINE);
 SetIndexBuffer(7,Balance);
 SetIndexLabel(7,ShortName+" Balance");
 SetIndexStyle(7,DRAW_LINE);
 if (Show_Equity)  ShortName=StringConcatenate(ShortName," Equity");
 if (Show_Balance) ShortName=StringConcatenate(ShortName," Balance");
 IndicatorShortName(ShortName);
 IndicatorDigits(2);
 ANumber=AccountNumber();
 First=true;
 TimeBar=0;
 return(0);
}
//+----------------------------------------------------------------------------+
//|  Custom indicator deinitialization function                                |
//+----------------------------------------------------------------------------+
int deinit()
{
 ObjectsDeleteAll(Window);
 return(0);
}
//+----------------------------------------------------------------------------+
//|  Custom indicator iteration function                                       |
//+----------------------------------------------------------------------------+
int start()
{
 static bool open;
 string filename,objectname,text,time;
 static string minfosymbols="",m1symbols="";
 static double equityopen,equityhigh,equitylow,equityclose;
 double spread,lotsize;
 int handle,beginbar,bar,i,m,j,start,total,historytotal,opentotal;
 //int tick=GetTickCount();

 if (ANumber!=AccountNumber())
 {
  ArrayInitialize(EquityBodyUp,EMPTY_VALUE);
  ArrayInitialize(EquityBodyDown,EMPTY_VALUE);
  ArrayInitialize(MaskBody,EMPTY_VALUE);
  ArrayInitialize(EquityShadeUp,EMPTY_VALUE);
  ArrayInitialize(EquityShadeDown,EMPTY_VALUE);
  ArrayInitialize(MaskShade,EMPTY_VALUE);
  ArrayInitialize(EquityLine,EMPTY_VALUE);
  ArrayInitialize(Balance,EMPTY_VALUE);
  ObjectsDeleteAll(Window);
  ANumber=AccountNumber();
  minfosymbols="";
  m1symbols="";
  First=true;
  TimeBar=0;
 }
 if (!IsConnected())
 {
  Print("Ñâÿçü ñ ñåðâåðîì îòñóòñòâóåò èëè ïðåðâàíà");
  return(0);
 }
 if (!OrderSelect(0,SELECT_BY_POS,MODE_HISTORY)) return(0);
 Window=WindowFind(ShortName);
 if (First)
 {
  First=false;
  MaxProfit=0.0;
  Drawdown=0.0;
  MaxPeak=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(CloseTime,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);
  ArrayResize(Magic,total);
  for (i=0;i<total;i++) if (OrderSelect(OpenTime_Ticket[i][1],SELECT_BY_TICKET)) ReadOrder(i);
  if (Type[0]<6)
  {
   Alert("Èñòîðèÿ ñäåëîê çàãðóæåíà íå ïîëíîñòüþ");
   return(0);
  }
  if (File_Write)
  {
   filename=StringConcatenate(AccountNumber(),"_",Period(),".csv");
   handle=FileOpen(filename,FILE_CSV|FILE_WRITE);
   if (handle<0)
   {
    Alert("Îøèáêà #",GetLastError()," ïðè îòêðûòèè ôàéëà");
    return(0);
   }
  }
  start=0;
  CurrentBalance=0.0;
  beginbar=iBarShift(NULL,0,OpenTime_Ticket[0][0]);
  for (i=beginbar;i>=0;i--)
  {
   open=true;
   equityopen=0.0;
   TimeBar=iTime(NULL,0,i);
   for (m=0;m<Period();m++)
   {
    if (TimeBar>TimeCurrent()) break;
    equityclose=0.0;
    for (j=start;j<total;j++)
    {
     if (OpenTime_Ticket[j][0]>TimeBar+60) break;
     if (CloseTime[start]<TimeBar) start++;
     if (CloseTime[j]>=TimeBar && CloseTime[j]<TimeBar+60 && Type[j]>5)
     {
      CurrentBalance+=Profit[j];
      objectname=StringConcatenate("Time: ",TimeToStr(CloseTime[j]));
      if (ObjectFind(objectname)==-1) ObjectCreate(objectname,OBJ_VLINE,Window,TimeBar,0);
      ObjectSetText(objectname,StringConcatenate(Instrument[j],": ",DoubleToStr(Profit[j],2)));
      ObjectSet(objectname,OBJPROP_TIME1,TimeBar);
      ObjectSet(objectname,OBJPROP_COLOR,OrangeRed);
      ObjectSet(objectname,OBJPROP_WIDTH,2);
      continue;
     }
     if (CloseTime[j]>=TimeBar && CloseTime[j]<TimeBar+60 && ClosePrice[j]!=0) CurrentBalance+=Swap[j]+Commission[j]+Profit[j];
     else if (Show_Equity && OpenTime_Ticket[j][0]<=TimeBar && CloseTime[j]>=TimeBar)
     {
      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],PERIOD_M1,TimeBar);
      if (iTime(Instrument[j],PERIOD_M1,bar)>TimeBar+300)
      {
       if (StringFind(m1symbols,Instrument[j])==-1)
       {
        Alert("Îòñóòñòâóåò èñòîðèÿ M1 ïî "+Instrument[j]+" íà÷èíàÿ ñ "+TimeToStr(iTime(Instrument[j],PERIOD_M1,bar)));
        m1symbols=StringConcatenate(m1symbols," ",Instrument[j]);
       }
       continue;
      }
      if (open)
      {
       if (TimeDayOfWeek(iTime(NULL,0,i))!=TimeDayOfWeek(iTime(NULL,0,i+1)) && OpenTime_Ticket[j][0]<TimeBar)
       {
        switch (MarketInfo(Instrument[j],MODE_PROFITCALCMODE))
        {
         case 0:
         {
          if (TimeDayOfWeek(iTime(NULL,0,i))==4) CurSwap[j]+=3*DaySwap[j];
          else CurSwap[j]+=DaySwap[j];
         } break;
         case 1:
         {
          if (TimeDayOfWeek(iTime(NULL,0,i))==1) CurSwap[j]+=3*DaySwap[j];
          else CurSwap[j]+=DaySwap[j];
         }
        }
       }
       if (Type[j]==OP_BUY)
       {
        lotsize=LotSize(Instrument[j],TimeBar,false);
        equityopen+=Commission[j]+CurSwap[j]+(iOpen(Instrument[j],PERIOD_M1,bar)-OpenPrice[j])*Lots[j]*lotsize;
       }
       else
       {
        spread=MarketInfo(Instrument[j],MODE_POINT)*MarketInfo(Instrument[j],MODE_SPREAD);
        lotsize=LotSize(Instrument[j],TimeBar,false);
        equityopen+=Commission[j]+CurSwap[j]+(OpenPrice[j]-iOpen(Instrument[j],PERIOD_M1,bar)-spread)*Lots[j]*lotsize;
       }
      }
      if (Type[j]==OP_BUY)
      {
       lotsize=LotSize(Instrument[j],TimeBar,true);
       equityclose+=Commission[j]+CurSwap[j]+(iClose(Instrument[j],PERIOD_M1,bar)-OpenPrice[j])*Lots[j]*lotsize;
      }
      else
      {
       spread=MarketInfo(Instrument[j],MODE_POINT)*MarketInfo(Instrument[j],MODE_SPREAD);
       lotsize=LotSize(Instrument[j],TimeBar,true);
       equityclose+=Commission[j]+CurSwap[j]+(OpenPrice[j]-iClose(Instrument[j],PERIOD_M1,bar)-spread)*Lots[j]*lotsize;
      }
     }
    }
    TimeBar+=60;
    if (open)
    {
     equityopen+=CurrentBalance;
     equityhigh=equityopen;
     equitylow=equityopen;
     open=false;
    }
    equityclose+=CurrentBalance;
    if (equityhigh<equityclose) equityhigh=equityclose;
    if (equitylow>equityclose)  equitylow=equityclose;
    if (Show_Info) Information(equityclose);
   }
   if (Show_Balance) Balance[i]=NormalizeDouble(CurrentBalance,2);
   if (Show_Equity)
   {
    if (equityopen<=equityclose)
    {
     EquityBodyUp[i]=NormalizeDouble(equityclose,2);
     MaskBody[i]=NormalizeDouble(equityopen,2);
     EquityShadeUp[i]=NormalizeDouble(equityhigh,2);
    }
    else
    {
     EquityBodyDown[i]=NormalizeDouble(equityopen,2);
     MaskBody[i]=NormalizeDouble(equityclose,2);
     EquityShadeDown[i]=NormalizeDouble(equityhigh,2);
    }
    MaskShade[i]=NormalizeDouble(equitylow,2);
    if (equityhigh==equitylow) EquityLine[i]=equityhigh;
    if (equityclose<0) EquityLine[i]=equityclose;
    if (File_Write)
    {
     time=StringConcatenate(TimeToStr(iTime(NULL,0,i),TIME_DATE),";",TimeToStr(iTime(NULL,0,i),TIME_MINUTES));
     if (FileWrite(handle,time,equityopen,equityhigh,equitylow,equityclose,CurrentBalance)<0) Print("Îøèáêà #",GetLastError()," ïðè çàïèñè â ôàéë");
    }
   }
  }
  TimeBar=Time[0];
  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) FileClose(handle);
 }
 else
 {
  if (TimeBar!=Time[0])
  {
   TimeBar=Time[0];
   equityopen=0.0;
   equityclose=0.0;
   open=true;
  }
  if (Only_Comment=="" && Only_Magics=="" && Only_Symbols=="" && !Only_Current && !Only_Buys && !Only_Sells)
  {
   if (Show_Balance) Balance[0]=NormalizeDouble(AccountBalance(),2);
   if (Show_Equity)
   {
    if (open)
    {
     equityopen=AccountEquity();
     equityhigh=equityopen;
     equitylow=equityopen;
     open=false;
    }
    equityclose=AccountEquity();
    if (equityclose<equitylow)  equitylow=equityclose;
    if (equityclose>equityhigh) equityhigh=equityclose;
   }
   if (Show_Info) Information(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();
    }
   }
   equityclose=0.0;
   opentotal=OrdersTotal();
   if (opentotal>0)
   {
    for (i=0;i<opentotal;i++)
    {
     if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
     if (Select()) equityclose+=OrderCommission()+OrderSwap()+OrderProfit();
    }
   }
   equityclose+=CurrentBalance;
   if (Show_Balance) Balance[0]=NormalizeDouble(CurrentBalance,2);
   if (Show_Equity)
   {
    if (open)
    {
     equityopen=equityclose;
     equitylow=equityopen;
     equityhigh=equityopen;
     open=false;
    }
    if (equityclose<equitylow)  equitylow=equityclose;
    if (equityclose>equityhigh) equityhigh=equityclose;
   }
   if (Show_Info) Information(equityclose);
   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 (Show_Equity)
  {
   if (equityopen<=equityclose)
   {
    EquityBodyDown[0]=EMPTY_VALUE;
    EquityBodyUp[0]=NormalizeDouble(equityclose,2);
    MaskBody[0]=NormalizeDouble(equityopen,2);
    EquityShadeDown[0]=EMPTY_VALUE;
    EquityShadeUp[0]=NormalizeDouble(equityhigh,2);
   }
   else
   {
    EquityBodyUp[0]=EMPTY_VALUE;
    EquityBodyDown[0]=NormalizeDouble(equityopen,2);
    MaskBody[0]=NormalizeDouble(equityclose,2);
    EquityShadeUp[0]=EMPTY_VALUE;
    EquityShadeDown[0]=NormalizeDouble(equityhigh,2);
   }
   MaskShade[0]=NormalizeDouble(equitylow,2);
   if (equityhigh==equitylow) EquityLine[0]=equityhigh; else EquityLine[0]=EMPTY_VALUE;
  }
 }
 objectname="Equity Level";
 if (ObjectFind(objectname)==-1) ObjectCreate(objectname,OBJ_HLINE,Window,0,equityclose);
 ObjectSet(objectname,OBJPROP_PRICE1,equityclose);
 ObjectSet(objectname,OBJPROP_COLOR,LightSlateGray);
 if (Show_Info)
 {
  objectname="Maximal Drawdown";
  if (ObjectFind(objectname)==-1) ObjectCreate(objectname,OBJ_LABEL,Window,0,0);
  text=StringConcatenate(objectname,": ",DoubleToStr(Drawdown,2));
  if (MaxPeak>0) text=StringConcatenate(text," (",DoubleToStr(100*Drawdown/MaxPeak,2),"%)");
  ObjectSetText(objectname,text);
  ObjectSet(objectname,OBJPROP_XDISTANCE,10);
  ObjectSet(objectname,OBJPROP_YDISTANCE,10);
  ObjectSet(objectname,OBJPROP_CORNER,1);
  ObjectSet(objectname,OBJPROP_COLOR,Silver);
  objectname="Recovery Factor";
  if (ObjectFind(objectname)==-1) ObjectCreate(objectname,OBJ_LABEL,Window,0,0);
  if (Drawdown>0) RecoveryFactor=equityclose/Drawdown;
  text=StringConcatenate(objectname,": ",DoubleToStr(RecoveryFactor,2));
  ObjectSetText(objectname,text);
  ObjectSet(objectname,OBJPROP_XDISTANCE,10);
  ObjectSet(objectname,OBJPROP_YDISTANCE,30);
  ObjectSet(objectname,OBJPROP_CORNER,1);
  ObjectSet(objectname,OBJPROP_COLOR,Silver);
 }
 //Print("Calculating - ",GetTickCount()-tick," ms");
 return(0);
}
//+----------------------------------------------------------------------------+
//|  ×òåíèå äàííûõ îðäåðà                                                      |
//+----------------------------------------------------------------------------+
void ReadOrder(int n)
{
 Type[n]=OrderType();
 if (OrderType()>5) Instrument[n]=OrderComment();
 else Instrument[n]=OrderSymbol();
 Lots[n]=OrderLots();
 OpenPrice[n]=OrderOpenPrice();
 int close;
 if (OrderCloseTime()!=0)
 {
  CloseTime[n]=OrderCloseTime();
  ClosePrice[n]=OrderClosePrice();
  close=iBarShift(NULL,0,OrderCloseTime());
 }
 else
 {
  CloseTime[n]=TimeCurrent();
  ClosePrice[n]=0.0;
  close=0;
 }
 Commission[n]=OrderCommission();
 Swap[n]=OrderSwap();
 Profit[n]=OrderProfit();
 CurSwap[n]=0.0;
 int swapdays=0;
 int open=iBarShift(NULL,0,OrderOpenTime());
 for (int b=open-1;b>=close;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;
 Magic[n]=OrderMagicNumber();
 if (Lots[n]==0)
 {
  string ticket=StringSubstr(OrderComment(),StringFind(OrderComment(),"#")+1);
  if (OrderSelect(StrToInteger(ticket),SELECT_BY_TICKET,MODE_HISTORY)) Lots[n]=OrderLots();
 }
}
//+----------------------------------------------------------------------------+
//|  Ðàñ÷¸ò ìàêñèìàëüíîé ïðîñàäêè                                             |
//+----------------------------------------------------------------------------+
void Information(double equity)
{
 if (MaxProfit<equity) MaxProfit=equity;
 if (Drawdown<(MaxProfit-equity))
 {
  Drawdown=MaxProfit-equity;
  MaxPeak=MaxProfit;
 }
}
//+----------------------------------------------------------------------------+
//|  Îïðåäåëåíèå ðàçìåðà êîíòðàêòà                                             |
//+----------------------------------------------------------------------------+
double LotSize(string symbol, datetime tbar, bool close)
{
 double size;
 string BQ,currency=AccountCurrency();
 switch (MarketInfo(symbol,MODE_PROFITCALCMODE))
 {
  case 0:
  {
   int sbar=iBarShift(symbol,PERIOD_M1,tbar);
   size=MarketInfo(symbol,MODE_LOTSIZE);
   if (StringSubstr(symbol,3,3)=="USD") break;
   if (StringSubstr(symbol,0,3)=="USD")
   {
    if (close) size=size/iClose(symbol,PERIOD_M1,sbar);
    else size=size/iOpen(symbol,PERIOD_M1,sbar);
   }
   else
   {
    BQ=StringSubstr(symbol,0,3)+"USD";
    if (iClose(BQ,PERIOD_M1,0)==0) BQ="USD"+StringSubstr(symbol,0,3);
    if (iClose(BQ,PERIOD_M1,0)==0) break;
    int BQbar=iBarShift(BQ,PERIOD_M1,tbar);
    if (StringSubstr(BQ,0,3)=="USD")
    {
     if (close) size=size/iClose(BQ,PERIOD_M1,BQbar)/iClose(symbol,PERIOD_M1,sbar);
     else size=size/iOpen(BQ,PERIOD_M1,BQbar)/iOpen(symbol,PERIOD_M1,sbar);
    }
    else
    {
     if (close) size=size*iClose(BQ,PERIOD_M1,BQbar)/iClose(symbol,PERIOD_M1,sbar);
     else size=size*iOpen(BQ,PERIOD_M1,BQbar)/iOpen(symbol,PERIOD_M1,sbar);
    }
   }
  } 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,PERIOD_M1,0)==0)
  {
   BQ="USD"+currency;
   if (close) size*=iClose(BQ,PERIOD_M1,iBarShift(BQ,PERIOD_M1,tbar));
   else size*=iOpen(BQ,PERIOD_M1,iBarShift(BQ,PERIOD_M1,tbar));
  }
  else
  {
   if (close) size/=iClose(BQ,PERIOD_M1,iBarShift(BQ,PERIOD_M1,tbar));
   else size/=iOpen(BQ,PERIOD_M1,iBarShift(BQ,PERIOD_M1,tbar));
  }
 }
 return(size);
}
//+----------------------------------------------------------------------------+
//|  Âûáîð îðäåðà ïî êðèòåðèÿì                                                 |
//+----------------------------------------------------------------------------+
bool Select()
{
 if (OrderType()>5) return(true);
 if (OrderType()>1) return(false);
 if (Only_Comment!="")
 {
  if (StringFind(OrderComment(),Only_Comment)==-1) return(false);
 }
 if (Only_Magics!="")
 {
  if (StringFind(Only_Magics,DoubleToStr(OrderMagicNumber(),0))==-1) return(false);
 }
 if (Only_Symbols!="")
 {
  if (StringFind(Only_Symbols,OrderSymbol())==-1) return(false);
 }
 else if (Only_Current && OrderSymbol()!=Symbol()) 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 open prices of each bar
Series array that contains close prices for each bar


Indicator Curves created:


Implements a curve of type DRAW_HISTOGRAM
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