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

 

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

Вполне логично. Для индикатора на графике ничего не изменилось - таймфрейм, символ остались теже.

 

Поэкспериментировал. Еще при смене счета IndicatorCounted() не сбрасывается, а счета могут быть в разных ДЦ, т.е. индиктор будет отрисован по данным другого ДЦ. С одной стороны баг, а с другой - всё в предах концепции - у каждого ДЦ свой терминал, что не подразумевает переключений по счетам разных ДЦ из одного терминала. Это так сказать последствия использования недокументированных возможностей. Если переключаться только между счетами одного ДЦ, то все нормально, таймфрейм и символ теже, параметры без изменений - никаким образом не нужна инициализация.

Короче, надо терминал перезапускать после смены счета.

Только зачем все это? Неужели кто-то будет прыгать в одном терминале со счета на счет? Если несколько счетов у разных ДЦ, то и столько же терминалов должно быть установлено.

 

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


Я не совсем понял проблему с переинициализацией эксперта на смене счета. Все работает правильно - на смене счета происходит корректная переинициализация эксперта. Вот проверочный код:

int init()
  {
   Print("Init ",AccountNumber());
   return(0);
  }
int deinit()
  {
   Print("Deinit");
   return(0);
  }
int start()
  {
   return(0);
  }


Вот результат:

07:12:54 TestInit EURGBP,M1: loaded successfully
07:12:54 TestInit EURGBP,M1: Init 1169463     // запуск на первом счете
07:12:54 TestInit EURGBP,M1: initialized
07:13:15 TestInit EURGBP,M1: Deinit           // тут пошла смена счета
07:13:15 TestInit EURGBP,M1: deinitialized
07:13:15 TestInit EURGBP,M1: uninit reason 6
07:13:15 TestInit EURGBP,M1: Init 1169007     // перезапущен на новом счете
07:13:15 TestInit EURGBP,M1: initialized

Я склоняюсь к мысли, что на нашем форуме все чаще люди игнорируют тесты и доказательства.

 

Вкладка "Эксперты"

Индикатор приложен. Нет сообщений об init и deinit

Файлы:
1.mq4  2 kb
 

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


А индикаторам нужно работать с IndicatorCounted(), чтобы понять - произошла смена расчетных данных или нет. Вот проверочный код:

int init()
  {
   Print("Init ",AccountNumber());
   return(0);
  }
int deinit()
  {
   Print("Deinit");
   return(0);
  }
int start()
  {
   Print("Counter ",IndicatorCounted()," ",AccountCompany());
   return(0);
  }
Вот результаты:
08:35:54 TestInd EURGBP,M1: loaded successfully
08:35:54 TestInd EURGBP,M1: Init 1344912
08:35:54 TestInd EURGBP,M1: initialized
08:35:54 TestInd EURGBP,M1: Counter 0 Alpari Ltd.    // счетчик сброшен в 0
08:35:54 TestInd EURGBP,M1: Counter 2050 Alpari Ltd.
08:35:55 TestInd EURGBP,M1: Counter 2050 Alpari Ltd.
08:35:56 TestInd EURGBP,M1: Counter 2050 Alpari Ltd.
08:36:01 TestInd EURGBP,M1: Counter 2050 Alpari Ltd.
08:36:01 TestInd EURGBP,M1: Counter 0 MetaQuotes Software Corp. // счетчик сброшен в 0
08:36:04 TestInd EURGBP,M1: Counter 2126 MetaQuotes Software Corp.
08:36:05 TestInd EURGBP,M1: Counter 2126 MetaQuotes Software Corp.
08:36:05 TestInd EURGBP,M1: Counter 2126 MetaQuotes Software Corp.
08:36:06 TestInd EURGBP,M1: Counter 2126 MetaQuotes Software Corp.

При смене торгового счета индикатор отлично понимает невалидность старых расчетов через IndicatorCounted=0, что я и продемонстрировал в примере. Например, при переходе на другой сервер (с Альпари на Метаквотс) счетчик сначала занулился, а на следующем тике показал нормальное значение.


То есть, и с индикаторами все отлично и правильно работает. IndicatorCounted() сбрасывается при смене торгового сервера (но при переключениях в пределах одного сервера не происходит смена History Center и счетчик не сбрасывается!):

Поэкспериментировал. Еще при смене счета IndicatorCounted() не сбрасывается, а счета могут быть в разных ДЦ, т.е. индиктор будет отрисован по данным другого ДЦ.

 

to Renat

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

 
Korey >>:

to Renat

Вопрос темы был про модификатор static примененный к переменным глобальной видимости (пока только к ним, к глобальным))).

Я не понял вопроса и поэтому не отвечаю на него ибо стараюсь не домысливать слабо подготовленные вопросы.


Сформулируйте кратко, но понятно с куском кода свой вопрос, пожалуйста.

 
Renat писал(а) >>

IndicatorCounted() сбрасывается при смене торгового сервера (но при переключениях в пределах одного сервера не происходит смена History Center и счетчик не сбрасывается!):

Тогда все нормально.

 

to Renat

Вот тестовый индикатор.
Задача: допустим мы собираем все парaметры с которыми применялся индиктор в один массив с целью дальнейшего анализа.
т.е. пользователь изменил параметр через "свойства", а мы запомнили.
Читаем даташит и обнаруживаем там модификатор static.
Ага, сказали мы, и написали следующе

#property indicator_chart_window
#property  indicator_buffers 1
#property  indicator_color1  Silver
extern int param=0;
double line[];
static int his_p[10000];
static int chparam=0;
int init() {  SetIndexStyle(0,DRAW_LINE);  SetIndexBuffer(0,line); }
int deinit() {Comment("");}
int start()
  {
   int    i,counted_bars=IndicatorCounted(); for(i=0;i<50;i++) line[i]=High[0]+i*Point;
   if(counted_bars==0) {his_p[chparam]=param; chparam++;}
   Comment("counted_bars=",counted_bars,"  изменений=", chparam,"  Поледнее=",his_p[chparam-1],"\n");
   func();
   return(0);
  }
  


Однако, массив и переменная под модификатором static нагло инициализируются при каждом изменении свойств.
Смотрим логи была ли перезагрузка? -не было.
Значит модификатор static в отношении переменных глобальной видимости не работает.
Ага, сказали мы, наверное в функции будет работать!!!
и дописали функцию)))

#property indicator_chart_window
#property  indicator_buffers 1
#property  indicator_color1  Silver
extern int param=0;
double line[];
static int his_p[10000];
static int chparam=0;
int init() {  SetIndexStyle(0,DRAW_LINE);  SetIndexBuffer(0,line); }
int deinit() {Comment("");}
int start()
  {
   int    i,counted_bars=IndicatorCounted(); for(i=0;i<50;i++) line[i]=High[0]+i*Point;
   
   if(counted_bars==0) {his_p[chparam]=param; chparam++;}
   Comment("counted_bars=",counted_bars,"  изменений=", chparam,"  Поледнее=",his_p[chparam-1],"\n");
   func();
   return(0);
  }
  
  void func()
  {
   static int his_p2[10000];
   static int chparam2=0;
   int    counted_bars=IndicatorCounted(); 
   if(counted_bars==0) {his_p2[chparam2]=param; chparam2++;}
   Alert("counted_bars2=",counted_bars,"  изменений2=", chparam2,"  Поледнее=",his_p2[chparam]);
   return;
  
  }

Ессно и в функциях обнуляется без перезагрузки.

 

P.S.

в МТ-4 что либо изменять кроме документации необходимости нет и нежелательно, т.к. к этому привыкли.
Однако, этот же баг в понимании видимости и статичности при переходе к МТ-5 может создать проблемы.

Причина обращения: