Для изменения размера нажмите или перетащите
Доска опционов

Графический компонент OptionDesk - таблица для отображения доски опционов. Показывает "греки", вмененную волатильность, теоретическую цену, лучший оффер и бид для Put и Call опционов.

Ниже показан пример OptionCalculator, в котором используется этот компонент. Исходные коды примера можно найти в папке Samples/Options/OptionCalculator.

option desk

Пример OptionCalculator

  1. В коде XAML добавляем элемент OptionDesk и присваиваем ему имя Desk.

    XAML
    <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"
            xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
            Title="{x:Static loc:LocalizedStrings.XamlStr396}" Height="400" Width="1030">
        <Grid Margin="5,5,5,5">
    
          .........................................................
    
          <xaml:OptionDesk x:Name="Desk" Grid.Row="6" Grid.ColumnSpan="3" Grid.Column="0" />
    
      </Grid>
    </Window>
  2. В коде C# создаем подключение. В зависимости от выбранного типа коннектора инициализируем экземпляр QuikTrader или PlazaTrader.

    C#
    if (_connector == null)
    {
        if (IsQuik.IsChecked == true)
        {
            // создаем подключение
            var trader = new QuikTrader()
            {
            };
    
            _connector = trader;
        }
        else
        {
            var trader = new PlazaTrader
            {
                Address = Address.Text.To<EndPoint>(),
                IsCGate = IsCGate.IsChecked == true
            };
    
            trader.Tables.Add(trader.TableRegistry.Volatility);
    
            if (IsAutorization.IsChecked == true)
            {
                trader.Login = Login.Text;
                trader.Password = Password.Password;
            }
    
            _connector = trader;
        }
    }
  3. Задаем провайдера сообщений для рыночных данных и инструментов.

    C#
    Desk.MarketDataProvider = _connector;
    Desk.SecurityProvider = _connector;
    Desk.CurrentTime = null;
  4. При получении инструментов:

    1. Заполняем коллекцию фьючерсов для выпадающего списка;
    2. Инициализируем выбранный инструмент первым элементом этой коллекции;
    3. Заполняем массив цепочкой опционов, где подлежащим активом выступает выбранный инструмент;
    4. Присваиваем свойству OptionDeskOptions этот массив;
    5. Обновляем значения доски опционов при помощи метода OptionDeskRefreshOptions.
    C#
    _connector.NewSecurities += securities =>
        this.GuiAsync(() =>
        {
            // добавляем в выпадающий список (подлежащие инструменты) только фьючерсы
            _assets.AddRange(securities.Where(s => s.Type == SecurityTypes.Future));
    
            if (SelectedAsset == null && _assets.Count > 0)
                SelectedAsset = _assets.First();
    
            if (SelectedAsset != null)
            {
                var newStrikes = securities
                    .Where(s => s.Type == SecurityTypes.Option && s.UnderlyingSecurityId.CompareIgnoreCase(SelectedAsset.Id))
                    .ToArray();
    
                if (newStrikes.Length > 0)
                {
                    _options.AddRange(newStrikes);
                    Desk.Options = _options;
                    Desk.RefreshOptions();
                }
            }
        });
  5. При изменении параметров опционов:

    1. Заполняем массив опционами, которые не были добавлены ранее в коллекцию опционов контрола;
    2. Если добавлены новые опционы, то обновляем значение свойства OptionDeskOptions;
    3. Если были добавлены новые опционы или изменились параметры ранее добавленных опционов, то обновляем доску опционов OptionDeskRefreshOptions.
    C#
    _connector.SecuritiesChanged += securities =>
    {
        this.GuiAsync(() =>
        {
            if (SelectedAsset == null)
                return;
    
            var newStrikes = securities
                    .Where(s => s.Type == SecurityTypes.Option && s.UnderlyingSecurityId.CompareIgnoreCase(SelectedAsset.Id))
                    .Where(s => !_options.Contains(s))
                    .ToArray();
    
            if (newStrikes.Length > 0)
            {
                _options.AddRange(newStrikes);
                Desk.Options = _options;
                Desk.RefreshOptions();
            }
    
            if (Desk.Options.Intersect(securities).Any())
                Desk.RefreshOptions();
        });
    };
См. также

Другие ресурсы