Criar o seu próprio cubo
Tal como ao criar um cubo a partir de um diagrama, pode criar o seu próprio cubo com base em código C#. Esse cubo será mais funcional do que um cubo criado a partir de um diagrama.
Para criar um cubo a partir de código, este deve ser criado na pasta Elementos próprios:

No exemplo apresentado abaixo, o cubo herda da classe DiagramExternalElement e tem o seguinte aspeto:
/// <summary>
/// Elemento de diagrama de exemplo que demonstra a utilização de sockets de entrada e saída.
///
/// 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()
{
// propriedade de exemplo para mostrar como criar parâmetros
_minValue = AddParam("MinValue", 10)
.SetBasic(true) // tornar o parâmetro visível no modo básico
.SetDisplay("Parâmetros", "Valor mínimo", "Descrição do parâmetro de valor mínimo", 10);
}
// sockets de saída são eventos marcados com o atributo DiagramExternal
[DiagramExternal]
public event Action<Unit> Output1;
[DiagramExternal]
public event Action<Unit> Output2;
// sockets de entrada são parâmetros de métodos marcados com o atributo DiagramExternal
// descomente para que o método Process seja chamado sempre que for recebido um novo argumento
// (não é necessário esperar até todos os argumentos de entrada serem recebidos)
//public override bool WaitAllInput => false;
[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();
// adicionar lógica antes do arranque
}
public override void Stop()
{
base.Stop();
// adicionar lógica depois da paragem
}
public override void Reset()
{
base.Reset();
// adicionar lógica para repor o estado interno
}
}
Neste código, o cubo tem dois sockets de entrada e dois sockets de saída. Os sockets de entrada são definidos aplicando o atributo DiagramExternalAttribute ao método:
[DiagramExternal]
public void Process(CandleMessage candle, Unit diff)
Os sockets de saída são definidos aplicando o atributo a um evento. No exemplo do cubo, existem dois eventos deste tipo:
[DiagramExternal]
public event Action<Unit> Output1;
[DiagramExternal]
public event Action<Unit> Output2;
Por isso, existirão também dois sockets de saída.
Além disso, é mostrado como criar uma propriedade para o cubo:
_minValue = AddParam("MinValue", 10)
.SetBasic(true) // tornar o parâmetro visível no modo básico
.SetDisplay("Parâmetros", "Valor mínimo", "Descrição do parâmetro de valor mínimo", 10);
A utilização da classe DiagramElementParam aplica automaticamente a abordagem de guardar e restaurar definições.
A propriedade Valor mínimo está marcada como básica e ficará visível no modo Propriedades básicas.
A propriedade comentada WaitAllInput é responsável pelo momento da chamada do método com sockets de entrada:
//public override bool WaitAllInput => false;
Se for descomentada, o método Processo será sempre chamado assim que pelo menos um valor chegar (no caso do exemplo, uma candle ou um valor numérico).
Para adicionar o cubo resultante ao diagrama, é necessário selecionar o cubo criado na paleta, na secção Elementos próprios:

Warning
Cubos em código C# não podem ser usados em estratégias criadas em código C#. Só podem ser usados em estratégias criadas a partir de cubos.