Кто понимает логику инициализации переменных? - объясните плизззз

 

Есть простой тестовый код индикатора:

#property indicator_chart_window
#property indicator_buffers 0

static int Number=0;  

int init() { Print("Init"); }

int start() { Number++; Print("Number="+Number); }

Компилим, цепляем на график. Получаем Number=1. С каждым новым тиком или по команде Обновить счетчик увеличивается. Пока все ясно и понятно и работает как и ожидалось.

Теперь меняем тайм фрейм или сбрасываем на чарт другой символ. Честно отрабатывает инит и счетчик сбрасывается в ноль и нумерация снова начинает идти с новой 1. Ну допустим что это тоже правильно.

Теперь - ВНИМАНИЕ! Перелогиниваемся на другой счет. Инита - НЕТ! С каждым новым тиком или по команде Обновить счетчик увеличивается, продолжая наращивать цифры насчитанные на прошлом счете.

Ну почему сделано именно так?!! Один из вариантов ответа: ну какже - ведь данные то поменялись, значит нужно инитится. Гм... но тогда почему нет инита при смене счета?!! Ведь у разных ДЦ они разные, да и разница между реалом и демо тоже есть. Вот здесь бы как раз и проинить, но...

Я рассчитывал что время жизни статической переменной должно начаться с присоединения к графику и ее значение (если нет никаких операций по ее изменению в самом коде) не должно изменяться до удаления графика с основного чарта. Что то вроде: при запуске проинитил и пользуешся до тех пор пока индюк на чарте висит. Но - "имеем - то что имеем" :(


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

Файлы:
 

Здесь в МТ-4 явная ошибка, конечно же не влияющая на качество конечного продукта)))
static означает, что пока прога не выгружена, переменная гарантировано не инициализируется (и бывает даже не перемещается)
Однако в МТ static на общие переменные не влияет никак

- предусмотрена переинициализацию (+пересчет для инди) при изменении свойств,
это фактическая перезагрузка но в журнале про это не пишут.
и эта переинициализации при изменении свойств не должна бы трогать переменные static, т.е. как ни прискорбно это ошибка.
например при смене только цвета слетит какой нить расчет.
Обратно при смене счета нет перезагрузки но есть пересчет - = - вторая ошибка на ошибку
- если переиницируем при пересчете,
тогда правильно при пересчете переинициировать.

....

Однако, нашли этот баг ну и ладушки, как обойти понятно, "не верь не бойся не проси":
- сочиняем имена глобальных терминала состоящие из номера счета+пара+Tф+имя проги

+ следим за сменой счета и сами заботимся о чистоте расчетов

 
Korey >>:

как ни прискорбно это ошибка.

Ок. а то я уж начал думать что гдето документацию недочитал...

 
Кому ошибка, а кому и фича.:-)
Совсем недавно возвращались к этому вопросу, что при смене счета нет переинициализации.
 
Roger >>:
Совсем недавно возвращались к этому вопросу, что при смене счета нет переинициализации.

тогда в чем здесь логика? при смене тайма - есть, при смене счета - нет. и там и там мы получаем НОВЫЕ данные, значит что и там и там инитить либо и там и там не инитить (ИМХО).

 
Roger писал(а) >>
Кому ошибка, а кому и фича.:-)

въезжаю, пацаны тему прокашляли, хозяин старую мульку протер, до МТ-5 всем вилы, а там кто правильные с МТ-4 реально откинутся

 
ForexTools писал(а) >>

тогда в чем здесь логика? при смене тайма - есть, при смене счета - нет. и там и там мы получаем НОВЫЕ данные, значит что и там и там инитить либо и там и там не инитить (ИМХО).

При чем здесь логика, можно было сделать и по-Вашему, но тогда другие бы спрашивали почему так. Мне например важно, чтобы при смене счетов некоторые переменные не обнулялись. Не было бы, тогда бы городил огород. При смене ТФ действительно меняется все, поэтому переинициализация уместна.

 
модификатор static))
 
Korey >>:
модификатор static))

ну типа чтобы наверняка ;) ведь компилятор не ругается на ТАКУЮ конструкцию

 
ага, неповторимый аромат MQL-4
 

На мой взгляд, наличие трёх специальных функций (СФ) с фиксированными свойствами - содержательная часть общей концепции, предполагающей потиковый запуск СФ. Современные управляющие программы выполняют обработку больших объёмов данных, что диктует необходимость непрерывных вычислений. Возможен, например, такой подход: терминал отдаёт в окружение сведения о событиях (перекл. ТФ, смена счёта, новый бар, тик и пр.), а количество СФ и их свойства (по каким событиям ф-ии должны запускаться на исполнение) определяются программистом.

Отчасти это можно реализовать и средствами MQL4, но конфликты и ошибки могут возникать в случаях, если программа построена за пределами исходной концепции. Вообще говоря, это абсолютно нормальный процесс. Наличие подобных конфликтов и приводит разработчиков к необходимости создания новой, улучшенной версии платформы.