//+------------------------------------------------------------------+
//|                                                     Drawdown.mq4 |
//|                                          Copyright 2014, ForexDE |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, ForexDE"
#property link      ""
#property version   "1.00"
#property strict
#property indicator_chart_window

//+------------------------------------------------------------------+
//| Parameters                                                       |
//+------------------------------------------------------------------+
extern double  mm    =  1.0;        // Просадка от: 0 - св. маржа; 1 - депозит; 2 - эквити
extern double  dd    =  2.0;        // Уровень просадки (в %)
extern color   ddc   =  clrRed;     // Цвет надписи просадки
extern bool    fl_lp =  true;       // Отображать уровень профита?
extern double  lp    =  2.0;        // Уровень профита (в %)
extern color   lpc   =  clrBlue;    // Цвет надписи профита
extern bool    fl_bu =  true;       // Отображать уровень безубытка?
extern color   buc   =  clrGreen;   // Цвет уровня безубыточности
extern int     mn    =  0;          // Магики (0 - если руками)
extern int     tx_fs =  8;          // Размер шрифта

// Структура с информацией по просадкам и профитам
struct dd_value 
{
   string buy_text[2];
   string sell_text[2];
   string buy_name[2];
   string sell_name[2];
   string buy_text_nm[2];
   string sell_text_nm[2];
   string buy_bu_name;
   string sell_bu_name;
} new_dd;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
   new_dd.buy_name[0]     = "buy_level_pr_"  + Symbol();
   new_dd.buy_name[1]     = "buy_level_dd_"  + Symbol();
   new_dd.sell_name[0]    = "sell_level_pr_" + Symbol();
   new_dd.sell_name[1]    = "sell_level_dd_" + Symbol();
   new_dd.buy_text_nm[0]  = "buy_text_pr_"   + Symbol();
   new_dd.buy_text_nm[1]  = "buy_text_dd_"   + Symbol();
   new_dd.sell_text_nm[0] = "sell_text_pr_"  + Symbol();
   new_dd.sell_text_nm[1] = "sell_text_dd_"  + Symbol();
   new_dd.buy_bu_name     = "buy_bu_name_"   + Symbol();
   new_dd.sell_bu_name    = "sell_bu_name_"  + Symbol();
      
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   ObjectDelete(new_dd.buy_name[0]);
   ObjectDelete(new_dd.buy_name[1]);
   ObjectDelete(new_dd.sell_name[0]);
   ObjectDelete(new_dd.sell_name[1]);
   ObjectDelete(new_dd.buy_text_nm[0]);
   ObjectDelete(new_dd.buy_text_nm[1]);
   ObjectDelete(new_dd.sell_text_nm[0]);
   ObjectDelete(new_dd.sell_text_nm[1]);
   ObjectDelete(new_dd.buy_bu_name);
   ObjectDelete(new_dd.sell_bu_name);

   Comment("");
}
//+------------------------------------------------------------------+
//| 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[])
{
   // Величина депозита
   double balance = 0;
   if (mm == 0) balance = AccountFreeMargin();
   if (mm == 1) balance = AccountBalance();
   if (mm == 2) balance = AccountEquity();
   
   // Найдём просадку, выраженную в денежном эквиваленте
   double money_dd = - balance * dd / 100.0;
   
   // Вычисление ДДПрайс
   double PB = ProfitPrice(Symbol(), OP_BUY,  mn, money_dd);
   double PS = ProfitPrice(Symbol(), OP_SELL, mn, money_dd);
   
   // Текст
   new_dd.buy_text[1]  = "DD = " + DoubleToStr(dd,1) + "% | " + DoubleToStr(money_dd,2) + " " + AccountCurrency();
   new_dd.sell_text[1] = "DD = " + DoubleToStr(dd,1) + "% | " + DoubleToStr(money_dd,2) + " " + AccountCurrency();
   
   // Рисуем
   SetPriceLine(PB, new_dd.buy_name[1],  ddc);
   SetText(new_dd.buy_text_nm[1],new_dd.buy_text[1],ddc,TimeCurrent(),NormalizeDouble(PB,Digits),tx_fs);

   SetPriceLine(PS, new_dd.sell_name[1], ddc);
   SetText(new_dd.sell_text_nm[1],new_dd.sell_text[1],ddc,TimeCurrent(),NormalizeDouble(PS,Digits),tx_fs);
   
   if (fl_lp) {
      // Найдём профит, выраженный в денежном эквиваленте
      double money_lp = balance * lp / 100.0;

      // Вычисление ДДПрайс
      double PBDD = ProfitPrice(Symbol(), OP_BUY,  mn, money_lp);
      double PSDD = ProfitPrice(Symbol(), OP_SELL, mn, money_lp);
      
      // Текст
      new_dd.buy_text[0]  = "Profit = " + DoubleToStr(lp,1) + "% | " + DoubleToStr(money_lp,2) + " " + AccountCurrency();
      new_dd.sell_text[0] = "Profit = " + DoubleToStr(lp,1) + "% | " + DoubleToStr(money_lp,2) + " " + AccountCurrency();
      
      // Рисуем
      SetPriceLine(PBDD, new_dd.buy_name[0],  lpc);
      SetText(new_dd.buy_text_nm[0],new_dd.buy_text[0],lpc,TimeCurrent(),NormalizeDouble(PBDD,Digits),tx_fs);
      SetPriceLine(PSDD, new_dd.sell_name[0], lpc);
      SetText(new_dd.sell_text_nm[0],new_dd.sell_text[0],lpc,TimeCurrent(),NormalizeDouble(PSDD,Digits),tx_fs);
   }
   
   if (fl_bu) {
      // Найдём профит, выраженный в денежном эквиваленте
      double money_bu = 0.0;

      // Вычисление ДДПрайс
      double PBBU = ProfitPrice(Symbol(), OP_BUY,  mn, money_bu);
      double PSBU = ProfitPrice(Symbol(), OP_SELL, mn, money_bu);
      
      // Рисуем
      SetPriceLine(PBBU, new_dd.buy_bu_name,  buc);
      SetPriceLine(PSBU, new_dd.sell_bu_name, buc);
   }

   return(rates_total);
}
//+------------------------------------------------------------------+
/*void find_dd_buy()
{
   
   for (int i = OrdersTotal() - 1; i >= 0; i--) {
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) {
         if (OrderSymbol() == Symbol()) {
            if (OrderType() == OP_BUY) {
               // Проверяем, в рынке ли ордер
               if (OrderCloseTime() == 0) {
                  
               }
            }
         }
      }
   }
}*/

//+------------------------------------------------------------------+
double ProfitPrice(string fSymbol, int fType, int fMagic=0, double MyProfit=0.0)
{
   //Функция возвращает цену, на которую необходимо установить уровень TakeProfit, чтобы получить прибыль MyProfit
   double SummPrice=0.0, SummLots=0.0, Formula=0.0, SummLoss=0.0;
   int k = 0;
   int total = OrdersTotal();
   for (int i = total-1; i >= 0; i--) {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
         if(OrderSymbol()==fSymbol) {
            if(OrderMagicNumber()==fMagic || fMagic==0) {
               if(OrderType()==fType) {
                  k++;
                  SummLots=SummLots+OrderLots();
                  SummPrice=SummPrice+OrderOpenPrice()*OrderLots();
                  SummLoss=SummLoss+OrderCommission()+OrderSwap();
               }
            }
         }
      }
   }//Next i  
   
   if(k>0){
      if(fType==OP_BUY){
         Formula = SummPrice/SummLots + 
         (MyProfit-SummLoss) * MarketInfo(fSymbol, MODE_POINT) / 
         (MarketInfo(fSymbol, MODE_TICKVALUE) * SummLots);
      } else {
         Formula = SummPrice/SummLots - 
         (MyProfit-SummLoss) * MarketInfo(fSymbol, MODE_POINT) / 
         (MarketInfo(fSymbol, MODE_TICKVALUE) * SummLots);
      }
   }
   
   return(Formula);
}//ProfitPrice()
//+------------------------------------------------------------------+
void SetPriceLine(double Price=0.0, string NameLine = "MyLine", color ColorLine = DarkOliveGreen){
   int indWnd=0;
   //hWnd = WindowFind(window);
   if (ObjectFind(NameLine)==-1) ObjectCreate(NameLine, OBJ_HLINE, indWnd, 0, Price);
   if(Price==0.0){
      ObjectDelete(NameLine);
   }else{
      ObjectSet(NameLine, OBJPROP_PRICE1, Price);
      ObjectSet(NameLine, OBJPROP_COLOR, ColorLine);
   }
}//SetPriceLine()

bool SetText(string nm, string tx, color cl, datetime time, double price, int fs) 
{
   time += 5*Period()*60;
   //--- сбросим значение ошибки
   ResetLastError();
   //--- создадим объект "Текст"
   if (ObjectFind(nm) < 0) {
      ObjectCreate(0, nm, OBJ_TEXT, 0, time, price);
   } 
   
   ObjectMove(0, nm, 0, time, price);
     
   //--- установим текст
   ObjectSetString(0, nm, OBJPROP_TEXT, tx);
   
   //--- установим размер шрифта
   ObjectSetInteger(0, nm, OBJPROP_FONTSIZE, fs);
   
   //--- установим угол наклона текста
   ObjectSetDouble(0, nm, OBJPROP_ANGLE, 0.0);
   
   //--- установим способ привязки
   ObjectSetInteger(0, nm, OBJPROP_ANCHOR, ANCHOR_LEFT_LOWER);
   
   //--- установим цвет 
   ObjectSetInteger(0, nm, OBJPROP_COLOR, cl);
   
   //--- отобразим на переднем (false) или заднем (true) плане
   ObjectSetInteger(0, nm, OBJPROP_BACK, false);
   
   //--- включим (true) или отключим (false) режим перемещения объекта мышью
   ObjectSetInteger(0, nm, OBJPROP_SELECTABLE, false);
   ObjectSetInteger(0 ,nm, OBJPROP_SELECTED,   false);
   
   return (true);
}