Table of Contents

Пример стратегии на C#

Создание стратегии из исходного кода будет рассмотрено на примере стратегии SMA - аналогичный пример-стратегии SMA, собранной из кубиков в пункте Создание алгоритма из кубиков.

Данный раздел не будет описывать конструкции C# языка (как и Strategy, на базе чего создаются стратегии), но будут упомянуты особенности для работы кода в Дизайнере.

Tip

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

  1. Параметры стратегии создаются через специальный подход:
_candleTypeParam = this.Param(nameof(CandleType), DataType.TimeFrame(TimeSpan.FromMinutes(1)));
_long = this.Param(nameof(Long), 80);
_short = this.Param(nameof(Short), 20);


private readonly StrategyParam<DataType> _candleTypeParam;

public DataType CandleType
{
	get => _candleTypeParam.Value;
	set => _candleTypeParam.Value = value;
}

private readonly StrategyParam<int> _long;

public int Long
{
	get => _long.Value;
	set => _long.Value = value;
}

private readonly StrategyParam<int> _short;

public int Short
{
	get => _short.Value;
	set => _short.Value = value;
}

При использовании класса StrategyParam автоматически используется подход сохранения и восстановления настроек.

  1. При создании индикаторов необходимо добавлять их во внутренний список стратегии (Indicators):
_longSma = new SimpleMovingAverage { Length = Long };
_shortSma = new SimpleMovingAverage { Length = Short };

// !!! DO NOT FORGET add it in case use IsFormed property (see code below)
Indicators.Add(_longSma);
Indicators.Add(_shortSma);

Это делается для того, чтобы стратегия могла отслеживать все необходимые для ее логики работы индикаторы при переходе их в состояние сформирован.

  1. При работе с графиком необходимо учитывать, что в случае запуска стратегии вне Дизайнера объект графика может быть отсутствовать.
_chart = this.GetChart();

// chart can be NULL in case hosting strategy in custom app like Runner or Shell
if (_chart != null)
{
	var area = _chart.AddArea();

	_chartCandlesElem = area.AddCandles();
	_chartTradesElem = area.AddTrades();
	_chartShortElem = area.AddIndicator(_shortSma);
	_chartLongElem = area.AddIndicator(_longSma);

	// you can apply custom color palette here
}

И далее в коде отрисовки данных на графике делать специальные проверки вида:

if (_chart == null)
	return;

var data = _chart.CreateData();
  1. Чтобы удостоверится что стратегия полностью готова к работе, ее индикаторы сформированы историческими данными и все подписки перешли в Онлайн, можно использовать специальный метод:
// some of indicators added in OnStarted not yet fully formed
// or user turned off allow trading
if (this.IsFormedAndOnlineAndAllowTrading())
{
	// TODO
}