//+------------------------------------------------------------------+
//|                                              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 Green
#property indicator_color4 Lime

#property indicator_color3 Crimson
#property indicator_color5 Red
#property indicator_color6 White

#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.10.01 00:00';  // Время одновременного открытия позиций
extern datetime Time_Close=D'2019.02.02 00:00'; // Время одновременного закрытия позиций
extern bool     General_Line=false; // Использовать граф.объекты - линии для установки времени открытия/закрытия
extern bool     Zero_point=false; // Использовать точку отсчета из советника (zero_point) 
extern bool     First_open=false; // Использовать точку отсчета из советника (время открытия первой позиции)
extern bool     Import=false;       // Импорт экстремумов из глобальных переменных
extern double   Default_Lot=0.01;    // Размер лота по умолчанию, если он не указан дополнительно в перечне символов
//--- Перечни символов, которые условно открываются в buy или в sell
//--- "На хвост" символу может дописываться размер лота
//--- Если размер лота не дописан, применяется лот по умолчанию
//--- Количество символов в пакете произвольное
extern string   Symbols="GBPUSD EURJPY AUDUSD NZDJPY EURUSD GBPJPY NZDUSD AUDJPY";//
string   Buy_Symbols,Sell_Symbols;

bool     Show_Total=false;  // Отображать суммарное эквити
bool     Show_Buy=true;   // Отображать эквити позиций buy
bool     Show_Sell=true;  // Отображать эквити позиций sell

int      Total;
bool     First;
double   TotalEquity[],BuyEquity[],SellEquity[];
double   Equity[],maxlong=0,maxshort=0;
double   Fat_BuyEquity[],Fat_SellEquity[],num_pair;

string   ShortName;

int      OpenBar;      // номер бара открытия
int      CloseBar;     // Номер бара закрытия
int      Type[];       // тип операции
string   Instrument[]; // инструмент
double   Lots[];       // количество лотов
double   OpenPrice[];  // цена открытия

//+----------------------------------------------------------------------------+
//|  Custom indicator initialization function                                  |
//+----------------------------------------------------------------------------+
int init()
{
  ObjectsDeleteAll(ObjectFind("AutoFibo*"),OBJ_FIBO);
  num_pair= GlobalVariableGet("num_pair");

 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="EVM+Fibo ";
//ShortName=StringConcatenate(ShortName,TimeToStr(Time_Open));
//  IndicatorShortName(ShortName);
 //if (Show_Total) ShortName=StringConcatenate(ShortName," Total");
// if (Show_Buy)   ShortName=StringConcatenate(ShortName," Buy");
// if (Show_Sell)  ShortName=StringConcatenate(ShortName," Sell");
 IndicatorShortName(ShortName);
 IndicatorDigits(0);
// ObjectsDeleteAll(-1,OBJ_FIBO);
 First=true;
 return(0);
}
//+----------------------------------------------------------------------------+
//|  Custom indicator iteration function                                       |
//+----------------------------------------------------------------------------+
int start()
{
 string  winname;
 if (General_Line==false)
 {
 if (Zero_point==true && First_open==false && GlobalVariableCheck("zero_point")==true) Time_Open = GlobalVariableGet("zero_point");
 if (First_open==true && GlobalVariableCheck("opentime")==true) 
      {
      Time_Open = GlobalVariableGet("opentime");
      } else { Time_Open = GlobalVariableGet("zero_point"); }
  }
  else {
   if (ObjectFind("openall")==-1) 
  {
  ObjectCreate("openall",OBJ_VLINE,WindowFind(ShortName) ,Time_Open,0);
  ObjectSet("openall",OBJPROP_COLOR,DarkGray);
  }
  }
 static string minfosymbols="";
 double buyprofitloss,sellprofitloss,spread,lotsize;
 int bar,i,j;
 
 winname = StringConcatenate(ShortName,TimeToStr(Time_Open));
 if (WindowFind(winname)==-1) IndicatorShortName(StringConcatenate(ShortName,TimeToStr(Time_Open)));
   
 
 switch (num_pair)
               {
                 case 8 :
                  Buy_Symbols="GBPUSD EURJPY AUDUSD NZDJPY EURUSD GBPJPY NZDUSD AUDJPY";// Мой 8-парный набор
                  Sell_Symbols="GBPUSD EURJPY AUDUSD NZDJPY EURUSD GBPJPY NZDUSD AUDJPY";//
                   break;
                 case 14 :
                  Buy_Symbols="GBPUSD EURGBP GBPJPY CADJPY NZDUSD AUDJPY EURJPY EURUSD USDJPY AUDUSD NZDJPY GBPCHF CHFJPY EURCHF";// Мой 14-парный набор
                  Sell_Symbols="GBPUSD EURGBP GBPJPY CADJPY NZDUSD AUDJPY EURJPY EURUSD USDJPY AUDUSD NZDJPY GBPCHF CHFJPY EURCHF";//
                   break;
                 default:
                  Buy_Symbols=Symbols;// Пары для набора из параметров, если советник не работает
                  Sell_Symbols=Symbols;// 
               }
/*
 if (!IsConnected())
 {
  Print("Связь с сервером отсутствует или прервана");
  return(0);
 }
*/

 if (ObjectFind("AutoFiboUp"+TimeToStr(Time_Open))==-1) ObjectCreate("AutoFiboUp"+TimeToStr(Time_Open) , OBJ_FIBO, WindowFind(winname)  ,Time[0] ,0,Time_Open,0);
 if (ObjectFind("AutoFiboDn"+TimeToStr(Time_Open))==-1) ObjectCreate("AutoFiboDn"+TimeToStr(Time_Open) , OBJ_FIBO, WindowFind(winname)  , Time[0],0,Time_Open,0);
// ObjectDelete("openall");



  if (ObjectFind("closeall")==-1) ObjectCreate("closeall",OBJ_VLINE,NULL,Time_Close,0);
  if (ObjectGet("openall",OBJPROP_TIME1)!=Time_Open || ObjectGet("closeall",OBJPROP_TIME1)!=Time_Close)
  {
   First=true;
   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);
   ArrayInitialize(Equity,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("Ни одного символа не задано!");
   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("В обзоре рынка не хватает "+Instrument[j]);
     minfosymbols=StringConcatenate(minfosymbols," ",Instrument[j]);
    }
    continue;
   }
   spread=MarketInfo(Instrument[j],MODE_POINT)*MarketInfo(Instrument[j],MODE_SPREAD);
   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
   {
  //  sellprofitloss+=(OpenPrice[j]-iClose(Instrument[j],0,bar)-spread)*Lots[j]*lotsize;
    sellprofitloss+=(OpenPrice[j]-iClose(Instrument[j],0,bar))*Lots[j]*lotsize;
   }
  }

  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];
   
   if (Import) maxlong = GlobalVariableGet("maxtotal_long");
    else if (BuyEquity[i]>maxlong) maxlong=BuyEquity[i];

      
   Fat_BuyEquity[i] = 0;
   if (BuyEquity[i] >= BuyEquity[i+1])
     Fat_BuyEquity[i] = BuyEquity[i];

   }
  if (Show_Sell)  
  {
  sellprofitloss=sellprofitloss*(-1);
  SellEquity[i]=NormalizeDouble(sellprofitloss,2);
   if (SellEquity[i]>=0)  SellEquity[i]=0;
   else Equity[i] = SellEquity[i];
   
    if (Import) maxshort = GlobalVariableGet("maxtotal_short");
    else if  (SellEquity[i]<maxshort) maxshort=SellEquity[i];

   Fat_SellEquity[i] = 0;
   if (SellEquity[i] <= SellEquity[i+1])
     Fat_SellEquity[i] = SellEquity[i];

  }

         ObjectSet("AutoFiboUp"+TimeToStr(Time_Open), OBJPROP_PRICE1, NormalizeDouble(maxlong,0));
         ObjectSet("AutoFiboUp"+TimeToStr(Time_Open), OBJPROP_PRICE2, 0);

         ObjectSet("AutoFiboDn"+TimeToStr(Time_Open), OBJPROP_PRICE1, NormalizeDouble(maxshort,0));
         ObjectSet("AutoFiboDn"+TimeToStr(Time_Open), OBJPROP_PRICE2, 0);

      WindowRedraw(); 
     for(j = 0; j < 32; j++)
     {
     ObjectSetFiboDescription("AutoFiboUp"+TimeToStr(Time_Open), j, DoubleToStr(ObjectGet("AutoFiboUp"+TimeToStr(Time_Open), 
     OBJPROP_FIRSTLEVEL+j)*100,1) + "  %$");
     ObjectSetFiboDescription("AutoFiboDn"+TimeToStr(Time_Open), j, DoubleToStr(ObjectGet("AutoFiboDn"+TimeToStr(Time_Open), 
     OBJPROP_FIRSTLEVEL+j)*100,1) + "  %$");
     } 
 }

 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);
 }
}
//+----------------------------------------------------------------------------+