Помогите реализовать простую идею

 

Добрый день, уважаемый программисты помогите реализовать простую идею, в общем суть такая:
Hажимается кнопка--> создаются 2 зоны:
зона ХАЙ(верхняя) зависит от среднего уровня атр(например за 10 минут) и уровня лоу в данный момент на текущей свече
т.е выбирается ЛОУ уровень свечи + прибавляется атр = верхняя зона

зона ЛОУ аналогично только с хай

Люди добрый помогите пожалуйста
Есть 2 кода, но они оба работают но не корректно, первый простой, но в нём проблема в том что при нажатии кнопку - зоны строются только но новому тику, скрываются тоже только по тику:

#property copyright "Copyright 2020"
#property link      "http://www.ya.ru"
#property version   "1.00"
#property strict
#property indicator_chart_window

input int atr=10;
input int pip=10;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   PutButton("baton",70,50,"HIDE");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutRect(string name,datetime t1,double p1,datetime t2,double p2,color clr)
  {
   ObjectDelete(0,name);
//--- создадим прямоугольник по заданным координатам
   ObjectCreate(0,name,OBJ_RECTANGLE,0,t1,p1,t2,p2);
//--- установим цвет прямоугольника
   ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutButton(string name,int x,int y,string text)
  {
   ObjectCreate(0,name,OBJ_BUTTON,0,0,0);
//--- установим координаты кнопки
   ObjectSetInteger(0,name,OBJPROP_XDISTANCE,x);
   ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y);
//--- установим размер кнопки
   ObjectSetInteger(0,name,OBJPROP_XSIZE,50);
   ObjectSetInteger(0,name,OBJPROP_YSIZE,30);
//--- установим угол графика, относительно которого будут определяться координаты точки
   ObjectSetInteger(0,name,OBJPROP_CORNER,3);
//--- установим текст
   ObjectSetString(0,name,OBJPROP_TEXT,text);
//--- установим шрифт текста
   ObjectSetString(0,name,OBJPROP_FONT,"Arial");
//--- установим размер шрифта
   ObjectSetInteger(0,name,OBJPROP_FONTSIZE,9);
//--- установим цвет текста
   ObjectSetInteger(0,name,OBJPROP_COLOR,Red);
//--- установим цвет фона
   ObjectSetInteger(0,name,OBJPROP_BGCOLOR,White);
//--- установим цвет границы
   ObjectSetInteger(0,name,OBJPROP_BORDER_COLOR,Blue);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
   ObjectSetInteger(0,name,OBJPROP_HIDDEN,false);
  }
//+------------------------------------------------------------------+
//| 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 lo=Low[iLowest(NULL,0,MODE_LOW,atr,0)];
   double hi=High[iHighest(NULL,0,MODE_HIGH,atr,0)];
   double del=hi-lo;

   if(ObjectGetInteger(0,"baton",OBJPROP_STATE)==1)
     {
      ObjectsDeleteAll(0,0,OBJ_RECTANGLE);
     }

   if(ObjectGetInteger(0,"baton",OBJPROP_STATE)==0)
     {
      PutRect("up",time[0],low[0]+del,time[atr],low[0]+del+pip*_Point,Red);
      PutRect("dn",time[0],high[0]-del,time[atr],high[0]-del-pip*_Point,Lime);
     }

//--- return value of prev_calculated for next call
   return(rates_total);
  }


Второй замудренный, там используется функция выводящая true при новой свече от неё я и оттолкнулся. Проблема же в этом коде заключается что зоны строются по первоначальынм данным(т.е атр хай и лоу как будто замерают в определенном положении, т.е при изменении хай или лоу или атр зоны не перестраиваются)

#property copyright "Copyright 2017"
#property link      "http://www.ya.ru"
#property version   "1.00"
#property strict
#property indicator_chart_window

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   PutButton("KNOPKA",20,50,"Kropo4ka");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ObjectsDeleteAll(0,0,OBJ_RECTANGLE);
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//---



         if(!ObjectGetInteger(0,"KNOPKA",OBJPROP_STATE,false))
           {
                  if(isNewBar(1) == false)
                  {
                  ObjectDelete("ТНмин");
                  ObjectDelete("ТНмин2");
                  }
           }
         else
           {
                  if(isNewBar(1) == true)
                  {
                  
                  datetime t2=0;
                  double Hi=0,Lo=0,ATRM=0;
                  t2=iTime(NULL,PERIOD_M1,0);
                  Hi=iHigh(NULL,PERIOD_M1,0);
                  Lo=iLow(NULL,PERIOD_M1,0);
                  ATRM = (NormalizeDouble(iATR(NULL,PERIOD_M1,10,0)/_Point,0));
                  
                  PutRect("ТНмин",t2+60,Lo+ATRM*_Point,t2,Lo+(ATRM*_Point)/100*90,Black);
                  PutRect("ТНмин2",t2+60,Hi-ATRM*_Point,t2,Hi-(ATRM*_Point)/100*90,Black);  
                  }
           }
         //+Comment(ATRM*_Point);

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
   if(id==CHARTEVENT_OBJECT_CLICK)
     {     
      if(ObjectFind(0,"KNOPKA")==0)
         if(GetState("KNOPKA"))
           {

                  datetime t2=0;
                  double Hi=0,Lo=0,ATRM=0;
                  t2=iTime(NULL,PERIOD_M1,0);
                  Hi=iHigh(NULL,PERIOD_M1,0);
                  Lo=iLow(NULL,PERIOD_M1,0);
                  ATRM = (NormalizeDouble(iATR(NULL,PERIOD_M1,10,0)/_Point,0));
                  
               PutRect("ТНмин",t2+60,Lo+ATRM*_Point,t2,Lo+(ATRM*_Point)/100*90,Black);
               PutRect("ТНмин2",t2+60,Hi-ATRM*_Point,t2,Hi-(ATRM*_Point)/100*90,Black); 
           }
           else
           {
               ObjectDelete("ТНмин");
               ObjectDelete("ТНмин2");
           }
     }       
  }
  
  
void PutButton(string name,int x,int y,string text)
  {
   ObjectCreate(0,name,OBJ_BUTTON,0,0,0);
//--- установим координаты кнопки
   ObjectSetInteger(0,name,OBJPROP_XDISTANCE,x);
   ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y);
//--- установим размер кнопки
   ObjectSetInteger(0,name,OBJPROP_XSIZE,20);
   ObjectSetInteger(0,name,OBJPROP_YSIZE,30);
//--- установим угол графика, относительно которого будут определяться координаты точки
   ObjectSetInteger(0,name,OBJPROP_CORNER,2);
//--- установим текст
   ObjectSetString(0,name,OBJPROP_TEXT,text);
//--- установим шрифт текста
   ObjectSetString(0,name,OBJPROP_FONT,"Arial");
//--- установим размер шрифта
   ObjectSetInteger(0,name,OBJPROP_FONTSIZE,9);
//--- установим цвет текста
   ObjectSetInteger(0,name,OBJPROP_COLOR,Red);
//--- установим цвет фона
   ObjectSetInteger(0,name,OBJPROP_BGCOLOR,White);
//--- установим цвет границы
   ObjectSetInteger(0,name,OBJPROP_BORDER_COLOR,Blue);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
   ObjectSetInteger(0,name,OBJPROP_HIDDEN,false);
  }  

//+------------------------------------------------------------------+
//| Возвращает true, если появился новый бар для пары символ/период  |
//+------------------------------------------------------------------+
bool isNewBar(int tf)
  {
//--- в статической переменной будем помнить время открытия последнего бара
   static datetime last_time=0;
   
//--- текущее время
   datetime lastbar_time=SeriesInfoInteger(_Symbol,tf,SERIES_LASTBAR_DATE);

//--- если это первый вызов функции
   if(last_time==0)
     {
      //--- установим время и выйдем 
      last_time=lastbar_time;
      return(false);
     }

//--- если время отличается
   if(last_time!=lastbar_time)
     {
      //--- запомним время и вернем true
      last_time=lastbar_time;
      return(true);
     }
//--- дошли до этого места - значит бар не новый, вернем false
   return(false);
  }


//+---------------------Кнопки показа окн----------------------------+
bool GetState(string aName)
  {
   long value=0;
   ObjectGetInteger(0,aName,OBJPROP_STATE,0,value);
   return  (bool)value;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutRect(string name,datetime t1,double p1,datetime t2,double p2,color clr)
  {
   ObjectDelete(0,name);
//--- создадим прямоугольник по заданным координатам
   ObjectCreate(0,name,OBJ_RECTANGLE,0,t1,p1,t2,p2);
//--- установим цвет прямоугольника
   ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
  }