ООП. Вопрос по обновлению полей CEdit и CSpinEdit при смене тайм-фрейма.

 

создаю панель для ввода данных. на ней есть поля CEdit и CSpinEdit.

в пределах одного любого тайм-фрейма все работает прекрасно.

при смене тайм-фрейма графика (например, с m15 на h1) при открытой панели поля  CEdit не сохраняют ранее введенные значения (обнуляются), значения с полей CSpinEdit вообще пропадают (пустое поле). хотя после нажатия на кнопки +/- поля CSpinEdit начинают работать по-прежнему.


вопросы знатокам.

1. как сохранять и показывать значения полей  CSpinEdit после смены тайм-фрейма графика?

2.  как сохранять значения полей   CEdit  после смены тайм-фрейма графика?


Создание информационных табло с использованием классов из Стандартной библиотеки и Google Chart API
Создание информационных табло с использованием классов из Стандартной библиотеки и Google Chart API
  • www.mql5.com
Мощный язык программирования MQL5 нацелен в первую очередь на создание автоматических торговых систем и сложных инструментов технического анализа. Но помимо прочего он позволяет создавать интересные информационные системы для отслеживания рыночной ситуации и обеспечения обратной связи с трейдером. В статье сделан обзор компонентов Стандартной библиотеки и примеры их использования на практике для этих целей. Также показан пример использования Google Charts API для создания графиков.
 

На всякий случай:

Сразу же после того, как клиентский терминал загрузит программу (эксперт или пользовательский индикатор) и запустит процесс инициализации глобальных переменных, будет послано событие Init, которое обрабатывается функцией OnInit(), если она есть. Это событие также генерируется после смены финансового инструмента и/или периода графика, после перекомпиляции программы в редакторе MetaEditor, после смены входных параметров из окна настройки эксперта или пользовательского индикатора. Советник также инициализируется после смены счета. Для скриптов событие Init не генерируется.

https://www.mql5.com/ru/docs/runtime/event_fire

 
JRandomTrader #:

На всякий случай:

Сразу же после того, как клиентский терминал загрузит программу (эксперт или пользовательский индикатор) и запустит процесс инициализации глобальных переменных, будет послано событие Init, которое обрабатывается функцией OnInit(), если она есть. Это событие также генерируется после смены финансового инструмента и/или периода графика, после перекомпиляции программы в редакторе MetaEditor, после смены входных параметров из окна настройки эксперта или пользовательского индикатора. Советник также инициализируется после смены счета. Для скриптов событие Init не генерируется.

https://www.mql5.com/ru/docs/runtime/event_fire

спасибо за ответ. мне это известно.

но в функции OnInit() уже стоит стандартный код:

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create application dialog
   if(!ExtDialog.Create(0,"Controls",0,40,40,380,344))
      return(INIT_FAILED);
//--- run application
   ExtDialog.Run();
//--- succeed
   return(INIT_SUCCEEDED);
  }

 
JRandomTrader #:

На всякий случай:

Сразу же после того, как клиентский терминал загрузит программу (эксперт или пользовательский индикатор) и запустит процесс инициализации глобальных переменных, будет послано событие Init, которое обрабатывается функцией OnInit(), если она есть. Это событие также генерируется после смены финансового инструмента и/или периода графика, после перекомпиляции программы в редакторе MetaEditor, после смены входных параметров из окна настройки эксперта или пользовательского индикатора. Советник также инициализируется после смены счета. Для скриптов событие Init не генерируется.

https://www.mql5.com/ru/docs/runtime/event_fire

Тут еще важен факт того, что сначала происходит Deinit. А у вас там, наверняка, деструктор

По сути, переинициализация. То, что нужно хранить за пределами программы - храните за пределами. Глобальные переменные терминала, файлы.

 
А при деините надо смотреть причину и действовать соответственно.
 
JRandomTrader #:
А при деините надо смотреть причину и действовать соответственно.

ладно, при  DeInit теряются введенные данные, которые при необходимости нужно хранить вне проги. ок, согласен.

но почему напрочь исчезают данные в поле  CSpinEdit?!.

по умолчанию там - 2, а после перехода на другой тайм-фрейм - пусто, ни-че-го...

см. сканы в прицепе - ДО и ПОСЛЕ

Файлы:
t4.png  1 kb
g69c8.png  1 kb
 
retired #:

ладно, при  DeInit теряются введенные данные, которые при необходимости нужно хранить вне проги. ок, согласен.

но почему напрочь исчезают данные в поле  CSpinEdit?!.

по умолчанию там - 2, а после перехода на другой тайм-фрейм - пусто, ни-че-го...

см. сканы в прицепе - ДО и ПОСЛЕ

Я ж не знаю логику вашей программы.

Что удаляется при деините, что нет.

Что создаётся при ините, что уже существует и, возможно, создаётся заново или сбрасывается...

Просто подсказываю направления, в которых можно копать.

 
JRandomTrader #:

Я ж не знаю логику вашей программы.

Что удаляется при деините, что нет.

Что создаётся при ините, что уже существует и, возможно, создаётся заново или сбрасывается...

Просто подсказываю направления, в которых можно копать.

при чем здесь логика программы?

при уходе с одного ТФ происходит деинит, при входе в новый ТФ происходит инит...

деинит стандартный для этого случая:


void OnDeinit(const int reason) 

  { 

//--- очистим комментарии 

   Comment(""); 

//--- destroy dialog 

   ExtDialog.Destroy(reason); 

  } 


вопрос в другом - почему при повторной инициализации проги на новом ТФ, пропадают значения полей  CSpinEdit?

поля  CEdit - обнуляются. это понятно. но почему пропадают значения в CSpinEdit?!.

CSpinEdit - тип int.

CEdit = тип - string.



 

Создайте глобальную переменную указывающую на то что панель уже создана (при смене таймфрейма она не сбрасывается) и в ините проверяйте. Если панель уже создана то незачем её пересоздавать при смене таймфрейма, как и нет необходимости удалять её в deinit.

bool START=true;

void OnInit()
{
    if(START)
    {
        "Создаём панель"
        START=false;
    }
}

void OnDeinit(const int reason)
{
   if(reason!=REASON_CHARTCHANGE && reason!=REASON_PARAMETERS)
   {
       "Удаляем"
   }
}
 
Alexey Valeev #:

Создайте глобальную переменную указывающую на то что панель уже создана (при смене таймфрейма она не сбрасывается) и в ините проверяйте. Если панель уже создана то незачем её пересоздавать при смене таймфрейма, как и нет необходимости удалять её в deinit.

спасибо за совет, но увы...

при переходе с одного ТФ на другой и значения пропали, и панель с полями стали перемещаться по графику.

причем совершенно независимо друг от друга - поля сбежали от панели )))

 
Напишите для начала, какой тип программы. Эксперты и индикаторы инициализируются и деинициализируются по-разному.
Причина обращения: