Kerzen

Bildschirmfoto: Kerzentabelle

CandleMessageGrid - eine Kerzentabelle. Sie zeigt Eröffnungs-, Höchst-, Tiefst- und Schlusskurse, die Volumina, das Open Interest und den Zustand jeder Kerze.

Haupteigenschaften

Kerzenzustände

Die Spalte State wird nach dem Wert von CandleStates eingefärbt, und der Screenshot zeigt alle drei:

  • Active - die Kerze bildet sich noch. Sie wird hervorgehoben, weil sich ihre Werte weiter ändern: eine solche Kerze darf nicht wie eine geschlossene gelesen werden.
  • Finished - die Kerze ist geschlossen, ihre Werte sind endgültig. Neutrale Farbe, die meisten Zeilen der Tabelle sind so.
  • None - es kam kein Zustand an. Die Tabelle beschriftet ihn als Fehler und färbt ihn als Warnung: das ist kein leerer Wert, sondern ein Zeichen für unvollständige Daten.

Eine Kerzen-Subskription, die in der ersten Zeile Fehler zeigt, meldet also ein Problem der Datenquelle und keine Kerze ohne Zustand.

Nachfolgend Codefragmente zur Verwendung:

<Window x:Class="Sample.CandlesWindow"
	xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
	xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
	xmlns:xaml="http://schemas.stocksharp.com/xaml"
	Title="Kerzen" Height="400" Width="800">
	<xaml:CandleMessageGrid x:Name="CandleGrid" x:FieldModifier="public" />
</Window>
public class CandlesWindow
{
	private readonly Connector _connector;
	private readonly Security _security;
	private Subscription _candleSubscription;

	public CandlesWindow(Connector connector, Security security)
	{
		InitializeComponent();

		_connector = connector;
		_security = security;

		// Auf das Kerzen-Ereignis abonnieren
		_connector.CandleReceived += OnCandleReceived;

		// Subskription auf Fünf-Minuten-Kerzen anlegen
		_candleSubscription = new Subscription(TimeSpan.FromMinutes(5).TimeFrame(), security);

		// Subskription starten
		_connector.Subscribe(_candleSubscription);
	}

	// Handler für empfangene Kerzen
	private void OnCandleReceived(Subscription subscription, ICandleMessage candle)
	{
		// Prüfen, ob die Kerze zu unserer Subskription gehört
		if (subscription != _candleSubscription)
			return;

		// Kerze im UI-Thread in die Tabelle einfügen
		this.GuiAsync(() => CandleGrid.Messages.Add((CandleMessage)candle));
	}

	// Beim Schließen des Fensters abmelden
	public void Unsubscribe()
	{
		if (_candleSubscription != null)
		{
			_connector.CandleReceived -= OnCandleReceived;
			_connector.UnSubscribe(_candleSubscription);
			_candleSubscription = null;
		}
	}
}

Nur abgeschlossene Kerzen

Bis eine Kerze schließt, trifft sie mehrfach ein, und die Tabelle wächst bei jeder Aktualisierung. Wenn nur die endgültigen Werte zählen, nach Zustand filtern:

private void OnCandleReceived(Subscription subscription, ICandleMessage candle)
{
	if (subscription != _candleSubscription)
		return;

	// Alles überspringen, was sich noch bildet
	if (candle.State != CandleStates.Finished)
		return;

	this.GuiAsync(() => CandleGrid.Messages.Add((CandleMessage)candle));
}

Die aktuelle Kerze an Ort und Stelle aktualisieren

Damit die aktuelle Kerze in der Tabelle steht und aktualisiert statt erneut hinzugefügt wird, die letzte Zeile ersetzen, bis die Kerze schließt:

private void OnCandleReceived(Subscription subscription, ICandleMessage candle)
{
	if (subscription != _candleSubscription)
		return;

	var message = (CandleMessage)candle;

	this.GuiAsync(() =>
	{
		var last = CandleGrid.Messages.LastOrDefault();

		// Dieselbe Kerze wie die letzte Zeile - ersetzen
		if (last != null && last.OpenTime == message.OpenTime)
			CandleGrid.Messages[CandleGrid.Messages.Count - 1] = message;
		else
			CandleGrid.Messages.Add(message);
	});
}

Historische Kerzen laden

// Historische Kerzen laden
public void LoadHistoricalCandles(Security security, TimeSpan timeFrame, DateTime from, DateTime to)
{
	// Aktuelle Kerzen löschen
	CandleGrid.Messages.Clear();

	// Subskription auf historische Kerzen anlegen
	var historySubscription = new Subscription(timeFrame.TimeFrame(), security)
	{
		MarketData =
		{
			// Zeitraum der historischen Daten angeben
			From = from,
			To = to
		}
	};

	_connector.CandleReceived += OnCandleReceived;
	_connector.Subscribe(historySubscription);
}

Siehe auch

Tick-Trades