Ejemplo n.º 1
0
        internal List <OrderRelation> UpdateOrderRelationValueDate(TradeDayInfo info)
        {
            List <OrderRelation> result = new List <OrderRelation>();

            if (info.Settings.ValueDate == null)
            {
                return(result);
            }
            foreach (var eachOrderRelation in info.OrderRelations)
            {
                if (!this.ShouldUpdateOrderRelationValueDate(eachOrderRelation, info.Settings.ResetTime))
                {
                    continue;
                }
                var instrumentDayOpenCloseHistory = ResetManager.Default.GetInstrumentDayOpenCloseHistory(info.Instrument.Id, eachOrderRelation.CloseOrder.ExecuteTime.Value.Date);
                if (instrumentDayOpenCloseHistory.RealValueDate == info.TradeDay)
                {
                    result.Add(eachOrderRelation);
                    eachOrderRelation.ValueTime = info.Settings.ResetTime;
                    eachOrderRelation.RateIn    = info.RateSetting.RateIn;
                    eachOrderRelation.RateOut   = info.RateSetting.RateOut;
                    eachOrderRelation.Decimals  = info.RateSetting.RoundDecimals.Common;
                }
            }
            return(result);
        }
Ejemplo n.º 2
0
        private static bool IsOpenOrderOfCurrentDay(Order order, TradeDayInfo tradeDayInfo)
        {
            var tradePolicyDetail = Settings.Setting.Default.GetTradePolicy(tradeDayInfo.Account.TradePolicyId, tradeDayInfo.TradeDay)[tradeDayInfo.Instrument.Id, null];

            return(order.IsOpen && (tradePolicyDetail.InterestCut == tradeDayInfo.Settings.WeekDay || tradePolicyDetail.InterestCut == 11 ||
                                    (tradePolicyDetail.InterestCut == 12 && tradeDayInfo.Settings.IsMonthLastDay)));
        }
Ejemplo n.º 3
0
 private static TradeDayCalculator CreateCommon(TradeDayInfo tradeDayInfo, InstrumentCloseQuotation closeQuotation, bool isReset)
 {
     if (closeQuotation != null)
     {
         tradeDayInfo.UpdateInstrumentDayClosePrice(closeQuotation.BuyPrice, closeQuotation.SellPrice);
     }
     return(new TradeDayCalculator(tradeDayInfo, isReset));
 }
Ejemplo n.º 4
0
 internal TradeDayCalculator(TradeDayInfo data, bool isReset)
 {
     _info              = data;
     _isReset           = isReset;
     _orderPhaseUpdater = new OrderPhaseUpdater(data.CloseOrders, _info.Settings.ResetTime, _info.Instrument.Id, _info.TradeDay);
     this.Balance       = 0m;
     _exchanger         = new Exchanger(data.RateSetting);
 }
        private void DoResetPerTradeDay(AccountClass.Instrument instrument, TradeDayInfo eachResetHistorySetting, InstrumentCloseQuotation closeQuotation)
        {
            var settingInstrument = Settings.Setting.Default.GetInstrument(instrument.Id, eachResetHistorySetting.TradeDay);
            var calculator        = TradeDayCalculatorFactory.CreateForReset(eachResetHistorySetting, closeQuotation, Settings.Setting.Default);

            calculator.Calculate();
            _account.AddBalance(settingInstrument.CurrencyId, calculator.Balance, calculator.ResetTime);
            OrderDayHistorySaver.Save(_account, instrument, calculator, eachResetHistorySetting, settingInstrument);
        }
Ejemplo n.º 6
0
        private static OrderResetResult CreateOrderResetResult(Order closeOrder, TradeDayInfo tradeDayInfo, Dictionary <Guid, OrderResetResult> resetOrderDict)
        {
            OrderResetResult resetResult;

            if (!resetOrderDict.TryGetValue(closeOrder.Id, out resetResult))
            {
                resetResult = new OrderResetResult();
                CalculateOrderRelationPLCommon(closeOrder, resetResult, tradeDayInfo);
                resetOrderDict.Add(closeOrder.Id, resetResult);
            }
            return(resetResult);
        }
        private static TradeDayInfo LoadHistoryDataPerTradeDay(this Account account, Guid instrumentId, DateTime tradeDay)
        {
            var instrumentTradeDaySetting = ResetManager.Default.LoadInstrumentHistorySettingAndData(account.Id, instrumentId, tradeDay);

            if (instrumentTradeDaySetting == null)
            {
                return(null);
            }
            var data = new TradeDayInfo(account, instrumentId, tradeDay, instrumentTradeDaySetting, null, Settings.Setting.Default);

            return(data);
        }
Ejemplo n.º 8
0
        private decimal RecoverOrderDayHistory(DateTime tradeDay, List <Guid> affectedOrders)
        {
            var                settingInstrument         = _setting.GetInstrument(_instrumentId, tradeDay);
            var                instrumentTradeDaySetting = ResetManager.Default.LoadInstrumentHistorySettingAndData(_account.Id, _instrumentId, tradeDay);
            TradeDayInfo       tradeDayInfo       = new TradeDayInfo(_account, _instrumentId, tradeDay, instrumentTradeDaySetting, affectedOrders, _setting);
            var                closeQuotation     = _InstrumentDayClosePriceFactory.GetQuotation(settingInstrument, tradeDay);
            TradeDayCalculator tradeDayCalculator = TradeDayCalculatorFactory.CreateForHistoryOrder(tradeDayInfo, closeQuotation);

            tradeDayCalculator.Calculate();
            var resetResults = tradeDayCalculator.ResetResults;

            if (resetResults == null)
            {
                return(0m);
            }
            OrderDayHistorySaver.Save(_account, _account.GetInstrument(_instrumentId), tradeDayCalculator, tradeDayInfo, settingInstrument);
            return(tradeDayCalculator.ValuedPLForBook);
        }
Ejemplo n.º 9
0
        internal static Dictionary <Guid, OpenOrderPLOfCurrentDay> Calculate(TradeDayInfo tradeDayInfo, Dictionary <Guid, TradeDayCommonResult> resetCommonResultDict, Exchanger exchanger)
        {
            if (tradeDayInfo.Settings.ValueDate == null && !tradeDayInfo.Settings.UseCompatibleMode)
            {
                return(null);
            }
            Dictionary <Guid, OpenOrderPLOfCurrentDay> result = new Dictionary <Guid, OpenOrderPLOfCurrentDay>();

            foreach (var eachPair in resetCommonResultDict)
            {
                var orderId           = eachPair.Key;
                var commonResetResult = eachPair.Value;
                if (!orderId.ShouldCalculate(tradeDayInfo.AffectedOrders))
                {
                    continue;
                }
                var eachOrder = tradeDayInfo.GetOrder(orderId);
                if (!IsOpenOrderOfCurrentDay(eachOrder, tradeDayInfo))
                {
                    continue;
                }
                OpenOrderPLOfCurrentDay openOrderPLOfCurrentDay = new OpenOrderPLOfCurrentDay();
                int decimals = tradeDayInfo.Settings.IsInterestUseAccountCurrency ? tradeDayInfo.RateSetting.RoundDecimals.Max : tradeDayInfo.RateSetting.RoundDecimals.Instrument;
                var storage  = Math.Round(eachOrder.LotBalance * commonResetResult.StoragePerLot, decimals, MidpointRounding.AwayFromZero);
                var interest = Math.Round(eachOrder.LotBalance * commonResetResult.InterestPerLot, decimals, MidpointRounding.AwayFromZero);
                openOrderPLOfCurrentDay.DayNotValued += tradeDayInfo.Settings.ShouldValueCurrentDayPL ? InterestStorage.Empty : new InterestStorage(interest, storage);

                var exchangeStorage  = exchanger.ExchangeByCommonDecimals(storage);
                var exchangeInterest = exchanger.ExchangeByCommonDecimals(interest);
                openOrderPLOfCurrentDay.NotValued += tradeDayInfo.Settings.ShouldValueCurrentDayPL ? InterestStorage.Empty : new InterestStorage(exchangeInterest, exchangeStorage);

                bool    isInterestValued = (eachOrder.InterestValueDate ?? tradeDayInfo.TradeDay) <= tradeDayInfo.TradeDay;
                decimal interestPLValued = tradeDayInfo.Settings.ShouldValueCurrentDayPL && isInterestValued ? exchangeInterest : 0;
                decimal storagePLValued  = tradeDayInfo.Settings.ShouldValueCurrentDayPL ? exchangeStorage : 0;
                openOrderPLOfCurrentDay.Valued += new InterestStorage(interestPLValued, storagePLValued);

                openOrderPLOfCurrentDay.IsInterestValued = isInterestValued;
                openOrderPLOfCurrentDay.IsStorageValued  = true;
                result.Add(orderId, openOrderPLOfCurrentDay);
            }
            return(result);
        }
Ejemplo n.º 10
0
 private static void CalculateValuedOrderRelationPL(TradeDayInfo tradeDayInfo, Exchanger exchanger, Dictionary <Guid, OrderResetResult> resetOrderDict, List <Guid> affectedOrders)
 {
     foreach (var eachOrderRelation in tradeDayInfo.OrderRelations)
     {
         Order closeOrder = eachOrderRelation.CloseOrder;
         if (!closeOrder.ShouldCalculate(affectedOrders))
         {
             continue;
         }
         if (closeOrder.Phase == OrderPhase.Executed && !closeOrder.IsOpen && closeOrder.ExecuteTime <= tradeDayInfo.Settings.ResetTime && eachOrderRelation.ValueTime > tradeDayInfo.Settings.BeginTime && eachOrderRelation.ValueTime <= tradeDayInfo.Settings.ResetTime)
         {
             var resetResult = CreateOrderResetResult(closeOrder, tradeDayInfo, resetOrderDict);
             var valuedPL    = eachOrderRelation.CalculateValuedPL();
             resetResult.ValuedPL      += new InterestStorage(valuedPL.InterestPL, valuedPL.StoragePL);
             resetResult.TradePLValued += valuedPL.TradePL;
             PhysicalOrderRelation physicalOrderRelation = eachOrderRelation as PhysicalOrderRelation;
             if (physicalOrderRelation != null)
             {
                 resetResult.PhysicalTradePLValued += CalculatePhysicalTradePL(physicalOrderRelation, exchanger);
             }
         }
     }
 }
Ejemplo n.º 11
0
 private static void CalculateNotValuedOrderRelationPL(TradeDayInfo tradeDayInfo, Exchanger exchanger, Dictionary <Guid, OrderResetResult> resetOrderDict, List <Guid> affectedOrders)
 {
     foreach (var eachOrderRelation in tradeDayInfo.OrderRelations)
     {
         Order closeOrder = eachOrderRelation.CloseOrder;
         if (!closeOrder.ShouldCalculate(affectedOrders))
         {
             continue;
         }
         PhysicalOrder         physicalCloseOrder    = closeOrder as PhysicalOrder;
         PhysicalOrderRelation physicalOrderRelation = eachOrderRelation as PhysicalOrderRelation;
         if (closeOrder.Phase == OrderPhase.Executed && !closeOrder.IsOpen && closeOrder.ExecuteTime <= tradeDayInfo.Settings.ResetTime && eachOrderRelation.ValueTime == null)
         {
             OrderResetResult resetResult = CreateOrderResetResult(closeOrder, tradeDayInfo, resetOrderDict);
             resetResult.NotValuedPL      += new InterestStorage(exchanger.ExchangeByCommonDecimals(eachOrderRelation.InterestPL), exchanger.ExchangeByCommonDecimals(eachOrderRelation.StoragePL));
             resetResult.TradePLNotValued += exchanger.ExchangeByCommonDecimals(eachOrderRelation.TradePL);
             if (physicalOrderRelation != null)
             {
                 resetResult.PhysicalTradePLNotValued += CalculatePhysicalTradePL(physicalOrderRelation, exchanger);
             }
         }
     }
 }
 private InstalmentPayOffParameter GetInstalmentParam(Account account, DateTime tradeDay, TradeDayInfo tradeDayInfo)
 {
     return(new InstalmentPayOffParameter(_account.GetInstalmentOrders(), account, tradeDayInfo.Instrument, tradeDayInfo.Settings.BuyPrice, tradeDayInfo.Settings.SellPrice, tradeDay));
 }
        internal void PayoffInstalment(Account account, Guid instrumentId, DateTime tradeDay, TradeDayInfo tradeDayInfo)
        {
            InstalmentManager instalmentManager = new InstalmentManager(this.GetInstalmentParam(account, tradeDay, tradeDayInfo));

            instalmentManager.Payoff();
        }
Ejemplo n.º 14
0
        internal static void Save(Account account, AccountClass.Instrument instrument, TradeDayCalculator calculator, TradeDayInfo tradeDayInfo, Settings.Instrument settingInstrument)
        {
            InstrumentResetItem resetItem = CreateInstrumentResetItem(tradeDayInfo.TradeDay, instrument, calculator.ResetResults, tradeDayInfo.Settings.BuyPrice, tradeDayInfo.Settings.SellPrice);

            resetItem.ResetBalance = calculator.Balance;
            instrument.AddResetItem(tradeDayInfo.TradeDay, resetItem);
            AddOrderResetToAccount(account, calculator.ResetResults);
            AddResetResultToOrderDayHistory(account, calculator.ResetResults);
        }
        private void DoResetByClosePrice(AccountClass.Instrument instrument, DateTime tradeDay, List <TradingDailyQuotation> closeQuotations, TradeDayInfo tradeDayInfo)
        {
            var settingInstrument = Settings.Setting.Default.GetInstrument(instrument.Id, tradeDay);
            var resetItem         = instrument.GetResetItem(tradeDay);

            if (resetItem != null)
            {
                Logger.InfoFormat("DoResetByClosePrice modifyClosePrice lastResetItem instrumentId = {0}, tradeDay = {1}, resetBalance = {2}", instrument.Id, tradeDay, resetItem.ResetBalance);
                _account.AddBalance(settingInstrument.CurrencyId, -resetItem.ResetBalance, tradeDayInfo.Settings.ResetTime);
            }
            var quotation = _instrumentDayClosePriceFactory.GetQuotation(settingInstrument, closeQuotations);

            if (quotation == null)
            {
                this.PrintErrorInfo(instrument, tradeDay, closeQuotations);
            }
            this.DoResetPerTradeDay(instrument, tradeDayInfo, quotation);
        }
Ejemplo n.º 16
0
        internal List <PhysicalOrderRelation> UpdatePhysicalOrderRelationValueMatureDate(TradeDayInfo info)
        {
            List <PhysicalOrderRelation> result = new List <PhysicalOrderRelation>();

            foreach (var eachOrderRelation in info.OrderRelations)
            {
                PhysicalOrderRelation physicalOrderRelation = eachOrderRelation as PhysicalOrderRelation;
                if (physicalOrderRelation == null)
                {
                    continue;
                }
                if (physicalOrderRelation.PhysicalValueMatureDay <= info.TradeDay && physicalOrderRelation.RealPhysicalValueMatureDate == null)
                {
                    result.Add(physicalOrderRelation);
                    physicalOrderRelation.RealPhysicalValueMatureDate = DateTime.Now.Date;
                }
            }
            return(result);
        }
Ejemplo n.º 17
0
 internal static TradeDayCalculator CreateForReset(TradeDayInfo tradeDayInfo, InstrumentCloseQuotation closeQuotation)
 {
     return(CreateCommon(tradeDayInfo, closeQuotation, true));
 }
Ejemplo n.º 18
0
        private static void CalculateOrderRelationPLCommon(Order closeOrder, OrderResetResult resetResult, TradeDayInfo tradeDayInfo)
        {
            PhysicalOrder physicalCloseOrder = closeOrder as PhysicalOrder;

            resetResult.TradeDay                   = tradeDayInfo.TradeDay;
            resetResult.CurrencyId                 = tradeDayInfo.RateSetting.CurrencyId;
            resetResult.OrderId                    = closeOrder.Id;
            resetResult.PhysicalPaidAmount         = physicalCloseOrder != null ? physicalCloseOrder.PaidAmount : 0;
            resetResult.PaidPledgeBalance          = physicalCloseOrder != null ? physicalCloseOrder.PaidPledgeBalance : 0;
            resetResult.PhysicalOriginValueBalance = physicalCloseOrder != null ? physicalCloseOrder.PhysicalOriginValueBalance : 0;
        }
Ejemplo n.º 19
0
 internal static TradeDayCalculator CreateForHistoryOrder(TradeDayInfo tradeDayInfo, InstrumentCloseQuotation closeQuotation)
 {
     return(CreateCommon(tradeDayInfo, closeQuotation, false));
 }
Ejemplo n.º 20
0
 internal static void Calculate(TradeDayInfo tradeDayInfo, Exchanger exchanger, Dictionary <Guid, OrderResetResult> resetOrderDict, List <Guid> affectedOrders)
 {
     CalculateNotValuedOrderRelationPL(tradeDayInfo, exchanger, resetOrderDict, affectedOrders);
     CalculateValuedOrderRelationPL(tradeDayInfo, exchanger, resetOrderDict, affectedOrders);
 }
Ejemplo n.º 21
0
        internal static decimal CalculateStoragePerLot(Order order, decimal historyStoragePerLot, TradeDayInfo data)
        {
            decimal result = historyStoragePerLot;

            if (data.Settings.IsInterestUseAccountCurrency)
            {
                decimal storagePerLot = InterestAndStorageCalculater.CalculateStoragePerLot(data.Settings.InterestMultiple, data.Settings.StoragePerLotInterestRateBuy, data.Settings.StoragePerLotInterestRateSell, order.IsBuy);
                result += storagePerLot.Exchange(1 / data.RateSetting.RateIn, 1 / data.RateSetting.RateOut, data.RateSetting.RoundDecimals.Max, null);
            }
            else
            {
                var storagePerLot = InterestAndStorageCalculater.CalculateStoragePerLot(data.Settings.InterestMultiple, data.Settings.StoragePerLotInterestRateBuy, data.Settings.StoragePerLotInterestRateSell, order.IsBuy);
                result += Math.Round(storagePerLot, data.RateSetting.RoundDecimals.Instrument, MidpointRounding.AwayFromZero);
            }
            return(result);
        }
Ejemplo n.º 22
0
        internal static decimal CalculateInterestPerLot(Order order, decimal historyInterestPerLot, TradeDayInfo dayInfo)
        {
            decimal result = historyInterestPerLot;

            if (dayInfo.Settings.IsInterestUseAccountCurrency)
            {
                if (order.InterestValueDate == null || order.InterestValueDate <= dayInfo.TradeDay)
                {
                    if (dayInfo.Instrument.InterestFormula > 0)
                    {
                        result += InterestAndStorageCalculater.CalculateInterestPerLot((int)dayInfo.Instrument.InterestFormula, order.ExecutePrice, dayInfo.Settings.BuyPrice, dayInfo.Settings.SellPrice, dayInfo.Settings.IsUseSettlementPriceForInterest, dayInfo.Settings.InterestMultiple, dayInfo.Instrument.InterestYearDays, dayInfo.Settings.InterestRateBuy, dayInfo.Settings.InterestRateSell, order.IsBuy, order.Owner.ContractSize(dayInfo.TradeDay), dayInfo.RateSetting.RoundDecimals.Instrument);
                    }
                    else
                    {
                        decimal interestPerLot = InterestAndStorageCalculater.CalculateInterestPerLot((int)dayInfo.Instrument.InterestFormula, order.ExecutePrice, dayInfo.Settings.BuyPrice, dayInfo.Settings.SellPrice, dayInfo.Settings.IsUseSettlementPriceForInterest, dayInfo.Settings.InterestMultiple, dayInfo.Instrument.InterestYearDays, dayInfo.Settings.InterestRateBuy, dayInfo.Settings.InterestRateSell, order.IsBuy, order.Owner.ContractSize(dayInfo.TradeDay), dayInfo.RateSetting.RoundDecimals.Max);
                        result += interestPerLot.Exchange(1 / dayInfo.RateSetting.RateIn, 1 / dayInfo.RateSetting.RateOut, dayInfo.RateSetting.RoundDecimals.Max, null);
                    }
                }
            }
            else
            {
                if (order.InterestValueDate == null || order.InterestValueDate <= dayInfo.TradeDay)
                {
                    result += InterestAndStorageCalculater.CalculateInterestPerLot((int)dayInfo.Instrument.InterestFormula, order.ExecutePrice, dayInfo.Settings.BuyPrice, dayInfo.Settings.SellPrice, dayInfo.Settings.IsUseSettlementPriceForInterest, dayInfo.Settings.InterestMultiple, dayInfo.Instrument.InterestYearDays, dayInfo.Settings.InterestRateBuy, dayInfo.Settings.InterestRateSell, order.IsBuy, order.Owner.ContractSize(dayInfo.TradeDay), dayInfo.RateSetting.RoundDecimals.Instrument);
                }
            }
            return(result);
        }