Example #1
0
        public void TestCalculateAccountExposure()
        {
            decimal equity;
            decimal reservedMargin;
            decimal exposure;

            List <MarketOrder> orders;
            var profitCalculator = ProfitCalculator.Instance;

            fakeAccountManager.GetMarketOrders(testAccount.ID, out orders);

            var dicExp = profitCalculator.CalculateAccountExposure(testAccount.ID,
                                                                   out equity, out reservedMargin, out exposure, QuoteStorage.Instance.ReceiveAllData(),
                                                                   fakeAccountManager, i => testGroup);

            Assert.AreEqual(orders.Select(o => o.Symbol).Distinct().Count(),
                            dicExp.Count, "CalculateAccountExposure() - вернула нужное количество записей");

            // проверить общую экспозицию
            var dealByTicker = orders.GroupBy(o => o.Symbol).ToDictionary(o => o.Key,
                                                                          o => Math.Abs(o.Sum(ord => ord.Side * ord.Volume)));
            var quotes         = QuoteStorage.Instance.ReceiveAllData();
            var mustBeExposure = dealByTicker.Sum(deal =>
            {
                string errorStr;
                return(DalSpot.Instance.ConvertToTargetCurrency(deal.Key, true, testAccount.Currency,
                                                                deal.Value, quotes, out errorStr, true) ?? 0);
            });
            var deltaExp = Math.Abs(mustBeExposure - exposure);

            Assert.Less(deltaExp, 1, "CalculateAccountExposure() - неверный расчет экспозиции");
        }
Example #2
0
        /// <summary>
        /// возвращает позиции, которые надо закрыть
        /// </summary>
        public List <MarketOrder> CheckMarketOrders(int accountId)
        {
            var execOrders = new List <MarketOrder>();
            List <MarketOrder> orders;
            var status = proxyAccount.GetMarketOrders(accountId, out orders);

            if (status != RequestStatus.OK)
            {
                return(execOrders);
            }
            foreach (var pos in orders)
            {
                var quote = quoteStorage.ReceiveValue(pos.Symbol);
                if (quote == null)
                {
                    continue;
                }

                CheckOrderTrailing(pos, quote);

                if (pos.Side == 1)
                {
                    if (pos.StopLoss != null && pos.StopLoss >= quote.bid)
                    {
                        execOrders.Add(pos);
                        pos.ExitReason = PositionExitReason.SL;
                    }
                    else
                    if (pos.TakeProfit != null && pos.TakeProfit <= quote.bid)
                    {
                        execOrders.Add(pos);
                        pos.ExitReason = PositionExitReason.TP;
                    }
                }
                else
                {
                    // sell позиция
                    if (pos.StopLoss != null && pos.StopLoss <= quote.ask)
                    {
                        execOrders.Add(pos);
                        pos.ExitReason = PositionExitReason.SL;
                    }
                    else
                    if (pos.TakeProfit != null && pos.TakeProfit >= quote.ask)
                    {
                        execOrders.Add(pos);
                        pos.ExitReason = PositionExitReason.TP;
                    }
                }
            }
            return(execOrders);
        }
        public decimal CalculateAccountEquity(int accountId, decimal balance, string depoCurx,
            Dictionary<string, QuoteData> curPrices, ITradeSharpAccount proxyAccount)
        {
            var equity = balance;
            List<MarketOrder> posList;
            var result = proxyAccount.GetMarketOrders(accountId, out posList);
            if (result != RequestStatus.OK)
            {
                Logger.ErrorFormat("Ошибка в CalculateAccountEquity({0}) - ошибка получения позиций", accountId);
                return 0;
            }

            equity += posList.Sum(p =>
                p.State != PositionState.Opened ? 0
                : CalculatePositionProfit(p, depoCurx, curPrices));

            return equity;
        }
        public decimal CalculateAccountEquity(int accountId, decimal balance, string depoCurx,
                                              Dictionary <string, QuoteData> curPrices, ITradeSharpAccount proxyAccount)
        {
            var equity = balance;
            List <MarketOrder> posList;
            var result = proxyAccount.GetMarketOrders(accountId, out posList);

            if (result != RequestStatus.OK)
            {
                Logger.ErrorFormat("Ошибка в CalculateAccountEquity({0}) - ошибка получения позиций", accountId);
                return(0);
            }

            equity += posList.Sum(p =>
                                  p.State != PositionState.Opened ? 0
                : CalculatePositionProfit(p, depoCurx, curPrices));

            return(equity);
        }
Example #5
0
        private void MakeTradeSharpAccountProxy()
        {
            fakeAccountManager = ProxyBuilder.Instance.MakeImplementer<ITradeSharpAccount>(true);
            // "замочить" нужные методы
            // ReSharper disable SuspiciousTypeConversion.Global
            Account account;
            ((IMockableProxy)fakeAccountManager).MockMethods.Add(
                // ReSharper restore SuspiciousTypeConversion.Global
                StronglyName.GetMethodName<ITradeSharpAccount>(
                    f => f.GetAccountInfo(0, false, out account)),
                new GetAccountInfoDel((int accountId, bool needEquityInfo, out Account act) =>
                    {
                        act = testAccount;
                        act.ID = accountId;

                        if (needEquityInfo)
                        {
                            List<MarketOrder> ordList;
                            fakeAccountManager.GetMarketOrders(accountId, out ordList);
                            var profit = DalSpot.Instance.CalculateOpenedPositionsCurrentResult(ordList,
                                QuoteStorage.Instance.ReceiveAllData(), act.Currency);
                            act.Equity = act.Balance + (decimal)profit;
                        }
                        return RequestStatus.OK;
                    }));
            List<MarketOrder> orders;
            // ReSharper disable SuspiciousTypeConversion.Global
            ((IMockableProxy)fakeAccountManager).MockMethods.Add(
                // ReSharper restore SuspiciousTypeConversion.Global
                StronglyName.GetMethodName<ITradeSharpAccount>(
                    f => f.GetMarketOrders(0, out orders)),
                new GetMarketOrdersDel((int accountId, out List<MarketOrder> ordList) =>
                    {
                        ordList = new List<MarketOrder>
                            {
                                new MarketOrder
                                    {
                                        AccountID = accountId,
                                        Symbol = "EURUSD",
                                        Side = (int)DealType.Buy,
                                        Volume = 100000,
                                        PriceEnter = 1.3140f,
                                        State = PositionState.Opened
                                    },
                                new MarketOrder
                                    {
                                        AccountID = accountId,
                                        Symbol = "EURUSD",
                                        Side = (int)DealType.Sell,
                                        Volume = 20000,
                                        PriceEnter = 1.3180f,
                                        State = PositionState.Opened
                                    },
                                new MarketOrder
                                    {
                                        AccountID = accountId,
                                        Symbol = "USDCAD",
                                        Side = (int)DealType.Sell,
                                        Volume = 80000,
                                        PriceEnter = 1.1130f,
                                        State = PositionState.Opened
                                    }
                            };
                        return RequestStatus.OK;
                    }));
        }
Example #6
0
        private void MakeTradeSharpAccountProxy()
        {
            fakeAccountManager = ProxyBuilder.Instance.MakeImplementer <ITradeSharpAccount>(true);
            // "замочить" нужные методы
            // ReSharper disable SuspiciousTypeConversion.Global
            Account account;

            ((IMockableProxy)fakeAccountManager).MockMethods.Add(
                // ReSharper restore SuspiciousTypeConversion.Global
                StronglyName.GetMethodName <ITradeSharpAccount>(
                    f => f.GetAccountInfo(0, false, out account)),
                new GetAccountInfoDel((int accountId, bool needEquityInfo, out Account act) =>
            {
                act    = testAccount;
                act.ID = accountId;

                if (needEquityInfo)
                {
                    List <MarketOrder> ordList;
                    fakeAccountManager.GetMarketOrders(accountId, out ordList);
                    var profit = DalSpot.Instance.CalculateOpenedPositionsCurrentResult(ordList,
                                                                                        QuoteStorage.Instance.ReceiveAllData(), act.Currency);
                    act.Equity = act.Balance + (decimal)profit;
                }
                return(RequestStatus.OK);
            }));
            List <MarketOrder> orders;

            // ReSharper disable SuspiciousTypeConversion.Global
            ((IMockableProxy)fakeAccountManager).MockMethods.Add(
                // ReSharper restore SuspiciousTypeConversion.Global
                StronglyName.GetMethodName <ITradeSharpAccount>(
                    f => f.GetMarketOrders(0, out orders)),
                new GetMarketOrdersDel((int accountId, out List <MarketOrder> ordList) =>
            {
                ordList = new List <MarketOrder>
                {
                    new MarketOrder
                    {
                        AccountID  = accountId,
                        Symbol     = "EURUSD",
                        Side       = (int)DealType.Buy,
                        Volume     = 100000,
                        PriceEnter = 1.3140f,
                        State      = PositionState.Opened
                    },
                    new MarketOrder
                    {
                        AccountID  = accountId,
                        Symbol     = "EURUSD",
                        Side       = (int)DealType.Sell,
                        Volume     = 20000,
                        PriceEnter = 1.3180f,
                        State      = PositionState.Opened
                    },
                    new MarketOrder
                    {
                        AccountID  = accountId,
                        Symbol     = "USDCAD",
                        Side       = (int)DealType.Sell,
                        Volume     = 80000,
                        PriceEnter = 1.1130f,
                        State      = PositionState.Opened
                    }
                };
                return(RequestStatus.OK);
            }));
        }
        public Dictionary <string, decimal> CalculateAccountExposure(int accountId,
                                                                     out decimal equity,
                                                                     out decimal reservedMargin,
                                                                     out decimal exposure,
                                                                     Dictionary <string, QuoteData> curPrices,
                                                                     ITradeSharpAccount proxyAccount,
                                                                     Func <int, AccountGroup> getAccountGroup)
        {
            if (curPrices == null)
            {
                Logger.Error("Ошибка в CalculateAccountExposure - curPrices == null");
                throw new Exception("Ошибка в CalculateAccountExposure - curPrices == null");
            }

            equity         = 0;
            exposure       = 0;
            reservedMargin = 0;
            var     exps = new Dictionary <string, decimal>();
            Account account;

            proxyAccount.GetAccountInfo(accountId, true, out account);
            if (account == null)
            {
                return(exps);
            }

            equity = account.Equity;
            List <MarketOrder> marketOrders;

            try
            {
                var result = proxyAccount.GetMarketOrders(accountId, out marketOrders);
                if (result != RequestStatus.OK)
                {
                    return(exps);
                }
            }
            catch (Exception ex)
            {
                Logger.Error("Ошибка в CalculateAccountExposure - GetMarketOrders", ex);
                throw;
            }
            if (marketOrders == null)
            {
                Logger.Error("Ошибка в CalculateAccountExposure - posInf == null");
                throw new Exception("Ошибка в CalculateAccountExposure - posInf == null");
            }

            foreach (var position in marketOrders)
            {
                var volume = position.Volume * position.Side;
                if (exps.ContainsKey(position.Symbol))
                {
                    exps[position.Symbol] += volume;
                }
                else
                {
                    exps.Add(position.Symbol, volume);
                }
            }

            // перевести экспозицию по каждой валюте в валюту депо
            foreach (var pair in exps)
            {
                var deltaExp = pair.Value;
                try
                {
                    string errorStr;
                    var    deltaExpDepo = DalSpot.Instance.ConvertToTargetCurrency(pair.Key, true, account.Currency,
                                                                                   (double)deltaExp, curPrices, out errorStr, true);
                    if (deltaExpDepo.HasValue)
                    {
                        exposure += Math.Abs(deltaExpDepo.Value);
                    }
                }
                catch (Exception ex)
                {
                    Logger.Error("Ошибка в CalculateAccountExposure - ConvertBase2Depo", ex);
                    throw;
                }
            }

            // марж. требования
            try
            {
                var accountGroup = getAccountGroup(accountId);
                reservedMargin = exposure / (decimal)accountGroup.BrokerLeverage;
            }
            catch (Exception ex)
            {
                Logger.Error("Ошибка в CalculateAccountExposure - getAccountGroup", ex);
                throw;
            }

            return(exps);
        }
        public Dictionary<string, decimal> CalculateAccountExposure(int accountId,
            out decimal equity,
            out decimal reservedMargin,
            out decimal exposure,
            Dictionary<string, QuoteData> curPrices,
            ITradeSharpAccount proxyAccount,
            Func<int, AccountGroup> getAccountGroup)
        {
            if (curPrices == null)
            {
                Logger.Error("Ошибка в CalculateAccountExposure - curPrices == null");
                throw new Exception("Ошибка в CalculateAccountExposure - curPrices == null");
            }

            equity = 0;
            exposure = 0;
            reservedMargin = 0;
            var exps = new Dictionary<string, decimal>();
            Account account;
            proxyAccount.GetAccountInfo(accountId, true, out account);
            if (account == null) return exps;

            equity = account.Equity;
            List<MarketOrder> marketOrders;
            try
            {
                var result = proxyAccount.GetMarketOrders(accountId, out marketOrders);
                if (result != RequestStatus.OK) return exps;
            }
            catch (Exception ex)
            {
                Logger.Error("Ошибка в CalculateAccountExposure - GetMarketOrders", ex);
                throw;
            }
            if (marketOrders == null)
            {
                Logger.Error("Ошибка в CalculateAccountExposure - posInf == null");
                throw new Exception("Ошибка в CalculateAccountExposure - posInf == null");
            }

            foreach (var position in marketOrders)
            {
                var volume = position.Volume * position.Side;
                if (exps.ContainsKey(position.Symbol)) exps[position.Symbol] += volume;
                else
                    exps.Add(position.Symbol, volume);
            }

            // перевести экспозицию по каждой валюте в валюту депо
            foreach (var pair in exps)
            {
                var deltaExp = pair.Value;
                try
                {
                    string errorStr;
                    var deltaExpDepo = DalSpot.Instance.ConvertToTargetCurrency(pair.Key, true, account.Currency,
                        (double)deltaExp, curPrices, out errorStr, true);
                    if (deltaExpDepo.HasValue)
                        exposure += Math.Abs(deltaExpDepo.Value);
                }
                catch (Exception ex)
                {
                    Logger.Error("Ошибка в CalculateAccountExposure - ConvertBase2Depo", ex);
                    throw;
                }
            }

            // марж. требования
            try
            {
                var accountGroup = getAccountGroup(accountId);
                reservedMargin = exposure / (decimal)accountGroup.BrokerLeverage;
            }
            catch (Exception ex)
            {
                Logger.Error("Ошибка в CalculateAccountExposure - getAccountGroup", ex);
                throw;
            }

            return exps;
        }