Объекты графика и рисунки
Объекты графика (рисунки) позволяют рисовать линии или геометрические фигуры на графиках cTrader. Используя их, вы можете рисовать паттерны или показывать определенные события на графиках на основе данных вашего сиБота или индикатора.
Объекты графика используют координаты X и Y для позиционирования.
- Ось X представляет время графика или индексы баров.
- Ось Y — это цена инструмента.
Все объекты графика являются производными от базового класса ChartObject, что означает, что все они наследуют определенные базовые функции.
Примеры кода объектов графика
Рисование внутри окон индикаторов
При создании объектов графика вы не ограничены основным графиком инструмента. Фактически, вы можете рисовать объекты графика внутри любых окон, содержащих выходные данные индикаторов.
Класс Chart имеет коллекцию IndicatorAreas. Она содержит все неналоженные или отдельные окна, в которых индикаторы могут отображать свои выходные данные.
Вы также можете получить доступ к текущей области индикатора, используя свойство IndicatorArea вашего класса Indicator.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |
Когда вы запустите экземпляр вышеуказанного индикатора, вы должны увидеть красную линию в отдельном окне индикатора. При создании графиков в отдельных областях индикаторов вы можете использовать все методы рисования, поскольку и Chart, и IndicatorArea наследуются от базового класса ChartArea.
Статический текст
Вместо использования координат X и Y для позиционирования статический текст использует статическое горизонтальное и вертикальное выравнивание. Чтобы показать или нарисовать статический текст, используйте метод DrawStaticText().
1 | |
Если вы прикрепите этот объект графика к индикатору и запустите экземпляр, вы увидите следующий текст на основном графике.

Вертикальная линия
Используйте метод DrawVerticalLine() для рисования вертикальной линии.
1 2 3 | |
Горизонтальная линия
Используйте метод DrawHorizontalLine() для рисования горизонтальной линии.
1 2 3 | |
Линия Тренда
Линия Тренда начинается с определенной точки на графике и заканчивается в другой точке. Линии Тренда полезны для создания различных форм или сложных паттернов.
Чтобы нарисовать линию Тренда, используйте метод DrawTrendLine().
1 2 3 4 5 6 7 | |
Прямоугольник
Используйте метод DrawRectangle() для рисования прямоугольника.
1 2 3 4 5 6 7 | |
Треугольник
Используйте метод DrawTriangle() для рисования треугольника.
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
Другие объекты графика
Для краткости мы не упомянули несколько других объектов графика в приведенных выше фрагментах кода. Эти объекты включают, помимо прочего, следующие:
- Эллипс
- Значок
- Вилы Эндрюса
- Канал с равноудаленной ценой
- Расширение Фибоначчи
- Веер Фибоначчи
- Уровни коррекции Фибоначчи
Все эти объекты можно нарисовать, используя методы Draw...() с аналогичными названиями, принимающие аналогичные параметры.
Риск и доход
Интерфейс ChartRiskReward предоставляет типы, которые позволяют программно создавать объекты риска и дохода на графиках и управлять ими.
Приведенный ниже код показывает, как создать индикатор, который рисует объект риска и дохода:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | |

Ключевые настройки объектов
Именование объектов графика
Всякий раз, когда вы пытаетесь нарисовать объект графика, вы должны указать его имя в качестве аргумента для метода рисования.
Все имена объектов графика должны быть уникальными. Если это требование не выполняется, вы рискуете тем, что объекты графика будут переопределять объекты графика с одинаковыми именами в зависимости от времени их выполнения. Вы можете использовать значение индекса текущего бара или текущее время для генерации уникальных имен для каждого объекта.
Доступ к объектам графика
Все объекты графика содержатся в коллекции Objects. Эта коллекция включает объекты, нарисованные пользователем. В результате к коллекции Objects можно получить доступ для удаления объектов с графиков или изменения их свойств.
В приведенном ниже примере осуществляется доступ к элементам коллекции Objects:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | |
События
Объекты графика имеют несколько событий, которые вы можете использовать, чтобы узнать, какие объекты нарисованы, обновлены или удалены:
ObjectsAdded— срабатывает, когда один или несколько объектов графика добавляются на график.ObjectsRemoved— срабатывает, когда один или несколько объектов графика удаляются с графика.ObjectsUpdated— срабатывает, когда один или несколько объектов графика обновляются (одно из их свойств изменяется пользователем или активным индикатором или сиБотом).ObjectsSelectionChanged— срабатывает, когда один или несколько объектов графика выбираются пользователем.ObjectHoverChanged— срабатывает, когда курсор мыши наводится на объект графика.
В следующем примере используются все пять типов событий:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | |
Интерактивные и неинтерактивные объекты
При работе с интерактивными объектами пользователи могут изменять их свойства, такие как положение объекта, цвет, комментарий и т. д. Все объекты, нарисованные пользователем, по умолчанию являются интерактивными.
Примечание
Свойство ChartStaticText не может быть изменено независимо от того, является ли связанный с ним объект интерактивным.
Чтобы сделать объект интерактивным, установите его свойство IsInteractive в значение true, как показано ниже:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | |
Все объекты графика имеют свойство IsInteractive. Его значение по умолчанию — false.
Если объект графика интерактивен, он не будет удален при удалении или остановке экземпляра индикатора или сиБота. Напротив, неинтерактивные объекты удаляются автоматически, когда индикатор или сиБот прекращает работу.
Чтобы избежать беспорядка, обязательно очищайте интерактивные объекты после удаления связанного с ними экземпляра, используя методы индикатора Destroy или сиБота OnStop.
Если объект графика не является интерактивным, он также будет невидим в списках и коллекциях объектов графика.
Заблокированные и разблокированные объекты
Блокировка объекта графика не позволяет пользователю изменять или обновлять его. Вы можете сделать это через окно Трейдера (свойства графика) или установив свойство IsLocked в значение true. Значение по умолчанию — false.
Вы можете использовать блокировку, чтобы сделать объект интерактивным, но при этом запретить пользователю его изменять. В следующем примере блокируется объект вертикальной линии:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | |
Показать и скрыть
Вы можете нарисовать объект на графике и впоследствии скрыть его. Хотя объект по-прежнему будет присутствовать на графике, он будет полностью невидимым.
Для этого установите свойство IsHidden в значение true.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | |
Использование ресурсов — основное соображение при использовании этой функции. Если объект должен часто появляться на графике (но не постоянно), лучше скрыть его, чем удалять и перерисовывать каждый раз, когда он нужен.
Выбор объекта и индекс отображения (ZIndex)
Естественно, могут возникнуть случаи, когда несколько объектов пересекаются друг с другом на графике, что затрудняет или делает невозможным выбор одного конкретного объекта. При наведении курсора мыши на группу пересекающихся объектов графика можно будет выбрать только тот объект, который был нарисован последним.
Чтобы изменить это поведение, вы можете использовать свойство ZIndex. Оно может быть полезно при попытке отобразить сложные паттерны объектов графика.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | |
После добавления на график вышеуказанный индикатор отобразит красную вертикальную линию, а не желтую. Поскольку значение свойства ZIndex первой линии выше, чем соответствующее значение второй линии, она имеет приоритет над второй (желтой) линией.
Другими словами, свойство ZIndex определяет, какие объекты графика отображаются первыми при наложении. Всем нарисованным объектам графика автоматически присваивается определенное значение свойства ZIndex.
Узнать, удален ли объект
Все объекты графика наследуют свойство IsAlive от базового класса ChartObject. Значение этого свойства равно true, пока объект присутствует на графике (независимо от того, видимый он или невидимый). Значение устанавливается в false, как только объект удаляется с графика.
Если вы сохраняете ссылку на объект графика и этот объект удаляется пользователем, вы можете проверить свойство IsAlive, чтобы узнать, жив объект или нет.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | |
Если вы запустите экземпляр этого индикатора, щелкните правой кнопкой мыши по красной линии и удалите ее. В журнале должно появиться сообщение "Object reference removed".
Если вы сохраните ссылку на (мертвый) объект графика, произойдет утечка памяти. Во время сборки мусора ваш объект все еще будет считаться живым, что означает, что он переживет процесс сборки.
Чтобы избежать этой проблемы, используйте событие ObjectsRemoved в сочетании со свойством IsAlive.
Индекс бара или время
При кодировании объектов графика вы можете использовать либо время графика, либо индекс бара для оси X.
По нашему мнению, время графика — лучший вариант. При использовании индексов баров вы не можете планировать будущие значения (потому что необходимые индексы еще не существуют) и не можете учитывать пробелы между барами. Однако индексы баров могут быть проще в использовании, особенно в случае относительно простых объектов графика.
Все методы Chart.Draw имеют разные перегрузки для индексов баров и времени графика.