Простой индикатор
В этом разделе мы покажем вам, насколько просто писать индикаторы в Quantower.
Мы будем использовать расширение Quantower Algo для Visual Studio, но основные принципы действительны для всех сред разработки. Если у вас не установлено расширение Visual Studio или Quantower Algo, вы можете прочитать руководство Как установить Quantower Algo.
Смотрите примеры некоторых стратегий, интеграций и индикаторов в нашем репозитории Github.

Итак, что такое индикатор в целом?

Индикатор - это математические вычисления, основанные на цене или объеме финансового инструмента. Результат используется для отображения на графике и помогает трейдеру принять правильное решение. С технической точки зрения индикатор в Quantower представляет собой набор линий с буферами. Каждому элементу буфера присваивается исторический бар или тик на графике. Все, что вам нужно, это произвести необходимые вычисления и поместить результат в этот буфер.
Звучит не очень сложно, правда? Давайте начнем! Например, напишем код, который будет реализовывать алгоритм индикатора Simple Moving Average.
Используйте «Файл -> Новый проект» в главном меню Visual Studio, чтобы открыть окно «Новый проект». Наберите «Индикатор», и вы увидите специальный тип проекта для пустого индикатора:
Для начала нужно создать новый проект индикатора. Quantower Algo предоставляет вам предопределенные шаблоны для пустого индикатора, а также несколько примеров реальных индикаторов с исходным кодом:
Минимально необходимый исходный код будет сгенерирован автоматически и содержит основные функции индикатора:
Исходный код по умолчанию для пустого индикатора

Структура кода индикатора

Общие настройки

Пора углубиться в код. В методе конструктора вы можете указать имя индикатора, краткое имя для отображения на графиках и необходимость отдельного окна на графике для вашего индикатора. Наиболее важным здесь является указание количества линий и их стиля по умолчанию: Solid / Dot / Histogram, цвета и ширины. В нашем примере нам нужна всего одна строка, но вы можете добавить любую сумму:
1
/// <summary>
2
/// Indicator's constructor. Contains general information: name, description, LineSeries etc.
3
/// </summary>
4
public SimpleIndicator()
5
: base()
6
{
7
// Defines indicator's name and description.
8
Name = "SimpleIndicator";
9
Description = "My indicator's annotation";
10
11
// Defines line on demand with particular parameters.
12
AddLineSeries("line1", Color.CadetBlue, 1, LineStyle.Solid);
13
14
// By default indicator will be applied on main window of the chart
15
SeparateWindow = false;
16
}
Copied!

Получение данных

Метод «OnUpdate» будет вызываться каждый раз при изменении истории - здесь нам нужно добавить свои расчеты. Большинство индикаторов используют в своих алгоритмах цены или объемы. Quantower API предоставляет вам несколько способов получить эти данные - вы можете получить доступ к данным открытия, максимума, минимума, закрытия и других данных из текущего бара или из предыдущих столбцов, если это необходимо.
Общий метод GetPrice позволяет получить все типы данных:
1
// To get Low price of the current bar
2
double low = GetPrice(PriceType.Low);
3
// To get Volume price for the fifth bar before the current
4
double volume = GetPrice(PriceType.Volume, 5);
Copied!
И несколько упрощенных способов получить данные:
1
// To get Close price of the current bar
2
double close = Close();
3
// To get High price of the current bar
4
double high = High();
5
// To get Open price for the fifth bar before the current
6
double open = Open(5);
Copied!
Дополнительную информацию о классе «Индикатор» можно найти в нашей документации по API.

Установка данных

Теперь мы знаем, как получать цены, но, как мы уже говорили, нам также нужно поместить результаты в индикаторный буфер. Для этого мы можем использовать метод SetValue:
1
// Put value into current bar for first line of indicator
2
SetValue(1.43);
3
// Put value into current bar for second line of indicator
4
SetValue(1.43, 1);
5
// Put value into fifth bar before the current bar for second line of indicator
6
SetValue(1.43, 1, 5);
Copied!
Всего этого достаточно, чтобы закончить наш первый индикатор. Добавим вычисления в метод «OnUpdate», используя стандартные возможности C #. Это наш общий код:
1
/// <summary>
2
/// Calculation entry point. This function is called when a price data updates.
3
/// </summary>
4
protected override void OnUpdate(UpdateArgs args)
5
{
6
int Period = 10;
7
8
// Checking, if current amount of bars
9
// more, than period of moving average. If it is true
10
// then the calculation is possible
11
if (Count <= Period)
12
return;
13
14
double sum = 0.0; // Sum of prices
15
for (int i = 0; i < Period; i++)
16
// Adding bar's price to the sum
17
sum += GetPrice(PriceType.Close, i);
18
19
// Set value to the "SMA" line buffer.
20
SetValue(sum / Period);
21
}
Copied!
Как видите, для расчетов мы используем только цены закрытия и значение периода в жестком коде. В реальном случае вы позволите пользователю указать эти значения. В нашей следующей теме мы покажем, как использовать входной параметр для ваших скриптов.

Построение

Нам нужно его скомпилировать - используйте «Build -> Build Solution» в главном меню или горячую клавишу F6. Расширение Quantower Algo автоматически скопирует ваш индикатор на назначенную торговую платформу Quantower, и вы увидите его в справочнике «Индикаторы» на графике:
Вы можете увидеть свой индикатор в поиске по индикатору
Если вы решите внести некоторые исправления в свои расчеты, вы можете перестроить свой индикатор, и вам даже не нужно повторно добавлять его на график - он будет обновлен автоматически, и вы сразу увидите результаты:
Вы увидите все свои изменения сразу после перестройки
Используя этот базовый пример, вы можете легко создать свой собственный индикатор - вам доступны все возможности языка C #. В следующем разделе мы покажем вам, как добавить возможность настройки вашего индикатора с помощью входных параметров.