
#property copyright "© 2008 Takbir 2.0"
#property link      "www.stigal.com"

#define major   1
#define minor   4

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Blue
#property indicator_color2 Red
#property indicator_width1  1
#property indicator_width2  1
 //в версии 7  сделал след. изменения 
 //1)исправил ошибку что от параметра ShowInfo есть зависимость сигналов
 //2)исправлена ошибка при изменении врем.интервала и в начале работы индикатора срабатывают сигналы 
 //3)добавлен параметр pluspip - отступ от Азан и Икамат
// в версии 8 добавил звуки другие и добавил в алерт период и пипс поставил 0
extern string _tmp1_ = " --- Alerts ---";
extern bool SendMailOnBreakout = true;
extern string UpBreakout.MailText = "Kimma crashed";
extern string DnBreakout.MailText = "Yamma crashed";
extern bool PlaySoundOnBreakout = true;
extern string UpBreakout.SoundFile = "Athan_Up.wav";
extern string DnBreakout.SoundFile = "Athan_Down.wav";
extern string IUpBreakout.SoundFile = "Iqamat_Up.wav";
extern string IDnBreakout.SoundFile = "Iqamat_Down.wav";
extern int    pluspip        = 1;      // Дополнительный pip

extern string _tmp2_ = " --- Lines ---";
extern color UFrLine.color = Blue;
extern int UFrLine.width = 1;
extern int UFrLine.style = STYLE_DASH;
extern int UFrLine.len = 10;

extern color LFrLine.color = Red;
extern int LFrLine.width = 1;
extern int LFrLine.style = STYLE_DASH;
extern int LFrLine.len = 10;

extern color TrendLine.color = Red;
extern int TrendLine.width = 2;
extern int TrendLine.style = STYLE_SOLID;

extern color CrossLine.color = Black;
extern int CrossLine.width = 2;
extern int CrossLine.style = STYLE_SOLID;

extern bool UseRightOrder = false;
extern int SpacesForShift = 4;
extern bool ShowInfo = false;
double UpperFr[];
double LowerFr[];



double LastUpAzan=0;
double LastDwAzan=0;

double LastUpIkamat=0;
double LastDwIkamat=0;

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

int Bars.left = 5;
int Bars.right = 5;

datetime LUF.LastTime = -1;
datetime LLF.LastTime = -1;

double Ikamat.LastBar1 = -1;
double Azan.LastBar1 = -1;

double Ikamat.LastBar2 = -1;
double Azan.LastBar2 = -1;

string prefix = "";
string SpacesShift = "";

bool TradeAUp= false; //разрешено торговать
bool firstAUp= true; //

bool TradeIUp= false; //разрешено торговать
bool firstIUp= true; //

bool TradeADw= false; //разрешено торговать
bool firstADw= true; //

bool TradeIDw= false; //разрешено торговать
bool firstIDw= true; //

int     pos=0;
void init() 
{
 double Ikamat.LastBar1 = -1;
 double Azan.LastBar1 = -1;

 double Ikamat.LastBar2 = -1;
 double Azan.LastBar2 = -1;

  SetIndexBuffer(0, UpperFr);
  SetIndexBuffer(1, LowerFr);
  
  SetIndexEmptyValue(0, 0);
  SetIndexEmptyValue(1, 0);
    
  SetIndexStyle(0, DRAW_ARROW);
  SetIndexArrow(0, 217);

  SetIndexStyle(1, DRAW_ARROW);
  SetIndexArrow(1, 218);  
   

  prefix = WindowExpertName() + "_";
  ClearObj();
  for (int j = 1;j < SpacesForShift;j++)
     SpacesShift = SpacesShift + " ";
  Comment("");
  bool TradeAUp= false; //разрешено торговать
  bool firstAUp= true; //

  bool TradeIUp= false; //разрешено торговать
  bool firstIUp= true; //

  bool TradeADw= false; //разрешено торговать
  bool firstADw= true; //

  bool TradeIDw= false; //разрешено торговать
  bool firstIDw= true; //
  pos=0;
}

void deinit()
{
  ClearObj();
  Comment("");
}

void start()
{
  int counted = IndicatorCounted();
  if (counted < 0) return (-1);
  if (counted > 0) counted--;
  
  int limit = Bars-counted;
  
  //-----
  
  double dy = 0;
  for (int i=1; i <= 20; i++) {
    dy += 0.3*(High[i]-Low[i])/20;
  }
  
  //Такбиры имеют поочередность. Если появился верхний то следующим должен быть нижний. 
  //Все очередные отмечаются сплошной линией в длину 10 свечей. 
  //Если после верхнего появился еще раз верхний то из них сплошной и очередным является тот 
  //у кого выше цена (high), если у них цены одинаковые то отмечается последних по счету.
  
  string obj_name;
  int last_fr = 0;
  int last_high_fr_bar = -1;
  int last_low_fr_bar = -1;
  int CountedBars;
  int CountedTakbirs;
  
  //for (i=1+Bars.right; i <= limit+Bars.left; i++) 
  for (i=limit+Bars.left; i >= 1+Bars.right; i--)
  {
    UpperFr[i] = 0;
    LowerFr[i] = 0;
  
    if (IsUpperFr(i))
    {
      UpperFr[i] = High[i] + dy;
      
      //-----
      
      obj_name = prefix + "UFr" + Time[i];
      if (ObjectFind(obj_name) == -1)
      {
        ObjectCreate(obj_name, OBJ_TREND, 0, 0, 0);
      }
      
      int bar0 = MathMax(i-UFrLine.len, 0);
      ObjectMove(obj_name, 0, Time[i], High[i]);
      ObjectMove(obj_name, 1, Time[bar0], High[i]);
      ObjectSet(obj_name, OBJPROP_COLOR, UFrLine.color);
      ObjectSet(obj_name, OBJPROP_WIDTH, UFrLine.width);
      ObjectSet(obj_name, OBJPROP_STYLE, UFrLine.style);
      ObjectSet(obj_name, OBJPROP_RAY, false);
      
      if (last_fr == -1)
      {
        ObjectSet(obj_name, OBJPROP_STYLE, STYLE_SOLID);
      }

      if (last_fr != -1 && last_high_fr_bar != -1 && High[i] >= High[last_high_fr_bar])
      {
        ObjectSet(obj_name, OBJPROP_STYLE, STYLE_SOLID);
        
        obj_name = prefix + "UFr" + Time[last_high_fr_bar];  
        if (ObjectFind(obj_name) != -1)
        {
          ObjectSet(obj_name, OBJPROP_STYLE, UFrLine.style);        
        }
      }
      
      last_high_fr_bar = i;
      last_low_fr_bar = -1;
      last_fr = +1;
    }
    
    if (IsLowerFr(i))
    {
      LowerFr[i] = Low[i] - dy;
      
      //-----
      
      obj_name = prefix + "LFr" + Time[i];
      if (ObjectFind(obj_name) == -1)
      {
        ObjectCreate(obj_name, OBJ_TREND, 0, 0, 0);
      }
      
      bar0 = MathMax(i-LFrLine.len, 0);
      ObjectMove(obj_name, 0, Time[i], Low[i]);
      ObjectMove(obj_name, 1, Time[bar0], Low[i]);
      ObjectSet(obj_name, OBJPROP_COLOR, LFrLine.color);
      ObjectSet(obj_name, OBJPROP_WIDTH, LFrLine.width);
      ObjectSet(obj_name, OBJPROP_STYLE, LFrLine.style);
      ObjectSet(obj_name, OBJPROP_RAY, false);
      
      if (last_fr == +1)
      {
        ObjectSet(obj_name, OBJPROP_STYLE, STYLE_SOLID);
      }

      if (last_fr != +1 && last_low_fr_bar != -1 && Low[i] <= Low[last_low_fr_bar])
      {
        ObjectSet(obj_name, OBJPROP_STYLE, STYLE_SOLID);
        
        obj_name = prefix + "LFr" + Time[last_low_fr_bar];
        if (ObjectFind(obj_name) != -1)
        {
          ObjectSet(obj_name, OBJPROP_STYLE, LFrLine.style);
        }
      }
      
      last_low_fr_bar = i;
      last_high_fr_bar = -1;
      last_fr = -1;
    }
  }
  
  //-----
  
  //Так же можно добавить инфо на графике в углу. Где пусть будет написано какой у нас тренд 
  //в данный момент. В зависимости от тренда пусть так же пишет stop loss. 
  //Stop loss считается последний сформированный противоположный такбир
  
  int TLUF.bar = -1;
  int TLLF.bar = -1;
  
  double H = High[0];
  double L = Low[0];
    
  for (i=0; i < Bars; i++)
  {
    H = MathMax(H, High[i]);
    
    if (UpperFr[i] > 0 && H >= UpperFr[i]) // бар_1 где High больше кимма (max такбира)
    {
      TLUF.bar = i;
      break;
    }
  }

  for (i=0; i < Bars; i++)
  {
    L = MathMin(L, Low[i]);
    
    if (LowerFr[i] > 0 && L <= LowerFr[i]) // бар_2 где low меньше  ямма (min такбира)
    {
      TLLF.bar = i;
      break;
    }
  }
  
  int LUF.bar = -1;
  int LLF.bar = -1;
  
  for (i=0; i < Bars; i++) 
  {
    if (UpperFr[i] > 0)           // бар_3 последнего кимма (max такбира)
    {
      LUF.bar = i;
      break;
    }
  }

  for (i=0; i < Bars; i++)
  {
    if (LowerFr[i] > 0)             // бар_4 где  последнего ямма (min такбира)
    {
      LLF.bar = i;
      break;
    }
  }
  
  int Trend = 0;  
  if (TLUF.bar < TLLF.bar && TLUF.bar != -1) Trend = +1; // если бар_1 сформировался позже бар_2 считаем что тренд вверх 
  if (TLLF.bar < TLUF.bar && TLLF.bar != -1) Trend = -1; // если бар_2 сформировался позже бар_1 считаем что тренд вниз
  
  
  
  //-----

  if (LUF.bar != -1 && High[0] >= High[LUF.bar] && (High[1] < High[LUF.bar] || High[2] < High[LUF.bar]))
  {
    if (Time[LUF.bar] != LUF.LastTime)
    {
/*      if (PlaySoundOnBreakout)
      {
        PlaySound(UpBreakout.SoundFile);
      }
      
      if (SendMailOnBreakout)
      {
        string subj = WindowExpertName() + " " + Symbol() + " " + TF2Str(Period());
        SendMail(subj, UpBreakout.MailText);
      }
      
      LUF.LastTime = Time[LUF.bar];*/
    }
  }
  
  if (LLF.bar != -1 && Low[0] <= Low[LLF.bar] && (Low[1] > Low[LLF.bar] || Low[2] > Low[LLF.bar]))
  {
    if (Time[LLF.bar] != LLF.LastTime)
    {
    /*  if (PlaySoundOnBreakout)
      {
        PlaySound(DnBreakout.SoundFile);
      }
    
      if (SendMailOnBreakout)
      {    
        subj = WindowExpertName() + " " + Symbol() + " " + TF2Str(Period());
        SendMail(subj, DnBreakout.MailText);
      }*/
      
      LLF.LastTime = Time[LLF.bar];
    }
  }
  
  //-----
  
/*  
  last_fr = 0;
  
  for (i=0; i < Bars; i++)
  {
    if (UpperFr[i] > 0)
    {
      last_fr = +1;
      break;
    }

    if (LowerFr[i] > 0)
    {
      last_fr = -1;
      break;
    }
  }
*/
  
  int bar1 = -1;
  int bar2 = -1;

  for (i=1+Bars.right; i < Bars; i++)
  {
    if (Trend == +1)
    {
      if (LowerFr[i] > 0)
      {
        bar1 = i;
        break;
      }
    }

    if (Trend == -1)
    {
      if (UpperFr[i] > 0)
      {
        bar1 = i;
        break;
      }
    }
  }
  
  bool IsRightOrder = false;
  
  for (i=i+1; i < Bars; i++)
  {
    if (Trend == +1)
    {
      if ((LowerFr[i] > 0) && (IsRightOrder || !UseRightOrder) && (Low[bar1] > Low[i]))
      {
         bar2 = i;
         break;
      }
      else
      if (UpperFr[i] > 0)
         IsRightOrder = true;
    }

    if (Trend == -1)
    {
      if ((UpperFr[i] > 0) && (IsRightOrder || !UseRightOrder) && (High[bar1] < High[i]))
      {
        bar2 = i;
        break;
      }
      else
      if (LowerFr[i] > 0)
         IsRightOrder = true;
    }
  }
  string info_Trend_1="";
  string info_Trend_2="";
  double y1=0,k=0,b=0;
  LastDwAzan=0;
  LastDwIkamat=0;
  /*if (first){ if (Ask >= y1 )  pos = 1;
                              if (Ask <= ydw1 )pos = 3;
                              if (Ask > ydw1 &&Ask < y1) pos=2;*/
  
  
  
  if (Trend == +1)
  {
    if (bar1!= -1)
    { 
      LastDwIkamat=Low[bar1];
      if (ShowInfo) info_Trend_1  =  info_Trend_1 + "Уровень Икамат от "+TimeToStr(Time[bar1])+ " "+ DoubleToStr(LastDwIkamat, Digits);
    }
    if (bar2-bar1 != 0) 
    { 
      k = (Low[bar2]-Low[bar1])/(bar2-bar1);
      b = Low[bar1] - k*bar1;
      y1 = k*0 + b;  // (k и b уже известны) для нулевого бара ставим 0 при k
    }
    if (Trend != 0 && bar1 != -1 && bar2 != -1)
    { 
      LastDwAzan=y1;
      if (ShowInfo) info_Trend_1  =  info_Trend_1 + "   Уровень Азан от "+TimeToStr(Time[0])+ " "+ DoubleToStr(LastDwAzan, Digits);
    }
    if (firstADw) 
    { 
       if (Low[0] >= LastDwAzan) 
       { 
         firstADw=false;TradeADw=true;
         firstIDw=false;TradeIDw=true;
       }
    }
    if (Low[0] < ( LastDwAzan - (pluspip*Point)) && TradeADw )
    {
      if (Azan.LastBar1 != Low[bar1])
      {
         Azan.LastBar1 = Low[bar1];
         Alert("Азан вниз по паре " +Symbol()+ " на " +TF2Str(Period())  );
          if (PlaySoundOnBreakout)
          {
            PlaySound(DnBreakout.SoundFile);
          }
   
         obj_name = prefix + "Cross"+ Time[0];
         if (ObjectFind(obj_name) == -1)
         {
           ObjectCreate(obj_name, OBJ_TREND, 0, 0, 0 , 0 , 0);
         }
         ObjectSet(obj_name, OBJPROP_COLOR, CrossLine.color);
         ObjectSet(obj_name, OBJPROP_WIDTH, CrossLine.width);
         ObjectSet(obj_name, OBJPROP_STYLE, CrossLine.style);
         ObjectSet(obj_name, OBJPROP_RAY, False); 
         ObjectMove(obj_name, 0, Time[0], LastDwAzan- (pluspip*Point));
         ObjectMove(obj_name, 1, Time[1], LastDwAzan- (pluspip*Point));
         ObjectSetText(obj_name, "Азан вниз!", 10, "Times New Roman", Green);

      }
    }
    if (firstIDw) 
    { 
       if (Low[0] >= LastDwIkamat) 
       { 
         firstIDw=false;TradeIDw=true;
       }
    }
    if (Low[0] <  (LastDwIkamat - (pluspip*Point))&& TradeIDw )
    {
      if (Ikamat.LastBar1 != Low[bar1])
      {
         Ikamat.LastBar1 = Low[bar1];
         Alert("Икамат вниз по паре " +Symbol()+ " на " +TF2Str(Period()) );
        if (PlaySoundOnBreakout)
      {
        PlaySound(IDnBreakout.SoundFile);
      }
         obj_name = prefix + "CrossI"+ Time[0];
         if (ObjectFind(obj_name) == -1)
         {
           ObjectCreate(obj_name, OBJ_TREND, 0, 0, 0 , 0 , 0);
         }
         ObjectSet(obj_name, OBJPROP_COLOR, CrossLine.color);
         ObjectSet(obj_name, OBJPROP_WIDTH, CrossLine.width);
         ObjectSet(obj_name, OBJPROP_STYLE, CrossLine.style);
         ObjectSet(obj_name, OBJPROP_RAY, False); 
         ObjectMove(obj_name, 0, Time[0], LastDwIkamat- (pluspip*Point));
         ObjectMove(obj_name, 1, Time[1], LastDwIkamat- (pluspip*Point));
          ObjectSetText(obj_name, "Икамат вниз!", 10, "Times New Roman", Green);
      }
    }
    Comment(
      "\n",
      SpacesShift,
      "Trend UP",
      "\n",
      SpacesShift,
      "Пробит Такбир ot ", TimeToStr(Time[TLUF.bar]), " ", DoubleToStr(High[TLUF.bar], Digits),
      "\n",
      SpacesShift,
      "StopLoss: ", DoubleToStr(Low[LLF.bar], Digits),
      "\n",
      SpacesShift,
      info_Trend_1
      );
  }
  LastUpAzan=0;
  LastUpIkamat=0;
  if (Trend == -1)
  {
    if  (bar1!=  0 )
    {
       LastUpIkamat=High[bar1];
       if (ShowInfo) info_Trend_2  =  info_Trend_2 + "Уровень Икамат от "+TimeToStr(Time[bar1])+ " "+ DoubleToStr(LastUpIkamat, Digits);
    }
    if (bar2-bar1!=0) 
    { 
      k = (High[bar2]-High[bar1])/(bar2-bar1);
      b = High[bar1] - k*bar1;
      y1 = k*0 + b;  // (k и b уже известны) для нулевого бара ставим 0 при k
    }
    if (Trend != 0 && bar1 != -1 && bar2 != -1)
    { 
      LastUpAzan=y1;
      if (ShowInfo) info_Trend_2  =  info_Trend_2 + "   Уровень Азан от "+TimeToStr(Time[0])+ " "+ DoubleToStr(LastUpAzan, Digits);
    } 
    if (firstAUp) 
    { 
       if (High[0] <= LastUpAzan) 
       { 
         firstAUp=false;TradeAUp=true;
         firstIUp=false;TradeIUp=true;
       }
    }
    if (High[0] >  (LastUpAzan + (pluspip*Point))&& TradeAUp )
    {
      if (Azan.LastBar2 != High[bar1])
      {
         Azan.LastBar2 = High[bar1];
         Alert("Азан вверх по паре " +Symbol()+ " на " +TF2Str(Period()));
          if (PlaySoundOnBreakout)
          {
            PlaySound(UpBreakout.SoundFile);
          }
   
         obj_name = prefix + "Cross"+ Time[0];
         if (ObjectFind(obj_name) == -1)
         {
           ObjectCreate(obj_name, OBJ_TREND, 0, 0, 0 , 0 , 0);
         }
         ObjectSet(obj_name, OBJPROP_COLOR, CrossLine.color);
         ObjectSet(obj_name, OBJPROP_WIDTH, CrossLine.width);
         ObjectSet(obj_name, OBJPROP_STYLE, CrossLine.style);
         ObjectSet(obj_name, OBJPROP_RAY, False); 
         ObjectMove(obj_name, 0, Time[0], LastUpAzan + (pluspip*Point));
         ObjectMove(obj_name, 1, Time[1], LastUpAzan + (pluspip*Point));
         ObjectSetText(obj_name, "Азан вверх!", 10, "Times New Roman", Green);

      }
    }
    if (firstIUp) 
    { 
       if (High[0] <= LastUpIkamat) 
       { 
         firstIUp=false;TradeIUp=true;
       }
    }
    if (High[0] > (LastUpIkamat + (pluspip*Point))&& TradeIUp )
    {
      if (Ikamat.LastBar2 != High[bar1])
      {
         Ikamat.LastBar2 = High[bar1];
         Alert("Икамат вверх по паре " +Symbol()+ " на " +  TF2Str(Period()));
        if (PlaySoundOnBreakout)
      {
        PlaySound(IUpBreakout.SoundFile);
      }
         obj_name = prefix + "CrossI"+ Time[0];
         if (ObjectFind(obj_name) == -1)
         {
           ObjectCreate(obj_name, OBJ_TREND, 0, 0, 0 , 0 , 0);
         }
         ObjectSet(obj_name, OBJPROP_COLOR, CrossLine.color);
         ObjectSet(obj_name, OBJPROP_WIDTH, CrossLine.width);
         ObjectSet(obj_name, OBJPROP_STYLE, CrossLine.style);
         ObjectSet(obj_name, OBJPROP_RAY, False); 
         ObjectMove(obj_name, 0, Time[0], LastUpIkamat+ (pluspip*Point));
         ObjectMove(obj_name, 1, Time[1], LastUpIkamat+ (pluspip*Point));
          ObjectSetText(obj_name, "Икамат вверх!", 10, "Times New Roman", Green);
      }
    }

    
    
    Comment(
      "\n",
      SpacesShift,
      "Trend DOWN",
      "\n",
      SpacesShift,
      "Пробит Такбир ot ", TimeToStr(Time[TLLF.bar]), " ", DoubleToStr(Low[TLLF.bar], Digits),
      "\n",
      SpacesShift,
      "StopLoss: ", DoubleToStr(High[LUF.bar], Digits)
      ,
      "\n",
      SpacesShift,
      info_Trend_2);
  }
  bool IsLastSubmitted = false;  
  
  if (Trend != 0 && bar1 != -1 && bar2 != -1)
  {
    obj_name = prefix + "Trend";
    if (ObjectFind(obj_name) == -1)
    {
      ObjectCreate(obj_name, OBJ_TREND, 0, 0, 0);
    }
    ObjectSet(obj_name, OBJPROP_COLOR, TrendLine.color);
    ObjectSet(obj_name, OBJPROP_WIDTH, TrendLine.width);
    ObjectSet(obj_name, OBJPROP_STYLE, TrendLine.style);
    ObjectSet(obj_name, OBJPROP_RAY, true);  
    
    if (Trend == +1)
    {
       for (i=1; i < bar1; i++)
          if (UpperFr[i] > 0)
          {
             IsLastSubmitted = true;
             break;
          }   
       if (!UseRightOrder || IsLastSubmitted)
       {
          ObjectMove(obj_name, 0, Time[bar2], Low[bar2]);
          ObjectMove(obj_name, 1, Time[bar1], Low[bar1]);    
       }
       else
       {
          ObjectSet(obj_name, OBJPROP_WIDTH, 1);
          ObjectSet(obj_name, OBJPROP_STYLE, STYLE_DASH);
          ObjectMove(obj_name, 0, Time[bar2], Low[bar2]);
          ObjectMove(obj_name, 1, Time[bar1], Low[bar1]);
//          ObjectSet(obj_name, OBJPROP_STYLE, TrendLine.style);    
       }     
    }

    if (Trend == -1)
    {
       for (i=1; i < bar1; i++)
          if (LowerFr[i] > 0)
          {
             IsLastSubmitted = true;
             break;
          }   
       if (!UseRightOrder || IsLastSubmitted)
       {
          ObjectMove(obj_name, 0, Time[bar2], High[bar2]);
          ObjectMove(obj_name, 1, Time[bar1], High[bar1]);
       }
       else
       {
          ObjectSet(obj_name, OBJPROP_WIDTH, 1);
          ObjectSet(obj_name, OBJPROP_STYLE, STYLE_DASH);
          ObjectMove(obj_name, 0, Time[bar2], High[bar2]);
          ObjectMove(obj_name, 1, Time[bar1], High[bar1]);
    //      ObjectSet(obj_name, OBJPROP_STYLE, STYLE_DOT);
       }
    
    }
 }   
}

bool IsUpperFr(int bar) 
{
  for (int i=1; i <= Bars.left; i++) 
  {
    if (bar+i >= Bars) return (false);

    if (High[bar] < High[bar+i]) return (false);
  }

  for (i=1; i <= Bars.right; i++) 
  {
    if (bar-i < 0) return (false);

    if (High[bar] < High[bar-i]) return (false);
  }
  
  return (true);
}

bool IsLowerFr(int bar) 
{
  for (int i=1; i <= Bars.left; i++) 
  {
    if (bar+i >= Bars) return (false);

    if (Low[bar] > Low[bar+i]) return (false);
  }

  for (i=1; i <= Bars.right; i++) 
  {
    if (bar-i < 0) return (false);

    if (Low[bar] > Low[bar-i]) return (false);
  }

  return (true);
}

string TF2Str(int period) 
{
  switch (period) 
  {
    case PERIOD_M1: return("M1");
    case PERIOD_M5: return("M5");
    case PERIOD_M15: return("M15");
    case PERIOD_M30: return("M30");
    case PERIOD_H1: return("H1");
    case PERIOD_H4: return("H4");
    case PERIOD_D1: return("D1");
    case PERIOD_W1: return("W1");
    case PERIOD_MN1: return("MN");
 }
 
  return (period);
}

void ClearObj()
{
  int total = ObjectsTotal();
  for (int i=total-1; i >= 0; i--)
  {
    string name = ObjectName(i);
    if (StringFind(name, prefix) == 0) ObjectDelete(name);
  }
}

