Обзор TradeStation 9.1 build 12880 [Update 13-29].

Вступление.
Поддержка секундных интервалов.
Улучшения работы с графиками.
Улучшения пользовательского интерфейса.
Расширение возможностей языка EasyLanguage.
Расширение библиотеки классов EasyLanguage (ECL).
Новые объекты рисования.
Визуальный отладчик и визуальный построитель форм.
Выводы.



Вступление.

После выхода TradeStation 9.1 build 12098 (Update 12), программисты TradeStation не сидели без дела и смогли реализовать достаточно много улучшений, призванных сделать работу с платформой более удобной, экономящей время и силы. В данном обзоре рассматриваются наиболее интересные возможности платформы TradeStation 9.1 с обновлениями Update 13-24.

В данное время идет тестирование новой версии QuoteRoom, которая будет поддерживать работу с TradeStation 9.1 build 12679 (Update 24). Инструкция по установке и настройке новой версии будет опубликована на сайте после окончания тестирования.

Поддержка секундных интервалов.

Для построения графиков, расчета индикаторов в RadarScreen, Scanner можно использовать секундные интервалы. Поддерживаются интервалы от 1 секунды до 3600. Прежний интервал Intra-day переименован в Minute.

Секундные интервалы могут использоваться для построения как обычных графиков, так и для построения графиков Point & Figure, Kagi, Line Break, Momentum, Range. Более 50 индикаторов и сигналов, входящих в инсталляцию TradeStation, были доработаны так, чтобы правильно работать на секундных интервалах.

Улучшения работы с графиками.

Для улучшения качества графического представления изменены методы отрисовки графических объектов. Далее вы можете видеть изображение объектов до и после Update 23:








Графики типа «Крестики и нолики» стали буквально соответствовать своему названию:


Снято ограничение применения стилей к линиям различной толщины:




Наклонные линии получили свойство «Show Anchor Prices», после включения которого на графике отображается начальная и конечная цена линии:




Графики, объекты рисования, индикаторы получили свойство для установления уровня прозрачности. На рисунке далее показаны графики двух различных символов, наложенных один на другой. Из-за установки уровня прозрачности второй символ не мешает видеть то, что происходит с основным символом:




Для управления загрузкой ядер процессора окнами с графиками, добавлен дополнительный параметр для ограничения числа доступных ядер:
 

Улучшения пользовательского интерфейса.

Многие функции форматирования доступны через улучшенное контекстное меню, отображающее не только текстовые пункты, но и стили, цвета, толщину:


Для создания новых окон разработан новый элемент интерфейса платформы - TradingApps Launcher. На рисунке далее он представлен в виде серого прямоугольника с надписью «TradingApps»:


Кликнув по прямоугольнику с надписью «TradingApps», вы увидите окно с иконками доступных для создания типов окон:


Прямоугольник «TradingApps» можно перетянуть к любой стороне главного окна TradeStation. Окно со списком иконок доступных для создания типов окон можно перетягивать, менять его размер, менять порядок доступных иконок с помощью их перетягивания:


Так же есть поле для быстрой фильтрации по строке, входящей в название приложения:


Если вам не нужна кнопка "TradingApps", вы можете отключить ее, выбрав в главном меню "View / TradingApp Launcher".

Расширение возможностей языка EasyLanguage.

Для работы с секундами в коде EasyLanguage были добавлены следующие ключевые слова: BarDateTime, EntryDateTime, ExitDateTime, LastCalcDateTime, функция SecondsIntoWeek.

Ключевое слово BarDateTime.

Ключевое слово BarDateTime позволяет получить доступ к секундам и широкому спектру данных даты и времени соответствующего бара. Обращение к BarDateTime возвращает объект типа DateTime.

Объект типа DateTime имеет ряд свойств для получения информации о дате и времени в нужном формате.

Обращение к предыдущим данным серии через BarDateTime доступно так же, как это было доступно для Date или Time. Вы можете указать в квадратных скобках на сколько баров в прошлое надо сослаться при получении данных. Так же вы можете обращаться к нескольким наборам данных через Data1-Data50.

Пример работы с BarDateTime:

Print("Date[0] = ", Date[0], " Time[0] = ", Time[0]);
Print("BarDateTime[0].ELDate = ", BarDateTime[0].ELDate,
" BarDateTime[0].ELTime = ", BarDateTime[0].ELTime,
" BarDateTime[0].Second = ", BarDateTime[0].Second);

Print("Date[1] = ", Date[1], " Time[1] = ", Time[1]);
Print("BarDateTime[1].ELDate = ", BarDateTime[1].ELDate,
" BarDateTime[1].ELTime = ", BarDateTime[1].ELTime,
" BarDateTime[1].Second = ", BarDateTime[1].Second);

Ключевые слова EntryDateTime, ExitDateTime.


Ключевые слова EntryDateTime, ExitDateTime возвращают объект типа DateTime. Синтаксис обращения выглядит так:

EntryDateTime(PositionNum).FieldName

PositionNum – номер позиции от текущей (ноль) до 10, информацию по которой необходимо получить. FieldName – имя свойства объекта DateTime, которые мы запрашиваем. Оператор EntryDateTime возвращает данные, относящиеся к открытию позиции. Оператор ExitDateTime возвращает данные, относящиеся к закрытию позиции.

Обратите внимание на отличие от ключевых слов EntryDate, ExitDate, которые возвращают ноль, если требуемая позиция не существовала. Новые ключевые слова в этом случае возвращают Null.

Пример обращения к операторам EntryDateTime, ExitDateTime:

If Currentbar = 1 then buy next bar at market;
If Currentbar = 2 then sell next bar at market;

If Currentbar = 3 then Begin
Print(" ");
Print("EntryDate(1) = ", EntryDate(1), " EntryTime(1) = ", EntryTime(1)) ;
Print("EntryDateTime(1).ELDate = ", EntryDateTime(1).ELDate, " EntryDateTime(1).ELTime = ", EntryDateTime(1).ELTime, " EntryDateTime(1).Seconds = ", EntryDateTime(1).Second);
Print(" ");
Print("ExitDate(1) = ", ExitDate(1), " ExitTime(1) = ", ExitTime(1));
Print("ExitDateTime(1).ELDate = ", ExitDateTime(1).ELDate, " ExitDateTime(1).ELTime = ", ExitDateTime(1).ELTime, " ExitDateTime(1).Seconds = ", ExitDateTime(1).Second);
End;

Ключевое слово LastCalcDateTime.

Ключевое слово LastCalcDateTime возвращает объект типа DateTime, соответствующий данным последнего бара для данного потока данных. Синтаксис эквивалентен синтаксису BarDateTime.

Пример использования:

Once Print("LastCalcDateTime.ELDate = ", LastCalcDateTime.ELDate, " LastCalcDateTime.ELTime = ", LastCalcDateTime.ELTime, " LastCalcDateTime.Second = ", LastCalcDateTime.Second);

Функция SecondsIntoWeek.

Функция SecondsIntoWeek возвращает число секунд, прошедших с 12 часов утра воскресенья до заданного в параметрах функции времени. Подробнее функция описана здесь.

Новые логические операторы.

Добавлены битовые логические операторы NOT, OR, XOR, AND.

Примеры использования:

myFont = Font.Create("Arial", 10, FontStyle.Bold or FontStyle.Italic);

Condition1 = True;
Condition2 = False;
Print (Not Condition1); // prints False
Print (Not Condition2); // prints True
Print (Not (Condition1 AND Condition2)); // prints True

Новое ключевое слово Transparent.

Ключевое слово Transparent позволяет скрыть часть линии индикатора между двумя точками. В настоящее время это ключевое слово может применяться только в отношении индикаторов в виде линии.

Пример построения индикатора без использования Transparent:

If (Time = SessionFirstBarTime(1, 1)) then
Value1 = 0
Else
Value1 = Value1 + 1;
Plot1(Value1);


Пример построения индикатора с использованием Transparent:

// Plot Example using transparent
If (Time = SessionFirstBarTime(1, 1)) then
Value1 = 0
Else
Value1 = Value1 + 1;

If (Time = SessionEndTime(1, 1)) then
SetPlotColor(1, Transparent);
Plot1(Value1);


Расширение библиотеки классов EasyLanguage (ECL).

Разработчики TradeStation стремятся расширять возможности языка и ECL так, чтобы приложения пользователей получали все больше возможностей для создания мощных интерактивных приложений. Кроме добавления новых объектов управления, появилась возможность передачи объектов управления между различными приложениями, используя GlobalDictionary. Пример такой передачи можно увидеть здесь.

Новый компонент WebBrowser.

В пространство имен elsystem.windows.forms добавлен компонент WebBrowser, который позволяет использовать функциональность браузера IE внутри ваших форм. Это позволит получить вам доступ к внешним ресурсам сети. Кроме того, вы можете отображать через браузер программно созданный HTML любой сложности.

Пример использования браузера находится в индикаторе _BrowserControlTest. После вставки этого индикатора вы сможет увидеть примерно следующее:


Компонент WebBrowser так же получил свойство ScriptErrorsSuppressed, позволяющее скрывать все окна с сообщениями об ошибке выполнения скрипта.

Улучшение класса DataPoint.

Класс DataPoint получил свойство CallOut, позволяющее включить вынос сносок за пределы диаграммы:


Улучшение компонента Label.

Компонент Label получил свойство TextAlign и ContentAlignment. Эти свойства дают больше контроля над тем, как будет выглядеть текст в форме:


Новый компонент NewsProvider.


Компонент NewsProvider позволяет разработчикам получить доступ к заголовкам и текстам новостей любого новостного контент-провайдера TradeStation.


NewsProvider поддерживает фильтрацию по символам (свойство Symbol) или ключевым словам (свойство Keywords). Для получения новостей от всех контент-провайдеров, свойство ProvidersFilter должно оставаться пустым.


Когда становится доступной новая новость, вызывается событие Updated. В параметрах события передается информация о заголовке, авторе, дате публикации. Для загрузки полного текста новости необходимо вызвать метод Load объекта NewsItem.

Новый компонент RSSProvider.

Компонент RSSProvider позволяет разработчикам получить доступ к RSS-лентам новостей, блогов, которые публикуются с помощью формата RSS:


Свойство Address должно содержать ссылку на ленту новостей в формате RSS. Свойство Interval содержит частоту запроса обновления в минутах. Если используется Proxy, то его адрес и порт указываются в свойстве Proxy.

Компонент имеет одно событие Updated:


Его параметры схожи с аналогичным событием компонента NewsProvider.

Новый компонент SymbolAttributesProvider.

Компонент SymbolAttributesProvider позволяет получить доступ к информации о символах, таких как пункт, минимальное движение, масштаба цен и информации о сессии. Обратите внимание, символ не обязательно должен быть в RadarScreen или на графике, чтобы получить информацию о нем.

Пример использования:

Using tsdata.marketdata;

Vars:
SymbolAttributesProvider SymInfo(Null);

Once Begin
SymInfo = SymbolAttributesProvider.Create();
SymInfo.Symbol = Symbol;
SymInfo.Load = True;

Print("Info for ", Symbol);
Print("Description = ", SymInfo.Description);
Print("Strike Price = ", SymInfo.StrikePrice);
Print("Session1 start time = ", SymInfo.Data.Sessions.Items[0].Open.ToString());
End;

Вставка индикатора с приведенным выше кодом позволит вывести в «EasyLanguage Print Log» следующую информацию:

Info for MSFT 130222C26.5
Description = Microsoft Corp [MSFT] Feb 2013 26.500 Call
Strike Price = 26.50
Session1 start time = 2/18/2013 8:30:00 AM

Новый класс Cursor.

Пространство имен elsystem.windows.forms получило новый класс Cursor, которые возвращает текущие координаты курсора мыши. Чтобы получить координаты курсора, можно обратиться к свойствам Cursor.Position.X, Cursor.Position.Y. Объект Cursor является статическим, поэтому не надо отдельно создавать класс для обращения к его свойствам.

Пример использования:

Method void CreateNewsMenu(Vector vect)
Vars: ContextMenu menu, MenuItem item, int cnt, NewsItem news;
Begin
menu = New ContextMenu();
Print(vect.Count);
For cnt = 0 to vect.Count - 1 Begin
news = vect[cnt] astype NewsItem;
item = MenuItem.Create(news.Title);
item.Click += OnMenuClick;
item.Tag = news;
menu.MenuItems.Add(item);
End;
menu.Show(Cursor.Position);
End;

Новый компонент TabControl.

С помощью компонента TabControl, TabPage и класса TabControlEventArgs, наряду с перечислением TabControlAction, можно создавать несколько панелей с вкладками, содержащими компоненты управления на форме. Вкладки обеспечивают удобный способ организации работы при большом числе компонентов управления.

Чтобы использовать вкладку в форме, необходимо сначала создать компонент типа TabControl и добавить его на форму. Компонент TabPage может быть создан внутри компонента TabControl. Другие компоненты управления добавляются в соответствующий компонент TabPage. Активный элемент TabPage указывается с помощью свойства SelectedIndex.

Новый компонент TableLayoutPanel.

Компонент TableLayoutPanel создает секции в форме, которые будут выдерживать размеры компонент формы в абсолютном или процентном значении при изменении размера формы, не требуя дополнительного кода для перемещения и масштабирования элементов управления.

Новый компонент ProgressBar.

Компонент ProgressBar предоставляет визуальную обратную связь о ходе длительных процессов:


После добавления на форму, можно установить свойства Minimum, Maximum и текущее значение индикатора прогресса Value:


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

Новый компонент Slider.

С помощью ползунка Slider пользователи могут легко выбирать значение из определенного диапазона, перетаскивая ползунок вдоль горизонтальной или вертикальной оси:

Свойства компонента:


Частота делений задается свойством TickFrequency.

Пример создания компонента в коде:

SpeedSlider = Slider.Create (150 , 30) ;
SpeedSlider.BackColor = Color.FromArgb (30 , 30, 30);
SpeedSlider.Location (90 , 5);
SpeedSlider.Minimum = 1;
SpeedSlider.Maximum = MaxSpeed ;
SpeedSlider.TickFrequency = 10;
SpeedSlider.LargeChange = 10;
SpeedSlider.SmallChange = 5;
SpeedSlider.Value = 4;
SpeedSlider.Scroll + = OnSpeedUpdate ;


Новый компонент DateTimePicker.

Компонент DateTimePicker отображает дату и время, с возможностью использования календаря:


Пример использования в коде:

DTPicker = DatetimePicker.Create(275, 30); // create the control
DTPicker.Location(2, 2);
DTPicker.Format = DateTimePickerFormat.custom; // we'll use a custom date and time display in the control
DTPicker.CustomFormat = "dddd MMMM dd, yyyy hh:mm:ss tt";
DTPicker.MinDate = DateTime.FromELDateAndTime(Date, Time) ; // restrict the first date of the calendar to the date of first bar on chart
DTPicker.ValueChanged += OnNewDate; // call OnNewDate when the date or time is modified in the control

Улучшение компонента Chart.

Компонент Chart получил свойство BackGradientStyle для задания метода градиентной закраски. Для указания базовых цветов необходимо установить свойства BackColor и BackSecondaryColor:


Компоненту добавлены обработчики событий Click, MouseDown, MouseHover, MouseMove, MouseUp.

Класс ChartSeries получил свойства основного цвета подписи LabelForeColor. Кроме того, стиль и размер маркеров может быть изменен с помощью свойств MarkerSize и MarkerStyle.

Улучшение класса Font.

Различные стили шрифта могут одновременно использоваться с использованием нового оператора OR:

Font.Create ( "Arial" , 10, FontStyle.Bold OR FontStle.Italic)

Улучшение компонентов ButtonBase и Button.

Компоненты ButtonBase и Button получили новые свойства: TextAlign для выравнивания по одному из перечислений ContentAlignment.

Оформление с помощью градиента.

Компоненты ButtonBase, Button, Label, ListView, Panel, TextBox, Form для отображения градиента получили свойства SetRadialGradient, SetLinearGradient, RemoveGradient и перечисление GradientStyle.

Улучшение компонента DataGridView.

Событие CellClick было добавлено компоненту DataGridView. Это событие позволяет компоненту DataGridView реагировать, когда пользователь щелкает по одной из его клеток.

Улучшение компонента MenuItem.

Компонент MenuItem получил новое свойство Tag, позволяющее хранить любое числовое значение. Это значение может использоваться в момент события Click.

Новые компоненты OpenFileDialog и SaveFileDialog.

Компоненты OpenFileDialog и SaveFileDialog позволяют запросить имя файла для открытия или сохранения:

OFD = OpenFileDialog.Create();
OFD.FileOk += OnFileSelected;
OFD.Show();

Результат выполнения кода:


Новый компонент SymbolListDialog.

Компонент SymbolListDialog предоставляет удобный способ получения доступа к символам в выбранном пользовательском списке символом. Компонент может быть очень удобным инструментом, когда есть необходимость оценки большого числа символов. Его использование аналогично работе с диалогами открытия/сохранения файлов:

SListDialog SymbolListDialog.Create = ();
SListDialog.StatusChanged + = OnSymbolListUpdate;
SlistDialog.Show ();

Приведенный выше код вызовет следующий диалог:


Улучшение компонента Form.

Форма получила свойство Position, для определения координат окна на экране.

Сериализация некоторых классов.

Классы DateTime, TimeSpan, Alarm, Timer, Dictionary, GlobalDictionary, Stack, Queue, Vector теперь сериализованы и могут передаваться между разными приложениями через GlobalDictionary.

Улучшение компонента Alarm.

Компонент Alarm теперь может добавляться через ToolBox. Добавлено свойство Time, для получения времени срабатывания и отключения сигнализирования.

Улучшение компонента ChartingHost.

Компонент ChartingHost получил метод ScrollTo для прокрутки графика в заданное место. Следующий фрагмент кода показывает, как метод ScrollTo используется для сдвига графика на один бар во время выполнения обработчика таймера:

method void Timer1_Elapsed( elsystem.Object sender, elsystem.TimerElapsedEventArgs args )
begin
If (AppStorage[PausedKey] astype bool = False and BarDateTime[CurrentBar - AppStorage[ScrollPositionKey] astype int] < BarDateTime[0]) then Begin
ChartingHost1.ScrollTo(BarDateTime[CurrentBar - AppStorage[ScrollPositionKey] astype int]);
AppStorage[ScrollPositionKey] = AppStorage[ScrollPositionKey] astype int + 1;
End;
end;

Метод ScrollTo может использоваться для симуляции торговли, создания закладок и прочих сервисных функций, облегчающих работу с графиками.

Компонент ChartingHost так же получил событие OnSize, которое вызывается во время изменения размера окна с графиком и событие OnInitialUpdate, которое вызывается по время обновления окна с графиком. Эти события позволяют отслеживать изменение размера окна с графиком. Пример использования этих событий есть в индикаторе _ChartingHostExample:

// Test OnInitialUpdate
method void ChartingHost1_OnInitialUpdate( elsystem.Object sender, charting.OnInitialUpdateEventArgs args )
Vars: charting.ChartingHost host;
begin
host = sender astype charting.ChartingHost;
Print("OnInitialUpdate: Width = ", args.Width, " Height = ", args.Height);
Print("OnInitialUpdate: sender.ClientWindow: IsReady = ", host.ClientWindow.IsReady.ToString(), " Width = ", host.ClientWindow.Width, " Height = ", host.ClientWindow.Height);
end;

// Test OnSize
method void ChartingHost1_OnSize( elsystem.Object sender, charting.OnSizeEventArgs args )
Vars: charting.ChartingHost host;
begin
host = sender astype charting.ChartingHost;
Print("ChartOnSize: sender.ClientWindow: IsReady = ", host.ClientWindow.IsReady.ToString(), " Width = ", host.ClientWindow.Width, " Height = ", host.ClientWindow.Height);
Print("ChartOnSize: Width = ", args.Width, " Height = ", args.Height);
end;

Print("ChartingHost.ClientWindow: IsReady = ", ChartingHost1.ClientWindow.IsReady.ToString(), " Width = ", ChartingHost1.ClientWindow.Width, " Height = ", ChartingHost1.ClientWindow.Height);

Объект Color.

Для упрощения оформления новых графических объектов, в пространство имен elsystem.drawing добавлен новый объект Color, который позволяет быстро получить параметры нужного цвета. Метод FromName позволяет получить параметры цвета, исходя из предопределенного имени цвета:

Form1.BackColor = Color.FromName("SlateBlue");
label1.ForeColor = elsystem.drawing.color.FromArgb(50,255,125,0); // set label text to custom ARGB color
button1.ForeColor = elsystem.drawing.color.White; // set button text to white
button1.BackColor = elsystem.drawing.color.DarkBlue; // set button background to dark blue
myTextDO.Color = elsystem.drawing.color.LightGreen; // set text drawing object to light green;

Таблицу цветов можно посмотреть здесь.

Новые объекты рисования.

Функции для работы с линиями tl_xxx и текстом text_xxx имели ряд ограничений в плане оформления. Возможностей для работы с такими объектами как прямоугольник, эллипс и так далее, не было вообще. Для снятия этих ограничений реализованы новые классы графических объектов. Работа с предыдущими типами графических объектов поддерживается как и раньше.

В пространство имен elsystem добавлен базовый класс AnalysisTechnique, имеющий свойство DrawingObjects, и перечисление ObjectCategory. Свойство DrawingObjects содержит список объектов, созданных в окне с графиком вручную или программно. Вектор объектов можно отфильтровать с помощью перечисления ObjectCategory, чтобы исключить ненужные объекты.

Методы Add и Delete позволяют добавить и удалить объект рисования в окно с графиком. Эти методы надо вызвать после создания объекта рисования нужного типа. Важно помнить, что простое создание объекта рисования без добавления его в окно графика с помощью метода Add, не сделает его видимым в окне с графиком.

Для установки координат объектов рисования, в пространство имен elsystem.drawingobjects добавлен базовый класс DOPoint, три дочерних класса XYPoint, BNPoint, DTPoint и перечисление PointType.

Графический объект рисования создается с заданием одной или более координат на графике. Например, Trendline требует две координаты. TextLabel требует одну координату. Ранее координаты задавались с помощью даты, времени и цены. Этого было достаточно. Однако для новых объектов рисования могут потребоваться секунды или привязка координат относительно базового окна с графиком, а не относительно цены с историей котировок. Поэтому для задания координат используются новые классы XYPoint, BNPoint, DTPoint, которые дают разработчикам больше возможностей для размещения объектов рисования.

Все три класса должны создаваться стандартным образом. Класс DTPoint ожидает в качестве первого параметра значение типа DateTime и значение цены (с точностью double), в качестве второго параметра. Класс BNPoint ожидает в качестве параметра целое значение номера бара и значение цены (с точностью double), в качестве второго параметра. Класс XYPoint ожидает в качестве параметров целое значение смещения в пикселях относительно левого верхнего угла окна. То есть, при прокрутке графика объект с привязкой XYPoint будет оставаться фиксированным относительно левого верхнего угла окна.

Каждый из трех классов XYPoint, BNPoint, DTPoint наследует от базового класса DOPoint свойство PointType, которое идентифицирует тип класса.

Все новые графические объекты являются производными от базового класса DrawingObject, который содержит свойства и события, общие для всех графических объектов:


Например, свойство Color задает цвет рисования объекта. Для TextLabel и TrendLine - это просто цвет объекта. Для графических объектов, таких как эллипс и прямоугольник, это цвет границы фигуры.

Свойство Points – это набор координат, используемых для создания графического объекта. Координаты графического объекта могут изменяться.

Свойство Persist позволяет включить сохранение графического объекта для индикаторов, обновляющих свои значения внутри бара на каждом тике. По умолчанию создание дублирующих объектов внутри бара блокируется, чтобы не создавались ненужные копии объектов и код мог оставаться максимально простым.

Свойство Tag имеет тип Object и позволяет сохранить вместе с объектом рисования дополнительную информацию.

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

Теперь рассмотрим новые объекты рисования.

Графический объект EllipseDrawing.

Этот объект рисования позволяет разработчикам программно разместить эллипс на графике. Для создания объекта надо передать две точки методу Create. Все три типа точек поддерживается для этого объекта. Обратите внимание, базовыми являются точки относительно левого и правого углов воображаемого прямоугольника, который ограничивает эллипс.

С помощью методов SetEndPoint и SetStartPoint графический объект можно переместить в другое место во время выполнения программы. Стиль и толщина границ эллипса могут быть изменены с помощью свойств Style и Weight. В качестве значений могут использоваться значения перечислений StyleType и Weight. Заливка задается с помощью свойств FillColor и FillPattern.

Следующий фрагмент кода создает три эллипса, каждый из которых использует различные типы координат:

If (Currentbar = 50) then Begin
MyBNEllipse = Ellipse.Create(BNPoint.Create(CurrentBar + MaxBarsBack, Highest(High, 50)),
BNPoint.Create(CurrentBar - 50 + MaxBarsBack, Lowest(Low, 50)));
DrawingObjects.Add(MyBNEllipse);
End;

If (LastBarOnChart = True) then Begin
MyDTEllipse = Ellipse.Create(DTPoint.Create(BarDateTime[0], Highest(High, 50)), DTPoint.Create(BarDateTime[49], Lowest(Low, 50)));
DrawingObjects.Add(MyDTEllipse);
MyXYEllipse = Ellipse.Create(XYPoint.Create(50, 50), XYPoint.Create(200, 200));
DrawingObjects.Add(MyXYEllipse);
End;

Графический объект HorizontalLine.

Объект HorizontalLine создает горизонтальную линию на графике. В следующем примере создается один экземпляр HorizontalLine, а затем он обновляет свое вертикальное расположение в соответствии с текущей ценой закрытия:

If (MyHorizontalLine = Null) then Begin
MyHorizontalLine = HorizontalLine.Create(Close);
MyHorizontalLine.Weight = Weight.weight4;
DrawingObjects.Add(MyHorizontalLine);
End Else
MyHorizontalLine.Price = Close;

Графический объект Rectangle.

Этот объект создает прямоугольник. По своим параметрам он схож с объектом Ellipse. Следующий фрагмент кода создаст три прямоугольника, каждый из которых использует уникальный тип координат:

If (Currentbar = 50) then Begin
MyBNRectangle = Rectangle.Create(BNPoint.Create(CurrentBar + MaxBarsBack, Highest(High, 50)), BNPoint.Create(CurrentBar - 50 + MaxBarsBack, Lowest(Low, 50)));
DrawingObjects.Add(MyBNRectangle);
End;

If (LastBarOnChart = True) then Begin
MyDTRectangle = Rectangle.Create(DTPoint.Create(BarDateTime[0], Highest(High, 50)), DTPoint.Create(BarDateTime[49], Lowest(Low, 50)));
DrawingObjects.Add(MyDTRectangle);
MyXYRectangle = Rectangle.Create(XYPoint.Create(50, 50), XYPoint.Create(200, 200));
DrawingObjects.Add(MyXYRectangle);
End;

В следующем примере изменяются параметры оформления MyXYRectangle:

If (MyXYRectangle <> Null) then Begin
MyXYRectangle.Weight = Weight.weight7;
MyXYRectangle.FillColor = Color.FromArgb(128, 0, 0);
MyXYRectangle.FillPattern = FillPattern.pattern8;
End;

Графический объект TextLabel.

Объект TextLabel позволяет разработчикам создавать текстовые метки на графиках. Свойства и методы класса TextLabel значительно шире тех возможностей, которые доступны с помощью функций Text_xxx. Объект TextLabel поддерживает все три типа координат.

Пример создания текстовой метки на графике:

If (Currentbar = 50) then Begin
MyBNTextLabel = TextLabel.Create(BNPoint.Create(CurrentBar, Close), "Hello 50th Bar!" );
DrawingObjects.Add(MyBNTextLabel);
End;

If (LastBarOnChart = True) then Begin
MyDTTextLabel = TextLabel.Create(DTPoint.Create(BarDateTime[0], Close), "Hello Last Bar!");
DrawingObjects.Add(MyDTTextLabel);
MyXYTextLabel = TextLabel.Create(XYPoint.Create(50, 50), "Hello 50,50");
DrawingObjects.Add(MyXYTextLabel);
End;

Объект TextLabel позволяет задавать индивидуальные параметры шрифта:

If (MyXYTextLabel <> Null) then Begin
MyFont = Font.Create("Arial", 30, FontStyle.bold);
MyXYTextLabel.Font = MyFont;
End;

Графический объект Trendline.

С помощью объекта Trendline вы можете разместить линии тренда на графике. Свойства и методы класса Trendline значительно шире тех возможностей, которые доступны с помощью функций Tl_xxx.

Пример создания Trendline:

If (Currentbar = 50) then Begin
MyBNTrendLine = TrendLine.Create(BNPoint.Create(CurrentBar, Close), BNPoint.Create(CurrentBar - 50, Close[49]));
MyBNTrendLine.ExtRight = False;
DrawingObjects.Add(MyBNTrendLine);
End;

If (LastBarOnChart = True) then Begin
MyDTTrendLine = TrendLine.Create(DTPoint.Create(BarDateTime[0], Close), DTPoint.Create(BarDateTime[49], Close[49]));
DrawingObjects.Add(MyDTTrendLine);
End;

В дополнение к свойствам оформления Style и Weight, есть свойства для продления линии - ExtendLeft и ExtendRight.

Графический объект VerticalLine.

Объект VerticalLine создает вертикальную линию, пересекающую окно с графиком. Он поддерживает привязку к координатам типа BNPoint и DTPoint.

Пример создания вертикальной линии:

If (Currentbar = 1) then Begin
MyBNVerticalLine = VerticalLine.Create(BNPoint.Create(CurrentBar, Close));
DrawingObjects.Add(MyBNVerticalLine);
End;

If (LastBarOnChart = True) then Begin
MyDTVerticalLine = VerticalLine.Create(DTPoint.Create(BarDateTime[0], Close));
DrawingObjects.Add(MyDTVerticalLine);
End;

Поддержка уведомлений.

Графические объекты HorizontalLine, TrendLine и VerticalLine имеют свойство Alert для создания оповещений. Для работы с оповещениями добавлены классы PriceAlert, TimeAlert и AlertConfiguration.

Объекты HorizontalLine, TrendLine могут включать оповещения типа PriceAlert. Объект VerticalLine может включать оповещение типа TimeAlert. Оба класса PriceAlert, TimeAlert являются дочерними класса AlertConfiguration, который предоставляет свойства, соответствующие настройкам вкладки «Alerts», доступной в окне свойств символа, инструмента теханализа или графического объекта.

Класс AlertConfiguration имеет событие Fired, которое происходит перед генерацией оповещения и событие Checked, которое происходит после генерации уведомления.

Пример установки горизонтальной линии с генерации оповещения при обновлении внутри бара:

Using elsystem;
Using elsystem.drawingobjects;
Vars:
HorizontalLine MyHorizontalLine(Null);

If (LastBarOnChart = True and MyHorizontalLine = Null) then // create one instance of the horizontaline on the last bar
Begin
MyHorizontalLine = HorizontalLine.Create(Close); // instantiate the line
MyHorizontalLine.Persist = True; // since this is called only once, set persist to true
DrawingObjects.Add(MyHorizontalLine); // add the line to the drawingobjects collection
MyHorizontalLine.Alert.PriceCondition = PriceCondition.breakoutintrabar; //set the price condition
MyHorizontalLine.Alert.Enable = True; // enable the alert
MyHorizontalLine.Alert.Notification.VisualEnable = True; // the alert will use a visual notification
End;

Визуальный отладчик и визуальный построитель форм.

В Update 24 включена версия «Developer Preview» визуального отладчика и построителя форм. Для включения этих скрытых по умолчанию функций, необходимо скачать и запустить файл Update24-On.reg, который внесет необходимые значения в реестр. Для отключения этих функций, запустите файл Update24-Off.reg. После внесения изменений необходимо перезапустить TDE.

Визуальный отладчик позволяет отлаживать код индикатора. В версии «Developer Preview» отлаживать код стратегий пока нельзя.

Для установки точки установки программы и начала отладки, необходимо в нужной строке установить Breakpoint. Для этого в главном меню выберите соответствующий пункт:


После установки Breakpoint, в строке слева, вы увидите маркер - красную точку:


После установки точки остановки (Breakpoint), выберите команду «Start Debugging» в меню Debug. Далее выберите окно, в котором хотите осуществить отладку.

Для пошагового прохода без входа внутрь кода функций/методов, используйте пункт меню «Debug / Step Over» или соответствующей комбинации клавиш. Для входа внутрь кода функций/методов, используйте «Debug / Step Into» или соответствующей комбинацию клавиш.

Во время отладки в окне Autos вы можете видеть значения переменных и параметры объектов:


Прекращение отладки происходит с помощью вызова пункта «Debug / Stop Debugging» или соответствующей комбинации клавиш.

Так же вы можете ознакомиться с процессом отладки, просмотрев демонстрационный ролик.

Новый визуальный редактор форм позволяет легко и быстро создать интерактивные формы. С ним нет необходимости вручную вводить строки кода, чтобы добавить элемент управления и задать его свойства. Просто дважды щелкните на элемент управления, который вы хотите добавить, а затем установите свойства и события, используя стандартный редактор свойств.

Чтобы добавить форму, вы можете просто выбрать «Add Form» в контекстном меню редактора кода:


Появится новая вкладка с пустой формой:


Активируйте ToolBox:


Двойной щелчок по компоненту добавит его на форму:


Компонент на форме может быть перемещен или изменен с помощью мыши. Чтобы изменить свойства элемента управления, используйте редактор свойств. Весь необходимый EasyLanguage код затем генерируется автоматически.

Так же вы можете ознакомиться с процессом создания форм, просмотрев демонстрационный ролик.

Выводы.

За год разработчики проделали достаточно большую работу. Новая версия TradeStation работает стабильно. Серьезные проблемы при работе с ней не обнаружены. Новые возможности EasyLanguage и ECL позволят сделать индикаторы и торговые стратегии более удобными. Время разработки и отладки значительно сократится. Будем надеяться, визуальный отладчик и построитель форм в ближайшее время будут выпущены официально.

Pavel Gelium 2000-2017 © All rights reserved.