Финансовая лаборатория

Биржевая торговля и торговые роботы

DataSeries - является базовой структурой данных, которая работает с историческими рядами данных. По своей внутренней организации DataSeries является числовым массивом (List<double>), ассоциированным с временным массивом (List<DateTime>). Массив DataSeries может управляться в экземпляре другого массива, или же ссылаться на другой массив DataSeries или на объект Bars.  Последовательности OHLC/V и все индикаторы являются экземплярами класса DataSeries.

Характеристика класса DataSeries:

  1. DataSeries является последовательностью чисел с плавающей точкой типа double.
  2. Все массивы DataSeries  содержат точно такое же количество значений, что и бары на графике.

Исключение: Только если Вы специально, работая со вторым финансовым инструментом, вызывая методы SetContext() либо GetExternalSymbol()  присвоите параметру синхронизации значение false - возвращаемые этими методами последовательности (Series) могут иметь другое по сравнению с барами на графике количество значений.

Операторы при работе с DataSeries

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

Операторы WealthScripts

Как: оперировать (Умножать, Делить, Добавлять или Вычетать) несколькими DataSeries

Выполнение математических операций над DataSeries в Wealth-Lab Developer версии 6.* интуитивно очень понятно. Просто выполняйте любые математические операции над DataSeries - как будто они являются самыми обычными числами типа double. Вы можете умножить или разделить DataSeries одну на другую, сложить их между собой, вычесть одну DataSeries из другой DataSeries. При этом как результат таких операций Вы получите новую DataSeries.

На самом деле, когда производят операции над двумя DataSeries, операции производятся над значениями из одинаковых по дате и времени баров в каждой из последовательностей. Когда же происходят операции с DataSeries и каким либо числом (константой), происходит операция в каждом из элементов массива DataSeries.

Когда происходит операция деления одной DataSeries на другую, WealthLab подавляет ошибку деления на ноль. Данная операция переопределена таким образом, что результатом деления на ноль является не ошибка, а нулевое значение (0d) для соответствующего бара.

Пример (как выполнить пример приведенного кода)...

Используя этот пример мы продемонстрируем - как можно сложить два DataSeries (High и Low) друг с другом.


// Создание массива DataSeries, содержащего значения средних цен (Average Price)

protected override void Execute()

{
   DataSeries avgPrice = (High + Low) / 2;
   avgPrice.Description = "Average Price";
   PlotSeries(PricePane, avgPrice, Color.Blue, WealthLab.LineStyle.Solid, 1);
}

Этот пример просто показывает, как можно создавать нужный Вам массив DataSeries. В реальной работе при построении торговых систем Вы не должны будете самостоятельно создавать массив со значениями средней цены. Намного проще и правильнее будет воспользоваться уже готовым стандартным индикатором (AveragePrice).

Еще один пример использования математических операция над DataSeries

Как: создать последовательность, содержащую типичную цену ("Typical Price")

Типичная цена ("Typical Price") это ничто иное, как среднее максимальной, минимальной цены и цены закрытия соответствующего бара. Т.е. мы можем сначала сложить 3 соответствующих DataSerise и лишь затем поделить сумму на 3.

Пример (как выполнить пример приведенного кода)...


protected override void Execute()

{
   DataSeries typPrice = (High + Low + Close) / 3;
   typPrice.Description = "Typical Price";
   PlotSeries(PricePane, typPrice, Color.Black, WealthLab.LineStyle.Solid, 1);
}

Точно также, как и в предыдущем примере, Вы можете воспользоваться стандартным индикатором AveragePriceC, а не изобретать велосипед заново и не создавать самостоятельно данный индикатор.

Теперь изучим очень удобный в практической работе по программированию торговых стратегий в Weatlh-Lab пример:

Как: Сдвинуть значения DataSeries вправо или влево по шкале времени

Вы можете "сдвинуть" DataSeries вправо (>>) либо влево (<<) по шкале времени. Для этого просто используйте интуитивно понятные операторы >> и <<, которые сдвигают каждую из "ячеек" массива DataSeries вправо или влево соответственно. При этом одно из значений массива DataSeries с одной из сторон в результате сдвигания "вылезет" за границы графика, при этом на другом конце графика крайней ячейке присваивается нулевое значение.

Сдвиг вправо по шкале времени (>>) является очень полезным приемом, т.к. часто требуется принимать решение на основе анализа цен предыдущего периода. В то время, как сдвиг по шкале времени влево (<<) подразумевает "заглядывание вперед", т.е. использование данных, которые появятся только в будущем. Именно поэтому сдвиг влево не должен использоваться при разработке правил торговых стратегий.

Пример (как выполнить пример приведенного кода)...


protected override void Execute()

{
   // Отобразить на графике на сколько процентов текущее значение отличается от значения 5 баров назад (RoC)

    DataSeries delayedClose = Close >> 5; //сдвигаем значение цен закрытия на 5 баров вправо

    DataSeries pctChange = 100 * ( Close / delayedClose - 1); //рассчитываем процент изменения

    pctChange.Description = "5-дневный процент изменения";

    ChartPane changePane = CreatePane(40, true, true);

    PlotSeries(changePane, pctChange, Color.Red, WealthLab.LineStyle.Solid, 1);

   /* Мы будем изучать индикаторы чуть позже, но здесь заметим, что
     точно такой же результат мы сможем получить если отобразим на графике
     индикатор  ROC (Rate of Change) в виде гистограммы */

   DataSeries roc = ROC.Series(Close, 5);

   PlotSeries(changePane, roc, Color.Black, WealthLab.LineStyle.Histogram, 1);
}

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

Сдвиг DataSeries по шкале времени вправо

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

При этом гистограмма отображает уже готовый индикатор ROC, а красная линия -  наши собственные вычисления. Как Вы можете убедиться на рисунке вычисления приводят к совершенно одинаковым результатам.

Как: Получить массив DataSeries только с положительными значениями

Для того, чтобы преобразовать все данные, содержащиеся в массиве DataSeries в положительные числа - используйте метод DataSeries.Abs().

Пример (как выполнить пример приведенного кода)...

В приведенном примере модуль разницы между двумя DataSeries добавляется к разнице, для того чтобы в тех ячейках, где значение было отрицательным появились нули. Этот пример демонстрирует работу метода DataSeries.Abs().


using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using WealthLab;
using WealthLab.Indicators;

namespace WealthLab.Strategies
{
    public class MyStrategy : WealthScript
    {
        /*
         Создаем метод, который возвращает новую DataSeries, в которой в соответствующих барах
         подсчитывается - сколько за указанный период было случаев, когда ds2 > ds1
         (в качестве аргументов метод принимает две различные DataSeries и период)

         */

        public DataSeries LessThanCountSeries(DataSeries ds1, DataSeries ds2, int Period)
        {

            DataSeries LTCSeries = ds2 - ds1; //подсчитывается разница

            LTCSeries = LTCSeries + DataSeries.Abs(LTCSeries); //если разница отрицательная, то результат дает ноль в соответствующей ячейке

            LTCSeries = LTCSeries / LTCSeries; //Если результат в ячейке не равен нулю, то результат становится равен 1

            return Sum.Series(LTCSeries, Period); //Подсчитывается количество ячеек, в которых была единица
        }

        protected override void Execute()
        {
            //Применяя созданный метод LessThanCountSeries() подсчитываем, сколько цен закрытия находилось внизу 20-ти периодичной скользящей средней за предыдущие 20 баров.

            DataSeries sma = SMA.Series(Close, 20);
            DataSeries ltc = LessThanCountSeries(Close, sma, 20);

            ChartPane ltcPane = CreatePane(40, true, false);

            PlotSeries(ltcPane, ltc, Color.Blue, WealthLab.LineStyle.Histogram, 1);

            PlotSeries(PricePane, sma, Color.Blue, WealthLab.LineStyle.Solid, 2);
        }
    }
}

В результате выполнения этого кода в программе Wealth-Lab 6.3 получим вот такой график.

Пример использоваия метода DataSeries.ABS()

Пример использоваия метода DataSeries.ABS()

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

На этом обзор операторов при работе с DataSeries заканчиваю. В следующий раз поговорим о том, как получить доступ к значениям массива DataSeries на конкретном баре (в нужные дату и время).

Рубрики: DataSeries, WealthScript

Комментариев: 5

  1. [...] Создать числовую последовательность (DataSeries) и, если это необходимо, установить значение для [...]

  2. [...] Одним из таких "самодельных индикаторов" является типичная цена (typical price), которую мы уже [...]

Оставить комментарий