예제 #1
0
        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);
        }
예제 #2
0
        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;
                            }
                        }
                    }
                }
            }
        }
예제 #3
0
        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);
        }
예제 #4
0
        //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);
                }
            }
        }