Negociação de volatilidade
Para cotação de opções, está implementada uma estratégia especial VolatilityQuotingStrategy, que fornece cotação de volume dentro do intervalo de volatilidade especificado.
Cotação por volatilidade
O pacote de instalação do S# inclui o exemplo SampleOptionQuoting, que cota o strike selecionado dentro do intervalo de volatilidade especificado.
Criar uma ligação ao OpenECry e iniciar a exportação:
private void InitConnector() { // assinar o evento de conexão bem-sucedida Connector.Connected += () => { // atualizar rótulos da interface this.GuiAsync(() => ChangeConnectStatus(true)); }; // assinar o evento de desconexão Connector.Disconnected += () => { // atualizar rótulos da interface this.GuiAsync(() => ChangeConnectStatus(false)); }; // assinar o evento de erro de conexão Connector.ConnectionError += error => this.GuiAsync(() => { // atualizar rótulos da interface ChangeConnectStatus(false); MessageBox.Show(this, error.ToString(), LocalizedStrings.ErrorConnection); }); // preencher a lista de ativos subjacentes 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; }; // assinatura de preços tick e atualização do preço do ativo 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; if (assetPos) PosChart.AssetPosition = position; if (newPos) PosChart.Positions.Add(position); 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)); } catch { } } private void ConnectClick(object sender, RoutedEventArgs e) { if (!_isConnected) { ConnectBtn.IsEnabled = false; _model.Clear(); _model.MarketDataProvider = Connector; ClearSmiles(); PosChart.Positions.Clear(); PosChart.AssetPosition = null; PosChart.Refresh(1, 1, default(DateTimeOffset), default(DateTimeOffset)); Portfolio.Portfolios = new PortfolioDataSource(Connector); PosChart.MarketDataProvider = Connector; PosChart.SecurityProvider = Connector; Connector.Connect(); } else Connector.Disconnect(); }Configurar a estratégia VolatilityQuotingStrategy (preenchimento do intervalo de volatilidade, bem como criação da ordem através da qual são especificados o volume necessário e a direção da cotação):
private void StartClick(object sender, RoutedEventArgs e) { var option = SelectedOption; // criar janela DOM var wnd = new QuotesWindow { Title = option.Name }; wnd.Init(option); // criar estratégia de hedge delta var hedge = new DeltaHedgeStrategy { Security = option.GetUnderlyingAsset(Connector), Portfolio = Portfolio.SelectedPortfolio, Connector = Connector, }; // criar cotação de opção para 20 contratos var quoting = new VolatilityQuotingStrategy(Sides.Buy, 20, new Range<decimal>(ImpliedVolatilityMin.Value ?? 0, ImpliedVolatilityMax.Value ?? 100)) { // tamanho de trabalho é 1 contrato Volume = 1, Security = option, Portfolio = Portfolio.SelectedPortfolio, Connector = Connector, }; // vincular cotação e hedge hedge.ChildStrategies.Add(quoting); // iniciar hedge hedge.Start(); wnd.Closed += (s1, e1) => { // forçar fechamento de todas as estratégias quando o DOM for fechado hedge.Stop(); }; // show DOM wnd.Show(); }Iniciar a cotação:
hedge.Start();Para uma apresentação visual da volatilidade, o exemplo mostra como é possível converter o livro de ofertas padrão com cotações para um livro de ofertas de volatilidade através da utilização do método DerivativesHelper.ImpliedVolatility(StockSharp.Messages.IOrderBookMessage depth, StockSharp.BusinessEntities.ISecurityProvider securityProvider, StockSharp.BusinessEntities.IMarketDataProvider dataProvider, StockSharp.BusinessEntities.IExchangeInfoProvider exchangeInfoProvider, System.DateTimeOffset currentTime, System.Decimal riskFree, System.Decimal dividend ):
private void OnQuotesChanged() { DepthCtrl.UpdateDepth(_depth.ImpliedVolatility(Connector, Connector, Connector.CurrentTime)); }
Terminar a cotação e parar a estratégia:
hedge.Stop();