public override ResetStrikeOption GenerateInstrument() { var startDate = TradeInfo.StartDate.ToDate(); var calendar = TradeInfo.Calendar.ToCalendarImpl(); var strikefixingDate = TradeInfo.StrikeFixingDate.ToDate(); TradeUtil.GenerateOptionDates(TradeInfo, out Date[] exerciseDates, out Date[] obsDates, out DayGap settlementGap);
public PayInfoParam GetPayInfoParamBeforeDeliveryInfoInsert(OrderItem orderItem, UserItem userItem, bool fromOrderConfirm) { DeliveryInfoItem deliveryInfoItem = DeliveryInfoDao.FindById(orderItem.DeliveryInfoId); PayInfoParam param = new PayInfoParam(); param.OrderItem = orderItem; param.DeliveryInfoItem = deliveryInfoItem; param.UserItem = userItem; OrderService.SetPriceInPayInfoParam(orderItem.Id, param); param.PayInfoItem = GetPayInfoItem(param.OrderItem.PayInfoId); if (param.OrderItem.PayInfoId == 0) { if (orderItem.HighPrintId > 0) { param.PayInfoItem.PayType = "BANK"; // 우선 출력 상품의 경우 대인불가 param.PayInfoItem.ShippingCharge = 0; param.PayInfoItem.ManPaidCharge = 0; } else { param.PayInfoItem.PayType = "MAN"; param.PayInfoItem.ShippingCharge = TradeUtil.GetShippingCharge(param.GoodsPrice, deliveryInfoItem); param.PayInfoItem.ManPaidCharge = TradeUtil.ManPaidCharge(param.PayInfoItem.ProductCharge + param.PayInfoItem.ShippingCharge - param.PayInfoItem.PointPaid); } param.PayInfoItem.ProductCharge = param.TaxAddedPrice; param.PayInfoItem.CashPrice = param.PayInfoItem.ComputedCashPrice(); } param.BankInfoSelectList = GetBankInfoSelectList(param.PayInfoItem.BankType); param.FromOrderConfirm = fromOrderConfirm; return(param); }
//private int InsertPayInfo(OrderItem orderItem, int payInfoId, PayInfoItem payInfoItem) //{ // payInfoId = PayInfoDao.Insert(payInfoItem); // orderItem.PayInfoId = payInfoId; // OrderDao.UpdatePayInfo(orderItem); // if (payInfoItem.PointPaid > 0) // { // SubtractPoint(orderItem, payInfoItem); // } // return payInfoId; //} //private void SubtractPoint(OrderItem orderItem, PayInfoItem payInfoItem) //{ // string title = "[" + orderItem.Code + "]ポイント支払い"; // PointService.SubtractPoint(title, payInfoItem.PointPaid, orderItem.UserId); //} internal PayInfoItem GetPayInfoItem(OrderItem orderItem, int pointPaid, string payType, string bankType, string bankUserName, int shippingCharge) { PayInfoItem item = new PayInfoItem(); item.ProductCharge = OrderService.GetTaxAddedPrice(orderItem.Id); item.ShippingCharge = shippingCharge; item.PayType = payType; if (item.PayType.Equals("MAN")) { item.ManPaidCharge = TradeUtil.ManPaidCharge(item.ProductCharge + item.ShippingCharge - pointPaid); } item.PointPaid = pointPaid; item.TelegramCommision = TradeUtil.GetTelegramCommision(item.PayType, item.TotalChargeBanTelegramCommision); item.CashPrice = item.TotalCharge - pointPaid; if (item.PayType.Equals("BANK")) { item.BankType = bankType; string modifiedBankUserName; if (item.BankType.Equals("1")) { modifiedBankUserName = TradeUtil.HalfToFull(bankUserName); } else { modifiedBankUserName = TradeUtil.FullToHalf(bankUserName); } item.BankUserName = modifiedBankUserName; } item.UserId = orderItem.UserId; return(item); }
//[Transaction()] //public void SetPayInfo(OrderItem orderItem, int pointPaid, string payType, string bankType, string bankUserName, int shippingCharge) //{ // int payInfoId = orderItem.PayInfoId; // PayInfoItem payInfoItem = GetPayInfoItem(orderItem, pointPaid, payType, bankType, bankUserName, shippingCharge); // if (payInfoId == 0) // { // payInfoId = InsertPayInfo(orderItem, payInfoId, payInfoItem); // } // else // { // UpdatePayInfo(orderItem, payInfoId, payInfoItem); // } //} //[Transaction()] //public void SetPayInfo(OrderItem orderItem, int pointPaid, string payType, string bankType, string bankUserName, DeliveryInfoItem deliveryInfoItem) //{ // int payInfoId = orderItem.PayInfoId; // int shippingCharge = GetShippingCharge(orderItem, deliveryInfoItem); // PayInfoItem payInfoItem = GetPayInfoItem(orderItem, pointPaid, payType, bankType, bankUserName, shippingCharge); // if (payInfoId == 0) // { // payInfoId = InsertPayInfo(orderItem, payInfoId, payInfoItem); // } // else // { // UpdatePayInfo(orderItem, payInfoId, payInfoItem); // } //} //[Transaction()] //public void SetPayInfoTelegram(OrderItem orderItem, int pointPaid, string payType, string bankType, string bankUserName, DeliveryInfoItem deliveryInfoItem, IDictionary<string, string> dic) //{ // int payInfoId = orderItem.PayInfoId; // int shippingCharge = GetShippingCharge(orderItem, deliveryInfoItem); // PayInfoItem payInfoItem = GetPayInfoItem(orderItem, pointPaid, payType, bankType, bankUserName, shippingCharge); // payInfoId = InsertPayInfo(orderItem, payInfoId, payInfoItem); // if (payType.StartsWith("TELEGRAM")) // { // TelegramProcess(payInfoItem, orderItem, dic); // } //} //[Transaction()] //public void SetPayInfoTelegram_UPDATE(OrderItem orderItem, int pointPaid, string payType, string bankType, string bankUserName, DeliveryInfoItem deliveryInfoItem, IDictionary<string, string> dic) //{ // int payInfoId = orderItem.PayInfoId; // string oldPayType = orderItem.PayType; // int shippingCharge = GetShippingCharge(orderItem, deliveryInfoItem); // PayInfoItem payInfoItem = GetPayInfoItem(orderItem, pointPaid, payType, bankType, bankUserName, shippingCharge); // UpdatePayInfo(orderItem, payInfoId, payInfoItem); // if (payType.StartsWith("TELEGRAM") && !oldPayType.Equals(payType)) // { // TelegramProcess(payInfoItem, orderItem, dic); // OrderDao.UpdatePayStatus(orderItem.Id, "UNPAID"); // } // else if (payType.Equals("POINT") || payType.Equals("MAN")) // { // OrderDao.UpdatePayStatus(orderItem.Id, "PAID"); // } // else // { // OrderDao.UpdatePayStatus(orderItem.Id, "UNPAID"); // } //} //private void TelegramProcess(PayInfoItem payInfoItem, OrderItem orderItem, IDictionary<string, string> dic) //{ // // 요청 // Paygent_TELEGRAM_KIND telegramType = (Paygent_TELEGRAM_KIND)Enum.Parse(typeof(Paygent_TELEGRAM_KIND), payInfoItem.PayType); // var Result = this.PaygentService.ProcPaygentTelegramPaymentRequest(orderItem.Id, payInfoItem.CashPrice, telegramType, this.TelegramProcess_GetParamDic(orderItem, telegramType, dic)); // // 응답 처리 // if (Result.Result != PaygentResultStatus.SUCCESS) // { // switch (Result.Result) // { // case PaygentResultStatus.ERROR_PARAM: // string propertyName = PaygentUtil.GetPropertyNameFromRESPONSE_HEADER_DETAIL(Result.Response.RESPONSE_HEADER_DETAIL); // string propertyNameJP = PaygentUtil.GetPaygentRequestTelegramDescription(propertyName, telegramType); // throw BizException.CreateMakumakuServiceException(propertyName, propertyNameJP + "を確認してください。(" + Result.Response.RESPONSE_HEADER_CODE + ")"); // case PaygentResultStatus.ERROR_CARD: // throw BizException.CreateMakumakuServiceException(PaygentResultStatus.ERROR_PARAM.ToString(), Result.Response.RESPONSE_HEADER_DETAIL + " (" + Result.Response.RESPONSE_HEADER_CODE + ")"); // default: // if (Result.ManagedException != null) // { // throw BizException.CreateMakumakuServiceException(PaygentResultStatus.ERROR_PARAM.ToString(), "PG社から決済システムの応答がありません。\nしばらくお待ちになってから、もう一度行なってください。" + " (" + Result.Response.RESPONSE_HEADER_CODE + ")", Result.ManagedException); // } // else // { // throw BizException.CreateMakumakuServiceException(PaygentResultStatus.ERROR_PARAM.ToString(), "PG社から決済システムの応答がありません。\nしばらくお待ちになってから、もう一度行なってください。" + " (" + Result.Response.RESPONSE_HEADER_CODE + ")"); // } // } // } //} //private IDictionary TelegramProcess_GetParamDic(OrderItem orderItem, Paygent_TELEGRAM_KIND telegramType, IDictionary<string, string> dic) //{ // DateTime executeTime = DateTime.Now; // PaygentTelegramRequest req = null; // string payment_detail = orderItem.Code; // string payment_detail_kana = orderItem.Code; // string payment_limit_date = executeTime.AddDays(20).ToString("yyyyMMdd"); // string customer_name = dic["customer_name"]; // string customer_family_name = dic["customer_family_name"]; // if (telegramType == Paygent_TELEGRAM_KIND.TELEGRAM_ATM_REQUEST) // { // req = new PaygentTelegramRequest_ATM() // { // customer_name = orderItem.UserName, // customer_name_kana = orderItem.UserId, // payment_detail = payment_detail, // payment_detail_kana = payment_detail_kana, // payment_limit_date = payment_limit_date // }; // } // else if (telegramType == Paygent_TELEGRAM_KIND.TELEGRAM_CARD_REQUEST) // { // req = new PaygentTelegramRequest_DEFAULT() // { // //card_conf_number = JangBoGo.Security.Cryptography.RSADecrypt(dic["card_conf_number"]), // //card_number = JangBoGo.Security.Cryptography.RSADecrypt(dic["card_number"]).FullToHalf().Replace("-", ""), // //card_valid_term = JangBoGo.Security.Cryptography.RSADecrypt(dic["card_valid_term"]), // //payment_detail = payment_detail, // //payment_detail_kana = payment_detail_kana, // //payment_class = (Paygent_CARD_PAYMENT_CLASS)Enum.Parse(typeof(Paygent_CARD_PAYMENT_CLASS), dic["payment_class"]), // //split_count = dic["split_count"] // }; // } //else if (telegramType == Paygent_TELEGRAM_KIND.TELEGRAM_KONBINI_N_REQUEST) //{ // var cvsCompanyId = (Paygent_KONBINI_PAYMENT_CVS_COMPANY_ID)Enum.Parse(typeof(Paygent_KONBINI_PAYMENT_CVS_COMPANY_ID), dic["cvs_company_id"]); // string cvsType = string.Empty; // switch (cvsCompanyId) // { // case Paygent_KONBINI_PAYMENT_CVS_COMPANY_ID.SEICO: // cvsType = "01"; // break; // case Paygent_KONBINI_PAYMENT_CVS_COMPANY_ID.LAWSON: // case Paygent_KONBINI_PAYMENT_CVS_COMPANY_ID.MINISTOP: // case Paygent_KONBINI_PAYMENT_CVS_COMPANY_ID.CIRCLEK: // case Paygent_KONBINI_PAYMENT_CVS_COMPANY_ID.DAILY_YAMAZAKI: // case Paygent_KONBINI_PAYMENT_CVS_COMPANY_ID.SUNKUS: // cvsType = "02"; // break; // case Paygent_KONBINI_PAYMENT_CVS_COMPANY_ID.SEJ: // cvsType = "03"; // break; // case Paygent_KONBINI_PAYMENT_CVS_COMPANY_ID.FAMILY: // cvsType = "04"; // break; // } // var item = new PaygentTelegramRequest_KONBINI_N() // { // cvs_type = cvsType, // customer_name = customer_name, // customer_family_name = customer_family_name, // customer_tel = dic["customer_tel"], // site_info = "Makumaku", // payment_limit_date = payment_limit_date, // cvs_company_id = cvsCompanyId, // sales_type = dic["sales_type"], // ticket_start_date = executeTime.ToString("yyyyMMdd"), // ticket_end_date = payment_limit_date, // service_type = Paygent_KONBINI_PAYMENT_SERVICE_TYPE.NONE, // ticket_num = 1 // }; // item.customer_notice[0] = string.Empty; // item.tNNmaster[0] = string.Empty; // item.tNNtemplate[0] = string.Empty; // item.tNN_fieldNN[0, 0] = orderItem.Code; // item.tNN_fieldNN_align[0, 0] = "1"; // req = item; //} //else if (telegramType == Paygent_TELEGRAM_KIND.TELEGRAM_BANK_ASP_PAYMENT_REQUEST) //{ // req = new PaygentTelegramRequest_BANK_ASP() // { // claim_kanji = payment_detail, // claim_kana = payment_detail_kana, // customer_name = orderItem.UserName, // customer_name_kana = orderItem.UserId, // copy_right = "Makumaku", // banner_url = "", // free_memo = "Makumaku" // }; //} //var rtn = req.ToRequestDictionary(); //foreach (var kv in dic) //{ // if (!rtn.Contains(kv.Key)) // { // rtn[kv.Key] = kv.Value; // } //} // return rtn; //} private int GetShippingCharge(OrderItem orderItem, DeliveryInfoItem deliveryInfoItem) { if (orderItem.HighPrintId > 0) { return(0); } return(TradeUtil.GetShippingCharge(OrderService.GetTaxAddedPrice(orderItem.Id), deliveryInfoItem)); }
public async Task Trades(CommandContext ctx, [Description("The player name or item name in question.")] string itemNameOrUserName = "") { try { var plugin = DiscordLink.Obj; if (plugin == null) { return; } if (string.IsNullOrEmpty(itemNameOrUserName)) { await RespondToCommand(ctx, "Please provide the name of an item or player to search for. " + "Usage: trades <item name or player name>"); return; } var embed = new DiscordEmbedBuilder() .WithColor(MessageBuilder.EmbedColor) .WithTitle("Trade Listings"); var match = TradeUtil.MatchItemOrUser(itemNameOrUserName); if (match.Is <Item>()) { var matchItem = match.Get <Item>(); embed.WithAuthor(matchItem.DisplayName); previousQueryEnumerator[ctx.User.UniqueUsername()] = TradeOffersBuySell(embed, (store, offer) => offer.Stack.Item == matchItem, t => t.Item1.Parent.Owners.Name); } else if (match.Is <User>()) { var matchUser = match.Get <User>(); embed.WithAuthor(matchUser.Name); previousQueryEnumerator[ctx.User.UniqueUsername()] = TradeOffersBuySell(embed, (store, offer) => store.Parent.Owners == matchUser, t => t.Item2.Stack.Item.DisplayName); } else { await RespondToCommand(ctx, "The player or item was not found."); return; } var pagedEnumerator = previousQueryEnumerator[ctx.User.UniqueUsername()]; if (pagedEnumerator.HasMorePages) { embed.WithFooter("More pages available. Use " + DiscordLink.EchoCommandToken + "nextpage to show."); } await RespondToCommand(ctx, null, embed); } catch (Exception e) { LogCommandException(e); } }
public static string Trades(string userOrItemName, out string matchedName, out bool isItem, out StoreOfferList groupedBuyOffers, out StoreOfferList groupedSellOffers) { var plugin = DiscordLink.Obj; matchedName = string.Empty; groupedBuyOffers = null; groupedSellOffers = null; isItem = false; if (string.IsNullOrEmpty(userOrItemName)) { return("Please provide the name of an item or player to search for."); } List <string> entries = new List <string>(); var match = TradeUtil.MatchItemOrUser(userOrItemName); if (match.Is <Item>()) { var matchItem = match.Get <Item>(); matchedName = matchItem.DisplayName; Func <StoreComponent, TradeOffer, bool> filter = (store, offer) => offer.Stack.Item == matchItem; var sellOffers = TradeUtil.SellOffers(filter); groupedSellOffers = sellOffers.GroupBy(t => TradeUtil.StoreCurrencyName(t.Item1)).OrderBy(g => g.Key); var buyOffers = TradeUtil.BuyOffers(filter); groupedBuyOffers = buyOffers.GroupBy(t => TradeUtil.StoreCurrencyName(t.Item1)).OrderBy(g => g.Key); isItem = true; } else if (match.Is <User>()) { var matchUser = match.Get <User>(); matchedName = matchUser.Name; Func <StoreComponent, TradeOffer, bool> filter = (store, offer) => store.Parent.Owners == matchUser; var sellOffers = TradeUtil.SellOffers(filter); groupedSellOffers = sellOffers.GroupBy(t => TradeUtil.StoreCurrencyName(t.Item1)).OrderBy(g => g.Key); var buyOffers = TradeUtil.BuyOffers(filter); groupedBuyOffers = buyOffers.GroupBy(t => TradeUtil.StoreCurrencyName(t.Item1)).OrderBy(g => g.Key); } else { return($"No player or item with the name \"{userOrItemName}\" could be found."); } return(string.Empty); }
private PagedEnumerator <Tuple <string, string> > TradeOffersBuySell(DiscordEmbedBuilder embed, Func <StoreComponent, TradeOffer, bool> filter, Func <Tuple <StoreComponent, TradeOffer>, string> context) { var sellOffers = TradeUtil.SellOffers(filter); var groupedSellOffers = sellOffers.GroupBy(t => TradeUtil.StoreCurrencyName(t.Item1)).OrderBy(g => g.Key); var buyOffers = TradeUtil.BuyOffers(filter); var groupedBuyOffers = buyOffers.GroupBy(t => TradeUtil.StoreCurrencyName(t.Item1)).OrderBy(g => g.Key); var fieldEnumerator = OffersToFields(groupedBuyOffers, groupedSellOffers, context).GetEnumerator(); var pagedFieldEnumerator = new PagedEnumerator <Tuple <string, string> >(fieldEnumerator, DiscordUtil.EMBED_CONTENT_CHARACTER_LIMIT, field => field.Item1.Length + field.Item2.Length); pagedFieldEnumerator.ForEachInPage(field => { embed.AddField(field.Item1, field.Item2, true); }); return(pagedFieldEnumerator); }
public async Task ExportLiveTradesData() { if (Config.Data.SaveHistoricalTradesData) { Logger.Debug("Exporting trades data"); var tradesString = TradeUtil.GetTradesString(); if (tradesString == null || tradesString.Length == 0) { return; } try { Logger.Debug("Saving trades to file"); await DataExporter.AddToFile("trades", "/", tradesString); } catch (Exception e) { Logger.Error($"Got an exception trying to export trades data: \n {e}"); } Logger.Debug("Finished exporting trades data"); } }
private async Task ExportLiveStoreData(bool byCommand = false) { if (Config.Data.SaveStoreData) { // Overrides current store data in file Logger.Debug("Exporting store data"); var storesString = TradeUtil.GetStoresString(); if (storesString == null || storesString.Length == 0) { return; } await DataExporter.WriteToFile("stores", "/", storesString[0]); Logger.Debug($"Store data exported at {DateTime.Now.ToShortTimeString()}"); if (!byCommand && Config.Data.SaveHistoricalStoreData) { Logger.Debug("Saving stores data to history file"); await DataExporter.AddToFile("storesHistoric", "/", storesString[1]); } Logger.Debug("Finished UpdateStoreData"); } }
public static Dictionary <string, PnLResultBase> DoPnLExplain(string[] tradeIds, PrebuiltQdpMarket t0Mkt, PrebuiltQdpMarket t1Mkt, PrebuiltQdpMarket t0MktDateRolledFwd, PrebuiltQdpMarket t0MktRolldownForBond, PrebuiltQdpMarket t0MktPriceNow = null, PrebuiltQdpMarket t0MktPriceVolNow = null, PrebuiltQdpMarket t0MktVolNow = null) { //TODO: add the following for more exotic product where rate/price interplay is more pronounced //resultRateNow, resultPriceRateNow, resultVolRateNow, resultPriceVolRateNow var useRevalPnLFramework = (t0MktPriceNow != null && t0MktVolNow != null && t0MktPriceVolNow != null); //use reval for pnl attribution //PnL = PriceImpact + VolImpact + PriceVolCrossImpact + Unexplained var ret = new Dictionary <string, PnLResultBase>(); var tMarketName = t0Mkt.MarketName; var t1MarketName = t1Mkt.MarketName; var t0Vals = new Dictionary <string, IPricingResult>(); var t0ValsRolledForward = new Dictionary <string, IPricingResult>(); var t1Vals = new Dictionary <string, IPricingResult>(); var t0ValsPriceNow = new Dictionary <string, IPricingResult>(); var t0RolldownPriceForBond = new Dictionary <string, IPricingResult>(); var t0ValsVolNow = new Dictionary <string, IPricingResult>(); var t0ValsPriceVolNow = new Dictionary <string, IPricingResult>(); //use minimium price request to make it faster #region requests var pricingRequest = PricingRequest.Pv | PricingRequest.Cashflow | PricingRequest.DirtyPrice | PricingRequest.KeyRateDv01 | PricingRequest.DollarDuration | PricingRequest.DollarConvexity | PricingRequest.Delta | PricingRequest.Gamma | PricingRequest.Vega | PricingRequest.Theta | PricingRequest.Rho | PricingRequest.DVegaDvol | //one high order risk PricingRequest.ZeroSpread | PricingRequest.ZeroSpreadDelta | PricingRequest.AiEod | PricingRequest.Basis | PricingRequest.CheapestToDeliver | PricingRequest.Ytm | PricingRequest.UnderlyingPv | PricingRequest.Carry; #endregion requests foreach (var tradeId in tradeIds) { t0Vals[tradeId] = xl_ValueTrade(tradeId, t0Mkt, pricingRequest); var t1Request = PricingRequest.Pv | PricingRequest.DirtyPrice | PricingRequest.ZeroSpread | PricingRequest.AiEod | PricingRequest.Ytm | PricingRequest.Basis | PricingRequest.Cashflow; t1Vals[tradeId] = xl_ValueTrade(tradeId, t1Mkt, t1Request); t0ValsRolledForward[tradeId] = xl_ValueTrade(tradeId, t0MktDateRolledFwd, PricingRequest.Pv | PricingRequest.DirtyPrice | PricingRequest.UnderlyingPv); //reval framework for better pnl attribution if (useRevalPnLFramework) { t0ValsPriceNow[tradeId] = xl_ValueTrade(tradeId, t0MktPriceNow, PricingRequest.Pv); t0ValsVolNow[tradeId] = xl_ValueTrade(tradeId, t0MktVolNow, PricingRequest.Pv); t0ValsPriceVolNow[tradeId] = xl_ValueTrade(tradeId, t0MktPriceVolNow, PricingRequest.Pv); t0RolldownPriceForBond[tradeId] = xl_ValueTrade(tradeId, t0MktRolldownForBond, PricingRequest.Pv | PricingRequest.ZeroSpread); } } //For old interface: //var tCurves = GetXlMarket(tMarketName).MarketInfo.YieldCurveDefinitions.Select(x => x.Name) // .Select(x => t0Mkt.GetData<CurveData>(x).YieldCurve).ToDictionary(x => x.Name, x => x); //var t1Curves = GetXlMarket(t1MarketName).MarketInfo.YieldCurveDefinitions.Select(x => x.Name) // .Select(x => t1Mkt.GetData<CurveData>(x).YieldCurve).ToDictionary(x => x.Name, x => x); var tCurves = t0Mkt.YieldCurves; var t1Curves = t1Mkt.YieldCurves; var curveMoveScaling = 1e4; foreach (var tradeId in tradeIds) { var t1cf = (t1Vals[tradeId].Cashflows != null) ? t1Vals[tradeId].Cashflows.Where(x => x.PaymentDate <= t1Mkt.ReferenceDate && x.PaymentDate > t0Mkt.ReferenceDate).Sum(x => x.PaymentAmount) : 0.0; var tradeInfo = GetTrade(tradeId); if (tradeInfo is InterestRateSwapInfo || tradeInfo is BondInfoBase || tradeInfo is BondFuturesInfo) { //PnL using bond discounted cash flows //curve risk is between T0_{prime} and T1 var _tPv = t0Vals[tradeId].Pv; var _t1Pv = t1Vals[tradeId].Pv; var _tPvRecalib = t0ValsRolledForward[tradeId].Pv; var curvePnL = new Dictionary <string, CurveRisk[]>(); foreach (var curveRiskse in t0Vals[tradeId].KeyRateDv01) { var tCurve = tCurves[curveRiskse.Key]; var t1Curve = t1Curves[curveRiskse.Key]; curvePnL[curveRiskse.Key] = curveRiskse.Value.Select(x => new CurveRisk( x.Tenor, x.Risk * (t1Curve[x.Tenor] - tCurve[x.Tenor]) * curveMoveScaling )).ToArray(); } //include raw t1 curve risks in result foreach (var curveRisks in t0Vals[tradeId].KeyRateDv01) { curvePnL[curveRisks.Key + "KeyRateDv01"] = curveRisks.Value; } var pnLCurve = new CommonPnLResult(_tPv, _t1Pv, _tPvRecalib - _tPv, t1cf, curvePnL); ret[tradeId] = pnLCurve; } if (tradeInfo is InterestRateSwapInfo) { var swap = tradeInfo as InterestRateSwapInfo; //carry & roll down var rollDown = t0ValsRolledForward[tradeId].Pv - t0Vals[tradeId].Pv; var carry = t0Vals[tradeId].Carry; var pnlTime = rollDown + carry; var commonPnl = ret[tradeId]; var pnlPv01 = ret.ContainsKey(tradeId) && ret[tradeId].YieldCurvePnL.Count > 0 ? ret[tradeId].YieldCurvePnL.First().Value.Sum(x => x.Risk) : 0.0; var pnl = new SwapPnLResult(commonPnl.TPv, commonPnl.T1Pv, pnlTime: pnlTime, t1Cf: t1cf, pnlPv01: pnlPv01, pnlCarry: carry, pnlRolldown: rollDown); ret[tradeId + "durationConvexity"] = pnl; } if (tradeInfo is BondInfoBase) { var bond = tradeInfo as BondInfoBase; var tPv = t0Vals[tradeId].DirtyPrice; var t1Pv = t1Vals[tradeId].DirtyPrice; var tPvRecalib = t0ValsRolledForward[tradeId].DirtyPrice; //bond market PnL var pnlPv01 = ret.ContainsKey(tradeId) && ret[tradeId].YieldCurvePnL.Count > 0 ? ret[tradeId].YieldCurvePnL.First().Value.Sum(x => x.Risk) : 0.0; //bond specific pnl var tZSpread = t0Vals[tradeId].ZeroSpread; var t1ZSpread = t1Vals[tradeId].ZeroSpread; var tZSpreadDelta = t0Vals[tradeId].ZeroSpreadDelta; var zSpreadPnl = tZSpreadDelta * (t1ZSpread - tZSpread) * curveMoveScaling; var pnlCarry = t1Vals[tradeId].Ai - t0Vals[tradeId].Ai; //bond roll down effect: cashflow less, but benefit from still curve, note that zspread also changes due to rolling down the curve var pnlRolldown = t0RolldownPriceForBond[tradeId].Pv - t0Vals[tradeId].Pv + tZSpreadDelta * (t0RolldownPriceForBond[tradeId].ZeroSpread - tZSpread) * curveMoveScaling; var pnlTime = pnlCarry + pnlRolldown; //duration pnl is not used in book level pnl explain var pnlDuration = t0Vals[tradeId].ModifiedDuration * (t1Vals[tradeId].Ytm - t0Vals[tradeId].Ytm) * bond.Notional; var pnlConverixy = 0.5 * Math.Pow(t1Vals[tradeId].Ytm - t0Vals[tradeId].Ytm, 2.0) * t0Vals[tradeId].DollarConvexity / 100.0; var explainedPriceImpact = pnlPv01 + zSpreadPnl + pnlConverixy + pnlTime; var pnl = new BondPnLResult(tPv, t1Pv, pnlTime: pnlTime, t1Cf: t1cf, pnlPv01: pnlPv01, pnlZspread: zSpreadPnl, pnlCarry: pnlCarry, pnlRolldown: pnlRolldown, pnlDuration: pnlDuration, pnlConvexity: pnlConverixy); ret[tradeId + "durationConvexity"] = pnl; } if (tradeInfo is BondFuturesInfo) { var tPv = t0Vals[tradeId].DirtyPrice; var t1Pv = t1Vals[tradeId].DirtyPrice; //curve pnl var pnlPv01 = ret.ContainsKey(tradeId) && ret[tradeId].YieldCurvePnL.Count > 0 ? ret[tradeId].YieldCurvePnL.First().Value.Sum(x => x.Risk) : 0.0; //zspread pnl from CTD, converted to future equivalen t var zspreadT0 = t0Vals[tradeId].ZeroSpread; var zspreadT1 = t1Vals[tradeId].ZeroSpread; var zspreadPnl = (zspreadT1 - zspreadT0) * curveMoveScaling * t0Vals[tradeId].ZeroSpreadDelta; //basis pnl from CTD/cf - Future var basisT0 = t0Vals[tradeId].Basis; var basisT1 = t1Vals[tradeId].Basis; var bondFut = XlManager.GetTrade(tradeId) as BondFuturesInfo; var futPosScaling = 1.0 / 100.0 * bondFut.Notional; var basisPnL = (basisT1 - basisT0) * futPosScaling; //convexity pnl from CTD var ctdId = t0Vals[tradeId].CheapestToDeliver; var pnlConvexity = 0.0; var bondMktData = t0Mkt.BondPrices[ctdId]; if (bondMktData != null) { var ctdCleanPriceT0 = bondMktData.CleanPrice; var ctdInfo = bondFut.DeliverableBondInfos.Where(x => x.BondId == ctdId).First(); var ctdResultT0 = XlUdf.BondEngineCalc(ctdId, t0Mkt.ReferenceDate.ToString(), PriceQuoteType.Clean, ctdCleanPriceT0, PricingRequest.DirtyPrice, fixedBond: ctdInfo) as PricingResult; pnlConvexity = 0.5 * Math.Pow(t1Vals[tradeId].Ytm - t0Vals[tradeId].Ytm, 2.0) * t0Vals[tradeId].DollarConvexity / 100.0; } //time pnl from CTD var timePnL = t0ValsRolledForward[tradeId].UnderlyingPv - t0Vals[tradeId].UnderlyingPv; var pnl = new BondFuturesPnLResult(tPv, t1Pv, pnlPv01: pnlPv01, pnlZspread: zspreadPnl, pnlBasis: basisPnL, pnlTime: timePnL, pnlConvexity: pnlConvexity, curveRisks: null); ret[tradeId] = pnl; } if (tradeInfo is VanillaOptionInfo || tradeInfo is BinaryOptionInfo || GetTrade(tradeId) is BarrierOptionInfo || tradeInfo is AsianOptionInfo) { OptionValuationParameters valuationParameters = null; Date exerciseDate = null; double strike = 0.0; var trade = tradeInfo as OptionInfoBase; valuationParameters = trade.ValuationParamter; TradeUtil.GenerateOptionDates(trade, out Date[] exerciseDates, out Date[] obsDates, out DayGap settlementGap);
public override BinaryOption GenerateInstrument() { var startDate = TradeInfo.StartDate.ToDate(); var maturityDate = TradeInfo.UnderlyingMaturityDate.ToDate(); TradeUtil.GenerateOptionDates(TradeInfo, out Date[] exerciseDates, out Date[] obsDates, out DayGap settlementGap);
public void TestSequence(int code, IEnumerable <SwitchButton> expect) { var result = TradeUtil.GetPresses(code); result.SequenceEqual(expect).Should().BeTrue(); }
public void TestDigit(int code, int digit, int expect) { var result = TradeUtil.GetCodeDigit(code, digit); result.Should().Be(expect); }
//public IPayInfoDao PayInfoDao { set; private get; } //public IOrderDao OrderDao { set; private get; } //public IBankInfoDao BankInfoDao { set; private get; } //public IPointService PointService { set; private get; } //public IDeliveryInfoDao DeliveryInfoDao { set; private get; } //public IPaygentService PaygentService { get; set; } //public ValidationErrorParam ValidationCheck(OrderItem orderItem, int pointPaid, string payType, string bankType, string bankUserName, DeliveryInfoItem deliveryInfoItem) //{ // ValidationErrorParam param = new ValidationErrorParam(); // if ("BANK".Equals(payType)) // { // if (!"1,2".Split(',').Contains(bankType)) param.Add(new ValidationErrorItem() { ErrorTarget = "", ErrorMessage = "振込先口座入力してください。" }); // if (string.IsNullOrEmpty(bankUserName)) param.Add(new ValidationErrorItem() { ErrorTarget = "bankUserName", ErrorMessage = "振込先口座入力してください。" }); // } // return param; //} //public ValidationErrorParam ValidationCheckPayInfoInsert(OrderItem orderItem) //{ // ValidationErrorParam param = new ValidationErrorParam(); // PayInfoItem payInfoItem = GetPayInfoItem(orderItem.Id); // if (payInfoItem.Id > 0) // { // param.Add(new ValidationErrorItem() { ErrorTarget = "", ErrorMessage = "処理できません - すでに処理が完了しています。" }); // } // return param; //} public ValidationErrorParam ValidationCheckCanPayInfoChange(OrderItem orderItem, int pointPaid, string payType, string bankType, string bankUserName, DeliveryInfoItem deliveryInfoItem) { ValidationErrorParam param = new ValidationErrorParam(); var oldPayInfoItem = GetPayInfoItem(orderItem.PayInfoId); var newPayInfoItem = GetPayInfoItem(orderItem, pointPaid, payType, bankType, bankUserName, TradeUtil.GetShippingCharge(OrderService.GetTaxAddedPrice(orderItem.Id), deliveryInfoItem)); if (orderItem.PayType.StartsWith("TELEGRAM") && !orderItem.PayType.Equals(payType)) { param.Add(new ValidationErrorItem() { ErrorTarget = "", ErrorMessage = "決済代行サービス(株式会社PAYGENT)ご利用頂いた場合、決済内容は変更頂けません。" }); } bool payChanged = oldPayInfoItem.TotalCharge != newPayInfoItem.TotalCharge; if (payChanged && ((!orderItem.PayType.Equals("MAN") && orderItem.IsPaid()) || orderItem.PayType.StartsWith("TELEGRAM"))) { param.Add(new ValidationErrorItem() { ErrorTarget = "", ErrorMessage = "決済代行サービス(株式会社PAYGENT)ご利用頂いた場合、決済金額等の修正は出来ません。\n※変更がある場合は、別途お問い合わせ下さい。" }); } return(param); }