//+------------------------------------------------------------------+
//|                                              Equity_virtual1.mq4 |
//|                                         Copyright © 2009, Xupypr |
//|                              http://www.mql4.com/ru/users/Xupypr |
//|                                             Версия от 01.04.2009 |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, Xupypr"
#property link      "http://www.mql4.com/ru/users/Xupypr"

#property indicator_separate_window
#property indicator_buffers 6
#property indicator_color1 Yellow

#property indicator_color2 DarkGreen
#property indicator_color4 Green

#property indicator_color3 FireBrick
#property indicator_color5 Crimson
#property indicator_color6 DarkSlateGray

#property indicator_width1 2
#property indicator_width2 1
#property indicator_width3 1

#property indicator_width4 2
#property indicator_width5 2
#property indicator_width6 1

#property indicator_level1 0

extern datetime Time_Open=D'2009.11.02 00:00';  // Время одновременного открытия позиций
extern datetime Time_Close=D'2019.02.02 00:00'; // Время одновременного закрытия позиций
extern bool     General_Line=true; // Использовать граф.объекты - линии для установки времени открытия/закрытия
extern bool     General_Line_BB=false; // Использовать точку отсчета из советника
extern double   Default_Lot=0.01;    // Размер лота по умолчанию, если он не указан дополнительно в перечне символов
//--- Перечни символов, которые условно открываются в buy или в sell
//--- "На хвост" символу может дописываться размер лота
//--- Если размер лота не дописан, применяется лот по умолчанию
//--- Количество символов в пакете произвольное
//extern string   Buy_Symbols="GBPUSD EURGBP GBPJPY CADJPY NZDUSD AUDJPY EURJPY EURUSD USDJPY AUDUSD NZDJPY GBPCHF CHFJPY EURCHF";//
//extern string   Sell_Symbols="GBPUSD EURGBP GBPJPY CADJPY NZDUSD AUDJPY EURJPY EURUSD USDJPY AUDUSD NZDJPY GBPCHF CHFJPY EURCHF";//

extern string   Buy_Symbols ="GBPUSD GBPJPY CADJPY NZDUSD AUDJPY EURJPY EURUSD AUDUSD NZDJPY CHFJPY USDCHF USDCAD";
extern string   Sell_Symbols="GBPUSD GBPJPY CADJPY NZDUSD AUDJPY EURJPY EURUSD AUDUSD NZDJPY CHFJPY USDCHF USDCAD";

extern bool     Show_Total=false;  // Отображать суммарное эквити
extern bool     Show_Buy=true;   // Отображать эквити позиций buy
extern bool     Show_Sell=true;  // Отображать эквити позиций sell

int      Total;
bool     First;
double   TotalEquity[],BuyEquity[],SellEquity[];
double   Equity[];
double   Fat_BuyEquity[],Fat_SellEquity[];

string   ShortName;

int      OpenBar;      // номер бара открытия
int      CloseBar;     // Номер бара закрытия
int      Type[];       // тип операции
string   Instrument[]; // инструмент
double   Lots[];       // количество лотов
double   OpenPrice[];  // цена открытия

//+----------------------------------------------------------------------------+
//|  Custom indicator initialization function                                  |
//+----------------------------------------------------------------------------+
int init()
{


 SetIndexBuffer(0,TotalEquity);
 SetIndexLabel(0,"Total");
// SetIndexStyle(0,DRAW_HISTOGRAM);
 SetIndexStyle(0, DRAW_LINE);

 SetIndexBuffer(1,BuyEquity);
 SetIndexLabel(1,"Buy "+Buy_Symbols);
 SetIndexStyle(1,DRAW_HISTOGRAM);

 SetIndexBuffer(2,SellEquity);
 SetIndexLabel(2,"Sell "+Sell_Symbols);
 SetIndexStyle(2,DRAW_HISTOGRAM);

//--N
 SetIndexBuffer(3,Fat_BuyEquity);
 SetIndexLabel(3,"Buy_Fat "+Buy_Symbols);
 SetIndexStyle(3,DRAW_HISTOGRAM);

 SetIndexBuffer(4,Fat_SellEquity);
 SetIndexLabel(4,"Sell_Fat "+Sell_Symbols);
 SetIndexStyle(4,DRAW_HISTOGRAM);

 SetIndexBuffer(5,Equity);
 SetIndexLabel(5,"Equity "+Sell_Symbols);
 SetIndexStyle(5, DRAW_LINE);

 ShortName="Equity Ideal ";
 if (Show_Total) ShortName=StringConcatenate(ShortName," Total");
 if (Show_Buy)   ShortName=StringConcatenate(ShortName," Buy");
 if (Show_Sell)  ShortName=StringConcatenate(ShortName," Sell");
 IndicatorShortName(ShortName);
 IndicatorDigits(2);
 First=true;
 return(0);
}
//+----------------------------------------------------------------------------+
//|  Custom indicator iteration function                                       |
//+----------------------------------------------------------------------------+
int start()
{
 IndicatorShortName(StringConcatenate(TimeToStr(Time_Open)," ",ShortName));
 static string minfosymbols="";
 double buyprofitloss,sellprofitloss,spread,lotsize;
 int bar,i,j;
/*
 if (!IsConnected())
 {
  Print("Связь с сервером отсутствует или прервана");
  return(0);
 }
*/
 if (General_Line_BB==true && GlobalVariableCheck("zero_point")==true) Time_Open = GlobalVariableGet("zero_point");
 if (General_Line)
 {
  if (ObjectFind("openall")==-1) 
  {
  ObjectCreate("openall",OBJ_VLINE,1,Time_Open,0);
  ObjectSet("openall",OBJPROP_COLOR,DarkGray);
  }
  if (ObjectFind("closeall")==-1) ObjectCreate("closeall",OBJ_VLINE,1,Time_Close,0);
  if (ObjectGet("openall",OBJPROP_TIME1)!=Time_Open || ObjectGet("closeall",OBJPROP_TIME1)!=Time_Close)
  {
   First=true;
   

   ObjectDelete("openall");
   if (General_Line_BB==FALSE) Time_Open=ObjectGet("openall",OBJPROP_TIME1);
   Time_Close=ObjectGet("closeall",OBJPROP_TIME1);
   ArrayInitialize(TotalEquity,EMPTY_VALUE);
   ArrayInitialize(BuyEquity,EMPTY_VALUE);
   ArrayInitialize(SellEquity,EMPTY_VALUE);
   ArrayInitialize(Fat_BuyEquity,EMPTY_VALUE);
   ArrayInitialize(Fat_SellEquity,EMPTY_VALUE);
  }
 }
 OpenBar=iBarShift(NULL,0,Time_Open);
 CloseBar=iBarShift(NULL,0,Time_Close,true);
 if (First)
 {
  First=false;
  Total=0;
  SetOrder(Buy_Symbols,OP_BUY);
  SetOrder(Sell_Symbols,OP_SELL);
  if (Total==0)
  {
   Alert("No pairs set!");
   return(0);
  }
 }
 else
 {
  if (Total==0) return(0);
  if (CloseBar>=0) return(0);
  else
  {
   OpenBar=1;
   CloseBar=0;
  }
 }
 for (i=OpenBar;i>=CloseBar;i--)
 {
  buyprofitloss=0.0;
  sellprofitloss=0.0;
  for (j=0;j<Total;j++)
  {
   if (MarketInfo(Instrument[j],MODE_POINT)==0)
   {
    if (StringFind(minfosymbols,Instrument[j])==-1)
    {
     Alert("The pairs set is lacking "+Instrument[j]);
     minfosymbols=StringConcatenate(minfosymbols," ",Instrument[j]);
    }
    continue;
   }
   bar=iBarShift(Instrument[j],0,Time[i]);
   lotsize=LotSize(Instrument[j],Time[i]);
   if (Type[j]==OP_BUY) buyprofitloss+=(iClose(Instrument[j],0,bar)-OpenPrice[j])*Lots[j]*lotsize;
   else
   {
    spread=MarketInfo(Instrument[j],MODE_POINT)*MarketInfo(Instrument[j],MODE_SPREAD);
    //sellprofitloss+=(OpenPrice[j]-iClose(Instrument[j],0,bar)-spread)*Lots[j]*lotsize;
    sellprofitloss+=(OpenPrice[j]-iClose(Instrument[j],0,bar))*Lots[j]*lotsize;
   }
  }

//   Equity[i] = SellEquity[i];
  if (Show_Total)
    TotalEquity[i]=NormalizeDouble(buyprofitloss+sellprofitloss,2);
  
  if (Show_Buy)  
  {
   BuyEquity[i] = NormalizeDouble(buyprofitloss,2);
   if (BuyEquity[i]<=0) 
     BuyEquity[i]=0;
   else
     Equity[i] = BuyEquity[i];

   Fat_BuyEquity[i] = 0;
   if (BuyEquity[i] >= BuyEquity[i+1])
     Fat_BuyEquity[i] = BuyEquity[i];
//     Fat_BuyEquity[i] = NormalizeDouble(buyprofitloss,2);
   

   }
  if (Show_Sell)  
  {
  sellprofitloss=sellprofitloss*(-1);
  SellEquity[i]=NormalizeDouble(sellprofitloss,2);
   if (SellEquity[i]>0)
     SellEquity[i]=0;
   else
     Equity[i] = SellEquity[i];
   
   Fat_SellEquity[i] = 0;
   if (SellEquity[i] <= SellEquity[i+1])
     Fat_SellEquity[i] = SellEquity[i];
  
//   Equity[i] = SellEquity[i];
  }
 }
 return(0);
}
//+----------------------------------------------------------------------------+
//|  Определение размера контракта                                             |
//+----------------------------------------------------------------------------+
double LotSize(string symbol, datetime tbar)
{
 double size;
 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") size=size/iClose(symbol,0,sbar);
   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);
    if (StringSubstr(BQ,0,3)=="USD") size=size/iClose(BQ,0,BQbar)/iClose(symbol,0,sbar);
    else size=size*iClose(BQ,0,BQbar)/iClose(symbol,0,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,0,0)==0)
  {
   BQ="USD"+currency;
   size*=iClose(BQ,0,iBarShift(BQ,0,tbar));
  }
  else size/=iClose(BQ,0,iBarShift(BQ,0,tbar));
 }
 return(size);
}
//+----------------------------------------------------------------------------+
//|  Установка параметров ордера                                               |
//+----------------------------------------------------------------------------+
void SetOrder(string name, int cmd)
{
 int length,pos,end;
 
 length=StringLen(name);
 pos=0;
 while (pos<length)
 {
  Total++;
  ArrayResize(Type,Total);
  ArrayResize(Instrument,Total);
  ArrayResize(Lots,Total);
  ArrayResize(OpenPrice,Total);
  Type[Total-1]=cmd;
  Instrument[Total-1]=StringSubstr(name,pos,6);
  pos+=6;
  if (StringGetChar(name,pos)==32 || (length-1)<pos) Lots[Total-1]=Default_Lot;
  else
  {
   end=0;
   while(StringGetChar(name,pos+end)!=32)
   {
    if ((length-1)<pos+end) break;
    end++;
   }
   Lots[Total-1]=StrToDouble(StringSubstr(name,pos,pos+end));
   pos+=end;
  }
  pos++;
  OpenPrice[Total-1]=iOpen(Instrument[Total-1],0,iBarShift(Instrument[Total-1],0,Time_Open));
  //if (cmd==OP_BUY) OpenPrice[Total-1]+=MarketInfo(Instrument[Total-1],MODE_POINT)*MarketInfo(Instrument[Total-1],MODE_SPREAD);
 }
}
//+----------------------------------------------------------------------------+