Ошибки, баги, вопросы - страница 434

 

komposter
Вы правы. Я допустил ошибку.
Спасибо за ответ.

 
Silent:

Опечатка в Справочник MQL5 - Стандартная библиотека - Классы для организации данных - CArrayObj (на сайте и в хелпе):

 2. Механизм управления памятью выключен.

В этом случае, CArrayObj не ответствечает за освобождение памяти

 

Исправили, спасибо
 

Документация. Раздел Статические переменные.

"...Статические переменные существуют с момента выполнения программы и инициализируются однократно перед вызовом специализированной функции OnInit()..."

 Проверочный код советника:

void OnInit() {
  Print("OnInit() begin!");

  static bool init = true;
  if (init) {
    Print("Static initialized!");
    init = false;
  } 

  Print("OnInit() end!");
}

"Кладем" советник на график:

2011.06.27 20:10:56     Тест (EURUSD,H1)        OnInit() begin!
2011.06.27 20:10:56     Тест (EURUSD,H1)        Static initialized!
2011.06.27 20:10:56     Тест (EURUSD,H1)        OnInit() end!

Не удаляя советника с графика, меняем период графика: 

2011.06.27 20:11:00     Тест (EURUSD,M30)       OnInit() begin!
2011.06.27 20:11:00     Тест (EURUSD,M30)       OnInit() end!

Так и должно работать?

 

Я на самом деле трактовал информацию из документации как принудительная инициализация статических переменных при любом вызове функции OnInit(), независимо: вызвана ли причиной перекомпиляции или сменой символа, или еще чем-то...

Выходит, я ошибался. Прошу просвятить: какие есть исключения в данном правиле?

 

При смене входных параметров - та же самая "петрушка".

А вот при смене счета, отработка идет правильная - статические переменные переинициализируются.

 

Интересно, как сменить символ графика, не удаляя эксперта (REASON_CHARTCHANGE)?

Документация по MQL5: Стандартные константы, перечисления и структуры / Именованные константы / Причины деинициализации
Документация по MQL5: Стандартные константы, перечисления и структуры / Именованные константы / Причины деинициализации
  • www.mql5.com
Стандартные константы, перечисления и структуры / Именованные константы / Причины деинициализации - Документация по MQL5
 
voix_kas:

Документация. Раздел Статические переменные.

"...Статические переменные существуют с момента выполнения программы и инициализируются однократно перед вызовом специализированной функции OnInit()..."

 Проверочный код советника:

"Кладем" советник на график:

Не удаляя советника с графика, меняем период графика: 

Так и должно работать?

Да, так и должно работать.

Программа (ее код) то уже загрузилась однократно и лишь делает горячую переинициализацию (Deinit/Init без выгрузки кода). В этом случае сам разработчик должен заботиться об правильной инициализации окружения.

 
Renat:

Да, так и должно работать.

Программа (ее код) то уже загрузилась однократно и лишь делает горячую переинициализацию (Deinit/Init без выгрузки кода). В этом случае сам разработчик должен заботиться об правильной инициализации окружения.

Во-первых, Ваш комментарий явно противоречит определению в документации: инициализируются однократно перед вызовом OnInit(). Тогда следует явно уточнить в документации определение: "...инициализируются однократно перед первым вызовом OnInit()".
Во-вторых, Ваш комментарий явно противоречит случаю со сменой счета, при котором МТ, очевидно, принудительно завершает работу эксперта и восстанавливает заново.

Можно ли вынести на рассмотрение/голосование принципиальный вопрос о необходимости принудительной переинициализации статических переменных при каждом (не только при первом) вызове OnInit()?

 

Вобще, забавно выходит.
По наитию, считал, что функция OnDenit - является своего рода деструктором, а OnInit - конструктором эксперта.
По факту же выходит, что OnInit - событие многократное (в пределах жизни эксперта). Непонятно тогда, зачем явно генерировать событие OnDenit, если известно, что советник не завершает свою работу (например, в случае с изменением периода графика)?

И еще вопрос.
Причина деинициализации REASON_CHARTCHANGE - Символ или период графика был изменен.
Объясните, пожалуйста, каким образом можно изменить символ графика, не удалив эксперта на нем?

 
voix_kas:

И еще вопрос.
Причина деинициализации REASON_CHARTCHANGE - Символ или период графика был изменен.
Объясните, пожалуйста, каким образом можно изменить символ графика, не удалив эксперта на нем?

ChartSetSymbolPeriod()
 
voix_kas:

Вобще, забавно выходит.
По наитию, считал, что функция OnDenit - является своего рода деструктором, а OnInit - конструктором эксперта.
По факту же выходит, что OnInit - событие многократное (в пределах жизни эксперта). Непонятно тогда, зачем явно генерировать событие OnDenit, если известно, что советник не завершает свою работу (например, в случае с изменением периода графика)?

И еще вопрос.
Причина деинициализации REASON_CHARTCHANGE - Символ или период графика был изменен.
.Объясните, пожалуйста, каким образом можно изменить символ графика, не удалив эксперта на нем?

1. Точно также все вызывалось в МТ4. А завершается либо нет работа эксперта этоо науки не известно (для этого в OnDeinit параметры и падаются, зотя причину возможного срабатывания OnInit тоже легко можно узнать).

2. Все очень просто, в параметрах терминала разрешите торговать эксперту при смене символа и периода.

После чего выберите в обзоре рынка другой символ и "бросьте" его на график мышкой.

Эксперт в любом случае при нормальной инициализации после смены символа/периода "не удалится" (происходит как ниже выразился Ренат "Горячий рестарт"). Если рассматривать это на простом уровне то эксперту при определенных настройках терминала разрешат торговать.

Yedelkin:
ChartSetSymbolPeriod()
Тоже вариант, но программный. :)
 
voix_kas:

Во-первых, Ваш комментарий явно противоречит определению в документации: инициализируются однократно перед вызовом OnInit(). Тогда следует явно уточнить в документации определение: "...инициализируются однократно перед первым вызовом OnInit()".

Да, это надо точнее прописать в документации.


Во-вторых, Ваш комментарий явно противоречит случаю со сменой счета, при котором МТ, очевидно, принудительно завершает работу эксперта и восстанавливает заново.

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


Можно ли вынести на рассмотрение/голосование принципиальный вопрос о необходимости принудительной переинициализации статических переменных при каждом (не только при первом) вызове OnInit()?

К сожалению, нет. Это может решаться исключительно холодным перезапуском эксперта.