ポジションチャート
OptionPositionChart グラフィカルコンポーネントは、原資産に関連するポジションとオプションの「Greeks」を表示するチャートです。
以下は、このチャートを使用する SampleOptionQuoting の例です。この例のソースコードは Samples/06_Strategies/09_LiveOptionsQuoting フォルダーにあります。

SampleOptionQuoting の例
XAML コードで、OptionPositionChart 要素を追加し、PosChart という名前を割り当てます。
<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>C# コードで、接続を作成し、必要なイベントを購読します。
... public readonly Connector Connector = new Connector(); ... // 接続成功イベントを購読 Connector.Connected += () => { // GUI ラベルを更新 this.GuiAsync(() => ChangeConnectStatus(true)); }; // 切断イベントを購読 Connector.Disconnected += () => { // GUI ラベルを更新 this.GuiAsync(() => ChangeConnectStatus(false)); }; // 接続エラーイベントを購読 Connector.ConnectionError += error => this.GuiAsync(() => { // GUI ラベルを更新 ChangeConnectStatus(false); MessageBox.Show(this, error.ToString(), LocalizedStrings.ErrorConnection); }); // 原資産のリストを埋める 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; }; // ティック価格を購読し、資産価格を更新する 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)); } ...接続時に、コントロールの初期設定を行います。
- OptionPositionChart.Model コントロールのモデルをリセットします。
- 初期値でチャートを再描画します: OptionPositionChart.Refresh(System.Nullable<System.Decimal> assetPrice, System.Nullable<System.DateTimeOffset> currentTime, System.Nullable<System.DateTimeOffset> expiryDate )。
- マーケットデータと銘柄のメッセージプロバイダーを指定します。
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(); }銘柄を受信したとき、原資産をリストに追加します。
Connector.SecurityReceived += (sub, security) => { if (security.Type == SecurityTypes.Future) _assets.Add(security); };原資産またはオプションの Level1 が変更された場合、および新しい約定を取得した場合に、_isDirty フラグを設定します。これにより、タイマーイベント内で RefreshChart メソッド(下記参照)を呼び出してチャートを再描画できます(コードは省略されています)。このようにして再描画の頻度を制御します。
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; };新しいポジションの発生イベントハンドラーで、チャートを再描画するために
RefreshChartを呼び出します。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(); });このメソッドはチャートを再描画します。
private void RefreshChart() { var asset = SelectedAsset; var trade = asset.LastTrade; if (trade != null) PosChart.Refresh(trade.Price); }