Conectores

Para trabajar con exchanges y fuentes de datos en S#, se recomienda utilizar la clase base Connector.

Veamos cómo trabajar con Connector. El código fuente del ejemplo se puede encontrar en el proyecto Samples/01_Basic/01_ConnectAndDownloadInstruments.

multiconnection vista principal

Cree una instancia de la clase Connector:

...
public Connector Connector;
...
public MainWindow()
{
	InitializeComponent();
	Connector = new Connector();
	InitConnector();
}

Para configurar Connector, la API cuenta con una interfaz gráfica especial que permite configurar varias conexiones simultáneamente. Cómo utilizarla se describe en la sección Configuración 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);
	}
}

API GUI ConnectorWindow

De manera similar, puede agregar conexiones directamente desde el código (sin ventanas gráficas) utilizando el método de extensión TraderHelper.AddAdapter<TAdapter>(StockSharp.Algo.Connector connector, System.Action<TAdapter> init ):

...
// Añadir adaptador para conectarse a Binance
connector.AddAdapter<BinanceMessageAdapter>(a =>
{
	a.Key = "<Your API Key>";
	a.Secret = "<Your Secret Key>";
});

// Añadir RSS para noticias
connector.AddAdapter<RssMessageAdapter>(a =>
{
	a.Address = "https://news-source.com/feed";
});

Puede agregar un número ilimitado de conexiones a un mismo objeto Connector. Por lo tanto, puede conectarse a múltiples exchanges y brokers simultáneamente desde el programa.

En el método InitConnector, configuramos los manejadores de eventos necesarios para IConnector:

private void InitConnector()
{
	// Suscribirse al evento de conexión correcta
	Connector.Connected += () =>
	{
		this.GuiAsync(() => ChangeConnectStatus(true));
	};

	// Suscribirse al evento de error de conexión
	Connector.ConnectionError += error => this.GuiAsync(() =>
	{
		ChangeConnectStatus(false);
		MessageBox.Show(this, error.ToString(), LocalizedStrings.ErrorConnection);
	});

	// Suscribirse al evento de desconexión
	Connector.Disconnected += () => this.GuiAsync(() => ChangeConnectStatus(false));

	// Suscribirse al evento de error
	Connector.Error += error =>
		this.GuiAsync(() => MessageBox.Show(this, error.ToString(), LocalizedStrings.Str2955));

	// Suscribirse al evento de fallo de suscripción a datos de mercado
	Connector.SubscriptionFailed += (subscription, error, isSubscribe) =>
		this.GuiAsync(() => MessageBox.Show(this, error.ToString(),
			LocalizedStrings.Str2956Params.Put(subscription.DataType, subscription.SecurityId)));

	// Suscripciones para recibir datos

	// Instruments
	Connector.SecurityReceived += (sub, security) => _securitiesWindow.SecurityPicker.Securities.Add(security);

	// Tick trades
	Connector.TickTradeReceived += (sub, trade) => _tradesWindow.TradeGrid.Trades.TryAdd(trade);

	// Orders
	Connector.OrderReceived += (sub, order) => _ordersWindow.OrderGrid.Orders.TryAdd(order);

	// Own trades
	Connector.OwnTradeReceived += (sub, trade) => _myTradesWindow.TradeGrid.Trades.TryAdd(trade);

	// Positions
	Connector.PositionReceived += (sub, position) => _portfoliosWindow.PortfolioGrid.Positions.TryAdd(position);

	// Fallos de registro de órdenes
	Connector.OrderRegisterFailReceived += (sub, fail) => _ordersWindow.OrderGrid.AddRegistrationFail(fail);

	// Fallos de cancelación de órdenes
	Connector.OrderCancelFailReceived += (sub, fail) => OrderFailed(fail);

	// Establecer proveedor de datos 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 proveedor de adaptadores para configuración gráfica
	ConfigManager.RegisterService<IMessageAdapterProvider>(
		new InMemoryMessageAdapterProvider(Connector.Adapter.InnerAdapters));
}

Cómo guardar y cargar la configuración de Connector en un archivo se puede encontrar en la sección Guardado y carga de configuración.

La información sobre cómo crear su propio Connector se puede encontrar en la sección Creación de su Propio Conector.

La colocación de órdenes se describe en las secciones Órdenes, Creación de una nueva orden, Creación de una nueva orden stop.

Funcionalidades adicionales

IFileSystem y Paths.FileSystem

Utilice IFileSystem para operaciones de archivo como la serialización y deserialización de configuraciones. La instancia predeterminada está disponible a través de Paths.FileSystem:

private readonly IFileSystem _fileSystem = Paths.FileSystem;

Los métodos Serialize y Deserialize sin el parámetro IFileSystem están marcados como [Obsolete].

Métodos asíncronos de órdenes

Los siguientes métodos asíncronos están disponibles para trabajar con órdenes:

  • RegisterOrderAsync: registra una orden de forma asíncrona.
  • CancelOrderAsync: cancela una orden de forma asíncrona.
  • EditOrderAsync: edita una orden de forma asíncrona.

SubscriptionsOnConnect

La propiedad SubscriptionsOnConnect controla las suscripciones que se realizan automáticamente al conectar. Por defecto, incluye suscripciones a instrumentos, portafolios y órdenes.

Eventos del adaptador

Los siguientes eventos están disponibles para rastrear eventos de adaptadores específicos:

  • ConnectedEx: un adaptador específico se ha conectado.
  • DisconnectedEx: un adaptador específico se ha desconectado.
  • ConnectionErrorEx: se produjo un error de conexión en un adaptador específico.

Ciclo de vida de la suscripción

  • SubscriptionStarted: la suscripción se ha iniciado.
  • SubscriptionOnline: la suscripción ha pasado al estado en línea: se han recibido los datos históricos y ha comenzado la transmisión de datos en tiempo real.
  • SubscriptionFailed: error de suscripción. El tercer parámetro, isSubscribe, indica si el error ocurrió durante la suscripción o la cancelación de la suscripción.
  • SubscriptionStopped: la suscripción se ha detenido.

Véase también

Configuración gráfica