コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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));
        }