Как удалить глобальную переменную терминала при закрытии графика?

 
Добрый день, возможно ли как то удалить глобальную переменную терминала при закрытии графика в индикаторе?
 
Если на этом графике висит индикатор или эксперт.
 
Dmitry Fedoseev:
Если на этом графике висит индикатор или эксперт.

я ставлю удаление этой переменной в индикаторе, и при удалении этого индикатора с графика всё ОК, переменная убирается.

НО!!! ввопрос в другом! если я не просто удалю индикатор с графика, а просто закрою вкладку с графиком например
открыт евро - доллар, на нём есть индикатор , я закрываю вкладку а эта переменная остаётся, и собственно вопрос
возможно ли сделать так, что если закрыть вкладку тогда переменная тоже закроется, это же всё что можно сделать в индикаторе
это просто удаление его с графика при удалении индикатора(с графика)

Спасибо!

 

1) Есть временные переменные, которые удаляются сами при перезагрузке терминала.

2) Нужно генерировать уникальное имя переменной для каждой копии индикатора-чарта, тогда проблем не будет.

 
Повесить на этот же график простейший эксперт, который при закрытии его графика, в OnDeinit удалит переменную.
 
utock:

я ставлю удаление этой переменной в индикаторе, и при удалении этого индикатора с графика всё ОК, переменная убирается.

НО!!! ввопрос в другом! если я не просто удалю индикатор с графика, а просто закрою вкладку с графиком например
открыт евро - доллар, на нём есть индикатор , я закрываю вкладку а эта переменная остаётся, и собственно вопрос
возможно ли сделать так, что если закрыть вкладку тогда переменная тоже закроется, это же всё что можно сделать в индикаторе
это просто удаление его с графика при удалении индикатора(с графика)

Спасибо!

Если на графике висит индикатор и если закрыть график, то у индикатора будет вызвана функция OnDeinit()

 
Dmitry Fedoseev:

Если на графике висит индикатор и если закрыть график, то у индикатора будет вызвана функция OnDeinit()

Пожалуйста посмотрите код:

Такая проблема индикатор создаёт переменную "val". Когда я кидаю индикатор на график эта переменная создаётся, если же просто удалить индикатор с графика!! тогда и переменная удалится, а если закрыть график тогда переменная останется. Пожалуйста исправьте код если это возможно, чтобы даже при закрытии графика переменная val удалялась Спасибо

#property version   "1.00"
#property strict
#property indicator_chart_window


input string mus="ok.wav";
static bool bPlayS=true;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(GlobalVariableCheck("val")==True){  
   if(Period()==1440 ) PlaySound("alert.wav");bPlayS=False;
   if(Period()==240 ) PlaySound("alert.wav");bPlayS=False;
   if(Period()==60 ) PlaySound("alert.wav");bPlayS=False;
   if(Period()==30 ) PlaySound("alert.wav");bPlayS=False;
   if(Period()==15 ) PlaySound("alert.wav");bPlayS=False;
   if(Period()==5 ) PlaySound("alert.wav");bPlayS=False;
   if(Period()==1 ) PlaySound("alert.wav");bPlayS=False;
   } 
   if(GlobalVariableCheck("val")==False) {PlaySound(mus);GlobalVariableSet("val",1);}
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   
   if(reason==1) GlobalVariableDel("val");
   Comment("\n Total: ",GlobalVariablesTotal());
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//---

   Comment("\n Total: ",GlobalVariablesTotal());
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Ребят если возможно такое исправьте пожалуйста
 
utock:
Ребят если возможно такое исправьте пожалуйста

Обратите внимание на эту таблицу

REASON_PROGRAM

0

Эксперт прекратил свою работу, вызвав функцию ExpertRemove()

REASON_REMOVE

1

Программа удалена с графика

REASON_RECOMPILE

2

Программа перекомпилирована

REASON_CHARTCHANGE

3

Символ или период графика был изменен

REASON_CHARTCLOSE

4

График закрыт

REASON_PARAMETERS

5

Входные параметры были изменены пользователем

REASON_ACCOUNT

6

Активирован другой счет либо произошло переподключение к торговому серверу вследствие изменения настроек счета

REASON_TEMPLATE

7

Применен другой шаблон графика

REASON_INITFAILED

8

Обработчик OnInit() вернул ненулевое значение

REASON_CLOSE

9

Терминал был закрыт


и на эту строку вашего кода

   if(reason==1) GlobalVariableDel("val");

Но, если я правильно помню начало вашей проблемы, то лучше условие поставить так

   if(reason != REASON_CHARTCHANGE) GlobalVariableDel("val");
 
Alexey Viktorov:

Обратите внимание на эту таблицу

REASON_PROGRAM

0

Эксперт прекратил свою работу, вызвав функцию ExpertRemove()

REASON_REMOVE

1

Программа удалена с графика

REASON_RECOMPILE

2

Программа перекомпилирована

REASON_CHARTCHANGE

3

Символ или период графика был изменен

REASON_CHARTCLOSE

4

График закрыт

REASON_PARAMETERS

5

Входные параметры были изменены пользователем

REASON_ACCOUNT

6

Активирован другой счет либо произошло переподключение к торговому серверу вследствие изменения настроек счета

REASON_TEMPLATE

7

Применен другой шаблон графика

REASON_INITFAILED

8

Обработчик OnInit() вернул ненулевое значение

REASON_CLOSE

9

Терминал был закрыт


и на эту строку вашего кода

Но, если я правильно помню начало вашей проблемы, то лучше условие поставить так

спасибо за ответ, а можно ли как то использовать 1  4   9

как то так, поправьте пожалуйста

   if(reason==1 && 4 && 9) GlobalVariableDel("val"); 

 
utock:

спасибо за ответ, а можно ли как то использовать 1  4   9

как то так, поправьте пожалуйста

   if(reason==1 && 4 && 9) GlobalVariableDel("val"); 

 if(reason==1 || reason==4 || reason==9) GlobalVariableDel("val"); // это ИЛИ
Причина обращения: