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

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

В программе Wealth-Lab версии 6 существуют только официальные скомпилированные библиотеки индикаторов. Каждая такая библиотека индикаторов соответствует спецификации для библиотеки индикаторов. Конечно же, Вы можете создать Вашу собственную коллекцию тех индикаторов, которыми пользуетесь чаще всего.

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

Самодельные индикаторы в Велс Лаб

Именно по этой причине мы называем самодельными индикаторами ряды данных (DataSeries), которые создаются "на лету", а не те индикаторы, которые были сделаны Вами самостоятельно заранее и хранятся в скомпилированной библиотеке. Одним из таких "самодельных индикаторов" является типичная цена (typical price), которую мы уже рассматривали.

Как: создать "полуофициальный (semi-formal)" индикатор своими руками

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

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

Оба этих подхода демонстрируются ниже.

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


/* Моделирование индикатора Sum.Series */
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using WealthLab;
using WealthLab.Indicators;

namespace WealthLab.Strategies
{

    //создаем "полуофициальный" индикатор (наследник класса DataSeries)
    public class SumTest : DataSeries
    {

        public SumTest(DataSeries ds, int period)
            : base(ds, "Мой ряд данных: Sum.Series")
        {
            double sum = 0;

            for (int bar = 0; bar < period; bar++)

                sum += ds[bar];

            this[period - 1] = sum;      // Сумма для инициализации периода

            for (int bar = period; bar < ds.Count; bar++)

                this[bar] = this[bar - 1] - ds[bar - period] + ds[bar];
        }

        public static SumTest Series(DataSeries ds, int period)
        {

            SumTest _SumTest = new SumTest(ds, period);

            return _SumTest;
        }
    }

    public class MyStrategy : WealthScript
    {

        protected override void Execute()
        {

            int period = 20;

            DataSeries sum1 = SumTest.Series(Close, period); // создаем и отображаем на графике полуофициальный индикатор Sum.Series

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

            PlotSeries(cp, sum1, Color.Blue, LineStyle.Solid, 1);

            // создаем тот же самый ряд данных "на лету", начиная с ряда данный, наполненного нулями

            DataSeries sum2 = Close - Close;

            sum2.Description = "Мой ряд данных: Sum (создан на лету)";

            double sum = 0d;

            for (int bar = 0; bar < period; bar++)

                sum += Close[bar];

            sum2[period - 1] = sum;         // Сумма для инициализации периода

            for (int bar = period; bar < Bars.Count; bar++)

                sum2[bar] = sum2[bar - 1] - Close[bar - period] + Close[bar];

            // отображаем на графике в виде гистограммы на той же самой области графика (для сравнения).

            PlotSeries(cp, sum2, Color.Black, LineStyle.Histogram, 1);
        }
    }
}

Выполнив этот код мы получим такой график:

Создание индикатора на лету

Как: создать индикатор MACD с самостоятельно определяемым периодом

Классический индикатор MACD, представленный в программе Wealth-Lab, базируется на разнице между двумя экспоненциальными скользящими средними (EMA) с разными экспонентами. (0,075 и 0,15). Если использовать 26-периодичную EMA с экспонентой 0,074074, 12-периодичную EMA с экспонентой 0,153846, Вы можете сдвинуть значение MACD по сравнению с использования классического индикатора (можно также взять любую другую комбинацию периодов).

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


// Замечание: Метод калькуляции modern для рассчета экспоненциальной скользящей средней (EMA) предполагает, что экспонента равна  2/(1 + Period)

protected override void Execute()

{
   // Создаем самодельный индикатор MACD

   DataSeries macdX = EMA.Series(Close, 12, EMACalculation.Modern) - EMA.Series(Close, 26, EMACalculation.Modern);

   // Отображаем на графике самодельный индикатор  MACD и сравниваем его со стандартным (библиотечным) индикатором MACD

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

   MACD standardMACD = new MACD(Close, "Standard MACD");

   PlotSeries(macdPane, macdX, Color.Blue, LineStyle.Solid, 1);

   PlotSeries(macdPane, standardMACD, Color.Red, LineStyle.Histogram, 1);
}

Получившийся график MACD демонстрирует нам, что оба подхода в создании индикатора - совершенно однозначны и приводят к одинаковым результатам.

Создание MACD в Велс Лаб

Создание индикатора MACD в Wealth-Lab

Как: создать индикатор, отражающий взвешенную цену закрытия

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

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


protected override void Execute()

{
   DataSeries weightedClose = ( (2 * Close) + High + Low ) / 4;
   PlotSeries(PricePane, weightedClose, Color.Blue, LineStyle.Solid, 1);
}

Получившийся график:

Взвешенная цена закрытия

Взвешенная цена закрытия

Как: создать индикатор СПРЕДа, отражающий разницу между двумя финансовыми инструментами

Спредом является разница между ценами двух различных финансовых инструментов.

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

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


protected override void Execute()
{
   DataSeries spread = Close - GetExternalSymbol("GAZP", true).Close;
   ChartPane sPane = CreatePane(40, true, true);
   PlotSeries(sPane, spread, Color.Blue, LineStyle.Solid, 2);
}

Верхняя область графика - это отображение графика Спреда между Роснефтью и Газпромом.

Создание графика спреда в Велс Лаб

Спред между Роснефтью и Газпромом в Wealth-Lab

Как: создать осциллятор силы Элдера (EFO)

Доктор Элдер, входя в комнату трейдеров, говорит, что если акция находится в восходящем тренде и 2-х дневная экспоненциальная скользящая средняя построенная по осцилятору силы Элдера (EFO) опускается ниже нуля, то это является сигналом на покупку. Аналогичным образом, сигнал на продажу появляется тогда, когда акция в нисходящем тренде, а 2-х дневная EMA, построенная по EFO пересекает нулевой уровень снизу вверх.

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

Обратите внимание на то, как используется оператор смешения (>>) для того, чтобы сдвинуть цены закрытия вправо по шкале времени. Именно это позволяет создать ряд данных (DataSeries), в котором отображается разница между сегодняшним и вчерашним закрытием. Эта разница умножается на объем - образуя в результате другой индикатор, создаваемый с помощью одной строчки кода.


protected override void Execute()
{
    // создаем ряд данных, в котором отображается осциллятор силы Элдера
   DataSeries efo =  (Close - (Close >> 1)) * Volume;
   efo.Description = "Elder Force";

   DataSeries efEma = EMA.Series(efo, 2, EMACalculation.Modern);
   ChartPane efPane = CreatePane(40, true, true);
   PlotSeries(efPane, efo, Color.Black, LineStyle.Histogram, 1);
   PlotSeries(efPane, efEma, Color.Green, LineStyle.Solid, 2);
}

Верхняя область графика отображает Осцилятор силы Элдера (EFO).

Осциллятор силы Элдера

Осциллятор силы Элдера

Как: самостоятельно создать NRTR_WATR индикатор Константина Копыркина

Русский трейдер Константин Копыркин создал индикатор под названием "NRTR_WATR": адаптированный вариант переворотной системы. Для измерения текущей волатильности величина истинной волатильности (ATR) усредняется с помощью взвешенной скользящей средней. Таким образом уровень трейлинг стопа (который является и переворотным уровнем) адаптируется к текущим условиям рынка.

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

Пересечение данного уровня NRTR снизу вверх либо сверху вниз может использоваться для входа в позицию по тренду, как это показано в данном примере, либо же в качестве основы для переворотной стратегии (SAR - stop-and-reverse).


protected override void Execute()
{

   int Period = 20;
   double Multiple = 3.0;
   int Trend = 0;
   double Reverse = 0;

   DataSeries HPrice = Highest.Series( Close, 20 );
   DataSeries LPrice = Lowest.Series( Close, 20 );
   DataSeries K = WMA.Series( TrueRange.Series( Bars ), Period ) * Multiple;

   DataSeries NRTR_WATR = new DataSeries( Bars, "NRTR_WATR" );

   for(int bar = K.FirstValidValue; bar < Bars.Count; bar++)

   {

      // Рассчитываем ряд данных, где хранинтся значение  NRTR_WATR

      if( Trend >= 0 )

      {

         HPrice[bar] = Math.Max( Bars.Close[bar], HPrice[bar] );

         Reverse = HPrice[bar] - K[bar];

         if( Bars.Close[bar] <= Reverse )

         {

            Trend = -1;

            LPrice[bar] = Bars.Close[bar];

            Reverse = LPrice[bar] + K[bar];

         }

      }

      if( Trend <= 0 )

      {

         LPrice[bar] = Math.Min( Bars.Close[bar], LPrice[bar] );

         Reverse = LPrice[bar] + K[bar];

         if( Bars.Close[bar] >= Reverse )

         {

            Trend = 1;

            HPrice[bar] = Bars.Close[bar];

            Reverse = HPrice[bar] - K[bar];

         }

      }

      NRTR_WATR[bar] = Reverse;

   }

   // Отображаем на графике NRTR_WATR

   PlotSeries( PricePane, NRTR_WATR, Color.Teal, WealthLab.LineStyle.Dotted, 3 );

    //торговая стратегия - вход на следующем баре по тренду после пересечения.
   for(int bar = NRTR_WATR.FirstValidValue+1; bar < Bars.Count; bar++)

   {

      if (IsLastPositionActive)

      {

         if( CrossUnder( bar, Close, NRTR_WATR ) )

            SellAtMarket( bar+1, LastPosition, "NRTR Exit" );

      }

      else if( CrossOver( bar, Close, NRTR_WATR ) )

         BuyAtMarket( bar+1, "NRTR Entry" );

   }

}

Именно так выглядит на графике индикатор Константина Копыркина:

Индикатор Копыркина NATR_WATR

Индикатор NATR-WATR

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

Для того, чтобы более подробно рассмотреть данную тему - можете посмотреть как пример стратегию Glitch Index.

Как: создать индикаторы используя внешние финансовые инструменты

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

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

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

protected override void Execute()
{
   Bars gazpBars = GetExternalSymbol("GAZP", true);

   // Отображаем график газпрома и его 20-ти периодичной скользящей средней на новой области графика

   ChartPane gazpPane = CreatePane(60, true, true);
   DataSeries smaGAZP = SMA.Series(gazpBars.Close, 20);
   PlotSymbol(gazpPane, gazpBars, Color.LightGreen, Color.Black);
   PlotSeries(gazpPane, smaGAZP, Color.Blue, LineStyle.Solid, 2);

  // Отображаем 10-ти пириодичный ATR, рассчитанный по данным Газпрома в новой области

   ChartPane atrPane = CreatePane(40, true, true);
   DataSeries atrGAZP = ATR.Series(gazpBars, 10);
   PlotSeries(atrPane, atrGAZP, Color.Red, LineStyle.Solid, 2);
}

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

Использование данные внешнего инструмента

Индикатор с использованием внешнего инструмента

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

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

  1. Gerig пишет:

    Доброго времени суток! Я с нового года осваиваю Wealth-lab самостоятельно, изучая инструкцию. Процесс этот шел не быстро, сначало надо перевести, потом осмыслить, что ты перевел, и затем попытаться повторить, то что указано в инструкции. К счастью нашел в интернете Ваш ресурс, где все раскладывается и доводится “практически на молекулярном уровне”. Очередной раз получил удовольствие от прочтения Ваших советов и приемов, с интересом жду новую публикацию. Спасибо за рубрику.

    • Я тоже осваиваю эту программу. И процесс протекал точно также – перевод, осмысление, повторение. Именно поэтому и решил здесь выкладывать русский перевод Велс Лаб, чтобы как только понадобится что-то вспомнить – все было под руками.

  2. [...] Делаем индикаторы в Wealth-Lab своими руками  Главная  Рисование графических объектов на [...]

  3. Юрий пишет:

    Дмитрий, здравствуйте!
    Мне кажется, что второе предложение в разделе “Как: создать индикатор MACD с самостоятельно определяемым периодом” лучше перевести как то так:”Так как 26-периодная EMA имеет экспоненту 0.074074, а 12-периодная 0.153846, то вы можете классический индикатор MACD аппроксимировать разностью 12 и 26-периодных EMA (или другой комбинацией периодов).” Здесь речь идет о том, что экспоненты, вычисленные для этих EMA по формуле 2/(1+period) очень близки к значениям, которые берутся при вычислении классического MACD (0.075 и 0.15). Поэтому и MACD будет не сильно отличаться от классического, о чем и свидетельствует приводимый ниже пример.
    А в разделе про индикатор Копыркина в предложении “Для измерения текущей волатильности величина истинной волатильности (ATR) усредняется с помощью взвешенной скользящей средней.” в скобках букву A нужно убрать. Вы сами говорите, что с помощью взвешенной скользящей средней усредняется величина истинной волатильности, т.е. именно TrueRange (TR). Это видно и из приводимого ниже кода.

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