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); } }