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; }
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; }
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; } }
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 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 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(); }
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 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(); }
public static void Initialize(ITradeSharpAccount proxyOrStub) { instance = new TradeSharpAccount(proxyOrStub); }
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; } }
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 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 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; }