//+------------------------------------------------------------------+
//|                                               ZeroMarginLine.mq4 |
//|                                                           Kirill |
//|                                          StockProgrammer@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Kirill"
#property link      "StockProgrammer@mail.ru"

#property indicator_chart_window

//Индикатор рисует уровень на графике торгуемой валюты, при достижении которого ценой 
//все открытые позиции в сумме уйдут в такой минус, что свободная маржа станет равна нулю.
//Работает только при торговле по одной валюте.
//Отложенные ордера не принимаются в расчёт
//
//Варианты режима расчета могут принимать следующие значения:
//v.0 - "Нереализованные прибыли/убытки не используются. Свобожная маржа не зависит от тек. цены."
//v.1 - "При расчете свободных средств используется как нереализованная прибыль, так и убыток по открытым позициям на текущем счете."
//v.2 - "Нереализованные убытки не используются. Свобожная маржа не уменьшается при изменении тек. цены."
//v.3 - "При расчете используется только значение убытка, текущая прибыль по открытым позициям не учитывается. Будет рассчитано два уровня."

extern color   Colour   = Yellow;
extern int     Style    = 0;     //0,1,2,3,4
extern int     Width    = 3;     //0,1,2,3,4
extern string  koordinat_pips_probel   = "               "; 


string comment = "";

int deinit()
{
   ObjectDelete("ZeroLevel");
   ObjectDelete("ZeroLevel_BUY");
   ObjectDelete("ZeroLevel_SELL");
   Comment("");
}

int start()
{
   int i, total = OrdersTotal();
   double lots=0.0, shift;
   
   if(AccountFreeMarginMode() == 0)
      Comment_("v.0" + " - Нереализованные прибыли/убытки не используются. \n Свобожная маржа не зависит от тек. цены.");
   else if(AccountFreeMarginMode() == 2)
      Comment_("v.2" + " - Нереализованные убытки не используются. \n Свобожная маржа не уменьшается при изменении тек. цены.");
   else if(AccountFreeMarginMode() == 1)
   {
      Comment_("v.1" + " - При расчете свободных средств используется как нереализованная прибыль, \n так и убыток по открытым позициям на текущем счете.");
      for(i=0; i<total; i++)
      {
         OrderSelect(i, SELECT_BY_POS);
         if(OrderSymbol() == Symbol() && OrderType() == OP_BUY)
            lots += OrderLots();   
         else if(OrderSymbol() == Symbol() && OrderType() == OP_SELL)
            lots -= OrderLots();
      }
      
      if(lots == 0.0)
      {
         ObjectDelete("ZeroLevel");
         Comment_("Все позиции находятся в локе. Для расчета нет данных." /*"All Postions Are Locked. Calculations cancelled."*/);
      }
      
      else
      {
         shift = AccountFreeMargin() / (MarketInfo(Symbol(), MODE_LOTSIZE) * lots * Point);
         ObjectDelete("ZeroLevel");
         ObjectCreate("ZeroLevel", OBJ_HLINE, 0, 0, Bid - shift*Point);
         ObjectSet("ZeroLevel", OBJPROP_COLOR, Colour);
         ObjectSet("ZeroLevel", OBJPROP_STYLE, Style);
         ObjectSet("ZeroLevel", OBJPROP_WIDTH, Width);
         
//######################################################################################################



//double   aa, bb;     
int  cc, shift2;
shift2 = shift*(-1);
//aa = Bid - shift*Point;
//bb = Bid;
cc = (shift2);


ObjectDelete("pips");

if(ObjectFind("pips") != 0)
{
ObjectCreate("pips", OBJ_TEXT, 0, Time[0], Close[0] + 0.0005);
//ObjectSetText("pips", "                                        " + aa , 18, "Verdana", DodgerBlue);
//ObjectSetText("pips", "                                        " + bb , 18, "Verdana", DodgerBlue);
ObjectSetText("pips", koordinat_pips_probel + cc , 18, "Verdana", Yellow);


}
else
{
ObjectMove("pips", 2, Time[0], Close[0] + 0.0005);
}
//######################################################################################################

 



//###################################################################################################### 
         Comment_("Уровень маржи - 0:    " + DoubleToStr(Bid - shift*Point, Digits));
         Comment_("Текущий  уровень:     " + DoubleToStr(Bid, Digits));
         Comment_("Осталось пунктов:    " + DoubleToStr(MathAbs(shift), 0));  
       }
   }
   else if(AccountFreeMarginMode() == 3)
   {
      Comment_("v.3" + " - При расчете используется только значение убытка, \n текущая прибыль по открытым позициям не учитывается. Будет рассчитано два уровня.");

      for(i=0; i<total; i++)
      {
         OrderSelect(i, SELECT_BY_POS);
         if(OrderSymbol() == Symbol() && OrderType() == OP_BUY)
            lots += OrderLots();   
      }
      if(lots == 0.0)
      {
         ObjectDelete("ZeroLevel_BUY");
         Comment_("Нет позиций на покупку (BUY)." /*"No Buy Positions."*/);
      }
      else
      {
         shift = AccountFreeMargin() / (MarketInfo(Symbol(), MODE_LOTSIZE) * lots * Point);
         ObjectDelete("ZeroLevel_BUY");
         ObjectCreate("ZeroLevel_BUY", OBJ_HLINE, 0, 0, Bid - shift*Point);
         ObjectSet("ZeroLevel_BUY", OBJPROP_COLOR, Colour);
         ObjectSet("ZeroLevel_BUY", OBJPROP_STYLE, Style);
         ObjectSet("ZeroLevel_BUY", OBJPROP_WIDTH, Width);
         Comment_("ZeroLevel_BUY:    " + DoubleToStr(Bid - shift*Point, Digits));
         Comment_("Current Bid:      " + DoubleToStr(Bid, Digits));
         Comment_("Points Left:       " + DoubleToStr(MathAbs(shift), 0));               
      }

      for(i=0; i<total; i++)
      {
         OrderSelect(i, SELECT_BY_POS);
         if(OrderSymbol() == Symbol() && OrderType() == OP_SELL)
            lots += OrderLots();   
      }
      if(lots == 0.0)
      {
         ObjectDelete("ZeroLevel_SELL");
         Comment_("Нет позиций на продажу (SELL)." /*"No SELL Positions."*/);
      }
      else
      {
         shift = AccountFreeMargin() / (MarketInfo(Symbol(), MODE_LOTSIZE) * lots * Point);
         ObjectDelete("ZeroLevel_SELL");
         ObjectCreate("ZeroLevel_SELL", OBJ_HLINE, 0, 0, Bid + shift*Point);
         ObjectSet("ZeroLevel_SELL", OBJPROP_COLOR, Colour);
         ObjectSet("ZeroLevel_SELL", OBJPROP_STYLE, Style);
         ObjectSet("ZeroLevel_SELL", OBJPROP_WIDTH, Width);
         Comment_("ZeroLevel_SELL:    " + DoubleToStr(Bid + shift*Point, Digits));
         Comment_("Current Bid:       " + DoubleToStr(Bid, Digits));
         Comment_("Points Left:        " + DoubleToStr(MathAbs(shift), 0));               
      } 
   }
   
   Comment_("-------------------------------\nАвторы: Bor-ix и Kirill ;)");
   Comment("ZeroMarginLineIndicator v1.2"+"\n"+"При поддержке www.FX4U.ru"+comment);
   comment = "";
  
   return(0);
}

void Comment_(string com)
{
   comment = comment + "\n" + com;
}


