Прошу помочь с кодом

 
Здравствуйте, уважаемый программисты буду краток, прошу вас помочь с кодом, при нажатии клавиши появляется число атр при нажатии 2-й клавиши оно удаляется, не знаю как заставить удаляться это число атр при удалении графика, т.е если сейчас добавить в OnDeinit  код: ObjectDelete(0,"L"); sтогда образуется новая проблема, при смене ТФ число не сохраняется!, Прошу помочь знающих людей! Спасибо
#property copyright "Copyright 2018, 1AM2"
#property link      "http://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window

#define KEY_UP             38 
#define KEY_DOWN           40 

input int Shift=0;
int atr=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutLabel(string text)
  {
   ObjectDelete(0,"L");
//--- создадим текстовую метку
   ObjectCreate(0,"L",OBJ_LABEL,0,0,0);
//--- установим координаты метки
   ObjectSetInteger(0,"L",OBJPROP_XDISTANCE,55);
   ObjectSetInteger(0,"L",OBJPROP_YDISTANCE,10);
//--- установим угол графика, относительно которого будут определяться координаты точки
   ObjectSetInteger(0,"L",OBJPROP_CORNER,1);
//--- установим текст
   ObjectSetString(0,"L",OBJPROP_TEXT,text);
//--- установим шрифт текста
   ObjectSetString(0,"L",OBJPROP_FONT,"Arial");
//--- установим размер шрифта
   ObjectSetInteger(0,"L",OBJPROP_FONTSIZE,12);
//--- установим цвет
   ObjectSetInteger(0,"L",OBJPROP_COLOR,Red);       
  }
//+------------------------------------------------------------------+ 
//| ChartEvent function                                              | 
//+------------------------------------------------------------------+ 
void OnChartEvent(const int id,         // идентификатор события   
                  const long& lparam,   // параметр события типа long 
                  const double& dparam, // параметр события типа double 
                  const string& sparam  // параметр события типа string 
                  )
  {
//--- нажатие кнопки на клавиатуре 
   if(id==CHARTEVENT_KEYDOWN)
     {
      if(lparam==38) PutLabel((string)atr);
      if(lparam==40) ObjectDelete(0,"L");
     }
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//---
   atr=(int)((iHigh(NULL,PERIOD_MN1,Shift)-iLow(NULL,PERIOD_MN1,Shift))/_Point);
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Dmitry Ivkin:
Здравствуйте, уважаемый программисты буду краток, прошу вас помочь с кодом, при нажатии клавиши появляется число атр при нажатии 2-й клавиши оно удаляется, не знаю как заставить удаляться это число атр при удалении графика, т.е если сейчас добавить в OnDeinit  код: ObjectDelete(0,"L"); sтогда образуется новая проблема, при смене ТФ число не сохраняется!, Прошу помочь знающих людей! Спасибо

Добавить в OnDeinit() код:

void OnDeinit(const int reason) {   
 if(reason != 3) ObjectDelete(0,"L"); 
}

Описание здесь

Документация по MQL5: Константы, перечисления и структуры / Именованные константы / Причины деинициализации
Документация по MQL5: Константы, перечисления и структуры / Именованные константы / Причины деинициализации
  • www.mql5.com
//| get text description                                             | //| Expert deinitialization function                                 |
 
Vitaly Muzichenko:

Добавить в OnDeinit() код:

Описание здесь

оххххх, спасибо вам огромное я 2 месяца а то и более искал ка решить эту проблему, емае, мне не верится!
я писал только это:

void OnDeinit(const int reason) {   
ObjectDelete(0,"L"); 
}

Подскажите пожалуйста что значит:  

if(reason != 3)  

Спасибо еще раз огромное!!!! Блин неужели!!! Спасибо!!!!!

 

1)Если у меня много чего нужно удалять, то везде использовать  if(reason != 3)  или можно как то объеденить это все?

2) как правильно выглядит блок удаления?
Спасибо

 
я вот так вынес, так правильно?

void OnDeinit(const int reason)
   {  
   if(reason != 3) 
      {
         ObjectDelete("Баываыва");
         ObjectDelete("ываываыва");
         ObjectDelete("ываываываыва");
         ObjectDelete("ываываыва");
	 .............
      }
   }

 
Dmitry Ivkin:

1)Если у меня много чего нужно удалять, то везде использовать  if(reason != 3)  или можно как то объеденить это все?

2) как правильно выглядит блок удаления?
Спасибо

Если объектов много, то программа должна их всех идентифицировать как свои. Для этого нужно, чтобы в имени каждого объекта был один и тот же набор символов, например - имя программы.

Значит нужно иметь переменную, объявленную на глобальном уровне, например string prefix; И в эту переменную нужно вписать имя программы:

string prefix=MQLInfoString(MQL_PROGRAM_NAME)+"_";

Далее, в блоке, в котором вы задаёте имена переменным, нужно к этому префиксу добавить имя переменной, в вашем случае - как пример - символ "L":

string object_name=prefix+"L";

Таким образом, если для всех имён объектов так задавать в программе имена, то перед именем каждой вашей переменной будет одинаковый набор символов - в данном примере - название программы.
Если программа называется "Test", то имя переменной будет "Test_L"

Ну и в OnDeinit() следует удалить все объекты, содержащие префикс:

if(reason!=3)
   ObjectsDeleteAll(0,prefix);

Такая строка удалит (в случае, если причиной деинициализации была не смена таймфрейма или символа графика) все объекты любого типа, в имени которой есть содержание переменной prefix, на том графике, на котором запущена программа. Удалит подходящие объекты как с главного окна, так и со всех подокон, расположенных на главном окне.

 
Andrey F. Zelinsky:

"Ну, вы, блин, даёте" (с)

"Вписать в идентификацию объекта имя программы" -- а если на графике стоит несколько одинаковых индикаторов с одинаковым именем программы (что очень распространённое явление), но с разными настройками?

-- а если мя программы в стиле "не смог дочитать до конца, сильно длинное" -- и из-за этого не хватит длины на действительно значащие данные, характеризующие сам объект.

Написано же, например...

1. Все случаи в одном ответе не предусмотреть.

2. Все возможные случаи должен обдумывать программист, а не тот, кто подсказывает направление действий.

Знаешь что предложить абсолютно универсальное, предлагай, а деструктивность - зачем?
 
Andrey F. Zelinsky:

"Ну, вы, блин, даёте" (с)


"Вписать в идентификацию объекта имя программы" -- а если на графике стоит несколько одинаковых индикаторов с одинаковым именем программы (что очень распространённое явление), но с разными настройками?

-- а если мя программы в стиле "не смог дочитать до конца, сильно длинное" -- и из-за этого не хватит длины на действительно значащие данные, характеризующие сам объект.

Для таких случаев есть номер подокна, с которого нужно удалить объекты. Я про это тоже писал выше. Но ты зачем-то упустил сей момент моего объяснения - подколоть хотел?

Так мимо ;)

 
Andrey F. Zelinsky:

зачем видеть "деструктивность" там где нет и не было?

я пояснил (да, с иронией) все негативные стороны твоего предложения -- как раз всё очень конструктивно.

Так а где конструктив-то?

Вот если бы ты предложил использовать для идентификации подокна графика такую форму вызова: ObjectsDeleteAll(0,prefix,sub_window);, о которой я намекнул в описании что сделает функция, но не стал расписывать, то это был бы конструктив. А так, как написал ты - выглядит попыткой показать себя, а не помочь человеку, которому помощь нужна, а не твой бесконструктивный пост.

Подозреваю, что дальше ты начнёшь высмеивать, что я не показал как номер подокна найти в индикаторе. Оставляю для твоего конструктивного поста ;)

 
Andrey F. Zelinsky:

"как всё запущено" (с) -- удалил свои "бесконструктивные посты" -- пусть будут только твои посты -- самые-самые-самые конструктивные.

Ну ты же написал человеку, что НЕЛЬЗЯ использовать проверку причины деинициализации - это что, конструктив? Ты пояснил это хоть как-то? Я не видел пояснения, а лишь твоё в этом утверждение, и посты свои ты удалил - зачем? Обсудили бы и развеяли твой страх перед проверкой причины деинициализации, которую многие используют без страха, что запутаются и всё у них рухнет.

 
Спасибо большое за помощь
Причина обращения: