Подскажите как будет правильно по структуре.

 

Создал button в oninit в нажатом состоянии, label в OnCharEvent ( по нажатию на кнопку показывался/удалялся (label например) )
Хочу сделать так чтобы при первоначальном включении индикатора показывался этот label
Проблема в том что сейчас если нажать на кнопку(2-й раз, тобишь удалить label) и смене ТФ она(label) повторно создастся

Но если создать кнопку не в  oninit тогда я не знаю как сделать показ содержимого (в примере label) при первой загрузки.

Как решить данную проблему?
Могли бы вы разъяснить как и где правильно было бы создать кнопки


2) Случай не про первую загрузку, а про смену ТФ
Очень часто я вот так делаю, когда не могу решить проблему, но считаю это не правильным вариантом это - создание кнопки и label c показом на пределы графика,

а потом в  OnCharEvent  по нажатию просто подставляю нужные размеры, при повторном опять за границы

 
vebster005:

Создал button в oninit в нажатом состоянии, label в OnCharEvent ( по нажатию на кнопку показывался/удалялся (label например) )
Хочу сделать так чтобы при первоначальном включении индикатора показывался этот label
Проблема в том что сейчас если нажать на кнопку(2-й раз, тобишь удалить label) и смене ТФ она(label) повторно создастся

Но если создать кнопку не в  oninit тогда я не знаю как сделать показ содержимого (в примере label) при первой загрузки.

Как решить данную проблему?
Могли бы вы разъяснить как и где правильно было бы создать кнопки


2) Случай не про первую загрузку, а про смену ТФ
Очень часто я вот так делаю, когда не могу решить проблему, но считаю это не правильным вариантом это - создание кнопки и label c показом на пределы графика,

а потом в  OnCharEvent  по нажатию просто подставляю нужные размеры, при повторном опять за границы

попробуйте поэкспериментировать с параметром  reason в функции OnDeinit
 
Не знаю, есть ли эта возможность в МТ5, а в МТ4 такой проблемы нет. Static. 
 
// -----------------------------------------------------------------------------
// Обработка события - удаление эксперта
// -----------------------------------------------------------------------------
void OnDeinit(const int reason) {

    // если это смена ТФ, то ничего не удаляем
    if (reason == REASON_CHARTCHANGE) return;

 
Алексей Тарабанов #:
а в МТ4 такой проблемы нет. Static. 
Давно?
 
Sergey Gridnev #:
Давно?

Давно

static int N;
...
if ( N == 0 ){ Создать объект }
N = 1; 
... 
 
Алексей Тарабанов #:

Давно

Буратино дали 5 яблок. Два яблока он отдал Мальвине, еще два - Артемону. Сколько яблок осталось у Буратино? Ответ 1 - неправильный. Так и в Вашем примере. Иногда будет работать, а иногда - нет, все будет зависеть от захламленности оперативной памяти машины.

 
Ihor Herasko #:

Буратино дали 5 яблок. Два яблока он отдал Мальвине, еще два - Артемону. Сколько яблок осталось у Буратино? Ответ 1 - неправильный. Так и в Вашем примере. Иногда будет работать, а иногда - нет, все будет зависеть от захламленности оперативной памяти машины.

Неправильно. 

Почитайте документацию, или просто попробуйте. 

 
Алексей Тарабанов #:


Почитайте документацию, или просто попробуйте. 

У топикстартера проблема в том, что при смене символа на чарте происходит деинициализация и инициализация советника. Как ему поможет переменная static если ее значение не сохранится между событиями deinit и init?
 
Sergey Gridnev #:
У топикстартера проблема в том, что при смене символа на чарте происходит деинициализация и инициализация советника. Как ему поможет переменная static если ее значение не сохранится между событиями deinit и init?

Сохранится до тех пор, пока программа не завершит работу. Учите матчасть. 

Не символа, а таймфрейма. При смене символа без рестарта программы ситуация не изменится, но это уже - не фича, а баг MQL4. 

 
Sergey Gridnev #:
У топикстартера проблема в том, что при смене символа на чарте происходит деинициализация и инициализация советника. Как ему поможет переменная static если ее значение не сохранится между событиями deinit и init?

поведение static зависит от версии (4/5), конкретного билда и настроя разработчиков. Это поведение static внутри DLL овеяно соглашениями и организацией памяти

чтобы быть уверенным что значение в OnInit то-же что при OnDeinit (то есть восстановлено то что ранее сохранено) - надо использовать глобальные переменные или файлы или sqlite/иные_базы

но в конце концов никто не гарантирует что между OnDeinit/OnInit нет рестарта терминала или целой Ось, не стоит полагаться на милости от природы, если надо сохранять данные то стоит приложить к этому усилия

PS/ тут даже очерёдность OnInit/Deinit не всегда однообразно очевидна. Про Deinit - даже его сомнения в его наличии. Есть ощущение что при перезагрузке по причине перекомпиляции порою не происходит :-)