Positionsdiagramm
Die grafische Komponente OptionPositionChart ist ein Diagramm, das die Position und die optionsbezogenen "Greeks" zum Basiswert anzeigt.
Nachfolgend wird das Beispiel SampleOptionQuoting gezeigt, in dem dieses Diagramm verwendet wird. Der Quellcode des Beispiels befindet sich im Ordner Samples/06_Strategies/09_LiveOptionsQuoting.

Beispiel SampleOptionQuoting
Fügen Sie im XAML-Code das Element OptionPositionChart hinzu und weisen Sie ihm den Namen PosChart zu.
<Window x:Class="OptionCalculator.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:loc="clr-namespace:StockSharp.Localization;assembly=StockSharp.Localization" xmlns:xaml="http://schemas.stocksharp.com/xaml" Title="{x:Static loc:LocalizedStrings.XamlStr396}" Height="400" Width="1030"> <Grid Margin="5,5,5,5"> ......................................................... <xaml:OptionPositionChart x:Name="PosChart" Grid.Row="7" Grid.Column="0" Grid.ColumnSpan="6" /> </Grid> </Window>Erstellen Sie im C#-Code eine Verbindung und abonnieren Sie die erforderlichen Ereignisse.
... public readonly Connector Connector = new Connector(); ... // Ereignis für erfolgreiche Verbindung abonnieren Connector.Connected += () => { // GUI-Beschriftungen aktualisieren this.GuiAsync(() => ChangeConnectStatus(true)); }; // Ereignis für Trennung abonnieren Connector.Disconnected += () => { // GUI-Beschriftungen aktualisieren this.GuiAsync(() => ChangeConnectStatus(false)); }; // Ereignis für Verbindungsfehler abonnieren Connector.ConnectionError += error => this.GuiAsync(() => { // GUI-Beschriftungen aktualisieren ChangeConnectStatus(false); MessageBox.Show(this, error.ToString(), LocalizedStrings.ErrorConnection); }); // Liste der Basiswerte füllen Connector.SecurityReceived += (sub, security) => { if (security.Type == SecurityTypes.Future) _assets.Add(security); }; Connector.Level1Received += (sub, security) => { if (_model.UnderlyingAsset == security || _model.UnderlyingAsset.Id == security.UnderlyingSecurityId) _isDirty = true; }; // Tick-Preise abonnieren und Asset-Preis aktualisieren Connector.TickTradeReceived += (sub, trade) => { if (_model.UnderlyingAsset == trade.Security || _model.UnderlyingAsset.Id == trade.Security.UnderlyingSecurityId) _isDirty = true; }; Connector.NewPosition += position => this.GuiAsync(() => { var asset = SelectedAsset; if (asset == null) return; var assetPos = position.Security == asset; var newPos = position.Security.UnderlyingSecurityId == asset.Id; if (!assetPos && !newPos) return; RefreshChart(); }); Connector.PositionChanged += position => this.GuiAsync(() => { if ((PosChart.AssetPosition != null && PosChart.AssetPosition == position) || PosChart.Positions.Cache.Contains(position)) RefreshChart(); }); try { if (File.Exists(_settingsFile)) Connector.Load(new JsonSerializer<SettingsStorage>().Deserialize(_settingsFile)); } ...Legen Sie beim Verbinden die anfänglichen Einstellungen des Steuerelements fest:
- Zurücksetzen des Modells des Steuerelements OptionPositionChart.Model;
- Neuzeichnen des Diagramms mit den Anfangswerten OptionPositionChart.Refresh(System.Nullable<System.Decimal> assetPrice, System.Nullable<System.DateTimeOffset> currentTime, System.Nullable<System.DateTimeOffset> expiryDate );
- Angeben des Nachrichtenproviders für Marktdaten und Instrumente.
private void ConnectClick(object sender, RoutedEventArgs e) { if (!_isConnected) { ConnectBtn.IsEnabled = false; ... PosChart.Model = null; ... PosChart.MarketDataProvider = Connector; PosChart.SecurityProvider = Connector; PosChart.PositionProvider = Connector; Connector.Connect(); } else Connector.Disconnect(); }Beim Empfang von Instrumenten fügen wir die Basiswerte zur Liste hinzu.
Connector.SecurityReceived += (sub, security) => { if (security.Type == SecurityTypes.Future) _assets.Add(security); };Wenn sich Level1 des Basisinstruments oder der Optionen ändert und beim Empfang eines neuen Trades setzen wir das Flag _isDirty. Dadurch kann die Methode RefreshChart (siehe unten) im Timer-Ereignis (Code ausgelassen) aufgerufen werden, um das Diagramm neu zu zeichnen. So steuern wir die Häufigkeit des Neuzeichnens.
Connector.Level1Received += (sub, security) => { if (_model.UnderlyingAsset == security || _model.UnderlyingAsset.Id == security.UnderlyingSecurityId) _isDirty = true; }; Connector.TickTradeReceived += (sub, trade) => { if (_model.UnderlyingAsset == trade.Security || _model.UnderlyingAsset.Id == trade.Security.UnderlyingSecurityId) _isDirty = true; };Im Ereignishandler für das Auftreten einer neuen Position rufen wir
RefreshChartauf, um das Diagramm neu zu zeichnen.Connector.NewPosition += position => this.GuiAsync(() => { var asset = SelectedAsset; if (asset == null) return; var assetPos = position.Security == asset; var newPos = position.Security.UnderlyingSecurityId == asset.Id; if (!assetPos && !newPos) return; RefreshChart(); }); Connector.PositionChanged += position => this.GuiAsync(() => { if ((PosChart.AssetPosition != null && PosChart.AssetPosition == position) || PosChart.Positions.Cache.Contains(position)) RefreshChart(); });Diese Methode zeichnet das Diagramm neu:
private void RefreshChart() { var asset = SelectedAsset; var trade = asset.LastTrade; if (trade != null) PosChart.Refresh(trade.Price); }