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); }
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); }
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; }