private void OnTradingDeskOptionParamsReceived(TradingDeskOptionVM tdOptionVM) { if (_strategySet != null && tdOptionVM.WingsReturnVM != null && _strategySet.ContainsKey(tdOptionVM)) { _wingsReturnVM.SlopeCurr = tdOptionVM.WingsReturnVM.SlopeCurr; _wingsReturnVM.SlopeCurrOffset = tdOptionVM.WingsReturnVM.SlopeCurrOffset; _wingsReturnVM.VolCurr = tdOptionVM.WingsReturnVM.VolCurr; _wingsReturnVM.VolCurrOffset = tdOptionVM.WingsReturnVM.VolCurrOffset; } }
public IList <CallPutTDOptionVM> MakeCallPutTDOptionData(IList <double> strikeList, IList <ContractKeyVM> callList, IList <ContractKeyVM> putList, IList <MarketDataVM> marketDataList = null) { var retList = new List <CallPutTDOptionVM>(); for (int i = 0; i < callList.Count; i++) { var callOption = new TradingDeskOptionVM { Exchange = callList[i].Exchange, Contract = callList[i].Contract }; var putOption = new TradingDeskOptionVM { Exchange = putList[i].Exchange, Contract = putList[i].Contract }; if (marketDataList != null) { callOption.MarketDataVM = marketDataList.FirstOrDefault(c => c.Contract == callList[i].Contract); putOption.MarketDataVM = marketDataList.FirstOrDefault(c => c.Contract == putList[i].Contract); } callOption.InitProperties(); putOption.InitProperties(); var callStrategyVM = StrategyVMCollection.FirstOrDefault(s => s.EqualContract(callList[i])); if (callStrategyVM != null) { callStrategyVM.Depth = 1; } var putStrategyVM = StrategyVMCollection.FirstOrDefault(s => s.EqualContract(putList[i])); if (putStrategyVM != null) { putStrategyVM.Depth = 1; } retList.Add(new CallPutTDOptionVM() { StrikePrice = strikeList[i], CallOptionVM = callOption, PutOptionVM = putOption, CallStrategyVM = callStrategyVM, PutStrategyVM = putStrategyVM }); } return(retList); }
public static TradingDeskOptionVM UpdatePosition(this IEnumerable <CallPutTDOptionVM> collection, PositionVM newVM) { TradingDeskOptionVM quote = null; var cp = collection.FirstOrDefault((pb) => string.Compare(pb.PutOptionVM.Contract, newVM.Contract, true) == 0); if (cp != null) { quote = cp.PutOptionVM; } else { cp = collection.FirstOrDefault((pb) => string.Compare(pb.CallOptionVM.Contract, newVM.Contract, true) == 0); if (cp != null) { quote = cp.CallOptionVM; } } if (quote != null) { if (newVM.Direction == PositionDirectionType.PD_LONG) { quote.LongPosition = newVM.Position; } else if (newVM.Direction == PositionDirectionType.PD_SHORT) { quote.ShortPosition = newVM.Position; } quote.Position = quote.LongPosition - quote.ShortPosition; } if (cp != null) { cp.TotalPosition = 1; cp.MixFuture = 1; } return(quote); }
private void OnTradingDeskOptionParams(PBTradingDeskOptionParams tradingDeskOption) { TradingDeskOptionVM quote = new TradingDeskOptionVM { Exchange = tradingDeskOption.Exchange, Contract = tradingDeskOption.Contract }; if (FindTradingDeskData(quote) != null) { if (tradingDeskOption.ImpliedVol != null) { quote.ImpliedVolVM = new VolatilityVM { AskVol = tradingDeskOption.ImpliedVol.AskVolatility, BidVol = tradingDeskOption.ImpliedVol.BidVolatility, MidVol = (tradingDeskOption.ImpliedVol.BidVolatility + tradingDeskOption.ImpliedVol.AskVolatility) / 2 }; if (double.IsNaN(quote.ImpliedVolVM.MidVol)) { quote.ImpliedVolVM.MidVol = double.IsNaN(quote.ImpliedVolVM.AskVol) ? quote.ImpliedVolVM.BidVol : quote.ImpliedVolVM.AskVol; } } if (tradingDeskOption.TheoData != null) { quote.TheoDataVM = new OptionPricingVM { AskPrice = tradingDeskOption.TheoData.AskPrice, AskSize = tradingDeskOption.TheoData.AskSize, AskVol = tradingDeskOption.TheoData.AskVolatility, Delta = tradingDeskOption.TheoData.Delta, Gamma = tradingDeskOption.TheoData.Gamma, Theta = tradingDeskOption.TheoData.Theta, Vega = tradingDeskOption.TheoData.Vega, Rho = tradingDeskOption.TheoData.Rho, BidPrice = tradingDeskOption.TheoData.BidPrice, BidSize = tradingDeskOption.TheoData.BidSize, BidVol = tradingDeskOption.TheoData.BidVolatility, MidVol = tradingDeskOption.TheoData.MidVolatility, MidPrice = (tradingDeskOption.TheoData.BidPrice + tradingDeskOption.TheoData.AskPrice) / 2, }; } if (tradingDeskOption.WingsReturn != null) { quote.WingsReturnVM = new WingsReturnVM { ATMFPrice = tradingDeskOption.WingsReturn.FAtm, RefPrice = tradingDeskOption.WingsReturn.FRef, SyncFPrice = tradingDeskOption.WingsReturn.FSyn, X0 = tradingDeskOption.WingsReturn.X0, X1 = tradingDeskOption.WingsReturn.X1, X2 = tradingDeskOption.WingsReturn.X2, X3 = tradingDeskOption.WingsReturn.X3, SlopeCurr = tradingDeskOption.WingsReturn.SlopeCurr, SlopeCurrOffset = tradingDeskOption.WingsReturn.SlopeCurrOffset, VolCurr = tradingDeskOption.WingsReturn.VolCurr, VolCurrOffset = tradingDeskOption.WingsReturn.VolCurrOffset, }; } if (tradingDeskOption.TheoDataTemp != null) { quote.TempTheoDataVM = new OptionPricingVM { AskVol = tradingDeskOption.TheoDataTemp.AskVolatility, BidVol = tradingDeskOption.TheoDataTemp.BidVolatility, MidVol = tradingDeskOption.TheoDataTemp.MidVolatility, }; } if (tradingDeskOption.TheoData.BidPrice >= tradingDeskOption.MarketData?.AskPrice) { quote.TheoDataVM.Biddirection = 2; } else { if (tradingDeskOption.TheoData.BidPrice >= tradingDeskOption.MarketData?.BidPrice) { quote.TheoDataVM.Biddirection = 1; } else if (tradingDeskOption.TheoData.BidPrice < tradingDeskOption.MarketData?.AskPrice) { quote.TheoDataVM.Biddirection = -1; } else if (tradingDeskOption.TheoData.BidPrice < tradingDeskOption.MarketData?.AskPrice) { quote.TheoDataVM.Biddirection = -2; } } if (tradingDeskOption.TheoData.AskPrice <= tradingDeskOption.MarketData?.BidPrice) { quote.TheoDataVM.Askdirection = 2; } else { if (tradingDeskOption.TheoData.AskPrice <= tradingDeskOption.MarketData?.AskPrice) { quote.TheoDataVM.Askdirection = 1; } else if (tradingDeskOption.TheoData.AskPrice > tradingDeskOption.MarketData?.AskPrice) { quote.TheoDataVM.Askdirection = -1; } else if (tradingDeskOption.TheoData.AskPrice > tradingDeskOption.MarketData?.BidPrice) { quote.TheoDataVM.Askdirection = -2; } } OnTradingDeskOptionParamsReceived?.Invoke(quote); } else { UnsubTradingDeskData(new[] { quote }); } }
public static TradingDeskOptionVM Update(this IEnumerable <CallPutTDOptionVM> collection, TradingDeskOptionVM newVM) { TradingDeskOptionVM quote = null; var cp = collection.FirstOrDefault((pb) => string.Compare(pb.PutOptionVM.Contract, newVM.Contract, true) == 0); if (cp != null) { quote = cp.PutOptionVM; } else { cp = collection.FirstOrDefault((pb) => string.Compare(pb.CallOptionVM.Contract, newVM.Contract, true) == 0); if (cp != null) { quote = cp.CallOptionVM; } } if (quote != null) { if (newVM.ImpliedVolVM != null) { quote.ImpliedVolVM.AskVol = newVM.ImpliedVolVM.AskVol; quote.ImpliedVolVM.BidVol = newVM.ImpliedVolVM.BidVol; quote.ImpliedVolVM.MidVol = newVM.ImpliedVolVM.MidVol; } if (newVM.TheoDataVM != null) { quote.TheoDataVM.AskPrice = newVM.TheoDataVM.AskPrice; quote.TheoDataVM.AskSize = newVM.TheoDataVM.AskSize; quote.TheoDataVM.AskVol = newVM.TheoDataVM.AskVol; quote.TheoDataVM.Delta = newVM.TheoDataVM.Delta; quote.TheoDataVM.Gamma = newVM.TheoDataVM.Gamma; quote.TheoDataVM.Theta = newVM.TheoDataVM.Theta; quote.TheoDataVM.Vega = newVM.TheoDataVM.Vega; quote.TheoDataVM.Rho = newVM.TheoDataVM.Rho; quote.TheoDataVM.MidVol = newVM.TheoDataVM.MidVol; quote.TheoDataVM.MidPrice = newVM.TheoDataVM.MidPrice; quote.TheoDataVM.BidPrice = newVM.TheoDataVM.BidPrice; quote.TheoDataVM.BidSize = newVM.TheoDataVM.BidSize; quote.TheoDataVM.BidVol = newVM.TheoDataVM.BidVol; quote.TheoDataVM.Askdirection = newVM.TheoDataVM.Askdirection; quote.TheoDataVM.Biddirection = newVM.TheoDataVM.Biddirection; } //if (quote.TheoDataVM.BidPrice >= quote.MarketDataVM?.AskPrice) // quote.TheoDataVM.Biddirection = 2; //else //{ // if (quote.TheoDataVM.BidPrice >= quote.MarketDataVM?.BidPrice) // quote.TheoDataVM.Biddirection = 1; // else if (quote.TheoDataVM.BidPrice < quote.MarketDataVM?.AskPrice) // quote.TheoDataVM.Biddirection = -1; // else if (quote.TheoDataVM.BidPrice < quote.MarketDataVM?.AskPrice) // quote.TheoDataVM.Biddirection = -2; //} //if (quote.TheoDataVM.AskPrice <= quote.MarketDataVM?.BidPrice) // quote.TheoDataVM.Askdirection = 2; //else //{ // if (quote.TheoDataVM.AskPrice <= quote.MarketDataVM?.AskPrice) // quote.TheoDataVM.Askdirection = 1; // else if (quote.TheoDataVM.AskPrice > quote.MarketDataVM?.AskPrice) // quote.TheoDataVM.Askdirection = -1; // else if (quote.TheoDataVM.AskPrice > quote.MarketDataVM?.BidPrice) // quote.TheoDataVM.Askdirection = -2; //} } return(quote); }
private void OnTradingDeskOptionParamsReceived(TradingDeskOptionVM vm) { CallPutTDOptionVMCollection.Update(vm); }
private void OnTradingDeskOptionParamsReceived(TradingDeskOptionVM tdOptionVM) { int idx; if (tdOptionVM.ImpliedVolVM != null) { idx = _optionPutVMList.FindIndex(c => c.Key.EqualContract(tdOptionVM)); if (idx >= 0) // Update PutOption { double x = _optionPutVMList[idx].Value; VolatilityModelVM.PutAskVolLine[idx] = double.IsNaN(tdOptionVM.ImpliedVolVM.AskVol) ? DataPoint.Undefined : new DataPoint(x, tdOptionVM.ImpliedVolVM.AskVol); VolatilityModelVM.PutBidVolLine[idx] = double.IsNaN(tdOptionVM.ImpliedVolVM.BidVol) ? DataPoint.Undefined : new DataPoint(x, tdOptionVM.ImpliedVolVM.BidVol); VolatilityModelVM.PutMidVolLine[idx] = double.IsNaN(tdOptionVM.ImpliedVolVM.MidVol) ? DataPoint.Undefined : new DataPoint(x, tdOptionVM.ImpliedVolVM.MidVol); } idx = _optionCallVMList.FindIndex(c => c.Key.EqualContract(tdOptionVM)); if (idx >= 0) // Update CallOption { double x = _optionCallVMList[idx].Value; VolatilityModelVM.CallAskVolLine[idx] = double.IsNaN(tdOptionVM.ImpliedVolVM.AskVol) ? DataPoint.Undefined : new DataPoint(x, tdOptionVM.ImpliedVolVM.AskVol); VolatilityModelVM.CallBidVolLine[idx] = double.IsNaN(tdOptionVM.ImpliedVolVM.BidVol) ? DataPoint.Undefined : new DataPoint(x, tdOptionVM.ImpliedVolVM.BidVol); VolatilityModelVM.CallMidVolLine[idx] = double.IsNaN(tdOptionVM.ImpliedVolVM.MidVol) ? DataPoint.Undefined : new DataPoint(x, tdOptionVM.ImpliedVolVM.MidVol); } } idx = _optionTheoCallVMList.FindIndex(c => c.Key.EqualContract(tdOptionVM)); if (idx < 0) { idx = _optionTheoPutVMList.FindIndex(c => c.Key.EqualContract(tdOptionVM)); } if (idx >= 0) { double x = _optionTheoCallVMList[idx].Value; if (tdOptionVM.TheoDataVM != null) { if (!double.IsNaN(tdOptionVM.TheoDataVM.AskVol)) { VolatilityModelVM.TheoAskVolLine[idx] = new DataPoint(x, tdOptionVM.TheoDataVM.AskVol); var scatterPt = VolatilityModelVM.TheoPutAskVolScatter[idx]; VolatilityModelVM.TheoPutAskVolScatter[idx] = new ScatterPoint(x, tdOptionVM.TheoDataVM.AskVol, ScatterSize, scatterPt.Value, scatterPt.Tag); scatterPt = VolatilityModelVM.TheoCallAskVolScatter[idx]; VolatilityModelVM.TheoCallAskVolScatter[idx] = new ScatterPoint(x, tdOptionVM.TheoDataVM.AskVol, ScatterSize, scatterPt.Value, scatterPt.Tag); } else { VolatilityModelVM.TheoAskVolLine[idx] = DataPoint.Undefined; var scatterPt = VolatilityModelVM.TheoPutBidVolScatter[idx]; VolatilityModelVM.TheoPutAskVolScatter[idx] = new ScatterPoint(x, tdOptionVM.TheoDataVM.AskVol, 0, scatterPt.Value, scatterPt.Tag); scatterPt = VolatilityModelVM.TheoCallBidVolScatter[idx]; VolatilityModelVM.TheoCallAskVolScatter[idx] = new ScatterPoint(x, tdOptionVM.TheoDataVM.AskVol, 0, scatterPt.Value, scatterPt.Tag); VolatilityModelVM.TheoMidVolLine[idx] = DataPoint.Undefined; } if (!double.IsNaN(tdOptionVM.TheoDataVM.BidVol)) { VolatilityModelVM.TheoBidVolLine[idx] = new DataPoint(x, tdOptionVM.TheoDataVM.BidVol); var scatterPt = VolatilityModelVM.TheoPutBidVolScatter[idx]; VolatilityModelVM.TheoPutBidVolScatter[idx] = new ScatterPoint(x, tdOptionVM.TheoDataVM.BidVol, ScatterSize, scatterPt.Value, scatterPt.Tag); scatterPt = VolatilityModelVM.TheoCallBidVolScatter[idx]; VolatilityModelVM.TheoCallBidVolScatter[idx] = new ScatterPoint(x, tdOptionVM.TheoDataVM.BidVol, ScatterSize, scatterPt.Value, scatterPt.Tag); VolatilityModelVM.TheoMidVolLine[idx] = new DataPoint(x, tdOptionVM.TheoDataVM.MidVol); } else { VolatilityModelVM.TheoBidVolLine[idx] = DataPoint.Undefined; var scatterPt = VolatilityModelVM.TheoPutBidVolScatter[idx]; VolatilityModelVM.TheoPutBidVolScatter[idx] = new ScatterPoint(x, tdOptionVM.TheoDataVM.BidVol, 0, scatterPt.Value, scatterPt.Tag); scatterPt = VolatilityModelVM.TheoCallBidVolScatter[idx]; VolatilityModelVM.TheoCallBidVolScatter[idx] = new ScatterPoint(x, tdOptionVM.TheoDataVM.BidVol, 0, scatterPt.Value, scatterPt.Tag); VolatilityModelVM.TheoMidVolLine[idx] = DataPoint.Undefined; } } if (tdOptionVM.TempTheoDataVM != null) { VolatilityModelVM.TheoAskVolLine1[idx] = double.IsNaN(tdOptionVM.TempTheoDataVM.AskVol) ? DataPoint.Undefined : new DataPoint(x, tdOptionVM.TempTheoDataVM.AskVol); VolatilityModelVM.TheoBidVolLine1[idx] = double.IsNaN(tdOptionVM.TempTheoDataVM.BidVol) ? DataPoint.Undefined : new DataPoint(x, tdOptionVM.TempTheoDataVM.BidVol); VolatilityModelVM.TheoMidVolLine1[idx] = double.IsNaN(tdOptionVM.TempTheoDataVM.BidVol) ? DataPoint.Undefined : new DataPoint(x, tdOptionVM.TempTheoDataVM.MidVol); } if (tdOptionVM.WingsReturnVM != null) { VolatilityModelVM.ATMLine = tdOptionVM.WingsReturnVM.ATMFPrice; VolatilityModelVM.ReferencePriceLine = tdOptionVM.WingsReturnVM.RefPrice; VolatilityModelVM.SynFLine = tdOptionVM.WingsReturnVM.SyncFPrice; VolatilityModelVM.X0Line = tdOptionVM.WingsReturnVM.X0; VolatilityModelVM.X1Line = tdOptionVM.WingsReturnVM.X1; VolatilityModelVM.X2Line = tdOptionVM.WingsReturnVM.X2; VolatilityModelVM.X3Line = tdOptionVM.WingsReturnVM.X3; } } }