Создание собственного кубика

Аналогично созданию кубика из схемы можно создать свой кубик на основе C# кода. Такой кубик будет более функциональным, чем кубик из схемы.

Для создания кубика из кода, необходимо создать его в папке Собственные кубики:

Designer_Source_Code_Elem_00

В приведённом ниже примере кубик наследуется от класса DiagramExternalElement и выглядит следующим образом:

/// <summary>
/// Пример элемента диаграммы показывает использование входных и выходных сокетов.
/// 
/// https://doc.stocksharp.com/topics/Designer_Combine_Source_code_and_standard_elements.html
/// </summary>
public class EmptyDiagramElement : DiagramExternalElement
{
	private readonly DiagramElementParam<int> _minValue;

	public EmptyDiagramElement()
	{
		// пример свойства, показывающий создание параметров
	
		_minValue = AddParam("MinValue", 10)
			.SetBasic(true) // make parameter visible in basic mode
			.SetDisplay("Parameters", "Min value", "Min value parameter description", 10);
	}

	// выходные сокеты — это события, помеченные атрибутом DiagramExternal

	[DiagramExternal]
	public event Action<Unit> Output1;

	[DiagramExternal]
	public event Action<Unit> Output2;

	// раскомментируйте, чтобы метод Process вызывался при каждом новом аргументе
	// (no need wait when all input args received)
	//public override bool WaitAllInput => false;

	// входные сокеты — это параметры методов, помеченные атрибутом DiagramExternal

	[DiagramExternal]
	public void Process(CandleMessage candle, Unit diff)
	{
		var res = candle.ClosePrice + diff;

		if (diff >= _minValue.Value)
			Output1?.Invoke(res);
		else
			Output2?.Invoke(res);
	}

	public override void Start()
	{
		base.Start();

		// добавить логику перед запуском
	}

	public override void Stop()
	{
		base.Stop();

		// добавить логику после остановки
	}

	public override void Reset()
	{
		base.Reset();

		// добавить логику сброса внутреннего состояния
	}
}

В данном коде кубик имеет два входящих сокета и два исходящих. Входящие сокеты определяются путем применения атрибута DiagramExternalAttribute к методу:

[DiagramExternal]
public void Process(CandleMessage candle, Unit diff)

Исходящие сокеты определяются путем применения атрибута к событию. В примере кубика таких событий два:

[DiagramExternal]
public event Action<Unit> Output1;

[DiagramExternal]
public event Action<Unit> Output2;

Поэтому исходящих сокетов будет также два.

Дополнительно показано как сделать свойство у кубика:

_minValue = AddParam("MinValue", 10)
	.SetBasic(true) // make parameter visible in basic mode
	.SetDisplay("Parameters", "Min value", "Min value parameter description", 10);

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

Свойство MinValue помечено как basic, и оно будет видно в режиме Базовые свойства.

Закомментированное свойство WaitAllInput отвечает за время вызова метода со входящими сокетами:

//public override bool WaitAllInput => false;

Если раскомментировать свойство, то метод Process будет вызываться всегда, как только придёт хотя бы одно значение (в случае примера это или свеча, или числовое значение).

Чтобы добавить получившийся кубик на схему, необходимо в палитре в разделе Собственные кубики выбрать созданный кубик:

Designer_Source_Code_Elem_01

Warning

Кубики из C# кода невозможно использовать в стратегиях, созданных на C# коде. Их возможно использовать только в стратегиях, созданных из кубиков.

См. также

Создание индикатора