public Task <ObservableCollection <RiskVM> > QueryValuationRiskAsync(QueryValuation queryValuation, string portfolio, int timeout = 10000) { var sst = new PBValuationRisk(); var msgId = (uint)BusinessMessageID.MSG_ID_QUERY_VALUATION_RISK; var tcs = new TaskCompletionSource <ObservableCollection <RiskVM> >(new CancellationTokenSource(timeout)); var serialId = NextSerialId; sst.Header = new DataHeader { SerialId = serialId }; sst.Portfolio = portfolio; sst.Interest = queryValuation.Interest.HasValue ? queryValuation.Interest.Value : -1; if (queryValuation.DaysRemain.HasValue) { sst.DaysRemain = queryValuation.DaysRemain.Value; } foreach (var cv in queryValuation.ContractParams) { var valuation = new PBValuationContract() { Contract = cv.Key, Price = cv.Value.Price }; if (cv.Value.Volatitly != 0) { valuation.Volatility = cv.Value.Volatitly; } sst.ContractValue.Add(valuation); } MessageWrapper.RegisterAction <PBRiskList, ExceptionMessage> (msgId, (resp) => { if (resp.Header?.SerialId == serialId) { tcs.TrySetResult(OnQueryRiskSuccessAction(resp)); } }, (bizErr) => { OnErrorAction(bizErr); tcs.SetResult(null); } ); MessageWrapper.SendMessage(msgId, sst); return(tcs.Task); }
private async void RiskIndex(string portfolio) { if (string.IsNullOrEmpty(portfolio)) { return; } var positions = _tradeExHandler.PositionVMCollection.Where(p => p.Portfolio == portfolio); var queryvaluation = new QueryValuation(); var queryvaluationzero = new QueryValuation(); selectedWrapPanel.Children.Clear(); if (expirationLV.ItemsSource != null) { foreach (var item in expirationLV.ItemsSource) { var strategyvm = item as StrategyBaseVM; double price = 0; if (strategyvm.Selected) { if (marketRadioButton.IsChecked.Value) { price = (strategyvm.MktVM.AskPrice + strategyvm.MktVM.BidPrice) / 2; } else if (settlementRadioButton.IsChecked.Value) { price = strategyvm.MktVM.PreSettlePrice; } else if (valuationRadioButton.IsChecked.Value) { price = strategyvm.Valuation; } AddSelectContractMsg(strategyvm.Contract, price); } } } queryvaluation.Interest = interestUP.Value; queryvaluation.DaysRemain = expIUP.Value; queryvaluationzero.Interest = interestUP.Value; queryvaluationzero.DaysRemain = expIUP.Value; if (priceCntIUP.Value != null && priceSizeIUP.Value != null && volCntIUP.Value != null && volSizeIUP.Value != null) { int volCount = 2 * VolCnt + 2; int priceCount = 2 * PriceCnt + 2; if (riskMatrixTable.RowGroups.Count != 0) { for (int x = 1; x < riskMatrixTable.RowGroups[0].Rows.Count; x++) { TableRow currentRow = riskMatrixTable.RowGroups[0].Rows[x]; for (int y = 1; y < riskMatrixTable.Columns.Count; y++) { //currentRow.Cells[y].Blocks.Clear(); if (variateRadioButton.IsChecked.Value) { var risksetzero = await MakeRisk(1 + VolCnt, 1 + PriceCnt); var riskset = await MakeRisk(x, y); string msg = string.Format("Δ:{0:N2}\n Γ:{1:N4}\n V:{2:N2}\n Θ:{3:N2}\n Ρ:{4:N2}\nPnL:{5:N0}", riskset.Delta - risksetzero.Delta, riskset.Gamma - risksetzero.Gamma, riskset.Vega - risksetzero.Vega, riskset.Theta - risksetzero.Theta, riskset.Rho - risksetzero.Rho, riskset.PnL); var firstblock = currentRow.Cells[y].Blocks.FirstBlock as Paragraph; var firstrun = firstblock.Inlines.FirstInline as Run; firstrun.Text = msg; } else { var riskset = await MakeRisk(x, y); string msg = string.Format("Δ:{0:N2}\n Γ:{1:N4}\n V:{2:N2}\n Θ:{3:N2}\n Ρ:{4:N2}\nPnL:{5:N0}", riskset.Delta, riskset.Gamma, riskset.Vega, riskset.Theta, riskset.Rho, riskset.PnL); //currentRow.Cells[y].Blocks.Add(new Paragraph(new Run(msg))); var firstblock = currentRow.Cells[y].Blocks.FirstBlock as Paragraph; var firstrun = firstblock.Inlines.FirstInline as Run; firstrun.Text = msg; } } } } } }
private async Task <RiskSet> MakeRisk(int x, int y) { var queryvaluation = new QueryValuation(); var queryvaluationzero = new QueryValuation(); var portfolio = portfolioCB.SelectedValue?.ToString(); var positions = _tradeExHandler.PositionVMCollection.Where(p => p.Portfolio == portfolio); var riskset = new RiskSet(); queryvaluation.Interest = interestUP.Value; queryvaluation.DaysRemain = expIUP.Value; foreach (var item in expirationLV.ItemsSource) { var strategyvm = item as StrategyBaseVM; double price = 0; if (strategyvm.Selected) { if (marketRadioButton.IsChecked.Value) { price = (strategyvm.MktVM.AskPrice + strategyvm.MktVM.BidPrice) / 2; Price = price; } else if (settlementRadioButton.IsChecked.Value) { price = strategyvm.MktVM.PreSettlePrice; Price = price; } else if (valuationRadioButton.IsChecked.Value) { price = strategyvm.Valuation; Price = price; } var tableValuation = price - priceCntIUP.Value * price * priceSizeIUP.Value / 100 + (y - 1) * price * priceSizeIUP.Value / 100; var tableVol = 0 + volCntIUP.Value * volSizeIUP.Value / 100 - (x - 1) * volSizeIUP.Value / 100; TableValuation = (double)tableValuation; TableVol = (double)tableVol; queryvaluationzero.ContractParams[strategyvm.Contract] = new ValuationParam { Price = price, Volatitly = 0 }; queryvaluation.ContractParams[strategyvm.Contract] = new ValuationParam { Price = (double)tableValuation, Volatitly = (double)tableVol }; } } var riskVMlist = await _otcOptionTradeHandler.QueryValuationRiskAsync(queryvaluation, portfolio); var riskzeroVMlist = await _otcOptionTradeHandler.QueryValuationRiskAsync(queryvaluationzero, portfolio); //riskVMlist.Add(new RiskVM { Contract = "m1709", Delta = 0.3, Gamma = 0.2 }); //if (riskMatrixTable.RowGroups.Count != 0) double zeropnl = 0; foreach (var vm in riskzeroVMlist) { var contractinfo = ClientDbContext.FindContract(vm.Contract); string basecontract = null; string contract = null; if (contractinfo != null) { if (!string.IsNullOrEmpty(contractinfo.UnderlyingContract)) { basecontract = contractinfo.UnderlyingContract; contract = contractinfo.Contract; } else { basecontract = contractinfo.Contract; contract = contractinfo.Contract; } var contractPosition = positions.Where(p => p.Contract == contract).FirstOrDefault(); if (_riskSet.Contains(basecontract)) { //var contractinfo = ClientDbContext.FindContract(vm.Contract); if ((callCheckBox.IsChecked.Value && contractinfo.ContractType == (int)ContractType.CONTRACTTYPE_CALL_OPTION) || (putCheckBox.IsChecked.Value && contractinfo.ContractType == (int)ContractType.CONTRACTTYPE_PUT_OPTION) || (futureCheckBox.IsChecked.Value && contractinfo.ContractType == (int)ContractType.CONTRACTTYPE_FUTURE)) { if (pnlCheckBox.IsChecked.Value) { if (contractPosition != null) { if (contractPosition.Direction == PositionDirectionType.PD_LONG) { zeropnl += vm.Price * contractPosition.Multiplier * contractPosition.Position; } else if (contractPosition.Direction == PositionDirectionType.PD_SHORT) { zeropnl -= vm.Price * contractPosition.Multiplier * contractPosition.Position; } } } } } } } foreach (var vm in riskVMlist) { var contractinfo = ClientDbContext.FindContract(vm.Contract); string basecontract = null; string contract = null; if (contractinfo != null) { if (!string.IsNullOrEmpty(contractinfo.UnderlyingContract)) { basecontract = contractinfo.UnderlyingContract; contract = contractinfo.Contract; } else { basecontract = contractinfo.Contract; contract = contractinfo.Contract; } var contractPosition = positions.Where(p => p.Contract == contract).FirstOrDefault(); if (_riskSet.Contains(basecontract)) { //var contractinfo = ClientDbContext.FindContract(vm.Contract); if ((callCheckBox.IsChecked.Value && contractinfo.ContractType == (int)ContractType.CONTRACTTYPE_CALL_OPTION) || (putCheckBox.IsChecked.Value && contractinfo.ContractType == (int)ContractType.CONTRACTTYPE_PUT_OPTION) || (futureCheckBox.IsChecked.Value && contractinfo.ContractType == (int)ContractType.CONTRACTTYPE_FUTURE)) { if (deltaCheckBox.IsChecked.Value) { riskset.Delta += vm.Delta; } if (gammaCheckBox.IsChecked.Value) { riskset.Gamma += vm.Gamma; } if (vegaCheckBox.IsChecked.Value) { riskset.Vega += vm.Vega100; } if (thetaCheckBox.IsChecked.Value) { riskset.Theta += vm.Theta365; } if (rhoCheckBox.IsChecked.Value) { riskset.Rho += vm.Rho100; } if (pnlCheckBox.IsChecked.Value) { if (contractPosition != null) { if (contractPosition.Direction == PositionDirectionType.PD_LONG) { riskset.PnL += vm.Price * contractPosition.Multiplier * contractPosition.Position; } else if (contractPosition.Direction == PositionDirectionType.PD_SHORT) { riskset.PnL -= vm.Price * contractPosition.Multiplier * contractPosition.Position; } } } //Logger.Debug(vm.Price.ToString()); } } } } riskset.PnL -= zeropnl; return(riskset); }
//private void ReloadDataCallback(object state) public void ReloadDataCallback() { Dispatcher.Invoke(async() => { var portfolio = portfolioCB.SelectedValue?.ToString(); var queryvaluation = new QueryValuation(); selectedWrapPanel.Children.Clear(); foreach (var item in expirationLV.ItemsSource) { var strategyvm = item as StrategyBaseVM; double price = 0; if (strategyvm.Selected) { if (marketRadioButton.IsChecked.Value) { price = (strategyvm.MktVM.AskPrice + strategyvm.MktVM.BidPrice) / 2; } else if (settlementRadioButton.IsChecked.Value) { price = strategyvm.MktVM.PreSettlePrice; } else if (valuationRadioButton.IsChecked.Value) { price = strategyvm.Valuation; } AddSelectContractMsg(strategyvm.Contract, price); queryvaluation.ContractParams[strategyvm.Contract] = new ValuationParam { Price = price, Volatitly = 0 }; } } var riskVMlist = await _otcOptionTradeHandler.QueryValuationRiskAsync(queryvaluation, portfolio); lock (BarItemCollection) { foreach (var baritem in BarItemCollection) { baritem.Value = 0; } foreach (var vm in riskVMlist) { if (_riskSet.Contains(vm.Contract)) { var contractinfo = ClientDbContext.FindContract(vm.Contract); if ((callCheckBox.IsChecked.Value && contractinfo.ContractType == (int)ContractType.CONTRACTTYPE_CALL_OPTION) || (putCheckBox.IsChecked.Value && contractinfo.ContractType == (int)ContractType.CONTRACTTYPE_PUT_OPTION)) { int index; if (_riskDict.TryGetValue(vm.Contract, out index)) { var barItem = BarItemCollection[index]; if (deltaRadioButton.IsChecked.Value) { barItem.Value += vm.Delta; } else if (gammaRadioButton.IsChecked.Value) { barItem.Value += vm.Gamma; } else if (vegaRadioButton.IsChecked.Value) { barItem.Value += vm.Vega100; } else if (thetaRadioButton.IsChecked.Value) { barItem.Value += vm.Theta365; } else if (rhoRadioButton.IsChecked.Value) { barItem.Value += vm.Rho100; } } } } plotModel.InvalidatePlot(true); } } }); }
private async void RiskIndex(string portfolio) { var queryvaluation = new QueryValuation(); selectedWrapPanel.Children.Clear(); if (expirationLV.ItemsSource != null) { foreach (var item in expirationLV.ItemsSource) { var strategyvm = item as StrategyBaseVM; double price = 0; if (strategyvm.Selected) { if (marketRadioButton.IsChecked.Value) { price = (strategyvm.MktVM.AskPrice + strategyvm.MktVM.BidPrice) / 2; } else if (settlementRadioButton.IsChecked.Value) { price = strategyvm.MktVM.PreSettlePrice; } else if (valuationRadioButton.IsChecked.Value) { price = strategyvm.Valuation; } AddSelectContractMsg(strategyvm.Contract, price); queryvaluation.ContractParams[strategyvm.Contract] = new ValuationParam { Price = price, Volatitly = 0 }; } } var riskVMlist = await _otcOptionTradeHandler.QueryValuationRiskAsync(queryvaluation, portfolio); foreach (var vm in riskVMlist) { var contractinfo = ClientDbContext.FindContract(vm.Contract); string basecontract = null; if (contractinfo != null) { if (!string.IsNullOrEmpty(contractinfo.UnderlyingContract)) { basecontract = contractinfo.UnderlyingContract; } else { basecontract = contractinfo.Contract; } //MarketDataVM = await _marketDataHandler.SubMarketDataAsync(vm.Contract); } if (_riskSet.Contains(basecontract)) { //var contractinfo = ClientDbContext.FindContract(vm.Contract); if ((callCheckBox.IsChecked.Value && contractinfo.ContractType == (int)ContractType.CONTRACTTYPE_CALL_OPTION) || (putCheckBox.IsChecked.Value && contractinfo.ContractType == (int)ContractType.CONTRACTTYPE_PUT_OPTION) || (futureCheckBox.IsChecked.Value && contractinfo.ContractType == (int)ContractType.CONTRACTTYPE_FUTURE)) { int index; //var basecontractPosition = positions.Where(p => p.Contract == vm.Contract).FirstOrDefault(); //if (basecontractPosition.Direction == PositionDirectionType.PD_LONG) //{ // basecontractPosition.Profit = (MarketDataVM.LastPrice - basecontractPosition.MeanCost) * basecontractPosition.Position * basecontractPosition.Multiplier; //} //else if (basecontractPosition.Direction == PositionDirectionType.PD_SHORT) //{ // basecontractPosition.Profit = (basecontractPosition.MeanCost - MarketDataVM.LastPrice) * basecontractPosition.Position * basecontractPosition.Multiplier; //} if (_riskDict.TryGetValue(basecontract, out index)) { var barItem = BarItemCollection[index]; if (deltaRadioButton.IsChecked.Value) { barItem.Value += vm.Delta; } else if (gammaRadioButton.IsChecked.Value) { barItem.Value += vm.Gamma; } else if (vegaRadioButton.IsChecked.Value) { barItem.Value += vm.Vega100; } else if (thetaRadioButton.IsChecked.Value) { barItem.Value += vm.Theta365; } else if (rhoRadioButton.IsChecked.Value) { barItem.Value += vm.Rho100; } //else if (pnlRadioButton.IsChecked.Value) // barItem.Value += basecontractPosition.Profit; } } } //if (_riskSet.Contains(futurecontract)) //{ // if(futureCheckBox.IsChecked.Value && contractinfo.ContractType == (int)ContractType.CONTRACTTYPE_FUTURE) // { // int index; // if (_riskDict.TryGetValue(basecontract, out index)) // { // var barItem = BarItemCollection[index]; // if (deltaRadioButton.IsChecked.Value) // barItem.Value += vm.Delta; // else if (gammaRadioButton.IsChecked.Value) // barItem.Value += vm.Gamma; // else if (vegaRadioButton.IsChecked.Value) // barItem.Value += vm.Vega100; // else if (thetaRadioButton.IsChecked.Value) // barItem.Value += vm.Theta365; // } // } //} plotModel.InvalidatePlot(true); } } }