private Price GetRefPrice(UsableMarginPrice usableMarginPrice, bool isBuy, bool isNormal) { Price refPrice1 = isNormal == isBuy ? usableMarginPrice.PrivateBid : usableMarginPrice.PrivateAsk; Price refPrice2 = isNormal == isBuy ? usableMarginPrice.PublicBid : usableMarginPrice.PublicAsk; return(refPrice1 ?? refPrice2); }
private IEnumerable <MarginData> CalculateMarginData(Account account, DateTime tradeDay, InstrumentManager instrumentManager) { var setting = Settings.Setting.Default; var settingAccount = setting.GetAccount(account.Id, tradeDay); Dictionary <Guid, MarginData> result = new Dictionary <Guid, MarginData>(account.InstrumentCount); foreach (var eachInstrument in instrumentManager.Instruments) { var settingInstrument = setting.GetInstrument(eachInstrument.Id, tradeDay); if (settingInstrument.MarginFormula == MarginFormula.FCPO || settingInstrument.MarginFormula == MarginFormula.FKLI) { continue; } if (!eachInstrument.ExistsOrdersForCalculateNormal(tradeDay)) { continue; } MarginData marginData; if (!result.TryGetValue(eachInstrument.Id, out marginData)) { marginData = this.CreateMarginData(setting, settingAccount, settingInstrument, tradeDay); result.Add(eachInstrument.Id, marginData); } this.CalculateInstrumentMarginData(setting, settingAccount, settingInstrument, tradeDay, marginData); UsableMarginPrice usableMarginPrice = ResetManager.Default.GetRefPriceForUsableMargin(eachInstrument.Id, account.Id, tradeDay); foreach (var eachOrder in eachInstrument.GetOrders(tradeDay)) { if (!eachOrder.IsForexOrderOrPayoffShortSellOrder()) { continue; } decimal orderMargin = this.CalculateOrderMargin(eachOrder.Order, setting, settingInstrument, settingAccount, tradeDay, usableMarginPrice); marginData.MarginBuy += this.GetBuyOrSellValue(orderMargin, eachOrder.Order, BuySellType.Buy); marginData.MarginSell += this.GetBuyOrSellValue(orderMargin, eachOrder.Order, BuySellType.Sell); decimal quantity = eachOrder.Order.LotBalance * eachOrder.Order.Owner.ContractSize(tradeDay); marginData.BuyLot += this.GetBuyOrSellValue(quantity, eachOrder.Order, BuySellType.Buy); marginData.SellLot += this.GetBuyOrSellValue(quantity, eachOrder.Order, BuySellType.Sell); marginData.BuyLotBalance += this.GetBuyOrSellValue(eachOrder.Order.LotBalance, eachOrder.Order, BuySellType.Buy); marginData.SellLotBalance += this.GetBuyOrSellValue(eachOrder.Order.LotBalance, eachOrder.Order, BuySellType.Sell); } } return(result.Values); }
private decimal CalculateOrderMargin(Order order, Settings.Setting setting, Settings.Instrument instrument, Settings.Account account, DateTime tradeDay, UsableMarginPrice usableMarginPrice) { Guid currencyId = this.GetCurrencyId(account, instrument); var currencyRate = setting.GetCurrencyRate(instrument.CurrencyId, currencyId); decimal?rateIn = currencyRate == null ? (decimal?)null : currencyRate.RateIn; decimal?rateOut = currencyRate == null ? (decimal?)null : currencyRate.RateOut; var currency = setting.GetCurrency(currencyId, tradeDay); int decimals = currency.Decimals; Price refPrice = this.GetRefPrice(usableMarginPrice, order.IsBuy, instrument.IsNormal); return(Calculator.MarginCalculator.CalculateRptMargin((int)instrument.MarginFormula, order.LotBalance, order.Owner.ContractSize(tradeDay), order.ExecutePrice, rateIn, rateOut, decimals, refPrice)); }