波动率交易
对于期权报价,实施了一种特殊的VolatilityQuotingStrategy策略,该策略在指定的波动率范围内提供成交量报价。
按波动率报价
S# 安装包包括示例 SampleOptionQuoting,该示例在指定的波动率范围内对选定的执行价进行报价。
正在创建到 OpenECry 的连接并开始导出:
private void InitConnector() { // 订阅连接成功事件 Connector.Connected += () => { // 更新界面标签 this.GuiAsync(() => ChangeConnectStatus(true)); }; // 订阅断开连接事件 Connector.Disconnected += () => { // 更新界面标签 this.GuiAsync(() => ChangeConnectStatus(false)); }; // 订阅连接错误事件 Connector.ConnectionError += error => this.GuiAsync(() => { // 更新界面标签 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; }; // 订阅 tick 价格并更新资产价格 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(); }设置VolatilityQuotingStrategy 策略(填写波动率范围,以及创建订单,通过该订单指定所需的数量和报价方向):
private void StartClick(object sender, RoutedEventArgs e) { var option = SelectedOption; // 创建 DOM 窗口 var wnd = new QuotesWindow { Title = option.Name }; wnd.Init(option); // 创建 delta 对冲策略 var hedge = new DeltaHedgeStrategy { Security = option.GetUnderlyingAsset(Connector), Portfolio = Portfolio.SelectedPortfolio, Connector = Connector, }; // 为 20 份合约创建期权报价 var quoting = new VolatilityQuotingStrategy(Sides.Buy, 20, new Range<decimal>(ImpliedVolatilityMin.Value ?? 0, ImpliedVolatilityMax.Value ?? 100)) { // 工作数量为 1 份合约 Volume = 1, Security = option, Portfolio = Portfolio.SelectedPortfolio, Connector = Connector, }; // 关联报价和对冲 hedge.ChildStrategies.Add(quoting); // 启动对冲 hedge.Start(); wnd.Closed += (s1, e1) => { // DOM 关闭时强制关闭所有策略 hedge.Stop(); }; // 显示 DOM wnd.Show(); }开始报价:
hedge.Start();为了直观展示波动性,示例展示了如何通过使用 DerivativesHelper.ImpliedVolatility(StockSharp.Messages.IOrderBookMessage 深度, StockSharp.BusinessEntities.ISecurityProvider 交易品种提供者, StockSharp.BusinessEntities.IMarketDataProvider 数据提供者, StockSharp.BusinessEntities.IExchangeInfoProvider 交易所信息提供者, System.DateTimeOffset 当前时间, System.Decimal 无风险利率, System.Decimal 股息**) **方法将标准报价订单簿转换为波动性订单簿:
private void OnQuotesChanged() { DepthCtrl.UpdateDepth(_depth.ImpliedVolatility(Connector, Connector, Connector.CurrentTime)); }
结束报价并停止策略:
hedge.Stop();