//+------------------------------------------------------------------+
//|                                                  RiskManager.mq4 |
//|                                  Copyright © 2012, My Everest.ru |
//|                                                                  |
//+------------------------------------------------------------------+

/*
Идея индикатора заключена в отрисовкe горизонтальных уровней по максимумам и минимумам
за указанное в параметре Р количество баров. Также в качестве параметров задаются значения
торгового лимита, минимальный лот и % риска на сделку и рассчитывается объем позиции.

*/

#property indicator_chart_window
//#property indicator_separate_window
extern int    TL=1000;            // Торговый лимит
extern double RiskPercent=3.0;    // Риск на сделку
extern int    P=30;               // Параметр торгового диапазона
extern double Spr=30;             // Отступ от экстремальных точек
extern double PointPrice=1.25;    // Стоимость тика делим на количество пипсов в тике (На минлоте).
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
  return(0);
  }
  
int deinit()
  {
  return(0);
  }

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
  int i;
  double MTL, ML, LHigh, LLow, CP, PP, ALS, ASS, ARS, Risk, Pr, Ps, Pl, ATR, ATRH, ATRL, ATR_Pos, RM;
  double ARO, Po;
  ATR=iATR(NULL,0,120,1);  
  //Spr=NormalizeDouble((ATR/4)/Point,0);
  LHigh=iHigh(NULL,0,iHighest(NULL,0,MODE_HIGH,P,0))+(Spr*2*Point);     //+Point);
  LLow=iLow(NULL,0,iLowest(NULL,0,MODE_LOW,P,0))-(Spr*Point);           // Point; 
  
  // Для всех остальных инструментов
  ML=MarketInfo(Symbol(),MODE_MINLOT);
  PP=PointPrice;  

  //Для валютных пар и золота с серебром
  if (Symbol()=="USDJPY" ||Symbol()=="EURJPY" ||Symbol()=="GBPJPY" ||Symbol()=="CHFJPY" ||Symbol()=="AUDJPY" || Symbol()=="NZDJPY" || Symbol()=="CADJPY") 
  {
  CP=MarketInfo("USDJPY",MODE_BID);
  PP=(100/CP)*ML;  
  }
  
  if (Symbol()=="EURNZD" ||Symbol()=="AUDNZD" ||Symbol()=="GBPNZD") 
  {
  CP=MarketInfo("NZDUSD",MODE_BID);
  PP=(1/CP)*ML;  
  }
  
  if (Symbol()=="USDCAD" || Symbol()=="EURCAD" ||Symbol()=="GBPCAD" ||Symbol()=="AUDCAD" ||Symbol()=="NZDCAD") 
  {
  CP=MarketInfo("USDCAD",MODE_BID);
  PP=(1/CP)*ML; 
  }
 
  if (Symbol()=="EURUSD" || Symbol()=="GBPUSD" ||Symbol()=="NZDUSD" ||Symbol()=="AUDUSD") 
  {
  PP=ML; 
  }

  if (Symbol()=="XAUUSD") 
  {
  CP=MarketInfo("XAUUSD",MODE_BID);
  PP=Point/ML; 
  }

  if (Symbol()=="XAGUSD")
  {
  CP=MarketInfo("XAGUSD",MODE_BID);
  PP=Point/ML*50; 
  }
  
  if (Symbol()=="USDCHF" || Symbol()=="EURCHF" ||Symbol()=="GBPCHF" ||Symbol()=="AUDCHF" ||Symbol()=="CADCHF" ||Symbol()=="AUDCHF" ||Symbol()=="NZDCHF") 
  {
  CP=MarketInfo("USDCHF",MODE_BID);
  PP=(1/CP)*ML; 
  }

  if (Symbol()=="EURGBP" || Symbol()=="NZDGBP") 
  {
  CP=MarketInfo("GBPUSD",MODE_BID);
  PP=CP*ML; 
  }
 
  if (Symbol()=="EURAUD" || Symbol()=="GBPAUD") 
  {
  CP=MarketInfo("AUDUSD",MODE_BID);
  PP=CP*ML; 
  }
 
  if (Symbol()=="USDSGD") 
  {
  CP=MarketInfo("USDSGD",MODE_BID);
  PP=(1/CP)*ML; 
  }
 
  if (Symbol()=="USDHKD") 
  {
  CP=MarketInfo("USDHKD",MODE_BID);
  PP=(1/CP)*ML; 
  }
    
  ObjectsDeleteAll(0,OBJ_HLINE); 
  
  ObjectCreate("BUY Stop Level", OBJ_HLINE,0,0,LHigh);  
  ObjectSet("BUY Stop Level",OBJPROP_STYLE,3);
  ObjectSet("BUY Stop Level",OBJPROP_COLOR,Teal);   
  ObjectSet("BUY Stop Level",OBJPROP_WIDTH,0);

  ObjectCreate("SELL Stop Level", OBJ_HLINE,0,0,LLow);    
  ObjectSet("SELL Stop Level",OBJPROP_STYLE,3);
  ObjectSet("SELL Stop Level",OBJPROP_COLOR,FireBrick);
  ObjectSet("SELL Stop Level",OBJPROP_WIDTH,0);  
  

  
  Risk=NormalizeDouble(TL*(RiskPercent/100),2);  
  
  ALS=NormalizeDouble((((Ask-LLow)/(Point))*PP),2);     //Стоимость Стопа в $$$ для длинной позиции
  ASS=NormalizeDouble((((LHigh-Bid)/(Point))*PP),2);     //Стоимость Стопа в $$$ для короткой позиции


  MTL=NormalizeDouble((ATR/Point)*240*PP,2);
   
  Ps=(Risk/ASS);         // Объем позиции для короткой позиции
  if (Risk/ASS < 1) Ps=0; 
  
  Pl=(Risk/ALS);         // Объем позиции для длинной позиции
  if (Risk/ALS < 1) Pl=0; 
  
    
//*
  Comment("\n",
         "Параметр ", P,",  Стоимость пипса на минлоте  $", NormalizeDouble(PP,3),",   Минлот ",ML,",    Point = ",DoubleToStr(Point,5),
         "\n",
         "\n", "Торговый лимит $",TL,", Риск на сделку ",RiskPercent,"%, "," в сумме ", Risk, "$",
         "\n", "Минимальный торговый лимит $ ",MTL,",   Спред  ", (Ask-Bid)/Point/10, ",  Отступ от Еxtrm ", NormalizeDouble(Spr/10,1),
         "\n",
         "\n", "Стоп для Current Long  ",LLow,"  или  ",NormalizeDouble(((Ask-LLow)/Point),1)," pips -  Позиция ", NormalizeDouble(Pl,0),"000 базовой валюты,  в лотах ", NormalizeDouble(Pl/100,2),
         "\n", "Стоп для Current Short ",LHigh,"  или  ",NormalizeDouble(((LHigh-Bid)/Point),1)," pips -  Позиция ", NormalizeDouble(Ps,0),"000 базовой валюты,  в лотах ", NormalizeDouble(Ps/100,2),
         "\n", 
         "\n", "Волатильность - АTR(120) = ",MathCeil(ATR/(Point)/10)," pips, ");
//*/

  return(0);
  }
//+------------------------------------------------------------------+