//+------------------------------------------------------------------+
//|                                                    iExposure.mq4 |
//|                   Copyright 2007-2014, MetaQuotes Software Corp. |
//|                                              http://www.mql4.com |
//+------------------------------------------------------------------+
#property copyright "2007-2014, MetaQuotes Software Corp."
#property link      "http://www.mql4.com"
#property strict

#property indicator_chart_window
#property indicator_buffers 1
//#property indicator_minimum 0.0
//#property indicator_maximum 0.1

#define SYMBOLS_MAX 1024
#define DEALS          0
#define BUY_LOTS       1
#define BE_BUY         2
#define SELL_LOTS      3
#define BE_SELL        4
#define NET_LOTS       5
#define PROFIT         6

input color InpColor=LightSeaGreen;  // Text color
extern int corner = 0; //0 - for top-left corner, 1 - top-right, 2 - bottom-left, 3 - bottom-right
extern int distance_y = 120;
extern int distance_x = 500;
extern int text_size = 10;


//extern int spread_distance_x = 1;
//extern int spread_distance_y = 130;

string ExtName="Exposure";
string ExtSymbols[SYMBOLS_MAX];
int    ExtSymbolsTotal=0;
double ExtSymbolsSummaries[SYMBOLS_MAX][7];
int    ExtLines=-1;
string ExtCols[8]={"Symbol",
                   "Deals",
                   "B-Net",
                   "Buy-BE",
                   "S-Net",
                   "Sell-BE",
                   "Net lots",
                   "Profit"};
int    ExtShifts[8]={ 10, 110, 160, 210, 290, 340, 420, 490 };
extern int  ExtVertShift=18;
int    extshifts[8];
double Pekali;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
	IndicatorShortName(ExtName);
   IndicatorDigits(0);
   int i,col;
   string name;
   switch (corner) {
    case 0: 
    case 2: 
      for (i=0;i<8;i++) extshifts[i]=ExtShifts[i];
      break;
    case 1: 
    case 3: 
      extshifts[i]=ExtShifts[7];
      for (i=1;i<8;i++) extshifts[i]=ExtShifts[7]-(ExtShifts[i]-ExtShifts[0])+2*ExtShifts[0];
      break;
   }
   
   
   for(i=ObjectsTotal()-1; i>=0; i--)
     if(StringFind(ObjectName(i),"Line_",0)>-1) ObjectDelete(ObjectName(i));

   for(col=0; col<8; col++)
        {
         name="Head_"+string(col);
         if(ObjectFind(0,name)==0 || ObjectCreate(name,OBJ_LABEL,0,0,0))
           {
            ObjectSet(name, OBJPROP_CORNER, corner);
            ObjectSet(name,OBJPROP_XDISTANCE,distance_x+extshifts[col]);
            ObjectSet(name,OBJPROP_YDISTANCE,distance_y+ExtVertShift);
            ObjectSetText(name,ExtCols[col],text_size,"Arial",InpColor);
           }
        }
   
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   int windex=WindowFind(ExtName);
   if(windex>0)
      ObjectsDeleteAll(windex);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long& tick_volume[],
                const long& volume[],
                const int& spread[])
  {
   string name;
   int    i,col,line;//windex=WindowFind(ExtName);
   double deal = 0, lot = 0, profit = 0;
//----
 //  if(windex<0)
 //     return(rates_total);
//---- header line
//----
   ArrayInitialize(ExtSymbolsSummaries,0.0);
   int total=Analyze();
   if(total>0)
     {
      line=0;
      for(i=0; i<ExtSymbolsTotal; i++)
        {
         if(ExtSymbolsSummaries[i][DEALS]<=0) continue;
         line++;
         //---- add line
         if(line>ExtLines)
           {
            int y_dist=distance_y+ExtVertShift*(line+1)+1;
            for(col=0; col<8; col++)
              {
               name="Line_"+string(line)+"_"+string(col);
               if(ObjectCreate(name,OBJ_LABEL,0,0,0))
                 {
                  ObjectSet(name, OBJPROP_CORNER, corner);
                  ObjectSet(name,OBJPROP_XDISTANCE,distance_x+extshifts[col]);
                  ObjectSet(name,OBJPROP_YDISTANCE,y_dist);
                 }
//-------------
                ObjectCreate("Lin",OBJ_LABEL,0,0,0);
                ObjectSet("Lin", OBJPROP_CORNER, corner);
                ObjectSet("Lin",OBJPROP_XDISTANCE,distance_x+20);
                ObjectSet("Lin",OBJPROP_YDISTANCE,y_dist+ExtVertShift);
                ObjectSetText("Lin","=====================================================",text_size,"Arial",InpColor);

                ObjectCreate("LinDeals",OBJ_LABEL,0,0,0);
                ObjectSet("LinDeals", OBJPROP_CORNER, corner);
                ObjectSet("LinDeals",OBJPROP_XDISTANCE,distance_x+extshifts[1]);
                ObjectSet("LinDeals",OBJPROP_YDISTANCE,y_dist+2 * ExtVertShift);
                                
                ObjectCreate("LinLots",OBJ_LABEL,0,0,0);
                ObjectSet("LinLots", OBJPROP_CORNER, corner);
                ObjectSet("LinLots",OBJPROP_XDISTANCE,distance_x+extshifts[6]);
                ObjectSet("LinLots",OBJPROP_YDISTANCE,y_dist+2 * ExtVertShift);
                                
                ObjectCreate("LinProfit",OBJ_LABEL,0,0,0);
                ObjectSet("LinProfit", OBJPROP_CORNER, corner);
                ObjectSet("LinProfit",OBJPROP_XDISTANCE,distance_x+extshifts[7]);
                ObjectSet("LinProfit",OBJPROP_YDISTANCE,y_dist+2 * ExtVertShift);
                
//--------------                 
                 
              }
            ExtLines++;
           }
         //---- set line
         
         double Gigits = MarketInfo (ExtSymbols[i], MODE_DIGITS);
         if (Gigits == 2) Pekali = 100;
         if (Gigits == 3) Pekali = 100;
         if (Gigits == 4) Pekali = 10000;
         if (Gigits == 5) Pekali = 10000;
         //---- set line
         int    digits=(int)MarketInfo(ExtSymbols[i],MODE_DIGITS);
         double buy_lots=ExtSymbolsSummaries[i][BUY_LOTS];
         double sell_lots=ExtSymbolsSummaries[i][SELL_LOTS];
         double be_buy=0.0;
         double be_sell=0.0;
         if(buy_lots!=0)  be_buy=(MarketInfo(ExtSymbols[i],MODE_BID) - ExtSymbolsSummaries[i][BE_BUY]/buy_lots) * Pekali;
         if(sell_lots!=0) be_sell=(ExtSymbolsSummaries[i][BE_SELL]/sell_lots - MarketInfo(ExtSymbols[i],MODE_ASK)) * Pekali;
         name="Line_"+string(line)+"_0";
         ObjectSetText(name,ExtSymbols[i],text_size,"Arial",InpColor);
         name="Line_"+string(line)+"_1";
         ObjectSetText(name,DoubleToStr(ExtSymbolsSummaries[i][DEALS],0),text_size,"Arial",InpColor);
         deal += ExtSymbolsSummaries[i][DEALS];
         name="Line_"+string(line)+"_2";
         ObjectSetText(name,DoubleToStr(buy_lots,2),text_size,"Arial",InpColor);
         name="Line_"+string(line)+"_3";
         ObjectSetText(name,DoubleToStr(be_buy,1),text_size,"Arial",InpColor);
         name="Line_"+string(line)+"_4";
         ObjectSetText(name,DoubleToStr(sell_lots,2),text_size,"Arial",InpColor);
         name="Line_"+string(line)+"_5";
         ObjectSetText(name,DoubleToStr(be_sell,1),text_size,"Arial",InpColor);
         name="Line_"+string(line)+"_6";
         ObjectSetText(name,DoubleToStr(buy_lots-sell_lots,2),text_size,"Arial",InpColor);
         lot += MathAbs(buy_lots-sell_lots);
         name="Line_"+string(line)+"_7";
         ObjectSetText(name,DoubleToStr(ExtSymbolsSummaries[i][PROFIT],2),text_size,"Arial",InpColor);
         profit += ExtSymbolsSummaries[i][PROFIT];
        }
       ObjectSetText("LinDeals",DoubleToString(deal,0),text_size,"Arial",InpColor);
       ObjectSetText("LinLots",DoubleToString(lot,2),text_size,"Arial",InpColor);
       ObjectSetText("LinProfit",DoubleToString(profit,2),text_size,"Arial",InpColor);
     }
//---- remove lines
   if(total<ExtLines)
     {
      for(line=ExtLines; line>total; line--)
        {
         name="Line_"+string(line)+"_0";
         ObjectSetText(name,"");
         name="Line_"+string(line)+"_1";
         ObjectSetText(name,"");
         name="Line_"+string(line)+"_2";
         ObjectSetText(name,"");
         name="Line_"+string(line)+"_3";
         ObjectSetText(name,"");
         name="Line_"+string(line)+"_4";
         ObjectSetText(name,"");
         name="Line_"+string(line)+"_5";
         ObjectSetText(name,"");
         name="Line_"+string(line)+"_6";
         ObjectSetText(name,"");
         name="Line_"+string(line)+"_7";
         ObjectSetText(name,"");
        }
     }
   return(rates_total);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int Analyze()
  {
   double profit;
   int    i,index,type,total=OrdersTotal();
//----
   for(i=0; i<total; i++)
     {
      if(!OrderSelect(i,SELECT_BY_POS)) continue;
      type=OrderType();
      if(type!=OP_BUY && type!=OP_SELL) continue;
      index=SymbolsIndex(OrderSymbol());
      if(index<0 || index>=SYMBOLS_MAX) continue;
      //----
      ExtSymbolsSummaries[index][DEALS]++;
      profit=OrderProfit()+OrderCommission()+OrderSwap();
      ExtSymbolsSummaries[index][PROFIT]+=profit;
      if(type==OP_BUY)
        {
         ExtSymbolsSummaries[index][BUY_LOTS]+=OrderLots();
         ExtSymbolsSummaries[index][BE_BUY]+=OrderOpenPrice()*OrderLots();
        }
      else
        {
         ExtSymbolsSummaries[index][SELL_LOTS]+=OrderLots();
         ExtSymbolsSummaries[index][BE_SELL]+=OrderOpenPrice()*OrderLots();
        }
     }
//----
   total=0;
   for(i=0; i<ExtSymbolsTotal; i++)
     {
      if(ExtSymbolsSummaries[i][DEALS]>0) total++;
     }
//----
   return(total);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int SymbolsIndex(string SymbolName)
  {
   bool found=false;
   int  i;
//----
   for(i=0; i<ExtSymbolsTotal; i++)
     {
      if(SymbolName==ExtSymbols[i])
        {
         found=true;
         break;
        }
     }
//----
   if(found)
      return(i);
   if(ExtSymbolsTotal>=SYMBOLS_MAX)
      return(-1);
//----
   i=ExtSymbolsTotal;
   ExtSymbolsTotal++;
   ExtSymbols[i]=SymbolName;
   ExtSymbolsSummaries[i][DEALS]=0;
   ExtSymbolsSummaries[i][BUY_LOTS]=0;
   ExtSymbolsSummaries[i][BE_BUY]=0;
   ExtSymbolsSummaries[i][SELL_LOTS]=0;
   ExtSymbolsSummaries[i][BE_SELL]=0;
   ExtSymbolsSummaries[i][NET_LOTS]=0;
   ExtSymbolsSummaries[i][PROFIT]=0;
//----
   return(i);
  }
//+------------------------------------------------------------------+