Exemplo n.º 1
0
        public void Update(MarketDetailsResponse marketDetails)
        {
            Bid = Convert.ToDouble(marketDetails.snapshot.bid);
            Ask = Convert.ToDouble(marketDetails.snapshot.offer);

            Prime  = (Bid + Ask) / 2;
            Spread = Ask - Bid;

            InterestRate = EuriborHelper.GetInterestRate(Expiry.Subtract(DateTime.Now));

            CurrentPrice = Convert.ToDouble(marketDetails.snapshot.netChange);
            var isCall = Directions == OptionDirections.Call;
            var time   = Expiry.Subtract(DateTime.Now).TotalDays / 365;

            var correctedPrime = Math.Min(Bid + Spread * (Bid / 20), Prime);

            Volatility = BlackScholesHelper.ImpliedVolatility(isCall, CurrentPrice, Strike, time, 0, correctedPrime);

            InterestRate = Math.Round(InterestRate * 100, 2);
            Volatility   = Math.Round(Volatility * 100, 2);
        }
Exemplo n.º 2
0
        public OptionItem(MarketDetailsResponse marketDetails)
        {
            Epic = marketDetails.instrument.epic;

            Quantity = 1;
            Name     = $"{marketDetails.instrument.name} ({marketDetails.instrument.expiry})";

            var infos = marketDetails.instrument.name.Split(' ');

            var dir    = infos[infos.Length - 1];
            var strike = infos[infos.Length - 2];

            Directions = dir.ToUpper() == "CALL" ? OptionDirections.Call : OptionDirections.Put;
            Strike     = Convert.ToDouble(strike);

            Expiry = Convert.ToDateTime(marketDetails.instrument.expiryDetails.lastDealingDate, CultureInfo.GetCultureInfo("fr-FR"));

            Bid = Convert.ToDouble(marketDetails.snapshot.bid);
            Ask = Convert.ToDouble(marketDetails.snapshot.offer);

            Prime        = (Bid + Ask) / 2;
            CurrentPrime = Prime;
            Spread       = Ask - Bid;

            PrimeString = $"({Ask}/{Bid})";

            InterestRate = EuriborHelper.GetInterestRate(Expiry.Subtract(DateTime.Now));

            CurrentPrice = Convert.ToDouble(marketDetails.snapshot.netChange);
            var isCall = Directions == OptionDirections.Call;
            var time   = Expiry.Subtract(DateTime.Now).TotalDays / 365;

            var correctedPrime = Math.Min(Bid + Spread * (Bid / 20), Prime);

            Volatility = BlackScholesHelper.ImpliedVolatility(isCall, CurrentPrice, Strike, time, 0, correctedPrime);

            InterestRate = Math.Round(InterestRate * 100, 2);
            Volatility   = Math.Round(Volatility * 100, 2);
        }
Exemplo n.º 3
0
        private void Simulate(RenderingContext context)
        {
            var values   = new double[context.SimulationWidth * context.SimulationHeight];
            var minValue = double.MaxValue;
            var maxValue = double.MinValue;

            var deltaTime  = (context.EndDate.Subtract(context.StartDate).TotalDays) / context.SimulationWidth;
            var deltaPrice = (context.MaxPrice - context.MinPrice) / context.SimulationHeight;

            double baseValue = 0;

            //for (int i = 0; i < context.SimulationHeight; i++)
            Parallel.For(0, context.SimulationHeight, i =>
            {
                var price = context.MinPrice + (i * deltaPrice);

                for (int j = 0; j < context.SimulationWidth; j++)
                {
                    var time     = context.StartDate.AddDays(j * deltaTime);
                    double value = 0;

                    foreach (var option in context.Options)
                    {
                        if (option.Action == OptionActions.None)
                        {
                            continue;
                        }

                        var isCall       = option.Directions == OptionDirections.Call;
                        var timeToExpiry = option.Expiry.Subtract(time).TotalDays / 365;

                        if (option.Action == OptionActions.Buy)
                        {
                            var v     = -option.CurrentPrime;
                            var prime = BlackScholesHelper.Prime(isCall, price, option.Strike, option.InterestRate / 100, option.Volatility / 100, timeToExpiry);
                            v        += Math.Max(0, prime);

                            v -= (option.Spread / 2);

                            value += v * option.Quantity;
                        }

                        if (option.Action == OptionActions.Sell)
                        {
                            var v     = option.CurrentPrime;
                            var prime = BlackScholesHelper.Prime(isCall, price, option.Strike, option.InterestRate / 100, option.Volatility / 100, timeToExpiry);
                            v        -= Math.Max(0, prime);

                            v -= (option.Spread / 2);

                            value += v * option.Quantity;
                        }
                    }

                    minValue = Math.Min(minValue, value);
                    maxValue = Math.Max(maxValue, value);

                    values[(context.SimulationHeight - i - 1) * context.SimulationWidth + j] = value;
                }
            });

            context.Values    = values;
            context.KeyValues = new bool[context.SimulationWidth * context.SimulationHeight];
            context.MinValue  = minValue;
            context.MaxValue  = maxValue;
        }