Раскраска свечи может быть выполнена двумя линиями: тонкая линия должна
накладываться на свечу так, чтобы полностью накрыть тени, а широкая линия должна
заполнить тело свечи. Применить для решения задачи линии пользовательского
индикатора в данном случае не представляется возможным, потому что отображаемые
линии должны быть вертикальными, т.е. построенными по двум координатам цены (при
совпадающих координатах времени), а индикаторные массивы позволяют хранить только
одно значение, поставленное в соответствие каждому бару. Поэтому решение задачи
сводится к отображению на ценовом графике серии однотипных графических объектов -
OBJ_TREND, отличающихся координатами, стилем и цветом линий (см. Графические
объекты).
В данном случае в качестве прикладной программы используется эксперт, хотя в общем
случае алгоритм может быть реализован и в пользовательском индикаторе. В целом
алгоритм программы понятен. При присоединении эксперта к окну финансового
инструмента (при исполнении init()) график должен быть раскрашен первый раз. На
каждом тике (при исполнении start()) программа должна отслеживать возможные
изменения в положении каждого из созданных ею графических объектов (пользователь
может случайно удалить или переместить любой из них) и при необходимости
восстановить его. А в период завершения программы (deinit()) все созданные программой
графические объекты должны быть удалены.
В период практической работы с экспертом пользователь может вручную создать в окне
финансового инструмента и другие объекты, например, установить канал стандартных
отклонений, уровни Фибоначчи, линии поддержки и пр. Поэтому в программе должен
быть реализован алгоритм, позволяющий отличать объекты, созданные программой, от
объектов, установленных пользователем. Это особенно важно при завершении
программы: необходимо удалить только "свои" объекты, а "пользовательские" оставить
без изменения. Каждый графический объект обладает определёнными свойствами,
которые, в общем случае, могут совпадать. Единственным отличительным признаком
любого объекта является его уникальное имя (одинаковые имена не допускаются).
При составлении имени каждого из создаваемых объектов желательно ввести в имя
объекта полезную информацию, по которой можно было бы судить о местоположении и
свойствах объекта. Например, имя объекта может содержать префикс, отличающий
объект, созданный этой программой, от всех других. В нашем случае это строковое
значение "Paint_". Кроме того, необходимо отличать и "свои" объекты между собой. При
этом простая нумерация (Paint_1, Paint_2 и т.д.) не может быть использована. Используя
799