Формат CHD очень прост, если не заниматься дизайном графика. Для описания графика вполне хватает двух команд NewData и Series, за которыми следуют строки данных.
Команда NewData создает новую матрицу данных с заданными столбцами и делает ее текущей. Число значений в каждой последующей строке данных должно равняться количеству столбцов в матрице.
Команда Series создает серию точек на графике и описывает ее свойства, такие как X-координата, Y-координата, цвет, форма точки, и т.д. Каждое свойство может быть либо константой, либо именем столбца данных из какой-либо матрицы текущего слайда. Cвойства точек подробно описаны в разделе Серии.
Следующий график показывает динамику цен и объемов торгов акциями компании ЛУК ОЙЛ на ММВБ с февраля по ноябрь 1999 года.
График был построен по входному потоку данных, содержавшему по 3 значения в каждой строке: дату, цену и объем. Каждая строка соответствовала одному дню. Ниже приводится начальный отрывок входного потока:
#NewData day, price, value #Series X=day Y=price S=0 LC=1 #Series X=day Z=value S=0 LC=3 28/01/99 25.35 216335 29/01/99 25.68 124938 01/02/99 25.57 10226 ...
У этого графика много недостатков: даты отображаются числами, отсутствует заголовок и названия осей, слишком много нулей в метках правой вертикальной оси, и так далее... Таково форматирование графика по умолчанию.
Тот же график можно сделать существенно более понятным и привлекательным, если задать фоновую заливку, установить русскую локализацию, добавить заголовки и еще несколько команд форматирования:
#Locale= rus #Slide.Background = 17 17 7 7, bidir #Slide.GradMaxSize = 2 #Title Торги акциями ЛУК ОЙЛ, 1999 год #YName = цена #ZName= объем, млн. руб #XAxis.Type = date #YAxis.Color = 1 #ZAxis.Color = 3 #NewData day, price, value #Let vmill= value / 1000000 #Series X=day Y=price S=0 LP=2 LW=2 LC=1 #Series X=day Z=vmill S=0 LP=2 LW=1 LC=3 FD=1 FP=2 FC=15 #Series X=day Z=0 S=0 28/01/99 25.35 216335 29/01/99 25.68 124938 01/02/99 25.57 10226 ...
Продолжим пример с графиком хода торгов. Биржевые графики часто рисуют друг под другом: сверху цены, снизу объемы. Ход цены изображают с помощью интервальных гистограмм или японских подсвечников:
Данные для этого графика те же самые, что и в примерах 1 и 2. Слайд разбивается на две панели командами NewPanel. Команда Group размещает эти панели друг под другом и говорит, что верхняя панель в три раза выше. Команда CandleWidth задает ширину подсвечников в секундах (в данном случае одна неделя).
## определяем данные #NewData day, price, value #Let vmill= value / 1000000 #Slide.Background = 17 17 7 7, bidir #Slide.GradMaxSize = 2 ## определяем верхнюю панель цен #NewPanel price #Title Торги акциями ЛУК ОЙЛ, 1999 год #YName = цена #XAxis.Type = date #XAxis.Visible off #Series X=day MC=price MS=2 C=7 #CandleWidth 1 weeks ## определяем нижнюю панель объемов #NewPanel volume #Title.Border 0, 1, 0, 1 #Title.IndentVert = 0 #XAxis.Type = date #XAxis.SpaceVert = 1 #XAxis.IndentVert = 0 #Series X=day MC=vmill ML=0 MS=3 C=15 #CandleWidth = 1 weeks ## располагаем панели друг под другом, синхронизируем оси #Group (3,1)(1) main = price, volume #SyncAxis price.XAxis, volume.XAxis 27/01/99 24.85 66913 28/01/99 25.35 216335 29/01/99 25.68 124938 ...
Можно пойти дальше и построить третий график по тем же колонкам данных. Например, это могла бы быть гистограмма распределения объемов торгов по ценам, дающая нестандартное представление биржевых торгов.
Создадим еще одну панель и разместим на ней гистограммную серию. Для построения гистограммы распределения необходимы две дополнительных команды. HorizHist говорит, что гистограмма горизонтальная и каждая точка отображается отдельно внутри столбца. Команда ColWidth задает ширину колонки гистограммы.
## определяем данные #NewData day, price, value #Let vmill= value / 1000000 #Slide.Background = 17 17 7 7, bidir #Slide.GradMaxSize = 2 ## определяем верхнюю панель цен #NewPanel price #Title Торги акциями ЛУК ОЙЛ, 1999 год #YName = цена #XAxis.Type = date #XAxis.SpaceVert = 1 #XAxis.IndentVert = 0 #XAxis.RulePose both #Series X=day MC=price MS=2 C=7 #CandleWidth 1 weeks ## определяем нижнюю панель объемов #NewPanel volume #Title.IndentVert = 0 #XAxis.Type = date #XAxis.Visible off #Series X=day MC=vmill ML=0 MS=3 C=15 #CandleWidth = 1 weeks ## определяем правую панель с гистограммой объемов #NewPanel hist #HorizHist = detailed #ColWidth = 5 #YAxis.Visible off #Series Y=price HW=vmill HS=time C=15 ## располагаем панели друг под другом, синхронизируем оси #Group (3,1)(2,1) main = price, hist, volume #SyncAxis price.XAxis, volume.XAxis #SyncAxis price.YAxis, hist.YAxis 27/01/99 24.85 66913 28/01/99 25.35 216335 29/01/99 25.68 124938 ...
Точнее, данные можно вычислять по формулам. Например, чтобы построить график функции номального распределения, достаточно всего четырех строк описания:
#Let x= RowIndex/5-4 #Let y= FNorm(x) #ResizeData 40 #Series X=x Y=y
Команда Let создает новый столбец данных, значения в котором вычисляются по указанной формуле. Встроенная переменная RowIndex дает порядковый номер текущей точки, а команда ResizeData устанавливает число строк в столбцах x и y, то есть число точек на графике.
Вот что в итоге получается: