Verbindung über das FIX-Protokoll

Hydra kann im Servermodus verwendet werden. Dadurch ist eine Remote-Verbindung zu Hydra möglich, um auf Daten im Speicher zuzugreifen. Das Aktivieren des Servermodus von Hydra ist im Abschnitt Einstellungen beschrieben.

Für die Verbindung über das FIX-Protokoll müssen Sie eine Fix-Verbindung erstellen und konfigurieren (FIX-Adapterinitialisierung).

// Connector-Instanz erstellen
private readonly Connector _connector = new Connector();

// Adapter für Marktdaten über das FIX-Protokoll konfigurieren
var marketDataAdapter = new FixMessageAdapter(_connector.TransactionIdGenerator)
{
	Address = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 5002),
	SenderCompId = "hydra_user",
	TargetCompId = "StockSharpHydraMD",
	Login = "hydra_user",
	Password = "qwerty".To<SecureString>(),
};
_connector.Adapter.InnerAdapters.Add(marketDataAdapter);

// Adapter für Transaktionsdaten konfigurieren
var transactionDataAdapter = new FixMessageAdapter(_connector.TransactionIdGenerator)
{
	Address = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 5002),
	SenderCompId = "hydra_user",
	TargetCompId = "StockSharpHydraMD",
	Login = "hydra_user",
	Password = "qwerty".To<SecureString>(),
};
_connector.Adapter.InnerAdapters.Add(transactionDataAdapter);

Abonnieren Sie Ereignisse und richten Sie Datenhandler ein:

// Ereignis bei erfolgreicher Verbindung
_connector.Connected += () =>
{
	Console.WriteLine("Verbindung hergestellt");

	// Subscription zur Instrumentensuche erstellen
	var lookupSubscription = new Subscription(DataType.Securities);
	_connector.Subscribe(lookupSubscription);
};

// Ereignis bei Verbindungsverlust
_connector.Disconnected += () =>
{
	Console.WriteLine("Verbindung verloren");
};

// Ereignis bei empfangenem Instrument
_connector.SecurityReceived += (subscription, security) =>
{
	Console.WriteLine($"Instrument empfangen: {security.Code}, {security.Id}");
	BufferSecurity.Add(security);

	// Wenn dies das Zielinstrument ist, seine Daten abonnieren
	if (security.Id == targetSecurityId)
	{
		// Order-Book-Subscription
		var depthSubscription = new Subscription(DataType.MarketDepth, security);
		_connector.Subscribe(depthSubscription);

		// Tick-Trades-Subscription
		var tradesSubscription = new Subscription(DataType.Ticks, security);
		_connector.Subscribe(tradesSubscription);

		// Kerzen-Subscription
		var candleSubscription = new Subscription(
			DataType.TimeFrame(TimeSpan.FromMinutes(5)),
			security)
		{
			MarketData =
			{
				From = DateTime.Today.Subtract(TimeSpan.FromDays(30)),
				To = DateTime.Now
			}
		};
		_connector.Subscribe(candleSubscription);
	}
};

// Ereignis bei empfangenem Tick-Trade
_connector.TickTradeReceived += (subscription, trade) =>
{
	Console.WriteLine($"Trade empfangen: {trade.Security.Code}, {trade.Time}, {trade.Price}, {trade.Volume}");
};

// Ereignis bei geändertem Orderbuch
_connector.OrderBookReceived += (subscription, depth) =>
{
	Console.WriteLine($"Orderbuch empfangen: {depth.SecurityId}, bestes Bid: {depth.BestBid()?.Price}, bestes Ask: {depth.BestAsk()?.Price}");
};

// Ereignis bei empfangener Kerze
_connector.CandleReceived += (subscription, candle) =>
{
	Console.WriteLine($"Kerze empfangen: {candle.SecurityId}, {candle.OpenTime}, O:{candle.OpenPrice}, H:{candle.HighPrice}, L:{candle.LowPrice}, C:{candle.ClosePrice}");
};

// Verbindungsfehlerereignis
_connector.ConnectionError += error =>
{
	Console.WriteLine($"Verbindungsfehler: {error.Message}");
};

// Allgemeines Fehlerereignis
_connector.Error += error =>
{
	Console.WriteLine($"Fehler: {error.Message}");
};

// Fehlerereignis bei Marktdaten-Subscription
_connector.SubscriptionFailed += (subscription, error) =>
{
	Console.WriteLine($"Abonnementfehler {subscription.DataType} für {subscription.SecurityId}: {error}");
};

// Verbindung zum Server herstellen
_connector.Connect();

Hydra-Dienste verwenden

Hydra stellt im Servermodus Zugriff auf verschiedene Datentypen bereit. Betrachten wir Beispiele für das Abrufen historischer Daten:

// Historische Kerzen abrufen
private void RequestHistoricalCandles(Security security, DateTime from, DateTime to)
{
	// Subscription für historische Kerzen erstellen
	var candleSubscription = new Subscription(
		DataType.TimeFrame(TimeSpan.FromMinutes(5)),
		security)
	{
		MarketData =
		{
			From = from,
			To = to
		}
	};

	// Abonnieren, um empfangene Kerzen zu verarbeiten
	_connector.CandleReceived += OnCandleReceived;

	// Subscription starten
	_connector.Subscribe(candleSubscription);
}

private void OnCandleReceived(Subscription subscription, ICandleMessage candle)
{
	// Prüfen, ob die Kerze zu unserer Subscription gehört
	if (subscription.DataType != DataType.TimeFrame(TimeSpan.FromMinutes(5)))
		return;

	Console.WriteLine($"Historische Kerze: {candle.OpenTime}, O: {candle.OpenPrice}, H: {candle.HighPrice}, L: {candle.LowPrice}, C: {candle.ClosePrice}, V: {candle.TotalVolume}");

	// Empfangene Kerzen verarbeiten, zum Beispiel lokal speichern
	// oder für Analyse/Visualisierung verwenden
}

Verbindung zum Hydra-Server trennen

// Verbindung korrekt schliessen
private void DisconnectFromServer()
{
	// Von allen Subscriptions abmelden
	foreach (var subscription in _connector.Subscriptions.ToArray())
	{
		_connector.UnSubscribe(subscription);
	}

	// Verbindung zum Server trennen
	_connector.Disconnect();
}