//+------------------------------------------------------------------+
//|                                                RiskManager-2.mq4 |
//|                                  Copyright © 2013, 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 PointPrice=1.25;    // Стоимость тика делим на количество пипсов в тике (На минлоте).


  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;
   bool FirstTime;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   FirstTime = true;
  return(0);
  }
  
int deinit()
  {
  return(0);
  }

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
  ATR=iATR(NULL,0,120,1);  
  LHigh=iHigh(NULL,0,iHighest(NULL,0,MODE_HIGH,P,0));   
  LLow=iLow(NULL,0,iLowest(NULL,0,MODE_LOW,P,0));       
  
  // Для всех остальных инструментов
  ML=MarketInfo(Symbol(),MODE_MINLOT);
  PP=PointPrice;  

  //Для валютных пар и золота с серебром
  if (Symbol()=="USDJPY" ||Symbol()=="EURJPY" ||Symbol()=="GBPJPY" ||Symbol()=="CHFJPY" ||Symbol()=="AUDJPY" || Symbol()=="NZDJPY" || Symbol()=="CADJPY" || Symbol()=="NOKJPY" || Symbol()=="SEKJPY" || Symbol()=="SGDJPY") 
  {
  CP=MarketInfo("USDJPY",MODE_BID);
  PP=(100/CP)*ML;  
  }
  
  if (Symbol()=="EURNZD" || Symbol()=="AUDNZD" || Symbol()=="GBPNZD") 
  {
  CP=MarketInfo("NZDUSD",MODE_BID);
  PP=CP*ML; 
  }
  
  if (Symbol()=="USDCAD" || Symbol()=="EURCAD" ||Symbol()=="GBPCAD" ||Symbol()=="AUDCAD" ||Symbol()=="NZDCAD") 
  {
  CP=MarketInfo("USDCAD",MODE_BID);
  PP=(1/CP)*ML; 
  }
 
  if (Symbol()=="USDMXN" || Symbol()=="EURMXN" ||Symbol()=="GBPMXN" ||Symbol()=="AUDMXN" ||Symbol()=="NZDMXN") 
  {
  CP=MarketInfo("USDMXN",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" || Symbol()=="EURSGD" || Symbol()=="GBPSGD" || Symbol()=="AUDSGD") 
  {
  CP=MarketInfo("USDSGD",MODE_BID);
  PP=(1/CP)*ML; 
  }
 
  if (Symbol()=="USDHKD") 
  {
  CP=MarketInfo("USDHKD",MODE_BID);
  PP=(1/CP)*ML; 
  }
  
  if (Symbol()=="USDSEK" ||Symbol()=="EURSEK" ||Symbol()=="GBPSEK" ||Symbol()=="CHFSEK" ||Symbol()=="AUDSEK" || Symbol()=="NZDSEK" || Symbol()=="CADSEK") 
  {
  CP=MarketInfo("USDSEK",MODE_BID);
  PP=(1/CP)*ML;  
  } 
  
  if (Symbol()=="USDSGD" ||Symbol()=="EURSGD" ||Symbol()=="GBPSGD" ||Symbol()=="CHFSGD" ||Symbol()=="AUDSGD" || Symbol()=="NZDSGD" || Symbol()=="CADSGD") 
  {
  CP=MarketInfo("USDSGD",MODE_BID);
  PP=(1/CP)*ML;  
  } 
  
    
  if (Symbol()=="USDDKK" ||Symbol()=="EURDKK" ||Symbol()=="GBPDKK" ||Symbol()=="CHFDKK" ||Symbol()=="AUDDKK" || Symbol()=="NZDDKK" || Symbol()=="CADDKK") 
  {
  CP=MarketInfo("USDDKK",MODE_BID);
  PP=(1/CP)*ML;  
  } 

  if (Symbol()=="USDNOK" ||Symbol()=="EURNOK" ||Symbol()=="GBPNOK" ||Symbol()=="CHFNOK" ||Symbol()=="AUDNOK" || Symbol()=="NZDNOK" || Symbol()=="CADNOK") 
  {
  CP=MarketInfo("USDNOK",MODE_BID);
  PP=(1/CP)*ML;  
  } 

  if (FirstTime)
  {
     ObjectsDeleteAll(0,OBJ_HLINE); 
  
     ObjectCreate("STOP Level for  Short Position", OBJ_HLINE,0,0,LHigh);  
     ObjectSet("STOP Level for  Short Position",OBJPROP_STYLE,3);
     ObjectSet("STOP Level for  Short Position",OBJPROP_COLOR,Teal);   
     ObjectSet("STOP Level for  Short Position",OBJPROP_WIDTH,0);

     ObjectCreate("STOP Level for  Long Position", OBJ_HLINE,0,0,LLow);    
     ObjectSet("STOP Level for  Long Position",OBJPROP_STYLE,3);
     ObjectSet("STOP Level for  Long Position",OBJPROP_COLOR,FireBrick);
     ObjectSet("STOP Level for  Long Position",OBJPROP_WIDTH,0);  
     FirstTime = false;
  }
   else
   {
      LHigh = ObjectGet("STOP Level for  Short Position",OBJ_HLINE);
      LLow = ObjectGet("STOP Level for  Long Position",OBJ_HLINE);
   }
  
  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, 
         "\n",
         "\n", "Стоп для Current Long  ",LLow,"  или  ",NormalizeDouble(((Ask-LLow)/Point/10),1)," pips -  Позиция ", NormalizeDouble(Pl,0),"000 базовой валюты,  в лотах ", NormalizeDouble(Pl/100,2),
         "\n", "Стоп для Current Short ",LHigh,"  или  ",NormalizeDouble(((LHigh-Bid)/Point/10),1)," pips -  Позиция ", NormalizeDouble(Ps,0),"000 базовой валюты,  в лотах ", NormalizeDouble(Ps/100,2),
         "\n", 
         "\n", "Волатильность - АTR(120) = ",MathCeil(ATR/(Point)/10)," pips, ");
//*/

  return(0);
  }
//+------------------------------------------------------------------+