示例#1
0
        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);
示例#2
0
        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);
        }
示例#3
0
        //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);
        }
示例#4
0
        //[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);
            }
        }
示例#6
0
        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);
        }
示例#8
0
 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");
     }
 }
示例#9
0
        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");
            }
        }
示例#10
0
        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);
示例#11
0
        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);
示例#12
0
        public void TestSequence(int code, IEnumerable <SwitchButton> expect)
        {
            var result = TradeUtil.GetPresses(code);

            result.SequenceEqual(expect).Should().BeTrue();
        }
示例#13
0
        public void TestDigit(int code, int digit, int expect)
        {
            var result = TradeUtil.GetCodeDigit(code, digit);

            result.Should().Be(expect);
        }
示例#14
0
        //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);
        }