background

Центр поддержки Tradematic

Материалы, видео и ссылки для пользователей и разработчиков Tradematic.

Стратегия «спот-фьючерс» на примере торговли индексом в Tradematic Trader

96726СТАТЬЯ РЕДАКТОР КОДА СПОТ-ФЬЮЧЕРС ИНДЕКС ВНЕШНИЙ ИНСТРУМЕНТ GETEXTERNALSYMBOL

Мы продолжаем цикл статей, описывающих ньюансы использования Tradematic Trader — конструктора торговых роботов. В этой статье мы рассмотрим достаточно часто возникающую задачу типа «спот-фьючерс», т.е. анализируем один инструмент — торгуем другим, на примере стратегии, анализирующей индекс ММВБ 10, а торгующей бумагами, в него входящими.

Достаточно часто возникает необходимость анализировать один инструмент, а торговать другим (или сразу несколькими). Вот примеры стратегий, которые используют эту технику:

Торговля по индексу

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

Спот-фьючерс

Анализируется базовый актив (например, акция Сбербанка), а торгуется фьючерс на Сбербанк. Смысл этой стратегии — в значительной экономии на издержках (на рынке ФОРТС значительно ниже брокерские комиссии), а так же фактически использование бесплатных заемных средств (вместо полной стоимости контракта блокируется только гарантийное обеспечение).

Создание стратегии

В этой статье мы создадим стратегию, которая будет анализировать индекс ММВБ 10, а торговать акциями, в него входящими. Абсолютно точно таким же способом можно создать стратегию типа «спот-фьючерс», которая анализирует базовый актив, а торгует фьючерсом.

В качестве основы мы снова возьмем нашу любимую стратегию SMA-9, чтобы было нагляднее. В качестве индекса мы берем индекс ММВБ10, который на текущий момент включает следующие бумаги: ВТБ ао, ГАЗПРОМ ао, ГМКНорНик, ЛУКОЙЛ, Роснефть, РусГидро, Сбербанк, Сбербанк-п, СевСт-ао, Сургнфгз.

Важно! Все эти бумаги, а также индекс ММВБ 10, должны быть в списке инструментов в свойствах стратегии.

Технические аспекты

Трейдматик запускает скрипт по каждому из инструментов, указанных в свойствах стратегии. Это значит, что в коде мы должны будем проверять, по какому инструменту сейчас запущен скрипт, и: — если это индекс ММВБ 10, то нужно выходить, т.к. по самому индексу мы ничего делать не будем — если это не индекс ММВБ 10 (т.е. одна из входящих в него бумаг), то нам нужно получить индекс ММВБ10, проанализировать его, и если есть сигнал, открыть/закрыть позицию по текущему инструменту

Для получения внешнего инструмента (в данном случае индекса ММВБ10), т.е. инструмента, который сейчас не является текущим, используется функция Script.GetExternalSymbol(string symbol, bool synchronize).

Нам нужно получить внешний инструмент с именем «MICEX 10», и уже на основе него строить индикаторы и проверять условия:

// Получаем индекс ММВБ10
Symbol micex10 = GetExternalSymbol("MICEX 10", true);

Отрисовка на графиках и проверка

Нам нужно вывести индекс ММВБ 10 на всех графиках акций.

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

// Отрисовка
ChartPane micexPane = CreatePane(50, false);
PlotSymbol(micexPane, micex10, Color.Green, Color.Red);
PlotSeries(micexPane, SMA.Series(micex10.Close, parameter0.ValueInt), Color.Red, LineStyle.Solid, 1);
PlotSeries(micexPane, SMA.Series(micex10.Close, parameter1.ValueInt), Color.Red, LineStyle.Solid, 1);
Не забываем добавить проверку в функцию Execute(), чтобы по самому индексу сигналы не выдавались:
// Проверка
if (Symbol.SymbolName == "MICEX 10")
{
	return;
}
Кроме того, в список инструментов по стратегии, кроме списка индекса ММВБ10 (он приведен выше), нужно включить и сам индекс.

Итоговый код

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

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()
		{
			// Проверка         
			if (Symbol.SymbolName == "MICEX 10")
			{
				return;
			}

			// Получаем индекс ММВБ10         
			Symbol micex10 = GetExternalSymbol("MICEX 10", true);

			// Отрисовка         
			ChartPane micexPane = CreatePane(50, false);
			PlotSymbol(micexPane, micex10, Color.Green, Color.Red);
			PlotSeries(micexPane, SMA.Series(micex10.Close, parameter0.ValueInt), Color.Red, LineStyle.Solid, 1);
			PlotSeries(micexPane, SMA.Series(micex10.Close, parameter1.ValueInt), Color.Red, LineStyle.Solid, 1);
			
			// Инициализация   
			
			// Основной цикл         
			for (int bar = 9; bar < micex10.Count; bar++)
			{
				if (IsLastPositionActive)
				{
					if (CrossUnder(bar, micex10.Close, SMA.Series(micex10.Close, parameter1.ValueInt)))
					{
						SellAtClose(bar, LastPosition, "");
					}
				}
				else
				{
					if (CrossOver(bar, micex10.Close, SMA.Series(micex10.Close, parameter0.ValueInt)))
					{
						BuyAtClose(bar, "");
					}
				}
			}
		}
	}
}
В следующей статье мы будем создавать свой индикатор.

Спасибо, что потратили свое время на чтение этой статьи!