Conectores
Para trabalhar com bolsas e fontes de dados no S#, recomenda-se usar a classe base Connector.
Repositório de código-fonte
O Connector base, o modelo de mensagens e os contratos comuns dos adaptadores permanecem no repositório principal do StockSharp. Os adaptadores abertos específicos de cada fornecedor são mantidos separadamente no repositório StockSharp Connectors.
Cada diretório de conector de nível superior contém o seu próprio projeto .NET, enquanto Connectors.slnx compila todo o repositório. Use este repositório para estudar a implementação de um adaptador, corrigir um conector existente ou contribuir com um novo.
Vamos examinar o trabalho com Connector. O código-fonte do exemplo pode ser encontrado no projeto Samples/01_Basic/01_ConnectAndDownloadInstruments.
![]()
Crie uma instância da classe Connector:
...
public Connector Connector;
...
public MainWindow()
{
InitializeComponent();
Connector = new Connector();
InitConnector();
}
Para configurar o Connector, a API possui uma interface gráfica especial que permite configurar várias conexões simultaneamente. Como usá-la é descrito na seção Configuração gráfica.
...
private readonly IFileSystem _fileSystem = Paths.FileSystem;
private const string _connectorFile = "ConnectorFile.json";
...
private void Setting_Click(object sender, RoutedEventArgs e)
{
if (Connector.Configure(this))
{
Connector.Save().Serialize(_fileSystem, _connectorFile);
}
}

Da mesma forma, você pode adicionar conexões diretamente pelo código (sem janelas gráficas) usando o método de extensão TraderHelper.AddAdapter<TAdapter>(StockSharp.Algo.Connector connector, System.Action<TAdapter> init ):
...
// Adicionar adaptador para conectar à Binance
connector.AddAdapter<BinanceMessageAdapter>(a =>
{
a.Key = "<A sua chave de API>";
a.Secret = "<A sua chave secreta>";
});
// Adicionar RSS para notícias
connector.AddAdapter<RssMessageAdapter>(a =>
{
a.Address = "https://news-source.com/feed";
});
Você pode adicionar um número ilimitado de conexões a um único objeto Connector. Assim, é possível conectar-se simultaneamente a várias bolsas e corretoras a partir do programa.
No método InitConnector, definimos os manipuladores de eventos necessários para IConnector:
private void InitConnector()
{
// Assinar evento de conexão bem-sucedida
Connector.Connected += () =>
{
this.GuiAsync(() => ChangeConnectStatus(true));
};
// Assinar evento de erro de conexão
Connector.ConnectionError += error => this.GuiAsync(() =>
{
ChangeConnectStatus(false);
MessageBox.Show(this, error.ToString(), LocalizedStrings.ErrorConnection);
});
// Assinar evento de desconexão
Connector.Disconnected += () => this.GuiAsync(() => ChangeConnectStatus(false));
// Assinar evento de erro
Connector.Error += error =>
this.GuiAsync(() => MessageBox.Show(this, error.ToString(), LocalizedStrings.Str2955));
// Assinar evento de falha na assinatura de dados de mercado
Connector.SubscriptionFailed += (subscription, error, isSubscribe) =>
this.GuiAsync(() => MessageBox.Show(this, error.ToString(),
LocalizedStrings.Str2956Params.Put(subscription.DataType, subscription.SecurityId)));
// Assinaturas para recebimento de dados
// Instruments
Connector.SecurityReceived += (sub, security) => _securitiesWindow.SecurityPicker.Securities.Add(security);
// Negócios tick
Connector.TickTradeReceived += (sub, trade) => _tradesWindow.TradeGrid.Trades.TryAdd(trade);
// Ordens
Connector.OrderReceived += (sub, order) => _ordersWindow.OrderGrid.Orders.TryAdd(order);
// Negócios próprios
Connector.OwnTradeReceived += (sub, trade) => _myTradesWindow.TradeGrid.Trades.TryAdd(trade);
// Posições
Connector.PositionReceived += (sub, position) => _portfoliosWindow.PortfolioGrid.Positions.TryAdd(position);
// Falhas no registro de ordens
Connector.OrderRegisterFailReceived += (sub, fail) => _ordersWindow.OrderGrid.AddRegistrationFail(fail);
// Falhas no cancelamento de ordens
Connector.OrderCancelFailReceived += (sub, fail) => OrderFailed(fail);
// Definir provedor de dados de mercado
_securitiesWindow.SecurityPicker.MarketDataProvider = Connector;
try
{
if (File.Exists(_connectorFile))
{
var ctx = new ContinueOnExceptionContext();
ctx.Error += ex => ex.LogError();
using (new Scope<ContinueOnExceptionContext>(ctx))
Connector.Load(_connectorFile.Deserialize<SettingsStorage>(_fileSystem));
}
}
catch
{
}
ConfigManager.RegisterService<IExchangeInfoProvider>(new InMemoryExchangeInfoProvider());
// Registrar provedor de adaptadores para configuração gráfica
ConfigManager.RegisterService<IMessageAdapterProvider>(
new InMemoryMessageAdapterProvider(Connector.Adapter.InnerAdapters));
}
Como salvar e carregar configurações do Connector em um arquivo pode ser encontrado na seção Salvando e Carregando Configurações.
Informações sobre a criação do seu próprio Connector podem ser encontradas na seção Criando Seu Próprio Conector.
O envio de ordens é descrito nas seções Ordens, Criando uma Nova Ordem, Criando uma Nova Ordem Stop.
Recursos adicionais
IFileSystem e Paths.FileSystem
Use IFileSystem para operações de arquivo, como serializar e desserializar configurações. A instância padrão está disponível através de Paths.FileSystem:
private readonly IFileSystem _fileSystem = Paths.FileSystem;
Os métodos Serialize e Deserialize sem o parâmetro IFileSystem estão marcados como [Obsolete].
Métodos assíncronos de ordens
Os seguintes métodos assíncronos estão disponíveis para trabalhar com ordens:
RegisterOrderAsync- registra uma ordem de forma assíncrona.CancelOrderAsync- cancela uma ordem de forma assíncrona.EditOrderAsync- edita uma ordem de forma assíncrona.
SubscriptionsOnConnect
A propriedade SubscriptionsOnConnect controla as assinaturas que são realizadas automaticamente na conexão. Por padrão, inclui assinaturas de instrumentos, portfólios e ordens.
Eventos do adaptador
Os seguintes eventos estão disponíveis para rastrear eventos de adaptadores específicos:
ConnectedEx- um adaptador específico se conectou.DisconnectedEx- um adaptador específico se desconectou.ConnectionErrorEx- ocorreu um erro de conexão em um adaptador específico.
Ciclo de vida da assinatura
SubscriptionStarted- a assinatura foi iniciada.SubscriptionOnline- a assinatura mudou para o estado online: os dados históricos foram recebidos e a transmissão de dados em tempo real foi iniciada.SubscriptionFailed- erro de assinatura. O terceiro parâmetro,isSubscribe, indica se o erro ocorreu durante a assinatura ou o cancelamento da assinatura.SubscriptionStopped- a assinatura foi interrompida.