Обзор TradeStation 9.1 build 12880 (Update 29).

Walk-Forward Optimizer.
EasyLanguage 9.
Среда разработки TradeStation Development Environment (TDE).
EasyLanguage Utilization Monitor.
Визуальный отладчик и визуальный построитель форм.
Генетическое Stress-тестирование во время оптимизации.
Улучшение производительности генетической оптимизации.
Новые целевые функции оптимизации.
Улучшения оптимизации стратегии.
Автоматическое обновление платформы.
Многоядерная оптимизация.
Торговля с графика.
Улучшения работы с графиками.
Улучшения пользовательского интерфейса.
Новые объекты рисования.
Выводы.


Walk-Forward Optimizer.

Версия TradeStation 9.1 теперь включает свежеприобретенный и интегрированный Walk-Forward Optimizer (далее WFO). Вызвать WFO можно через главное меню "View / Walk-Forward Optimizer" ("Вид / Walk-Forward оптимизатор").

Данные для WFO сохраняются во время оптимизации стратегии:

36-wfo

Описанию WFO чуть позднее будет посвящена отдельная статья.

EasyLanguage 9.

Синтаксис языка программирования EasyLanguage 9 расширен и предоставляет новые возможности для использования объектно-ориентированного программирования:
  • Classes (классы).

    До EasyLanguage 9.0, все переменные были основаны на простых типах данных, таких как строки или числа, известные как типы переменных. В EasyLanguage 9.0 добавлена новая категория - ссылочные типы. Эти новые типы, также известные как классы, описываются в библиотеке классов EasyLanguage (ECL).

  • Namespaces (пространства имен).

    Чтобы помочь в использовании библиотеки классов EasyLanguage (ECL), связанные по логике и наследованию объекты группируются в пространства имен, которые подключаются к вашему коду.

    Например:
    using elsystem;
    using elsystem.office.excel;
    using elsystem.collections;
    В дальнейшем можно создавать объекты подключенных ранее пространств имен:
    variables:
    MarketDepthProvider MD( NULL ),
    Vector SizeBook( NULL ),
    Timer UDTmr( NULL ),
    Workbook MarketDepthWB( NULL );
    Ссылаясь на тип в EasyLanguage, объявление объекта можно снабдить префиксом библиотеки:

    method void AnalysisTechnique_Initialized( elsystem.Object sender, elsystem.InitializedEventArgs args)

  • Local Methods (локальные методы).

    EasyLanguage 9.0 теперь поддерживает локальные методы. Подобно функциям EasyLanguage, они могут использоваться, чтобы улучшить читаемость и упростить структуру кода. Локальные методы выполняются быстрее, чем функции EasyLanguage и поддерживают рекурсивный вызов.

  • Event Handlers (обработчики событий).

    Многие из компонентов, описанных в разделе ToolBox, могут предоставить информацию по мере ее доступности с помощью соответствующих обработчиков событий. Например, обработчик события таймера будет производить вызов вашего кода через заданный временной интервал. Код инструментов теханализа так же получил несколько событий: Initialized и UnInitialized. Эти события будут происходить однократно, во время первого и последнего запуска кода соответственно.

    Для включения обработки события AnalysisTechnique_Initialized необходимо в среде разработки TradeStation зайти во вкладку Properties (вкладки справа), нажать на значок Events (События) с иконкой в виде молнии. Затем для события с именем Initialized надо указать название обработчика события AnalysisTechnique_Initialized:

    37-events

  • Exception Handling (обработка исключений).

    EasyLanguage 9.0 обеспечивает новый механизм для обнаружения и обработки ошибок периода выполнения (run-time error). Эти ошибки могут произойти в результате ошибок в программе, но могут также происходить из-за неожиданных условий, которые могут сложиться во время выполнения вашего кода. Необработанные ошибки периода выполнения появляются в журнале событий (TradeStation Events Log) и приводят к отключению инструмента теханализа, который был источником ошибки. Теперь можно контролировать и реагировать на эти исключения, используя новые ключевые слова try, catch и finally.

    Например:
    var: elsystem.xml.xmldocument doc(nuLL);  

    method void AnalysisTechnique_Initialized( elsystem.Object sender, elsystem.InitializedEventArgs args )
    begin
    doc = new elsystem.xml.xmldocument;
    try
    doc.Load("C:\testing123.xml");
    catch (elsystem.io.filenotfoundexception ex)
    throw ex.create("User-defined: File is not in the specified directory");
    End;
    End;
В EasyLanguage 9.0 добавлены новые ключевые слова и операторы:
  • In/Out - используются в локальных методах, чтобы передать параметры ссылкой или значением.

  • Method - объявляет локальный метод в вашем коде.

  • Override - переопределение виртуального метода объекта.

  • Return – используется для возврата значения из локального метода.

  • Try / Catch / Finally / Throw – используются для обработки и генерирования исключения изнутри вашего кода.

  • Using - идентифицирует название библиотеки, которая будет использоваться в вашем коде.

  • New - создает новый экземпляр ссылочного типа (объект).

  • Оператор средства доступа (.) - используемый, чтобы получить доступ к свойству или методу объекта.

  • ObjectSimple / ObjectRef – используется для передачи объектов функциям EasyLanguage.

  • Swith / case / default –выполнение кода в зависимости от значения переменной:
    switch ( GetAppInfo( aiVolatilityModel ) )
    begin
    case 0:
    CompareOptPrice = RawAsk of Option ;
    case 1:
    CompareOptPrice = RawBid of Option ;
    case 2:
    CompareOptPrice = Close of Option ;
    default:
    CompareOptPrice = 0.5 * ( RawBid of Option + RawAsk of Option ) ;
    end ;
Библиотека классов EasyLanguage (ECL) содержит более 100 классов, позволяющих создавать мощные торговые решения. Компоненты ToolBox так же являются частью ECL.


Классы в ECL могут использоваться только с двумя новыми элементами языка: оператор New, который используется, чтобы создать объект и оператор доступа(.), который используется, чтобы сослаться на свойства объекта или методы.

Группы классов ECL объединены в пространства имен. В Словаре TDE они идентифицируются изогнутыми фигурными скобками {}. Щелчок по знаку "плюс" пространства имен покажет все классы, содержавшиеся в выбранном пространстве имен. Выбор отдельного класса выведет на экран все элементы, содержавшиеся в этом классе. Щелчок по знаку "плюс" покажет родительский класс. Следующее изображение показывает элементы класса очереди пространства имен elsystem.collections.


Краткое описание пространств имен ECL:
  • Tsdata.common - cодержит классы, совместно использованные tsdata.marketdata и tsdata.trading.

  • Tsdata.marketdata - содержит классы, используемые для получения фундаментальных данных, котировок, баров и данных глубины рынка.

  • Tsdata.trading - содержит классы, используемые для контроля и мониторинга счета, позиций, информации о торговле. Дополнительно содержит классы для работы с единичными ордерами и мульти ордерами.

  • Elsystem - содержит утилиты ECL и базовые классы. Они включают классы исключений (exception), базовые классы для типов значения, объектный базовый класс, события и классы параметра событий, классы для работы с датами и временем, таймер и секундомер, классы среды.

  • Elsystem.collections - содержит классы, используемые для создания, хранения и управления наборами объектов. Эти классы включают реализации структур общих данных, такие как dictionary (словарь), queue (очередь), stack (стек) и vector (вектор). Класс elsystem.collections.GlobalDictionary позволяет создавать глобальную коллекцию данных, которая будет доступна разным инструментам теханализа, работающих в разных окнах.

  • Elsystem.office.excel - содержит классы, используемые для взаимодействия с Microsoft Excel. Классы в этом пространстве имен обеспечивают функциональность для чтения и записи ячеек электронной таблицы, для открытия, закрытия, активирования и сохранения рабочих книг (workbooks).

  • Elsystem.xml - содержит  классы, которые  позволяют Вам создавать, читать, писать, анализировать, управлять и сохранять документы в формате Extensible Markup Language (XML).

  • Strategy - содержит классы, которые позволяют Вам просматривать новые и исполненные ордера во время тестирования стратегии. Это позволяет Вам изменять предположения относительно цены, на основании исторически исполненных ордеров. Можно также просмотреть более подробную информацию об ордерах, такую как тип ордера или имя сигнала.

  • Elsystem.windows.forms - содержит классы и перечисления, которые позволяют создавать пользовательские формы.
Работу с формами рассмотрим более подробно.

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

Следующие элементы управления поддерживаются в текущем выпуске. Для полного списка всех новых классов и элементов, пожалуйста, консультируйтесь со словарем (Dictionary) среды разработки TradeStation (TDE).

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


Checkbox - реагирует на щелчок пользователя и позволяет запрашивать состояние (Checked) во время выполнения.


ComboBox - представляет список выбора элементов. Реагирует на щелчок пользователя, когда делается выбор элемента (SelectedIndexChanged). Новое свойство Count возвращает число элементов объекта ComboBox.


GroupBox – панель с подписью для визуальной идентификации логически связанных элементов управления формы.


Label - выводит текст на форме.


ListView - выводит на экран набор элементов в многоколонном формате. Реагирует на щелчок пользователя, когда делается выбор элемента (SelectedIndexChanged). Новый метод AddRow, класса elsystem.windows.forms.ListView, может вызываться для увеличения производительности за счет добавления предварительно подготовленной объекта ListViewItem.


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


Panel - панель для визуальной идентификации логически связанных элементов управления формы.


RadioButton – группа взаимоисключающих опций. Реагирует на щелчок пользователя (Click) и позволяет запрашивать состояние (Checked) во время выполнения.


TextBox – поле ввода текста.


LinkLabel – текст с гиперссылкой.

Формы и элементы управления создаются и используются, так же как и другие классы Библиотеки классов EasyLanguage (ECL). У каждого элемента есть метод создания Create, которому передается начальная ширина и высота. После создания элемента управления, его необходимо добавить к существующей форме, вызвав метод AddControl формы. Точное размещение элемента управления задается с помощью метода Location, которому передаются координаты x и y.

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

Using elsystem;
Using tsdata.trading;
Using elsystem.windows.forms;

// Declare a couple of variables for the form and button objects
Vars: Form MyForm(null), Button MyButton(null);

// Create the form and button when the analysis technique is initialized
method void AnalysisTechnique_Initialized( elsystem.Object sender, elsystem.InitializedEventArgs args )
begin
MyForm = Form.Create("PlaceTrade", 200, 130); // Create the form
MyButton = Button.Create("Buy", 150, 50); // Create the button
MyButton.Location(20, 20); // Place the button 20 pixels from the top and left of the form
MyButton.Click += OnClick; // Tell the button to call the OnClick method when clicked
MyForm.AddControl(MyButton); // Add the button to the form
MyForm.Show(); // Show the form
end;

// This method will be called when the button is clicked
Method void OnClick(elsystem.Object sender, elsystem.EventArgs args)
Vars: OrderTicket ticket; // Declare a variable for an order ticket
Begin
// Create and send the order
ticket = New OrderTicket();
Ticket.Symbol = Symbol;
Ticket.SymbolType = Category;
Ticket.Account = "AccountString"; // Enter a valid account
Ticket.Quantity = 100;
Ticket.Action = OrderAction.Buy;
Ticket.Type = Ordertype.Market;
Ticket.SendAndForget();
End;


Добавлены новые возможности EasyLanguage:
  • Метод GetMyWorkDirectory.

    Метод GetMyWorkDirectory() позволяет определить местоположение рабочей папки платформы. Разбор пути позволит также узнать корневой каталог TradeStation.

  • Класс Alarm

    Новый класс Alarm позволяет запускать события уведомлений в разное время. Уведомления могут быть созданы методом Create с передачей параметра DateTime:

    alarm

  • Класс GlobalValue.

    Новый класс GlobalValue предоставляет удобный способ обмена информацией между различными экземплярами инструментов теханализа, работающими одновременно внутри платформы TradeStation. GlobalValue является производным от класса компонента и может быть просто перетащен из панели элементов TDE. В следующем примере, метод Sample_Server задает значение и Sample_Client извлекает это значение. В этом примере предполагается, что компонент GlobalVariable был вытянут в обоих индикаторах из панели элементов и в редакторе свойств назван как myClose:

    // Sample Server

    Using elsystem;

    Vars:
    GlobalValue GlobalValue1(null),

    GlobalValue1 = GlobalValue.Create();
    GlobalValue1.Name = "MyValue1";
    GlobalValue1.Channel = "MyValue1";
    GlobalValue1.Load = true;
    GlobalValue1.DoubleValue = 123.45;
    print(" Set ", GlobalValue1.DoubleValue);

    // Sample Client
    Using elsystem;

    Vars:
    GlobalValue GlobalValue1(null),

    GlobalValue1 = GlobalValue.Create();
    GlobalValue1.Name = "MyValue1";
    GlobalValue1.Channel = "MyValue1";
    GlobalValue1.Load = true;
    print(ldt, " Get ", GlobalValue1.DoubleValue);

    Такой код гораздо проще, чем при использовании GlobalDictionary.

  • Открытие документов методом метод elsystem.Environment.Start.

    Новый метод elsystem.Environment.Start позволяет открывать документы:

    Using elsystem;
    Using elsystem.windows.forms;
    // Declare variables for the form and linklabel control
    Vars: Form MyForm(null), LinkLabel MyLabel(null);
    // Create the form and linklabel when the analysis technique is initialized
    method void AnalysisTechnique_Initialized( elsystem.Object sender, elsystem.InitializedEventArgs args )
    begin
      MyForm = Form.Create("LinkLabel Sample", 200, 100); // Create the form
      MyLabel = LinkLabel.Create("TradeStation Home Page", 150, 20); // Create the linklabel
      MyLabel.Location(25, 25); // Place the label 25 pixels from the top and left of the form
      MyLabel.LinkClicked += OnLinkClicked; // Tell the label to call the OnLinkClicked method when user clicks it
      MyForm.AddControl(MyLabel); // Add the label to the form
      MyForm.Show(); //Show the form
    end;
    // This method is called when the label is clicked
    Method void OnLinkClicked(Object sender, EventArgs args)
    begin
      Environment.Start("www.tradestation.com"); // Call Start, passing the TradeStation link
    end;
    

  • Пространство имен Elsystem.collections получило метод Clone(), который позволяет сделать копию существующей коллекции.

  • Пространство имен Elsystem.drawing получило класса Font и свойство FontStyle для изменения атрибутов шрифта.

  • Форма получила свойство Dock, которое позволяет прикрепить форму к окну. Свойству Dock может быть присвоено значение из перечисления DockStyle. Если нескольким формам назначено одно и то же место для прикрепления, то для каждой из форм будут автоматически созданы вкладки:

    41-1-dock

    Пристыкованная панель может быть легко скрыта или показана выбором пункта главного меню View / EasyLanguage Application Bar:

    41-2-dock

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

    41-3-dock

  • Класс ComboBox получил метод Clear(), который используется для удаления всех элементов. Новое свойство SelectedText позволяет узнать, какой именно элемент был выделен во время вызова события SelectedIndexChanged.

  • Класс TextBox получил свойство Multiline, которое позволяет использовать элементы с большими блоками текста.

  • Классы Label, GroupBox, ComboBox, Button, CheckBox, RadioButton получили свойство FlatStyle, которое может принимать одно из значений: Flat, Popup, Standard, System.

  • Классы ListView, NumericUpDown, Panel получили свойство BorderStyle, которое может принимать одно из значений: Fixed3D, FixedSingle, None.

  • Новый компонент ChartingHost содержит ряд событий, позволяющих программно реагировать на клики в окне с графиками. Обработчик EventArgs предоставляет подробную информацию о месте, где произошел клик. Так как ChartingHost является компонентом, он легко может быть добавлен к вашему инструменту теханализа. Индикатор ChartTrading является реальным примером использования этого компонента.

  • Класс RadarScreenHost предоставляет информацию о клике в окне RadarScreen.

  • Два новых класса StreamReader и StreamWriter добавлены в пространство имен elsystem.io. Эти классы предоставляют возможность записи и чтения из текстовых файлов. Следующий пример читает файл данных и сохраняет данные в Dictionary:

    45-io

  • На основе обратной связи от пользователей, были внесены изменения для улучшения скорости работы с классами Global Dictionary и Global Value.

  • В пространство имен Elsystem.windows.forms добавлены два новых элемента управления: Chart и Grid. Элемент Chart используется для отображения графиков. Элемент Grid используется для отображения таблицы. Эти элементы управления будут полезны в представлении сложных данных в удобном и понятном виде.

    Элемент управления Chart может отображать одну или более серий данный в 2-D и 3-D стиле. Поддерживаются следующие стили графиков: Area, Bar, BoxPlot, Bubble, CandleStick, Column, Doughnut, ErrorBar, FastLine, FastPoint, Funnel, Kagi, Line, Pie, Point, PointAndFigure, Polar, Pyramid, Radar, Range, RangeBar, RangeColumn, Renko, Spline, SplineArea, SplineAngle, StackedArea, StackedArea100, StackedBar, StackedBar100, StackedColumn, StackedColumn100, StepLine, Stock, ThreeLineBreak.

    Для использования элемента управления Chart, вы создаете и добавляете его к форме так же, как и любой другой элемент управления. Кроме того, необходимо создать одно или несколько ChartAreas, которые будут отображать данные. Вам также необходимо создать одно или несколько ChartSeries, которые будут содержать сами данные, которые будут отображаться в ChartArea. Шкалы и легенды добавлять не обязательно.

    Элемент DataGridView позволяет отображать данные в табличном формате. Для начала использования необходимо создать элемент DataGridView и добавить его на форму. Столбцы и строки могут быть добавлены с помощью классов DataGridViewColumn и DataGridViewRow.

    Оба элемента управления позволяют настраивать их внешний вид с помощью богатого набора свойств и методов:

    46-chart
  • Добавлена возможность узнать из кода текущее значение параметра MaxBarsBack:

    47

    Если необходимо запросить данные, которые могут превышать ограничение, установленное параметром MaxBarsBack, вы можете использовать свойство BarsAgo. В этом случае не будет ошибки из-за обращения назад на большее число баров, чем разрешает параметр MaxBarsBack. Так же не будет выполняться автоматический пересчет параметра MaxBarsBack.
  • Секундные интервалы.

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

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

    Для работы с секундами в коде 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.

    Ключевые слова EntryDateTimeExitDateTime возвращают объект типа 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 часов утра воскресенья до заданного в параметрах функции времени. Подробнее функция описана здесь.
  • Новые логические операторы.

    Добавлены битовые логические операторы NOTORXORAND.

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

    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);

  • Новый компонент 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;
    Таблицу цветов можно посмотреть здесь.

Среда разработки TradeStation Development Environment (TDE).


Краткий обзор возможностей новой среды разработки кода:
  • Наконец-то комментарии к коду можно писать на русском.
  • Новый, автономный редактор с вкладками и выдвижными панелями.
  • Функция IntelliSense.
  • Функция AutoComplete.
  • Выделение функциональных блоков кода, которые можно сворачивать и разворачивать.
  • Выделение блоков кода ключевыми словами #Region и #EndRegion для сворачивания и разворачивания.
  • Панель для быстрой навигации по коду.
  • Новая панель словаря EasyLanguage с функциональностью перетащил и кинул.
  • Функции отмена/повтора правок, даже после того как документ был сохранен или проверен.
  • Нумерация строк.
Среда разработки имеет выдвигающуюся слева панель ToolBox, которая содержит ряд компонент:


Новый компонент можно вставить в лоток компонент, дважды кликнув по его названию или перетащить его из ToolBox в открытое окно с кодом.

Component Tray (компонентный лоток) присоединен к нижней части окна кода EasyLanguage.


Компоненты могут быть выбраны левым щелчком мышью. Если окно Редактора свойств открыто, выбранный компонент появляется в окне. Можно легко удалить выбранный компонент, и весь сгенерированный разработчиком код, связанный с этим, нажимая клавишу Delete.

На выдвигающейся справа вкладке Properties Editor располагается редактор свойств и событий компонента.


В приведенном на рисунке выше примере у компонента Timer есть только одно событие - Elapsed.

Просто двойной щелчок по событию создаст метод в Вашем коде, который вызовут с частотой, определенной свойством Interval. Вы помещаете код EasyLanguage, который Вы хотите выполнить, когда Timer вызывает автоматически созданный методе Timer_Elapsed, как показано в следующем изображении.


Обратите внимание, по умолчанию вы не видите код, который генерирует редактор свойств. Однако вы можете просмотреть его, выбрав пункт меню Designer Generated Code из меню View:


Еще одним интересным элементом в новом редакторе свойств является кнопка Input (значок I). Когда свойство выбрано, щелкая по этому значку, вы автоматически добавите код ввода значения для выбранного свойства компонента.

Выбор свойства Interval и щелчок по значку Input приведет к запросу подтверждения для создания соответствующего кода.


Если Вы выберете "Yes", то входное объявление будет автоматически добавлено к Вашему коду.


На выдвигающейся справа вкладке расположен новый Dictionary (словарь), который теперь включает ссылочную информацию для каждого пространства имен, класса, свойства, метода, оператора и события в Библиотеке классов EasyLanguage (ECL).


Функция Autocomplete (автозаполнение) была также улучшена и позволяет теперь показать объектные элементы. Можно быстро получить доступ к свойствам и методам объекта, без необходимости запоминать всю библиотеку классов.

Для работы с закладками добавлены две горячие клавиши. Для установки закладки в коде надо нажать Ctrl+F2. Для перехода между закладками надо нажимать F2.

Флажок "Search hidden text" был добавлен в диалоговое окно поиска. Когда этот флажок включен, поиск будет происходить и в свернутых регионах кода, который в противном случае в поиск включаться не будут.

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

Для создания проекта надо выбрать в главном меню "File / Project / New...":

42-1-projects

После создания проекта, добавьте или создайте инструмент теханализа, щелкнув правой кнопкой мыши и выбрав пункт контекстного меню "Add New Item..." или "Add Existing Item...":

42-2-projects

В приведенном ниже примере был создан проект "Leading Indicators" с добавленными к нему индикаторами CCI, Momentum и Stochastic:

42-3-projects

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

Как только вы закончите работу, просто выберите "Close Project " из пункта главного меню File / Project. Ваш проект и относящиеся к нему инструменты теханализа будут закрыты. Чтобы открыть проект, выберите "Open Project " из пункта главного меню File / Project.

Файлы проектов на основе XML с расширением .elx по умолчанию находятся в папке MyWork. Они хранят ссылки на инструменты теханализа, которые включены в проект наряду с заметками пользователя.

Два новых элемента были добавлены в контекстное меню, которое вызывается правым кликом в панели вывода сообщений TDE:

43-output

Выбор "Show Error Help" откроет online справку с описанием ошибки. Выбор "Copy" скопирует текст ошибки в буфер обмена. Затем этот текст можно использовать для отправки в службу поддержки.

В функционал Backup/Restore добавлены отдельные пункты для сохранения/восстановления конфигурации TDE. Для вызова Backup/Restore в главном меню выберите "File / Backup/Restore TradeStation":

44-backup

EasyLanguage Utilization Monitor.

EasyLanguage Utilization Monitor - монитор загрузки процессора со стороны инструментов, созданных на базе EasyLanguage. Вызов окна монитора осуществляется через меню View / EasyLanguage Utilization Monitor:


Вызов Utilization Monitor осуществляется через главное меню View / EasyLanguage Utilization Monitor.

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

В 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 код затем генерируется автоматически.

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

Генетическое Stress-тестирование во время оптимизации.

Доступ к новым опциям stress-тестирования и улучшения производительности генетического оптимизатора можно получить, щелкнув по кнопке Advanced Setting в окне Format Analysis Techniques & Strategies.


Для конфигурирования и использования нового stress-тестирования, выберите stress test size и процент stress-инкремента как показано в следующем диалоговом окне.


Stress-тест является по существу локализованным устойчивым поиском вокруг каждого отдельного набора параметров во время проведения генетического поиска. Параметр Stress test size определяет тип перебора параметров во время Stress-тестирования.

Например, установим Stress increment=10%.
  • Если Stress test size = 1, то Stress-тестирование не используется.

  • Если Stress test size > 1, то генетический алгоритм линейно переберет все параметры с определенным смещением в % согласно параметру Stress increment.

  • Если Stress test size =2, то основной набор параметров будет перебираться в пределах +10%.

    Например, стратегия Bollinger Band с параметрами 18 1.2 16 1.1 будет просчитываться со значениями 20 1.4 18 1.3.
    Stress increment +10 % округляется вверх к самому близкому инкрементному значению оптимизации, связанному исходным диапазоном оптимизации.

    Вычислим stress-значения:

    Input1: 20 = 18 + 10 % = 19.8 округлились вверх к самому близкому инкременту оптимизации 1, таким образом 19.8 становится 20
    Input2: 1.4 = 1.2 + 10 % = 1.32 округлились вверх к самому близкому инкременту оптимизации 0.1, таким образом 1.32 становится 1.4
    Input3: 18 = 16 + 10 % = 17.6 округлились вверх к самому близкому инкременту оптимизации 1, таким образом 17.6 становится 18
    Input4: 1.3 = 1.1 + 10 % = 1.21 округлились вверх к самому близкому инкременту оптимизации 0.1, таким образом 1.21 становится 1.3

  • Если Stress test size=3, то основной набор параметров будет просчитываться в диапазоне +10%, -10%.

    Например, стратегия Bollinger Band с параметрами 18 1.2 16 1.1 будет просчитываться со значениями
    +10 %: 20 1.4 18 1.3 (пример выше),
    -10 %: 16 1.0 14 1.0

    Stress increment -10% округляется вниз к самому близкому инкрементному значению оптимизации, связанному исходным диапазоном оптимизации.

    Вычислим stress-значения:

    Input1: 16 = 18 - 10 % = 16.2 округлились вниз к самому близкому инкременту оптимизации 1, таким образом 16.2 становится 16
    Input2: 1.0 = 1.2 - 10 % = 1.08 округлились вниз к самому близкому инкременту оптимизации 0.1, таким образом 1.08 становится 1.0
    Input3: 14 = 16 - 10 % = 14.4 округлились вниз к самому близкому инкременту оптимизации 1, таким образом 14.4 становится 14
    Input4: 1.0 = 1.1 - 10 % = 0.99 округлились вниз к самому близкому инкременту оптимизации 0.1 и ограничили исходным диапазоном оптимизации 1.3, таким образом 0.99 становится 1.0

  • Если Stress test size=4, то основной набор параметров будет просчитываться в диапазонах +10%, -10%, +20%

  • Если Stress test size =5, то основной набор параметров будет просчитываться в диапазонах +10%, -10%, +20%, -20%.

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

Теперь можно уменьшить время генетической оптимизации, используя опцию Terminate Optimization, как показано в следующем диалоговом окне.


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

Новые целевые функции оптимизации.

Добавлено несколько новых функций фитнесса (целей оптимизации), которые устанавливаются в диалоговом окне Chart Analysis Preferences.


Новые функции фитнесса могут быть просмотрены в Strategy Optimization Report (отчете оптимизации стратегии). Для этого новые поля необходимо добавить в Strategy Optimization Report с помощью диалогового окна Optimization Report Fields.


Новые целевые функции оптимизации определяются следующим образом:
  • Robustness Index (индекс устойчивости) - индекс устойчивости является отношением градиента кривой прибыльности на интервале проверки (out-of-sample) к градиенту кривой прибыльности на интервале настройки (in-sample).
  • Perfect Profit Correlation (совершенная корреляция прибыли) - вычисляет корреляцию фактической кривой прибыли по сравнению с "совершенной" кривой, как будто стратегия смогла купить по каждой минимальной цене и продать по каждой максимальной цене. Генетический оптимизатор будет стремиться найти параметры, которые позволят кривой прибыльности максимально соответствовать "совершенной" кривой.
  • Pessimistic Return on Capital (пессимистический возврат на капитал) - функция фитнесса, которая представляет очень консервативное значение возврата на капитал (ROC).
  • Expectancy - функция фитнесса, которая измеряет ожидаемую прибыль на доллар, которым рисковали во время сделки. Расчет базируется на методе Van K. Tharp.
  • TradeStation Index -  функция фитнесса, которая максимизирует чистую прибыль и число прибыльных сделок, минимизируя максимальную внутридневную просадку. Вычисляется по формуле Net Profit * NumWinTrades / AbsValue (Max. Intraday Drawdown).

Улучшения оптимизации стратегии.

Во время оптимизации можно исключить из расчета интервал проверки (Out of Sample) и проводить расчет и поиск оптимальных параметров только на интервале настройки (In Sample). Настройка интервала задается в диалоговом окне Advanced Optimization Options.


Вычисление функции фитнесса на интервале настройки позволяет Вам сравнивать результат оптимизации с работой стратегии на невидимых данных интервала проверки. Эта функция является очень полезной при использовании совместно с новым инструментом TradeStation Walk Forward Optimizer.

Также добавлены новые фильтры к Optimization Report и Strategy Performance Report, которые позволяют просматривать результаты для интервала настройки, интервала проверки или на всех данных.



Автоматическое обновление платформы.

Автоматическое обновление платформы теперь возможно без инсталляции. Для вызова функции проверки можно выбрать в главном меню пункт Help / TradeStation Update Manager.


Параметры обновления платформы доступны в диалоговом окне общих настроек TradeStation.


Обновление загружаются в папку C:\Documents and Settings\User_Name\Application Data\TradeStation Technologies\TradeStation\Versions\9.01.00\Patches и содержатся в файле с расширением msp. Запуск msp-файла и выбор в диалоговом окне установки Repair приведет к установке обновления. В этой же папке создается архив для восстановления всех настроек TradeStation с расширением tsa.

Многоядерная оптимизация.

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

Когда поддержка многоядерности включена, каждому окну будет назначено отдельное ядро в циклическом режиме. Например, рабочая область открывается на четырехъядерной системе и содержит восемь окон с графиками (обозначаются буквами от А до Н):
  • Окну A будет назначено ядро 1.
  • Окну B будет назначено ядро 2.
  • Окну C будет назначено ядро 3.
  • Окну D будет назначено ядро 4.
  • Окну E будет назначено ядро 1.
  • Окну F будет назначено ядро 2.
  • Окну G будет назначено ядро 3.
  • Окну H будет назначено ядро 4.
Во время открытия окон они будут назначаться ядрам в циклическом режиме. Если некоторые окна закрываются, тем самым освобождая нагрузку на ядра, все последующие недавно открытые или созданные окна автоматически будут подключены к менее загруженному ядру, чтобы сохранять баланс равномерной загрузки.

Важно отметить, что использование многоядерности может повлиять на работу с библиотеками DLL. Дело в том, что каждая библиотека будет загружаться отдельно для каждого ядра. Поэтому каждая библиотека будет иметь свой набор локальных данных. Раньше, при отсутствии многоядерности, библиотека загружалась однократно для всей платформы. Поэтому все вызовы из кода EasyLanguage были обращены к одной библиотеке, которая имела один общий для всех вызовов блок локальной памяти. При включенной многоядерности, каждая библиотека будет иметь свой локальный объем памяти. Например, при включенной многоядерности Puls будет загружаться отдельно для каждого ядра, иметь свой набор серий. Изменение данных со стороны одного ядра никак не будет видно при запросе тех же данных другим ядром. Поэтому для многоядерной работы надо использовать shared memory или аналогичные методы. Но лучше всего использовать встроенные механизмы TradeStation для работы с глобальными данными внутри платформы.

Для включения поддержки многоядерности надо выбрать в главном меню View / Chart Analysis Preferences. Далее в папке General надо включить флажок " beside "Enable use of multiple CPU cores":

Multi-Core Chart Analysis

Поддержка многоядерности в TradeStation позволяет при оптимизации отдельной торговой стратегии использовать только одно отдельное ядро. Это конечно позволяет продолжать вести работу с другими окнами или запустить несколько параллельных расчетов. Однако такая реализация уступает механизмам, реализованным в MultiCharts или MetaTrader 5. В MultiCharts во время оптимизации торговой стратегии задействуются для расчета все доступные ядра. MetaTrader 5 для расчетов может задействовать не только ядра одного компьютера, но и ядра других компьютеров или вычислительные ресурсы облака. Что потенциально должно уменьшать время проведения ресурсоемких расчетов.

Лично мне для расчетов, которые необходимы для торговли основными моделями теханализа, ресурсов TradeStation более чем достаточно. Можно даже утверждать, что если считать надо очень много, значит предварительная работа не была проведена достаточно хорошо и стоит подумать над тем, почему алгоритм такой сложный и как этот ресурсоемкий расчет соотносится с подгонкой под кривую.

Торговля с графика.

Новый индикатор "ChartTrading" позволяет вам быстро и легко размещать сделки, управлять позициями и ордерами с графика. Кликая и перетаскивая, вы можете управлять позициями и ордерами. Индикатор ChartTrading полностью написан на EasyLanguage. Предоставляется с исходным кодом, который вы можете менять так, как вам захочется. Это означает, что нет предела тому, как можно изменить или расширить применение этого инструмента в соответствии с вашими уникальными потребностями торговли.

39-1-ct

Для начала работы с ChartTrading нажмите на панели инструментов кнопку ChartTrading ChartTrading или выберите «Chart Trading» в контекстном меню.

Функции ChartTrading позволяют дискретным трейдерам интуитивно размещать и редактировать ордера непосредственно на графике. Ордера легко перемещаются на новый уровень цен путем перетаскивания, могут быть отменены нажатием клавиши удаления и редактирования с помощью правой кнопки мыши. Панель ChartTrading, прикрепленная к одной из сторон окна с графиком, позволяет просматривать детали позиций, а также легко закрыть позицию или отменить ордер.

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

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










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




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




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




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




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

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

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


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


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


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


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


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

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

Функции для работы с линиями 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;

Выводы.

Кроме исправления ошибок и множества оптимизация, новая версия платформы дает огромные возможности для реализации практически любых фантазий. Язык программирования приобрел большую функциональность, однако остался таким же простым и удобным. Интересные перспективы открывает компонент Timer, который позволяет выполнять код через заданный временной интервал. Появляется возможность интерактивной реакции инструмента теханализа на манипуляции пользователя объектами рисования. Класс для работы с книгами Excel позволяет хранить и анализировать данные сразу в среде Microsoft Office. Отчеты оптимизации и настройки МТС можно хранить в рабочих книгах Excel, что позволяет сократить трату времени на рутинные операции.

Наверх