Доступ к пользовательским индикаторам
Создайте экземпляр пользовательского индикатора с входными параметрами.

Общее

Quantower API предоставляет огромную коллекцию встроенных индикаторов. Но иногда нам нужно использовать собственный индикатор, который мы разработали ранее или скачали из Интернета.
В этой статье мы создадим экземпляр пользовательского индикатора и по-разному передадим входные параметры.
Ниже вы можете увидеть код пользовательского индикатора. Представим, что это очень полезный скрипт и что мы хотим использовать результаты его вычислений в нашем коде. Но нас не устраивают входные параметры по умолчанию, поэтому мы хотим их изменить.
1
public class CustomIndicator : Indicator
2
{
3
[InputParameter("Level", 10, 0.1, 9999, 0.1, 1)]
4
public double LevelValue = 10;
5
6
[InputParameter("Slow period", 20, 1, 9999, 1, 0)]
7
public int SlowPeriod = 30;
8
9
[InputParameter("Price type", variants: new object[]
10
{
11
"Close", PriceType.Close,
12
"Open", PriceType.Open,
13
"High", PriceType.High,
14
"Low", PriceType.Low,
15
})]
16
public PriceType PriceType = PriceType.Close;
17
18
[InputParameter("Period")]
19
public Period Period = Period.MIN1;
20
21
//
22
// Parameterless constructor
23
//
24
public CustomIndicator()
25
{
26
this.Name = "Custom indicator";
27
this.AddLineSeries("Line", Color.DodgerBlue, 2, LineStyle.Solid);
28
29
this.SeparateWindow = true;
30
}
31
32
protected override void OnUpdate(UpdateArgs args)
33
{
34
// something usefull
35
}
36
}
Copied!

Использовать конструктор класса (новичок)

Самый простой способ создать и передать параметры - использовать конструктор класса. На данный момент в нашем пользовательском индикаторе есть конструктор, который не принимает параметров (конструктор без параметров). Такой конструктор должен быть у каждого индикатора.
Давайте добавим новый конструктор для класса CustomIndicator, в котором мы переопределим входные параметры по умолчанию.
1
public class CustomIndicator : Indicator
2
{
3
// ...
4
5
//
6
// Parameterless constructor
7
//
8
public CustomIndicator()
9
{
10
this.Name = "Custom indicator";
11
this.AddLineSeries("Line", Color.DodgerBlue, 2, LineStyle.Solid);
12
13
this.SeparateWindow = true;
14
}
15
16
//
17
// New constructor with parameters
18
//
19
public CustomIndicator(double levelValue, int slowPeriod, PriceType priceType, Period period)
20
: this() // Don't forget to invoke parameterless constructor
21
{
22
this.LevelValue = levelValue;
23
this.SlowPeriod = slowPeriod;
24
this.PriceType = priceType;
25
this.Period = period;
26
}
27
28
// ...
29
}
Copied!
Теперь в других индикаторах мы можем использовать этот конструктор вместо конструктора по умолчанию. Например, в методе «OnInit».
1
class BestIndicator : Indicator
2
{
3
private Indicator customIndicator;
4
5
protected override void OnInit()
6
{
7
this.customIndicator = new CustomIndicator(10, 500, PriceType.High, Period.DAY1);
8
this.AddIndicator(this.customIndicator);
9
}
10
11
protected override void OnUpdate()
12
{
13
var indicatorValue = this.customIndicator.GetValue();
14
15
// something usefull
16
}
17
}
Copied!

Использовать сборник настроек индикатора (заранее)

Этот метод можно использовать, если вы не можете добавить требуемый конструктор. Например, вы импортировали dll-библиотеку с индикатором. У каждого индикатора есть свойство «Настройки», которое содержит все входные параметры, преобразованные в объекты типа «SettignItem».
Чтобы изменить любой из параметров, необходимо вызвать метод UpdateItemValue и передать имя необходимого параметра и новое значение.
1
class BestIndicator : Indicator
2
{
3
private Indicator customIndicator;
4
5
//
6
protected override void OnInit()
7
{
8
var customIndicator = new CustomIndicator();
9
var settings = customIndicator.Settings;
10
11
try
12
{
13
settings.UpdateItemValue("Level", 12.5);
14
settings.UpdateItemValue("Slow period", 55);
15
settings.UpdateItemValue("Price type", new SelectItem("Open", PriceType.Open));
16
settings.UpdateItemValue("Period", Period.MONTH1);
17
18
this.AddIndicator(this.customIndicator);
19
}
20
catch (Exception ex)
21
{
22
// log exception
23
}
24
25
indicator.Settings = settings;
26
}
27
28
//
29
protected override void OnUpdate()
30
{
31
var indicatorValue = customIndicator.GetValue();
32
33
// something usefull
34
}
35
}
Copied!