В каких случаях вызываются init() и deinit()

 
Возникла проблема с удалением пользовательских объектов при переключении таймфреймов. Все мои объекты начинаются с префикса "fxb" и логично предположить, что при завершении работы индикатора, изменении его параметров, переключении периода я могу удалить "старые" объекты как описано ниже.

int deinit() {
int i; string name;
 for (i= 0; i< ObjectsTotal(); i++) {
	name= ObjectName(i);
	if ( StringFind(name, "fxb", 0)!= -1) {
		if (ObjectDelete(name))
			Print(name + " deleted");
		else 
			Print(name + " delete error."+ ErrorDescription(GetLastError()));
	}
 }

}



Но, не получается. Например, выбран период Н4, все стрелки сигналов на месте. Теперь переключаюсь на Н1 и имею на графике сигналы как часовые, так 4-часовые, и так далее.

 
Попробуйте использовать для проверки код из примера "MQL4: UninitializeReason"
 
Попробуйте сделать цикл задом наперёд. От ObjectsTotal() к 0

Проблема многократно обсуждалась, правда в связи с закрытием и удалением ордеров.
 
Да, я проглядел, что в примере удаление объектов организовано неправильно.
 
Да, я проглядел, что в примере удаление объектов организовано неправильно.

А в чем неправильность-то? Перебираются все объекты и те, чьи имена начинаются с "fxb", удаляются. Как показывают логи, ф-ция ObjectDelete(name)) возвращает TRUE, но фактического удаления не происходит.
 
"Операция Ы" смотрели? Сцену с горшками.
 
Вы бы поискали обсуждение про удаление ордеров. Зашли бы на MQL4.COMmunity...

Функция ObjectDelete изменяет список объектов количественно и в некоторых случаях качественно.

Если объекты удалять с конца списка, то меняется только размер списка.

Если объекты удалять из начала списка (или из середины), то изменяется не только количество объектов, но и список сдвигается. Вот удалили Вы 0-й элемент - на его место попал 1-й элемент, на место первого элемента попал второй и т.д. Затем по цикл Вы удаляете 1-й элемент (следующий после 0-го, вы ведь инкрементировали индекс!). А бывший 1-й элемент сидит на месте 0-го, реально Вы удаляете бывший 2-й элемент.

То есть Вашим способом из 100 объектов Вы реально удалите только 50
 
Функция ObjectDelete изменяет список объектов количественно и в некоторых случаях качественно.

Мне ясна Ваша идея - список сокращается по мере выполнения цикла и элементы, находившиеся в конце массива, становятся недоступными. В этом случае прохождение массива от старшего эелемента к младшему должно помочь. Но, выяснилась еще одна деталь. Фактически, ф-ция удаления объектов по строке-идентификатору приложения его создавшего, находится у меня в отдельной библиотеке fxb_comm.ex4, которая подключена через #import "fxb_comm.ex4". Но логи пишут, что таковая (fxb_comm.ex4) загружается ПОСЛЕ индикатора, ее использующего (fxb_ind)...

09:24:12 Custom indicator fxb_ind EURUSDm,H4: loaded successfully
09:24:12 Custom indicator fxb_comm EURUSDm,H4: loaded successfully

... а выгружается РАНЬШЕ

09:24:19 Custom indicator fxb_comm EURUSDm,H4: removed
09:24:19 Custom indicator fxb_ind EURUSDm,H4: removed

Возможно, RemoveObjects() просто недоступна вызывающей программе, но сообщения об ошибке при этом не генерируется.


#property library
#include <fxb.mqh>

void RemoveObjects(string pfx) {
....
}
 
Слава, Рош, спасибо, удаление от старших к младшим работает нормально. И как это я лоханулся, ведь сто раз с этим сталкивался при работе с дельфийскими TStrings :-)
Причина обращения: