OptionData GetATMOptionData(EOptionType opType, DateTime expiryDate) { var offsetStep = 0.005; var maxOffset = 0.495; var minOffset = 0.505; OptionData theATMOption = null; //Get optionATM: while (theATMOption == null) { maxOffset += offsetStep; minOffset -= offsetStep; theATMOption = UNLManager.OptionsManager.OptionDataDic.Values.FirstOrDefault( o => o.Expiry.Equals(expiryDate) && o.OptionContract.OptionType == opType && o.DeltaAbsValue >= minOffset && o.DeltaAbsValue <= maxOffset); //Set for max iteration if (maxOffset > (0.50 + 20 * offsetStep))//Max will be: 0.555 <=> 0.445 { return(null); } } return(theATMOption); }
private OptionData GenerateOptionInPreconditions(EOptionType optionType) { double theta = MINIMAL_THETA + 1; DateTime expiry = DateTime.Now.Add(TimeSpan.FromDays(MIN_EXPIRY_DAYS + 1)); double strike; double underline = 100; if (optionType == EOptionType.Call) { strike = underline * (1 + MINIMAL_DIS_UNL / 100) + 10; } else { strike = underline * (1 - MINIMAL_DIS_UNL / 100) - 10; } var optionContract = new OptionContract("AAPL", expiry, optionType) { Strike = strike }; var option = new OptionData() { UnderlinePrice = underline, Theta = theta, OptionContract = optionContract }; return(option); }
/// <summary> /// Calculate the margin requierd to sell 1 option of the given position data. /// It calculates considering the situation and relations of entire positions of the given UNL. /// </summary> /// <param name="positionData"></param> /// <returns></returns> public double OnePositionSellMargin(OptionsPositionData positionData) { var symbol = positionData.OptionData.Symbol; CalculateUNLRequierdMargin(symbol); var marginData = MarginDataDic[symbol]; //double unlRate = positionData.OptionData.LastPrice; var unlRate = _appManager.ManagedSecuritiesManager.Securities[symbol].LastPrice; double strike = positionData.OptionContract.Strike; EOptionType type = positionData.OptionType; bool mate = false; switch (marginData.PutCallPositionRelation) { case EPutCallPositionRelation.Equel: break; case EPutCallPositionRelation.PutGCall: if (type == EOptionType.Call) { mate = true; } break; case EPutCallPositionRelation.CallGPut: if (type == EOptionType.Put) { mate = true; } break; } var result = CalculateMargin(unlRate, strike, mate, type); return(result); }
public OptionCalculationData(EOptionType optionType, int position, double currentUNLPrice, int multiplier) { OptionType = optionType; ResultDataValues = new ResultData(); Position = position; CurrentUNLPrice = currentUNLPrice; Multiplier = multiplier; }
public OptionContract(string symbol, DateTime expiry, EOptionType type, string exchange = "SMART", int multiplier = 100, string currency = "USD") : base(symbol, SecurityType.Option) { Expiry = expiry; Multiplier = multiplier; OptionType = type; }
/// <summary> /// Get the Implied Volatility on the ATM option. /// </summary> public double GetImVolOnATMOption(EOptionType optionType, DateTime expiryDate) { var option = GetATMOptionData(expiryDate, optionType); if (option != null) { return(option.ImpliedVolatility); } return(0); }
/// <summary> /// Check if there is any option that close enugh to the ATM option. /// </summary> /// <param name="optionType"></param> /// <param name="expiryDate"></param> /// <returns></returns> public bool CheckForATMOption(EOptionType optionType, DateTime expiryDate) { // var exist = OptionDataDic.Values .Any(op => op.Expiry == expiryDate && op.OptionContract.OptionType == optionType && op.DeltaOffsetFromATM < AllConfigurations.AllConfigurationsObject.Trading .MaxDeltaOffsetAllowed); return(exist); }
public BnSCalculationData(string symbol, EOptionType optionType, double stockPrice, double strike, int dayLeftsOriginal, int multiplier = 100) { Symbol = symbol; OptionType = optionType; StockPrice = stockPrice; Strike = strike; DayLeftsOriginal = dayLeftsOriginal; ResultDataValues = new ResultData(); Multiplier = multiplier; }
/// <summary> /// Calculates the number of the mate couples of given UNL (symbol), /// Also return the single options (without mate and the type of the singl). /// </summary> /// <param name="symbol">The UNL symbol</param> /// <param name="singleCount">The number of single options, that have no adequate mate.</param> /// <param name="optionType">The option type of the single.</param> /// <returns></returns> public int GetCoupleMateOptionsCount(string symbol, out int singleCount, out EOptionType optionType) { var posList = GetPositionList(symbol); var callPositionsCount = posList.Where(pd => pd.OptionType == EOptionType.Call).Sum(pd => pd.Quantity); var putPositionsCount = posList.Where(pd => pd.OptionType == EOptionType.Put).Sum(pd => pd.Quantity); var result = Min(callPositionsCount, putPositionsCount); singleCount = Abs(callPositionsCount - putPositionsCount); optionType = callPositionsCount >= putPositionsCount ? EOptionType.Call : EOptionType.Put; return(result); }
public double CalculateMargin(double unlRate, double strike, bool mate, EOptionType type = EOptionType.Call) { double lossPercantag = mate ? WITH_MATE_LOSS_PERCANTAG : NO_MATE_LOSS_PERCANTAG; //lossPercantag = 0.06; //lossPercantag = 0.245; const int multiplier = 100; var requierdMargin = type == EOptionType.Call ? (unlRate * (1 + lossPercantag) - strike) * multiplier : (strike - unlRate * (1 - lossPercantag)) * multiplier; return(requierdMargin); }
public void SetQuestTalkOption(uint questid, int step, bool bNpcSay, string strCap) { m_questid = questid; m_step = step; m_eOpType = EOptionType.EOT_ScenarioTalk; if (bNpcSay) { SetNpcCaption(m_questid, m_step, strCap); } else { SetHeroCaption(strCap); } }
public OptionData GetATMOptionData(DateTime expiry, EOptionType optionType) { const double epsilon = 0.005; //Get all the options nearest the ATM var options = OptionDataDic.Values .Where(od => od.Expiry == expiry && od.OptionContract.OptionType == optionType && od.DeltaOffsetFromATM < 0.05).ToList(); if (options.Count == 0) { return(null); } var minDeltaOffset = options.Min(od => od.DeltaOffsetFromATM); var atmOptionData = options.FirstOrDefault(od => od.DeltaOffsetFromATM < (minDeltaOffset + epsilon)); if (atmOptionData == null) { throw new Exception("ATM Option didn't found. check your calculation!!!"); } return(atmOptionData); }
public void SetAcceptTalkOption(uint questid) { m_questid = questid; m_eOpType = EOptionType.EOT_AcceptQuest; SetQuestCaption(m_questid); }
public BnSCalculationData(string symbol, EOptionType optionType) { Symbol = symbol; OptionType = optionType; ResultDataValues = new ResultData(); }
public string GetOptionKey(DateTime expiry, EOptionType optionType, double strike) { return($"{expiry}.{optionType}.{strike}"); }
private void grpOptionType_EditValueChanged(object sender, EventArgs e) { OptionType = (int)grpOptionType.EditValue == 1 ? EOptionType.Put : EOptionType.Call; }
public static double ImpliedVolatility(double S, double X, double t, double r, double P, EOptionType OptionType, EPutCall PutCall, EOptionPrice Method) { int n = 0; switch (Method) { case EOptionPrice.Binomial: n = 100; break; case EOptionPrice.MonteCarlo: n = 100000; break; } double Eps = 0.001; return(FinMath.ImpliedVolatility(S, X, t, r, P, OptionType, PutCall, Method, n, Eps)); }
public static double ImpliedVolatility(double S, double X, double t, double r, double P, EOptionType OptionType, EPutCall PutCall, EOptionPrice Method, int n, double Eps) { double num1 = 0.0; double num2 = 10.0; double num3 = 0.0; double s = 0.0; while (Math.Abs(num2 - num1) > Eps) { s = num1 + (num2 - num1) / 2.0; switch (Method) { case EOptionPrice.BlackScholes: num3 = FinMath.BS(S, X, t, s, r, PutCall); break; case EOptionPrice.Binomial: num3 = FinMath.BM(S, X, t, s, r, PutCall, n); break; case EOptionPrice.MonteCarlo: num3 = FinMath.MC(S, X, t, s, r, PutCall, n); break; } if (num3 > P) { num2 = s; } else { num1 = s; } } return(s); }
public double CalculateMarginTest(double unlRate, double strike, bool mate, EOptionType type = EOptionType.Call) { var result = MarginManager.CalculateMargin(unlRate, strike, mate, type); return(result); }
public static double ImpliedVolatility(double S, double X, double t, double r, double P, EOptionType OptionType, EPutCall PutCall, EOptionPrice Method, int n, double Eps) { double num1 = 0.0; double num2 = 10.0; double num3 = 0.0; double s = 0.0; while (Math.Abs(num2 - num1) > Eps) { s = num1 + (num2 - num1) / 2.0; switch (Method) { case EOptionPrice.BlackScholes: num3 = FinMath.BS(S, X, t, s, r, PutCall); break; case EOptionPrice.Binomial: num3 = FinMath.BM(S, X, t, s, r, PutCall, n); break; case EOptionPrice.MonteCarlo: num3 = FinMath.MC(S, X, t, s, r, PutCall, n); break; } if (num3 > P) num2 = s; else num1 = s; } return s; }
public static double ImpliedVolatility(double S, double X, double t, double r, double P, EOptionType OptionType, EPutCall PutCall, EOptionPrice Method) { int n = 0; switch (Method) { case EOptionPrice.Binomial: n = 100; break; case EOptionPrice.MonteCarlo: n = 100000; break; } double Eps = 0.001; return FinMath.ImpliedVolatility(S, X, t, r, P, OptionType, PutCall, Method, n, Eps); }
public void SetCompleteTalkOption(uint questid) { m_questid = questid; m_eOpType = EOptionType.EOT_CompleteQuest; SetQuestCaption(m_questid); }