474
Первый вариант, реализованный в эксперте strings.mq4, несколько более информативен,
поэтому в данном случае предпочтение отдано ему (с точки зрения алгоритма,
реализованного в программе, эти варианты равнозначны).
В последующих строках пользовательской функции Create() создаётся объект с
вычисленным именем His_Name, содержащим сведения о времени открытия бара, и со
свойствами, соответствующими номеру линии Line, а также с цветом в зависимости от
характеристик бара. Для каждого объекта указывается также значение текстового
описания: "Объект создан экспертом".
Вызов функции Create() осуществляется в программе в двух местах - из специальной
функции init() для первоначального создания объектов, и из специальной функции start(),
в случае необходимости ещё раз создать объект, случайно удалённый или изменённый
пользователем. Имена объектов в функции start() (блоки 4-5-6) формируются так же, как и
в других местах программы.
В блоке 6-7 определяется первая координата исследуемого объекта. Если при этом объект
не найден, то он создаётся с помощью Create(). А если объект существует, то
определяются другие его координаты и вычисляется, соответствуют ли его свойства
характеристикам бара (блок 7-8). При обнаружении любого несоответствия объект
удаляется и создаётся вновь (с тем же именем), но уже с правильными свойствами.
При исполнении функции deinit() решается ещё одна задача: из всей совокупности
объектов, имеющихся в окне финансового инструмента, необходимо удалить только те,
которые созданы экспертом. Это делается в два этапа: на первом этапе в массив
Name_Del[] запоминаются имена всех объектов, которые необходимо удалить, а затем, в
отдельном цикле, все эти объекты удаляются. Общее количество всех объектов в окне (в
том числе, созданных программой и установленных пользователем вручную) вычисляется
с помощью функции ObjectsTotal():
int Quant_Objects=ObjectsTotal(); // Cтолько всего ВСЕХ объектов
Количество раскрашиваемых баров устанавливается пользователем во внешней
переменной, т.е. заранее неизвестно, сколько графических объектов придётся удалять.
Поэтому строковый массив, несущий имена удаляемых объектов, объявляется с
количеством элементов равным 1, а затем размер массива программно изменяется -
количество его элементов увеличивается до общего количества объектов.
ArrayResize(Name_Del,Quant_Objects);// Необходимый размер массива