//+------------------------------------------------------------------+
//|                                                  i_IvERsCalc.mq4 |
//|                                                   © Shai(Alex2D) |
//|                                                       for IvERfx |
//|                              ----------------------------------- |
//|                                          Thanks to: RickD, KimIV |
//+------------------------------------------------------------------+

// 20.05.09 теперь еще и с процентами... 
//

#property copyright "© 2009 Shai(Alex2D)"
//#property link      ""

#define major   1
#define minor   0

#property indicator_chart_window
#property indicator_buffers 0
/*
extern string    Symbol.1="GBPUSD";
extern string    Symbol.2="EURUSD";
extern string    Symbol.3="USDCHF";
extern string    Symbol.4="GBPJPY";
extern string    Symbol.5;
extern string    Symbol.6;
extern string    Symbol.7;
extern string    Symbol.8;
extern string    Symbol.9;
extern string    Symbol.10;*/

extern bool ShowNegativValues = true;

extern int Corner = 0;
extern int ShiftX = 373;
extern int ShiftY=373;
extern int dy = 17;
extern color _LblColor = LimeGreen;//Khaki;//Gold;

extern string r1 = "==============================";
extern string Build="003"; //просто чтоб не запутаться :) 
extern bool DebugPrints = false;

extern int x_Col1 = 0;
extern int x_Col2 = 65;
extern int x_Col3 = 120;
extern int x_Col4 = 180;
extern int x_Col5 = 240; 
extern int x_Col6 = 305;
extern int x_Col7 = 365;
extern int x_Col8 = 425;

//extern color _LblLotColor = Lime;
//extern color _LblWarnColor = Crimson;

/*extern color _Header = White;
extern color _Text = White;
extern color _Data = Gold;
extern color _Separator = White;*/

string prefix = "iIvC_";

void init() 
{
  Comment("");
  clear();
}

void deinit() 
{
  Comment("");
  clear();
}

void clear() 
{
  string name;
  int obj_total = ObjectsTotal();
  for (int i=obj_total-1; i>=0; i--)
  {
    name = ObjectName(i);
    if (StringFind(name, prefix) == 0) ObjectDelete(name);
  }
}

/*
[15:22:23]IvERfx: КиберКащей v1.0: хочешь еще пищу для ЦП в виде ТЗ ????))))
[15:24:26] КиберКащей v1.0: IvERfx: да, наверное... пора отвлекаться...
[15:28:02] IvERfx: КиберКащей v1.0: можешь сделать такую штуку.... 
   Вот у нас есть терминал в терминале есть список открытых позиций, там установлены стопы. 
   Можешь сделать индюк, который бы показывал сколько у нас пипок и денег защищено стопом 
   по каждой открытой паре и сколько итого под стопом по всем парам. А так же сколько пипок 
   в + или - по каждой паре и итого? Пример пара евро/доллар ин стоп +150 п +150 у.е. 
   бумажная прибыль +450п +450 у.е. 
[15:31:58]КиберКащей v1.0: IvERfx: а "  Risk Calculator.mq4,|//|   
   self-modification of i_Breakeven.mq4(© 2007 RickD"
   не пойдет? он что-то очень похожее показывает вроде
[15:32:30]IvERfx: в свойствах можешь сделать  свободные ячейки для пар как в инф опен ордерс, 
   трейдер сам устанавливает портфель пар....
      пример еще раз
            под стопом                  бумажная прибыль
 EUR/USD  +150 п. +150у.е.          +450п.  +450у.е.
 GBP/JPY  +250 п. +250 у.е.         +720 п. +720 у.е.
 Тотал    +400 п. +400 у.е.        +1170 п. +1170 у.е.
 
[15:33:15]IvERfx: КиберКащей v1.0: ну х.з. мне сам по себе стоп не нужен, мне нужно инфо 
   по пипам в бу и по бумажной прибыли в пипах и деньгах.
[15:35:37]IvERfx: КиберКащей v1.0: Риск калькулятор у меня есть... вроде... а он в одном окне 
   показывает п овсем открытым позициям инфу или нет?
[15:37:14]IvERfx: КиберКащей v1.0: не это не то, он стоп сам по себе расчитывает, 
   а мне стоп нужен только когда он в бу стоит))) Да и нужно мне , чтобы сразу на одном индюке 
   показывалась вся моя экспозиция, типо монитора портфеля)*/

void start()
{
   clear();

   string Sym[];//,CurrPrice[];
   double EquityDelta[];
   double Lots[];
   int a_PrProfitInPips[];
   double a_PrProfit[];
   int a_EqDeltaInPips[];
         
   int z, ProtectedProfitInPips, EqDeltaInPips;
   double r, ProtectedProfit;
   
   string str;
   double CurrPrice;
         
   ArrayResize(Sym, 0); 
   ArrayResize(EquityDelta, 0);
   ArrayResize(Lots, 0);
   ArrayResize(a_PrProfitInPips, 0);
   ArrayResize(a_PrProfit, 0);
   ArrayResize(a_EqDeltaInPips, 0);
  
   int cnt = OrdersTotal();
   for (int i=0; i<cnt; i++)
   {
      if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
    
      int type = OrderType();
      if (type != OP_BUY && type != OP_SELL) continue;
    
      bool found = false;
    
      int size = ArraySize(Sym);
      for (int k=0; k<size; k++)
      {
         if (Sym[k] == OrderSymbol()) 
         {
            EquityDelta[k] += OrderProfit() + OrderCommission() + OrderSwap();
            
            if (type == OP_BUY)
            {
               Lots[k] += OrderLots();
               z=-1;
            }
            if (type == OP_SELL) 
            {
               Lots[k] -= OrderLots();
               z=1;               
            }

            if(OrderStopLoss()!=0.0)
            {
               r = MarketInfo(OrderSymbol(),MODE_TICKVALUE)*OrderLots();
               ProtectedProfitInPips = z*(OrderOpenPrice()-OrderStopLoss())/MarketInfo(OrderSymbol(),MODE_POINT);
               a_PrProfitInPips[k] += ProtectedProfitInPips;
               //Print(OrderSymbol()," ProtectedProfitInPips=[",ProtectedProfitInPips,"]");
            
               ProtectedProfit = ProtectedProfitInPips*r + OrderCommission()+ OrderSwap();
               a_PrProfit[k] += ProtectedProfit;
            //   Print(OrderSymbol()," ProtectedProfit=[",ProtectedProfit,"]");
            }

            CurrPrice = MarketInfo(Sym[k],MODE_BID);

            EqDeltaInPips = z*(-1)*(CurrPrice-OrderOpenPrice())/MarketInfo(OrderSymbol(),MODE_POINT);
            a_EqDeltaInPips[k] += EqDeltaInPips;
            
            if(DebugPrints)
               Print(OrderSymbol()," #", OrderTicket()," EqDeltaInPips=[",EqDeltaInPips,"]");                     
            found = true;
            break;
         }
      }
    
      if (found) 
         continue;
    
      int ind = ArraySize(Sym);
      ArrayResize(Sym, ind+1);
      Sym[ind] = OrderSymbol();

      //ArrayResize(CurrPrice,ind+1);
      //CurrPrice[ind]=MarketInfo(Sym[ind],MODE_BID);
    
      ArrayResize(EquityDelta, ind+1);
      EquityDelta[ind] = OrderProfit() + OrderCommission() + OrderSwap();
    
      ArrayResize(Lots, ind+1);
      
      if (type == OP_BUY)
      {
         Lots[k] = OrderLots();
         z=-1;
      }
      if (type == OP_SELL) 
      {
         Lots[k] = -OrderLots();
         z=1;
      }
      
      ArrayResize(a_PrProfitInPips, ind+1);
      ArrayResize(a_PrProfit, ind+1);
      
      if(OrderStopLoss()!=0.0)
      {
         r = MarketInfo(OrderSymbol(),MODE_TICKVALUE)*OrderLots();
         ProtectedProfitInPips = z*(OrderOpenPrice()-OrderStopLoss())/MarketInfo(OrderSymbol(),MODE_POINT);
         
         a_PrProfitInPips[k] = ProtectedProfitInPips;
  //       Print(OrderSymbol()," ProtectedProfitInPips=[",ProtectedProfitInPips,"]");
            
         ProtectedProfit = ProtectedProfitInPips*r + OrderCommission()+ OrderSwap();
         a_PrProfit[k] = ProtectedProfit;
//         Print(OrderSymbol()," ProtectedProfit=[",ProtectedProfit,"]");
      }
      
      ArrayResize(a_EqDeltaInPips, ind+1);
      
      CurrPrice = MarketInfo(Sym[ind],MODE_BID);

      EqDeltaInPips = z*(-1)*(CurrPrice-OrderOpenPrice())/MarketInfo(OrderSymbol(),MODE_POINT);
      a_EqDeltaInPips[k] += EqDeltaInPips;
      if(DebugPrints)
         Print(OrderSymbol()," #", OrderTicket()," EqDeltaInPips=[",EqDeltaInPips,"]");         
   }
  
  //-----
    
   string name = prefix + "symbols";
   SetLabel(name, "Символ", _LblColor, ShiftX, ShiftY, Corner, 10);

   name = prefix + "Lots";
   SetLabel(name, "Lots", _LblColor, ShiftX+x_Col2, ShiftY, Corner, 10);
    
   name = prefix + "protected";
   SetLabel(name, "Защищено стопом", _LblColor, ShiftX+x_Col3, ShiftY, Corner, 10);

   name = prefix + "profit";
   SetLabel(name, "Прибыль текущая", _LblColor, ShiftX+x_Col6, ShiftY, Corner, 10);

   name = prefix + "tmp1";

   string rzd = "-----------------------------------------------------";
   SetLabel(name, rzd, _LblColor, ShiftX, ShiftY+dy, Corner, 10); 
   name = prefix + "tmp11";
   SetLabel(name, rzd, _LblColor, ShiftX+215, ShiftY+dy, Corner, 10); 
                                        
//----------------------------------------------------------------------  
   double EquityDelta_sum = 0, PrProfitInPips_sum=0, PrProfit_sum=0, EqDeltaInPips_sum=0;
   double PrProfitPerc_sum=0, EqDeltaPerc_sum=0;
   string level0 = "",Price0="";
  
   size = ArraySize(Sym);
   for (i=0; i<size; i++)
   {
/*      if (Lots[i] == 0) 
      {
         level0 = "Lock";
      }
      else 
      {
         int dig = MarketInfo(Sym[i], MODE_DIGITS);
         double point = MarketInfo(Sym[i], MODE_POINT);
      
         double COP = Lots[i]*MarketInfo(Sym[i], MODE_TICKVALUE);
         double val = MarketInfo(Sym[i], MODE_BID) - point*EquityDelta[i]/COP;
         level0 = DoubleToStr(val, dig);
         if (Lots[i]>0) 
            Price0=DoubleToStr((val-MarketInfo(Sym[i], MODE_BID))/MarketInfo(Sym[i], MODE_POINT),0);
         else 
            Price0=DoubleToStr((MarketInfo(Sym[i], MODE_BID)-val)/MarketInfo(Sym[i], MODE_POINT),0);
      }
*/
      name = prefix + "symbol"+i;
      SetLabel(name, Sym[i], _LblColor, ShiftX, ShiftY+dy*(i+2), Corner, 10);
    
      name = prefix + "Lots"+i;
      str = DoubleToStr(Lots[i], 2);
      if (Lots[i] > 0) 
         str = "+" + str;
      SetLabel(name, str, _LblColor, ShiftX+x_Col2, ShiftY+dy*(i+2), Corner, 10);
    
      name = prefix + "PrProfitInPips"+i;
      string PrInPP = DoubleToStr(a_PrProfitInPips[i],0);
      
      if (a_PrProfitInPips[i] > 0) 
         PrInPP = "+" + PrInPP;
      PrInPP = PrInPP + " п.";//"$" + eq;
      
      if (ShowNegativValues || a_PrProfitInPips[i] > 0) 
         SetLabel(name, PrInPP, _LblColor, ShiftX+x_Col3, ShiftY+dy*(i+2), Corner, 10);
      
      name = prefix + "PrProfit"+i;
      string PrProfit = DoubleToStr(a_PrProfit[i],2);
      
      if (a_PrProfit[i] > 0) 
         PrProfit = "+" + PrProfit;
      PrProfit = "$" + PrProfit;
      
      if (ShowNegativValues || a_PrProfit[i] > 0) 
         SetLabel(name, PrProfit, _LblColor, ShiftX+x_Col4, ShiftY+dy*(i+2), Corner, 10);
      

      name = prefix + "PrProfitPerc"+i;
      
      double PrProfitPerc = a_PrProfit[i]*100/AccountBalance();
      string PrProfitPerc_str = DoubleToStr(PrProfitPerc, 2);
      
      if (PrProfitPerc > 0) 
         PrProfitPerc_str = "+" + PrProfitPerc_str;
      PrProfitPerc_str = PrProfitPerc_str + "%";
      
      if (ShowNegativValues || PrProfitPerc > 0) 
         SetLabel(name, PrProfitPerc_str, _LblColor, ShiftX+x_Col5, ShiftY+dy*(i+2), Corner, 10);


      name = prefix + "EqDeltaInPips"+i;
      str = DoubleToStr(a_EqDeltaInPips[i],0);
      
      if (a_EqDeltaInPips[i] > 0) 
         str = "+" + str;
      str = str + " п.";//"$" + eq;
      
      SetLabel(name, str, _LblColor, ShiftX+x_Col6, ShiftY+dy*(i+2), Corner, 10);


      name = prefix + "EquityDelta"+i;
      string eq = DoubleToStr(EquityDelta[i], 2);
      if (EquityDelta[i] > 0) 
         eq = "+" + eq;
      eq = "$" + eq;
      SetLabel(name, eq, _LblColor, ShiftX+x_Col7, ShiftY+dy*(i+2), Corner, 10);    
      
      name = prefix + "EquityDeltaPerc"+i;
      double eq_perc = EquityDelta[i]*100/AccountBalance();
      string eq_perc_str = DoubleToStr(eq_perc, 2);
      
      if (eq_perc > 0) 
         eq_perc_str = "+" + eq_perc_str;
      eq_perc_str = eq_perc_str + "%";
      SetLabel(name, eq_perc_str, _LblColor, ShiftX+x_Col8, ShiftY+dy*(i+2), Corner, 10);    


      EquityDelta_sum += EquityDelta[i];
      PrProfitInPips_sum += a_PrProfitInPips[i];
      PrProfitPerc_sum += PrProfitPerc;
      
      EqDeltaInPips_sum += a_EqDeltaInPips[i];
      EqDeltaPerc_sum += eq_perc;
      PrProfit_sum += a_PrProfit[i];
      
      
   }


//--------------------------------------------------------------------------
   name = prefix + "tmp2";
   SetLabel(name, rzd, _LblColor, ShiftX, ShiftY+dy*(i+2), Corner, 10); 
   name = prefix + "tmp21";
   SetLabel(name, rzd, _LblColor, ShiftX+215, ShiftY+dy*(i+2), Corner, 10); 

   name = prefix + "total";
   SetLabel(name, "Total", _LblColor, ShiftX, ShiftY + dy*(i+3), Corner, 10);
  
   name = prefix + "PrProfitInPips_sum";
   str = DoubleToStr(PrProfitInPips_sum, 0);
   if (PrProfitInPips_sum > 0) 
      str = "+" + str;
   str = str + " п.";
   if (ShowNegativValues || PrProfitInPips_sum > 0) 
      SetLabel(name, str, _LblColor, ShiftX+x_Col3, ShiftY + dy*(i+3), Corner, 10);
   
   name = prefix + "PrProfit_sum";
   str = DoubleToStr(PrProfit_sum, 2);
   if (PrProfitInPips_sum > 0)  // ??? *** не ошибка ли в имени, проверить... 20.05.09
      str = "+" + str;
   str = "$" + str;
   if (ShowNegativValues || PrProfit_sum > 0) 
      SetLabel(name, str, _LblColor, ShiftX+x_Col4, ShiftY + dy*(i+3), Corner, 10);

   name = prefix + "PrProfitPerc_sum";
   str = DoubleToStr(PrProfitPerc_sum, 2);
   if (PrProfitPerc_sum > 0) 
      str = "+" + str;
   str = str + "%";
   if (ShowNegativValues || PrProfitPerc_sum > 0) 
      SetLabel(name, str, _LblColor, ShiftX+x_Col5, ShiftY + dy*(i+3), Corner, 10);

   name = prefix + "EqDeltaInPips_sum";
   str = DoubleToStr(EqDeltaInPips_sum, 0);
   if (EqDeltaInPips_sum > 0) 
      str = "+" + str;
   str = str + " п.";
   SetLabel(name, str, _LblColor, ShiftX+x_Col6, ShiftY + dy*(i+3), Corner, 10);
      
   name = prefix + "EquityDelta_total";
   eq = DoubleToStr(EquityDelta_sum, 2);
   if (EquityDelta_sum > 0) 
      eq = "+" + eq;
   eq = "$" + eq;
   SetLabel(name, eq, _LblColor, ShiftX+x_Col7, ShiftY + dy*(i+3), Corner, 10);    

   name = prefix + "EqDeltaPerc_sum";
   eq = DoubleToStr(EqDeltaPerc_sum, 2);
   if (EqDeltaPerc_sum > 0) 
      eq = "+" + eq;
   eq = eq + "%";
   SetLabel(name, eq, _LblColor, ShiftX+x_Col8, ShiftY + dy*(i+3), Corner, 10);    

}

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
void SetLabel(string nm, string tx, color cl, int xd, int yd, int cr=0, int fs=9, string fn="Tahoma") 
{
  if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_LABEL, 0, 0,0);
  ObjectSetText(nm, tx, fs, fn);
  //Print("tx=", tx);
  ObjectSet(nm, OBJPROP_COLOR    , cl);
  ObjectSet(nm, OBJPROP_XDISTANCE, xd);
  ObjectSet(nm, OBJPROP_YDISTANCE, yd);
  ObjectSet(nm, OBJPROP_CORNER   , cr);
  ObjectSet(nm, OBJPROP_FONTSIZE , fs);
}

