Заметка

Использование разных таймфреймов в одной стратегии

  1  

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

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

Для получения преобразованного в нужный таймфрейм инструмента, используется функция ReScale(Symbol, BarScale, int) класса BarScaleConverter.
Кроме того, преобразованный инструмент нужно синхронизировать с текущим, чтобы бары и их даты полностью совпадали друг с другом — для этого используется функция Synchronize(Symbol).

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

         
// Получаем преобразованный в другой таймфрейм инструмент
Symbol newSymbol = BarScaleConverter.ReScale(Symbol, TradeMatic.BarScale.Minute, 60);



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


Создаем новую панель на графике и на ней отображаем индикаторы SMA, построенные уже на основе преобразованного в другой таймфрейм инструмента:

// Отрисовка
ChartPane anotherPane = CreatePane(50, false);
PlotSeries(anotherPane, Synchronize(newSymbol.Close), Color.Green,  LineStyle.Solid, 1);
PlotSeries(anotherPane, Synchronize(SMA.Series(newSymbol.Close, parameter0.ValueInt)), Color.Red, LineStyle.Solid, 1);
PlotSeries(anotherPane, Synchronize(SMA.Series(newSymbol.Close, parameter1.ValueInt)), Color.Red, LineStyle.Solid, 1);



Кроме того, уже в условиях на покупку и продажу меняем все ссылки на текущий инструмент (Close, Open, High, и т.п.) на преобразованный инструмент: newSymbol.Close, newSymbol.Open, newSymbol.High.

Итоговый код стратегии получается таким:

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

namespace ScriptNamespace
{
   class MyScript : Script
   {
      private StrategyParameter parameter0;
      private StrategyParameter parameter1;

      public MyScript()
      {
         parameter0 = CreateParameter("Период SMA", 9, 0, 100, 1);
         parameter1 = CreateParameter("Период SMA", 9, 0, 100, 1);
      }

      public override void Execute()
      {
         // Получаем преобразованный в другой таймфрейм инструмент
         Symbol newSymbol = BarScaleConverter.ReScale(Symbol, TradeMatic.BarScale.Minute, 60);
         
         // Отрисовка
         ChartPane anotherPane = CreatePane(50, false);
         PlotSeries(anotherPane, Synchronize(newSymbol.Close), Color.Green, LineStyle.Solid, 1);
         PlotSeries(anotherPane, Synchronize(SMA.Series(newSymbol.Close, parameter0.ValueInt)), Color.Red, LineStyle.Solid, 1);
         PlotSeries(anotherPane, Synchronize(SMA.Series(newSymbol.Close, parameter1.ValueInt)), Color.Red, LineStyle.Solid, 1);

         // Инициализация
                        Symbol newSymbolSynchronized = Synchronize(newSymbol);
                        DataSeries sma0 = Synchronize(SMA.Series(newSymbol.Close, parameter0.ValueInt));
                        DataSeries sma1 = Synchronize(SMA.Series(newSymbol.Close, parameter1.ValueInt));
         
         // Основной цикл
         for (int bar = 9; bar < newSymbolSynchronized.Count; bar++)
         {
            if (IsLastPositionActive)
            {
               if (CrossUnder(bar, newSymbolSynchronized.Close, sma1))
               {
                  SellAtClose(bar, LastPosition, "");
               }
            }
            else
            {
               if (CrossOver(bar, newSymbolSynchronized.Close, sma0))
               {
                  BuyAtClose(bar, "");
               }
            }
         }
      }
   }
}

Комментарии

Написать комментарий

Чтобы написать комментарий, необходимо авторизоваться.

Написать администратору