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

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


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

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

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

Вы можете получить доступ к внешним финансовым инструментам используя в коде торговой стратегии методы GetExternalSymbol() или SetContext().

Синхронизация в Велс Лаб по умолчанию

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

Синхронизация внешних данных в Велс Лаб

Объект Bars первичного финансового инструмента всегда используется при выполнении стратегии.

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

По умолчанию все внешние данные (бары и DataSeries) выравниваются с первичными барами сравнивая дату и время каждого из них на каждом из баров.

  • Все внешние данные, которые находятся за временными пределами первичных баров (раньше или позже) уничтожаются при синхронизации
  • Данные, которые существуют в первичных барах, но отсутствуют во внешних данных - добавляются к внешним данным. Значение в добавленные промежутки копируются из предыдущих значений соответствующих данных.
  • Если во внешних данных имеются данные, дата и время которых отсутствует в первичных барах, то такие внешние данные уничтожаются при синхронизации

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

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

Синхронизация данных в Велс Лаб

Схема синхронизации по умолчанию

Внешние данные были модифицированы следующим способом:

  • Бар с датой "4" был удален, т.к. такой даты не существует в первичной последовательности.
  • Бар "9" был вставлен, при этом его значение было скопировано из предыдущего бара "8" внешней последовательности.
  • Бар "17" был удален, т.к. он находился вне временных рамок первичной последовательности.

Влияние синхронизации на создание индикаторов

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

Если эта скользящая средняя будет составлена на основе цен внешнего финансового инструмента после синхронизации, то значение скользящей средней будет больше, чем если бы она рассчитывалась по данным до синхронизации. Это происходит из-за того, что значения в баре 5 и в баре 8 будут на единицу больше, чем если бы расчет проходил без синхронизации.

Такая ситуация может устраивать либо не устраивать разработчика торговой системы.

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

С другой стороны, внешний финансовый инструмент мог вообще не торговаться по тем или иным причинам в это время.

К счастью, программа Wealth-Lab позволяет Вам справиться с любым развитием ситуации.

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

Построение средней скользящей

Построение SMA5 по синхронизированным рядам

Смена способа синхронизации по умолчанию

WealthScript дает возможность отключить синхронизацию "по умолчанию" и выполнить синхронизацию уже после расчета индикаторов на первоначальных значениях внешних рядов данных. Это предполагает отключение синхронизации внешних финансовых инструментов при доступе к его барам или рядам данных и последующую синхронизацию с помощью метода Synchronize().

  1. Для того, чтобы отключить синхронизацию, которая используется по умолчанию, нужно присвоить параметру синхронизации в методах GetExternalSymbol() и SetContext() значение false.
  2. Создайте индикаторы на основании несинхронизированных (первоначальных) внешних баров или рядов данных.
  3. Выполните метод Synchronize() для синхронизации внешних рядов для того, чтобы создать синхронизированные бары или ряды данных.

Метод Synchronize() синхронизирует внешние ряды данных точно также, как и метод по умолчанию. Однако здесь мы уже синхронизируем индикаторы, построенные на основе данных внешнего финансового инструмента, а не сами бары внешнего финансового инструмента. Поэтому Вы можете быть уверены, что индикаторы точны, даже если внешний финансовый инструмент или ряд данных не торговался тогда, когда торговался основной финансовый инструмент.

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

Синхронизация индикатора после расчета

Построение SMA5 и синхронизация

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

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

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


protected override void Execute()

{
   // Получаем доступ к внешнему финансовому инструменту, но не синхронизируем его

   Bars rts = GetExternalSymbol("SPFB.RTS", false);

   // Рассчитываем скользящую среднюю по несинхронизированному внешнему финансовому инструменту

   DataSeries rtsSMA = SMA.Series(rts.Close, 50);

   // Теперь синхронизируем бары внешнего инструмента
   rts = Synchronize(rts);

   //Синхронизируем скользящую среднюю внешнего финансового инструмента
   rtsSMA = Synchronize(rtsSMA);

   ChartPane rtsPane = CreatePane(75, true, true);

   PlotSeries(rtsPane, rtsSMA, Color.Blue, WealthLab.LineStyle.Solid, 1); //отображаем скользящую среднюю

   PlotSymbol(rtsPane, rts, Color.LightBlue, Color.Black); //отображаем бары внешнего финансового инструмента
}

Когда Вы выполните в программе Wealth-Lab 6.3 приведенный код, у Вас отобразится вот такой график.

Построение графике в Велс Лаб

Синхронизированный график

Прошу обратить внимание, что в качестве первичного инструмента здесь используется ГАЗПРОМ, который торгуется на ММВБ и последний час торговли которого начинается в 18-00. В качестве внешнего (второго) инструмента используется фьючерс на индекс РТС, как Вы можете увидеть в коде. Причем, этот фьючерс торгуется и после 19 часов. На графике же, в верхней части Вы можете видеть бары фьючерса на индекс РТС и построенную по ним скользящую среднюю. Причем даже на фьючерсе после 18-ти часового бара отображается сразу первый бар следующей торговой сессии. Именно это демонстрирует, что была проведена синхронизация инструментов.

Замечание о первоначальных барах:

Метод Synchronize() синхронизирует внешние бары или ряды данных по отношению к основным барам. Будьте очень внимательны, т.к. первоначальные бары могут быть также изменены при вызове метода SetContext(). Если Вы хотите синхронизировать первоначальный график баров, убедитесь, что Вы выполнили метод RestoreContext() после использования метода SetContext(). Все это было сделано специально и позволяет Вам при использовании сложных стратегий, например парного трейдинга, полностью контролировать синхронизацию дополнительных (внешних) финансовых инструментов.

По этой теме Вы можете также почитать QuickRef (нажав кнопку F11 в редакторе): Bars.FirstActualBar

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

Рубрики: DataSeries, WealthScript

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

  1. Antrax пишет:

    В примере кода , метод GetExternalSymbol() будет работать только в рамках датасета “ММВБ-Акции(1h),чтобы он обращался к к другим датасетам он должен содержать еще один параметр с указанием стрингового имени датасета откуда получать символ.

    • Дмитрий Власов пишет:

      Да нет, тут будет работать в любом наборе данных (DataSet). Просто нужно вот здесь:

      Bars rts = GetExternalSymbol(“SPFB.RTS”, false);
      вместо “SPFB.RTS” прописать любой финансовый инструмент для сравнения. (у меня был прописан фьючерс на индекс РТС).

  2. Максим пишет:

    С одним внешним инструментом понятно, а как создать синтетический инструмент, к примеру SynthSymb=RTS-(4GAZR+4LKOH) и отобразить его на графике? Не осилил :(

    • Максим пишет:

      Сам себе отвечу.
      protected override void Execute()
      {
      Bars rts = GetExternalSymbol(“RTS”, true);
      Bars lkoh = GetExternalSymbol(“LKOH”, true);
      Bars gazp = GetExternalSymbol(“GAZP”, true);
      Bars si = GetExternalSymbol(“Si”, true);

      DataSeries rtsRub = rts.Close * 0.02 * si.Close / 1000;
      DataSeries synthSymb = rtsRub – ( 2 * lkoh.Close + 3 * gazp.Close );
      synthSymb.Description = “rts-2lkoh+3gazp”;

      ChartPane sPane = CreatePane(40, true, true);
      PlotSeries(sPane, synthSymb, Color.Blue, WealthLab.LineStyle.Solid, 2);
      }
      Как-то так. Получились не бары, как хотелось, но для принятия решения достаточно.

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