Criar um indicador em C#
A criação do seu próprio indicador na API é descrita na secção Indicador personalizado. Esses indicadores são totalmente compatíveis com o Designer.
Para criar um indicador, no painel Esquema é necessário selecionar a pasta Indicadores, clicar com o botão direito e, no menu de contexto, selecionar Adicionar:

O código do indicador terá o seguinte aspeto:
/// <summary>
/// Indicador de exemplo que demonstra como guardar e carregar parâmetros.
///
/// Altera o preço de entrada em +20% ou -20%.
///
/// Ver mais exemplos em https://github.com/StockSharp/StockSharp/tree/master/Algo/Indicators
///
/// Documentação https://doc.stocksharp.com/topics/Designer_Creating_indicator_from_source_code.html
/// </summary>
public class EmptyIndicator : BaseIndicator
{
private int _change = 20;
public int Change
{
get => _change;
set
{
_change = value;
Reset();
}
}
private int _counter;
// o indicador formado recebeu todas as entradas necessárias para ficar disponível para negociação
private bool _isFormed;
protected override bool CalcIsFormed() => _isFormed;
public override void Reset()
{
base.Reset();
_isFormed = default;
_counter = default;
}
protected override IIndicatorValue OnProcess(IIndicatorValue input)
{
// em cada 10.ª chamada, tentar devolver um valor vazio
if (RandomGen.GetInt(0, 10) == 0)
return new DecimalIndicatorValue(this);
if (_counter++ == 5)
{
// por exemplo, o nosso indicador precisa de 5 entradas para ficar formado
_isFormed = true;
}
var value = input.GetValue<decimal>();
// alteração aleatória de +20% ou -20% do valor atual
value += value * RandomGen.GetInt(-Change, Change) / 100.0m;
return new DecimalIndicatorValue(this, value)
{
// valor final significa que este valor para a entrada especificada
// já não é alterado (por exemplo, para candles que mudam com o último preço)
IsFinal = RandomGen.GetBool()
};
}
// persistir as nossas propriedades para as guardar para reinícios futuros da aplicação
public override void Load(SettingsStorage storage)
{
base.Load(storage);
Change = storage.GetValue<int>(nameof(Change));
}
public override void Save(SettingsStorage storage)
{
base.Save(storage);
storage.SetValue(nameof(Change), Change);
}
public override string ToString() => $"Change: {Change}";
}
Este indicador recebe um valor de entrada e aplica um desvio arbitrário com base no valor do parâmetro Alteração.
A descrição dos métodos do indicador está disponível na secção Indicador personalizado.
Para adicionar o indicador criado ao diagrama, é necessário usar o cubo Indicador e, nele, especificar o indicador necessário:

O parâmetro Alteração, previamente definido no código do indicador, é apresentado no painel de propriedades.
Warning
Indicadores 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.