//+------------------------------------------------------------------+
//|                                               # Риск от депо.mq4 |
//|                                     Copyright 2014, Kolosov D.E. |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, Kolosov D.E."
#property link      ""
#property version   "1.00"
#property strict
#property indicator_chart_window

extern double mm          =  1.0;      // ММ: 0 - св. маржа; 1 - депозит; 2 - эквити
extern double lot         =  0.01;     // Лот
extern int    min_stop    =  25;       // СЛ (в старых пп)
extern int    min_take    =  100;      // ТП (в старых пп)
extern color  colortext   =  clrBlack; // Цвет текста
extern int    corner      =  3;        // Угол привязки текста
extern int    coord_y     =  12;       // Координата Y
extern int    text_size   =  8;        // Размер шрифта

string        name1       =  "lot";
string        name2       =  "loss";
string        name3       =  "prof";
string        name4       =  "lots";
double        n           =  1.0;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{   
   if (Digits == 3 || Digits == 5) { 
      n = n*10;
      min_stop = min_stop*10;
      min_take = min_take*10;
   }
   return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason)
{
   Comment("");
   ObjectDelete(name1);
   ObjectDelete(name2);
   ObjectDelete(name3);
   ObjectDelete(name4);
}

//+------------------------------------------------------------------+
//| 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[])
  {
   
   RefreshRates();
   
   double Free = 0.0; string freee = "";
   if      (mm == 0.0)  { Free = AccountFreeMargin(); freee = " (ММ по свободной марже)"; }
   else if (mm == 1.0)  { Free = AccountBalance();    freee = " (ММ по балансу)";         }
   else if (mm == 2.0)  { Free = AccountEquity();     freee = " (ММ по эквити)";          }
   else                 { Free = AccountBalance();    freee = " (ММ по балансу)";         }
   
   double LotVal  = MarketInfo(Symbol(),MODE_TICKVALUE)/(MarketInfo(Symbol(),MODE_TICKSIZE)
                   /MarketInfo(Symbol(),MODE_POINT)); //стоимость 1 пункта для 1 лота
   double Min_Lot = MarketInfo(Symbol(),MODE_MINLOT);
   double Max_Lot = MarketInfo(Symbol(),MODE_MAXLOT);
   double Step    = MarketInfo(Symbol(),MODE_LOTSTEP);

   if (LotVal == 0) return (0);
   if (Step   == 0) return (0);
   
   double risk    = lot / Step * ( (min_stop * LotVal * Step) / (Free * 0.01));
   
   double Lot     = lot;//MathFloor((Free*risk/100)/(min_stop*LotVal)/Step)*Step;
   
   if (Lot < Min_Lot) Lot = Min_Lot;
   if (Lot > Max_Lot) Lot = Max_Lot;
   Lot = NormalizeDouble(Lot,2);
      
   string text1, text2, text3, text4, temp;
   double loss, prof, point_price;
   
   //text1 = "Лот " + DoubleToStr(Lot,2) + " (при риске " + DoubleToStr(risk,2) + "% и SL = " + DoubleToStr(min_stop,1) + ")" + freee;
   text1 = "Риск при лоте " + DoubleToStr(lot,2) + " и SL = " + DoubleToStr(min_stop,1) + " равен " + DoubleToStr(risk,2) + "%";
   
   loss  = Lot*LotVal*min_stop;
   text2 = "Возможный убыток: " + DoubleToStr(loss,2) + " " + AccountCurrency();
      
   prof  = Lot*LotVal*min_take;
   text3 = "Возможный профит: " + DoubleToStr(prof,2)  + " " + AccountCurrency() + " при уровне ТП: " + DoubleToStr(min_take,1) + " пунктов";
   
   point_price = Lot*LotVal*n;
   text4 = "Стоимость одного пункта при лоте " + DoubleToStr(Lot,2) + ": " + DoubleToStr(point_price,2) + " " + AccountCurrency();
   
   if (corner == 2 || corner == 3) { temp = text4; text4 = text1; text1 = temp; temp = text3; text3 = text2; text2 = temp; }
   
   SetLabel(name1, text1, colortext, 3, coord_y,      corner, text_size);
   SetLabel(name2, text2, colortext, 3, coord_y + 15, corner, text_size);
   SetLabel(name3, text3, colortext, 3, coord_y + 30, corner, text_size);
   SetLabel(name4, text4, colortext, 3, coord_y + 45, corner, text_size);


   return(rates_total);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//|  Параметры:                                                      |
//|    nm - наименование объекта                                     |
//|    tx - текст                                                    |
//|    cl - цвет метки                                               |
//|    xd - координата X в пикселах                                  |
//|    yd - координата Y в пикселах                                  |
//|    cr - номер угла привязки        (0 - левый верхний)           |
//|    fs - размер шрифта              (8 - по умолчанию)            |
//+------------------------------------------------------------------+
void SetLabel(string nm, string tx, color cl, int xd, int yd, int cr, int fs) 
{
   if (ObjectFind(nm) < 0) ObjectCreate(nm, OBJ_LABEL, 0, 0,0);
   ObjectSetText(nm, tx, fs);
   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);
}
//+------------------------------------------------------------------+