示例#1
0
 public TradeManager(ITradeSharpServerTrade proxyTrade, 
     ITradeSharpAccount proxyAccount,
     IStorage<string, QuoteData> quoteStorage, Func<int, AccountGroup> getAccountGroup)
 {
     profitCalculator = ProfitCalculator.Instance;
     if (getAccountGroup == null) throw new ArgumentException("TradeManager ctor()", "getAccountGroup");
     this.proxyTrade = proxyTrade;
     this.proxyAccount = proxyAccount;
     this.quoteStorage = quoteStorage;
     this.getAccountGroup = getAccountGroup;
     timeStarted = DateTime.Now;
 }
示例#2
0
 public TradeManager(ITradeSharpServerTrade proxyTrade,
                     ITradeSharpAccount proxyAccount,
                     IStorage <string, QuoteData> quoteStorage, Func <int, AccountGroup> getAccountGroup)
 {
     profitCalculator = ProfitCalculator.Instance;
     if (getAccountGroup == null)
     {
         throw new ArgumentException("TradeManager ctor()", "getAccountGroup");
     }
     this.proxyTrade      = proxyTrade;
     this.proxyAccount    = proxyAccount;
     this.quoteStorage    = quoteStorage;
     this.getAccountGroup = getAccountGroup;
     timeStarted          = DateTime.Now;
 }
示例#3
0
 private TradeSharpAccount(ITradeSharpAccount proxyOrStub = null)
 {
     if (proxyOrStub != null)
     {
         proxy = proxyOrStub;
         return;
     }
     try
     {
         proxy = ProxyBuilder.Instance.GetImplementer <ITradeSharpAccount>();
     }
     catch (Exception ex)
     {
         Logger.Error("TradeSharpAccount", ex);
     }
 }
 private TradeSharpAccount(ITradeSharpAccount proxyOrStub = null)
 {
     if (proxyOrStub != null)
     {
         proxy = proxyOrStub;
         return;
     }
     try
     {
         proxy = ProxyBuilder.Instance.GetImplementer<ITradeSharpAccount>();
     }
     catch (Exception ex)
     {
         Logger.Error("TradeSharpAccount", ex);
     }
 }
 private void RenewFactory()
 {
     try
     {
         if (factory != null)
         {
             factory.Abort();
         }
         factory = new ChannelFactory <ITradeSharpAccount>(endpointName);
         channel = factory.CreateChannel();
     }
     catch (Exception ex)
     {
         Logger.Error("TradeSharpAccountProxy: невозможно создать прокси", ex);
         channel = null;
     }
 }
示例#6
0
        public void Setup()
        {
            NewsMaker.ClearNewsFolder();

            fakeTradeServer = ProxyBuilder.Instance.GetImplementer<ITradeSharpServerTrade>();
            fakeTradeAccount = ProxyBuilder.Instance.GetImplementer<ITradeSharpAccount>();

            Account ac;
            var methodName = ProxyBuilder.GetMethodName<ITradeSharpAccount>(a => a.GetAccountInfo(1, false, out ac));
            ((IMockableProxy)fakeTradeAccount).MockMethods.Add(methodName,
                new GetAccountInfoDel((int accountId, bool needEquityInfo, out Account account) =>
                {
                    account = accounts.FirstOrDefault(a => a.ID == accountId);
                    return RequestStatus.OK;
                }));

            TradeSharpServerTradeProxy.fakeProxy = fakeTradeServer;
        }
示例#7
0
        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;
        }
示例#8
0
        public void Setup()
        {
            NewsMaker.ClearNewsFolder();

            fakeTradeServer  = ProxyBuilder.Instance.GetImplementer <ITradeSharpServerTrade>();
            fakeTradeAccount = ProxyBuilder.Instance.GetImplementer <ITradeSharpAccount>();

            Account ac;
            var     methodName = ProxyBuilder.GetMethodName <ITradeSharpAccount>(a => a.GetAccountInfo(1, false, out ac));

            ((IMockableProxy)fakeTradeAccount).MockMethods.Add(methodName,
                                                               new GetAccountInfoDel((int accountId, bool needEquityInfo, out Account account) =>
            {
                account = accounts.FirstOrDefault(a => a.ID == accountId);
                return(RequestStatus.OK);
            }));

            TradeSharpServerTradeProxy.fakeProxy = fakeTradeServer;
        }
        public void TestSetup()
        {
            #region Запоминиаем имена методов, которые будем мОчить разными реализациями в ходе тестов
            List <MarketOrder>   voidOrdersList;
            List <BalanceChange> voidBalanceChangesList;
            getHistoryOrdersName  = ProxyBuilder.GetMethodName <ITradeSharpAccount>(a => a.GetHistoryOrders(null, null, out voidOrdersList));
            getMarketOrdersName   = ProxyBuilder.GetMethodName <ITradeSharpAccount>(a => a.GetMarketOrders(0, out voidOrdersList));
            getBalanceChangesName = ProxyBuilder.GetMethodName <ITradeSharpAccount>(a => a.GetBalanceChanges(0, null, out voidBalanceChangesList));
            #endregion


            fakeTradeAccount = ProxyBuilder.Instance.GetImplementer <ITradeSharpAccount>();
            TradeSharpAccount.Initialize(fakeTradeAccount);

            // Инициализируем словарь котировок
            dailyQuoteStorage = new DailyQuoteStorage();
            dailyQuoteStorage.InitializeFake(QuoteMaker.MakeQuotesForQuoteDailyStorage(null));

            SetupMockMethodImplementation();
        }
示例#10
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;
                    }));
        }
示例#11
0
        private void MakeMoq()
        {
            serverCats = new List <Contract.Entity.Subscription>
            {
                new Contract.Entity.Subscription
                {
                    Service     = 1,
                    PaidService = new PaidService
                    {
                        Comment = "Test signals",
                    },
                    AutoTradeSettings = new AutoTradeSettings
                    {
                        PercentLeverage = 50,
                        MaxLeverage     = 10,
                        MinVolume       = 10000,
                        StepVolume      = 5000,
                        TradeAuto       = true,
                    }
                }
            };

            fakeTradeServer  = ProxyBuilder.Instance.GetImplementer <ITradeSharpServerTrade>();
            fakeTradeAccount = ProxyBuilder.Instance.GetImplementer <ITradeSharpAccount>();


            WalletError walletError;
            var         bindToTradeSignal = ProxyBuilder.GetMethodName <ITradeSharpServerTrade>(a => a.SubscribeOnService(
                                                                                                    null, "", 0, false, false, null, out walletError));

            ((IMockableProxy)fakeTradeServer).MockMethods.Add(bindToTradeSignal,
                                                              new GetAccountInfoDel((ProtectedOperationContext secCtx, string userLogin, int serviceId, bool renewAuto,
                                                                                     bool unsb, AutoTradeSettings sets, out WalletError error) =>
            {
                error = WalletError.OK;
                // модифицировать подписки
                var indexExists = serverCats.FindIndex(c => c.Service == serviceId);
                if (indexExists >= 0)
                {
                    if (unsb)
                    {
                        serverCats.RemoveAt(indexExists);
                    }
                    else
                    {
                        var subs = new Contract.Entity.Subscription
                        {
                            Service           = serviceId,
                            AutoTradeSettings = sets,
                            RenewAuto         = renewAuto,
                            PaidService       = new PaidService
                            {
                                Id = serviceId
                            }
                        };
                        serverCats[indexExists] = subs;
                        serverCats.Add(subs);
                    }
                    return(true);
                }

                return(true);
            }));


            var getTradeSignalsSubscribed = ProxyBuilder.GetMethodName <ITradeSharpAccount>(a => a.GetSubscriptions(""));

            ((IMockableProxy)fakeTradeAccount).MockMethods.Add(getTradeSignalsSubscribed, new Func <string, List <Contract.Entity.Subscription> >(userLogin =>
            {
                return(userLogin == "Demo"
                   ? serverCats
                   : new List <Contract.Entity.Subscription>());
            }));
        }
        public void TestSetup()
        {
            #region Запоминиаем имена методов, которые будем мОчить разными реализациями в ходе тестов
            List<MarketOrder> voidOrdersList;
            List<BalanceChange> voidBalanceChangesList;
            getHistoryOrdersName = ProxyBuilder.GetMethodName<ITradeSharpAccount>(a => a.GetHistoryOrders(null, null, out voidOrdersList));
            getMarketOrdersName = ProxyBuilder.GetMethodName<ITradeSharpAccount>(a => a.GetMarketOrders(0, out voidOrdersList));
            getBalanceChangesName = ProxyBuilder.GetMethodName<ITradeSharpAccount>(a => a.GetBalanceChanges(0, null, out voidBalanceChangesList));
            #endregion

            fakeTradeAccount = ProxyBuilder.Instance.GetImplementer<ITradeSharpAccount>();
            TradeSharpAccount.Initialize(fakeTradeAccount);

            // Инициализируем словарь котировок
            dailyQuoteStorage = new DailyQuoteStorage();
            dailyQuoteStorage.InitializeFake(QuoteMaker.MakeQuotesForQuoteDailyStorage(null));

            SetupMockMethodImplementation();
        }
示例#13
0
 public static void Initialize(ITradeSharpAccount proxyOrStub)
 {
     instance = new TradeSharpAccount(proxyOrStub);
 }
示例#14
0
 public static void Initialize(ITradeSharpAccount proxyOrStub)
 {
     instance = new TradeSharpAccount(proxyOrStub);
 }
示例#15
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);
            }));
        }
 private void RenewFactory()
 {
     try
     {
         if (factory != null) factory.Abort();
         factory = new ChannelFactory<ITradeSharpAccount>(endpointName);
         channel = factory.CreateChannel();
     }
     catch (Exception ex)
     {
         Logger.Error("TradeSharpAccountProxy: невозможно создать прокси", ex);
         channel = null;
     }
 }
示例#17
0
        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);
        }
示例#18
0
        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);
        }
示例#19
0
        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;
        }