private void CalculateMarginResultForNormal(Account account, DateTime tradeDay, Dictionary <Guid, MarginResult> marginResultDict, InstrumentManager instrumentManager)
        {
            var settingAccount = Settings.Setting.Default.GetAccount(account.Id, tradeDay);

            foreach (var eachMarginData in this.CalculateMarginData(account, tradeDay, instrumentManager))
            {
                MarginResult result            = this.GetMarginResult(account.Id, eachMarginData.CurrencyId, marginResultDict);
                var          settingInstrument = Settings.Setting.Default.GetInstrument(eachMarginData.InstrumentId, tradeDay);
                var          tradePolicyDetail = Settings.Setting.Default.GetTradePolicyDetail(eachMarginData.InstrumentId, settingAccount.TradePolicyId, tradeDay);
                if (settingInstrument.MarginFormula == MarginFormula.CSiPrice || settingInstrument.MarginFormula == MarginFormula.CSxPrice ||
                    settingInstrument.MarginFormula == MarginFormula.CSiMarketPrice || settingInstrument.MarginFormula == MarginFormula.CSxMarketPrice)
                {
                    decimal netAverageMargin = eachMarginData.BuyLot < eachMarginData.SellLot ? eachMarginData.AverageSell * (eachMarginData.SellLot - eachMarginData.BuyLot) :
                                               eachMarginData.AverageBuy * (eachMarginData.BuyLot - eachMarginData.SellLot);
                    result.Margin += netAverageMargin * eachMarginData.Margin + eachMarginData.AverageSell * eachMarginData.LockedLot * eachMarginData.MarginLocked
                                     + eachMarginData.AverageBuy * eachMarginData.LockedLot * eachMarginData.MarginLocked;
                }
                else if (settingInstrument.MarginFormula == MarginFormula.FixedAmount && tradePolicyDetail.VolumeNecessary != null)
                {
                    decimal lockedMargin    = Math.Min(eachMarginData.MarginBuy, eachMarginData.MarginSell) * eachMarginData.MarginLocked;
                    decimal netLot          = Math.Abs(eachMarginData.BuyLotBalance - eachMarginData.SellLotBalance);
                    decimal marginNecessary = Calculator.MarginCalculator.CalculateNecessaryMargin(Settings.Setting.Default, tradePolicyDetail.VolumeNecessaryId.Value, netLot, tradePolicyDetail.MarginO, true);
                    result.Margin += lockedMargin + marginNecessary * settingAccount.RateMarginO;
                }
                else
                {
                    result.Margin += eachMarginData.Margin * Math.Abs(eachMarginData.MarginBuy - eachMarginData.MarginSell) + Math.Min(eachMarginData.MarginBuy, eachMarginData.MarginSell) * eachMarginData.MarginLocked;
                }
            }
        }
        private MarginResult GetMarginResult(Guid accountId, Guid currencyId, Dictionary <Guid, MarginResult> marginResultDict)
        {
            MarginResult result;

            if (!marginResultDict.TryGetValue(currencyId, out result))
            {
                result = new MarginResult {
                    CurrencyId = currencyId
                };
                marginResultDict.Add(currencyId, result);
            }
            return(result);
        }
        private void CalculateMarginResultForInstrumentLotInfoCommon(Dictionary <Guid, MarginResult> marginResultDict, Account account, DateTime tradeDay, MarginFormula marginFormula, Func <Settings.TradePolicyDetail, Settings.CurrencyRate, Settings.Currency, InstrumentLotInfo, decimal> marginFunc, InstrumentManager instrumentManager)
        {
            var settingAccount = Settings.Setting.Default.GetAccount(account.Id, tradeDay);

            foreach (var eachItem in this.GetInstrumentLotInfo(account, tradeDay, marginFormula, instrumentManager))
            {
                var          settingInstrument = Settings.Setting.Default.GetInstrument(eachItem.InstrumentId, tradeDay);
                Guid         currencyId        = settingAccount.IsMultiCurrency ? settingInstrument.CurrencyId : settingAccount.CurrencyId;
                var          tradePolicyDetail = Settings.Setting.Default.GetTradePolicyDetail(eachItem.InstrumentId, settingAccount.TradePolicyId, tradeDay);
                var          currencyRate      = Settings.Setting.Default.GetCurrencyRate(settingInstrument.CurrencyId, currencyId, tradeDay);
                MarginResult marginResult      = this.GetMarginResult(account.Id, currencyId, marginResultDict);
                var          accountCurrency   = Settings.Setting.Default.GetCurrency(settingAccount.CurrencyId, tradeDay);
                marginResult.Margin += marginFunc(tradePolicyDetail, currencyRate, accountCurrency, eachItem);
            }
        }