//+------------------------------------------------------------------+
//|                                             HedgeStats.mq4 |
//|                      Copyright © 2007, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

#property indicator_chart_window
#property indicator_buffers 0

#define major   1
#define minor   0

extern int Corner = 0;
extern int dy = 20;

extern color _Header = OrangeRed;
extern color _Text = White;
extern color _Data = White;
extern color _Separator = Lime;

extern string TradeComment="place the comment here";

string prefix = "capital_";

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);
  }
}

void start()
{
  clear();

  string Sym[];
  double Equity[];
  double Lots[];
  double Swaps[];
  ArrayResize(Sym, 0);
  ArrayResize(Equity, 0);
  ArrayResize(Lots, 0);
  ArrayResize(Swaps, 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;
    
    if (OrderComment() != TradeComment)  continue;
    bool found = false;
    
    int size = ArraySize(Sym);
    for (int k=0; k<size; k++)
    {
      if (Sym[k] == OrderSymbol()) {
        //Equity[k] += OrderProfit() + OrderCommission() + OrderSwap();
        Equity[k] += OrderProfit();
        Swaps[k] += OrderSwap();
        if (type == OP_BUY) Lots[k] += OrderLots();
        if (type == OP_SELL) Lots[k] -= OrderLots();
        found = true;
        break;
      }
    }
    
    if (found) continue;
    
    int ind = ArraySize(Sym);
    ArrayResize(Sym, ind+1);
    Sym[ind] = OrderSymbol();
    
    ArrayResize(Equity, ind+1);
    //Equity[ind] = OrderProfit() + OrderCommission() + OrderSwap();
    Equity[ind] = OrderProfit();
    
    ArrayResize(Swaps, ind+1);
    //Equity[ind] = OrderProfit() + OrderCommission() + OrderSwap();
    Swaps[ind] = OrderSwap();

    ArrayResize(Lots, ind+1);
    if (type == OP_BUY) Lots[k] = OrderLots();
    if (type == OP_SELL) Lots[k] = -OrderLots();
  }
  
  //-----
    
  string name = prefix + "symbols";
  if (ObjectFind(name) == -1) {
    ObjectCreate(name, OBJ_LABEL, 0, 0, 0);
  }
  
  ObjectSet(name, OBJPROP_XDISTANCE, 30);
  ObjectSet(name, OBJPROP_YDISTANCE, 35);
  ObjectSetText(name, TradeComment, 10, "Tahoma", _Header);
  ObjectSet(name, OBJPROP_CORNER, Corner);

    
  name = prefix + "equity";
  if (ObjectFind(name) == -1) {
    ObjectCreate(name, OBJ_LABEL, 0, 0, 0);
  }
  
  ObjectSet(name, OBJPROP_XDISTANCE, 130);
  ObjectSet(name, OBJPROP_YDISTANCE, 35);
  ObjectSetText(name, "Equity", 10, "Tahoma", _Header);
  ObjectSet(name, OBJPROP_CORNER, Corner);


  name = prefix + "breakeven";
  if (ObjectFind(name) == -1) {
    ObjectCreate(name, OBJ_LABEL, 0, 0, 0);
  }
  
  ObjectSet(name, OBJPROP_XDISTANCE, 220);
  ObjectSet(name, OBJPROP_YDISTANCE, 35);
  ObjectSetText(name, "Breakeven", 10, "Tahoma", _Header);
  ObjectSet(name, OBJPROP_CORNER, Corner);

   name = prefix + "swaps";
  if (ObjectFind(name) == -1) {
    ObjectCreate(name, OBJ_LABEL, 0, 0, 0);
  }
  
  ObjectSet(name, OBJPROP_XDISTANCE, 310);
  ObjectSet(name, OBJPROP_YDISTANCE, 35);
  ObjectSetText(name, "Swap", 10, "Tahoma", _Header);
  ObjectSet(name, OBJPROP_CORNER, Corner);

  name = prefix + "tmp1";
  if (ObjectFind(name) == -1) {
    ObjectCreate(name, OBJ_LABEL, 0, 0, 0);
  }

  ObjectSet(name, OBJPROP_XDISTANCE, 20);
  ObjectSet(name, OBJPROP_YDISTANCE, 35+dy);
  ObjectSetText(name, "----------------------------------------------------------------------------------", 
    10, "Tahoma", _Separator);
  ObjectSet(name, OBJPROP_CORNER, Corner);

    
  
  double sum = 0;
  double sw_sum = 0;
  string level0 = "";
  
  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*Equity[i]/COP;
      level0 = DoubleToStr(val, dig);
    }

  
    name = prefix + "symbol"+i;
    if (ObjectFind(name) == -1) {
      ObjectCreate(name, OBJ_LABEL, 0, 0, 0);
    }
  
    ObjectSet(name, OBJPROP_XDISTANCE, 30);
    ObjectSet(name, OBJPROP_YDISTANCE, 35+dy*(i+2));
    ObjectSetText(name, Sym[i], 10, "Tahoma", _Text);
    ObjectSet(name, OBJPROP_CORNER, Corner);

    
    name = prefix + "equity"+i;
    if (ObjectFind(name) == -1) {
      ObjectCreate(name, OBJ_LABEL, 0, 0, 0);
    }
  
    ObjectSet(name, OBJPROP_XDISTANCE, 120);
    ObjectSet(name, OBJPROP_YDISTANCE, 35+dy*(i+2));
    
    string eq = DoubleToStr(Equity[i], 2);
    if (Equity[i] > 0) eq = "+" + eq;
    eq = "$" + eq;
    
    ObjectSetText(name, eq, 10, "Tahoma", _Data);
    ObjectSet(name, OBJPROP_CORNER, Corner);


    name = prefix + "breakeven"+i;
    if (ObjectFind(name) == -1) {
      ObjectCreate(name, OBJ_LABEL, 0, 0, 0);
    }
  
    ObjectSet(name, OBJPROP_XDISTANCE, 230);
    ObjectSet(name, OBJPROP_YDISTANCE, 35+dy*(i+2));
    ObjectSetText(name, level0, 10, "Tahoma", _Data);
    ObjectSet(name, OBJPROP_CORNER, Corner);
  
    name = prefix + "swaps"+i;
    if (ObjectFind(name) == -1) {
      ObjectCreate(name, OBJ_LABEL, 0, 0, 0);
    }
  
    ObjectSet(name, OBJPROP_XDISTANCE, 320);
    ObjectSet(name, OBJPROP_YDISTANCE, 35+dy*(i+2));
    
    string sw = DoubleToStr(Swaps[i], 2);
    if (Swaps[i] > 0) sw = "+" + sw;
    sw = "$" + sw;
    
    ObjectSetText(name, sw, 10, "Tahoma", _Data);
    ObjectSet(name, OBJPROP_CORNER, Corner);
  
    sum += Equity[i];
    sw_sum += Swaps[i];
  }


  name = prefix + "tmp2";
  if (ObjectFind(name) == -1) {
    ObjectCreate(name, OBJ_LABEL, 0, 0, 0);
  }

  ObjectSet(name, OBJPROP_XDISTANCE, 20);
  ObjectSet(name, OBJPROP_YDISTANCE, 35+dy*(i+2));
  ObjectSetText(name, "-------------------------------------------------------------------------", 
    10, "Tahoma", _Separator);
  ObjectSet(name, OBJPROP_CORNER, Corner);


  name = prefix + "total";
  if (ObjectFind(name) == -1) {
    ObjectCreate(name, OBJ_LABEL, 0, 0, 0);
  }

  ObjectSet(name, OBJPROP_XDISTANCE, 30);
  ObjectSet(name, OBJPROP_YDISTANCE, 35+dy*(i+3));
  ObjectSetText(name, "Total", 10, "Tahoma", _Text);
  ObjectSet(name, OBJPROP_CORNER, Corner);

  
  name = prefix + "equity_total";
  if (ObjectFind(name) == -1) {
    ObjectCreate(name, OBJ_LABEL, 0, 0, 0);
  }

  ObjectSet(name, OBJPROP_XDISTANCE, 120);
  ObjectSet(name, OBJPROP_YDISTANCE, 35+dy*(i+3));
  
  eq = DoubleToStr(sum, 2);
  if (Equity[i] > 0) eq = "+" + eq;
  eq = "$" + eq;
  
  ObjectSetText(name, eq, 10, "Tahoma", _Data);
  ObjectSet(name, OBJPROP_CORNER, Corner);
    
  name = prefix + "swap_total";
  if (ObjectFind(name) == -1) {
    ObjectCreate(name, OBJ_LABEL, 0, 0, 0);
  }

  ObjectSet(name, OBJPROP_XDISTANCE, 320);
  ObjectSet(name, OBJPROP_YDISTANCE, 35+dy*(i+3));
  
  sw = DoubleToStr(sw_sum, 2);
  if (Swaps[i] > 0) sw = "+" + sw;
  sw = "$" + sw;
  
  ObjectSetText(name, sw, 10, "Tahoma", _Data);
  ObjectSet(name, OBJPROP_CORNER, Corner);
}