public void TradeAccountTest_CreateBuyOrder_EdgeAfford_Fail() { var target = new TradeAccount(new Account(100ul)); var actual = target.CreateBuyOrder("Iron Ore", 101ul, 1ul); Assert.IsNull(actual); Assert.AreEqual(100ul, target.BalanceAccount.Balance); Assert.AreEqual(0, target.BuyOrders.Count); }
public void TradeAccountTest_CancelBuyOrder() { var target = new TradeAccount(new Account(100ul)); var actual = target.CreateBuyOrder("Iron Ore", 100ul, 1ul); actual.Cancel(); Assert.AreEqual(100ul, target.BalanceAccount.Balance); Assert.AreEqual(0, target.BuyOrders.Count); }
public void TradeAccountTest_ExecuteBuyOrder() { var target = new TradeAccount(new Account(100ul)); var actual = target.CreateBuyOrder("Iron Ore", 100ul, 1ul); actual.Execute(new SellOrder(new Security("Iron Ore", 100ul), 1ul)); Assert.AreEqual(0ul, target.BalanceAccount.Balance); Assert.AreEqual(0, target.BuyOrders.Count); }
public void TradeAccountTest_CreateSellOrder_Fail_EdgeQuantity() { var target = new TradeAccount(new Account(100ul), new List <Security> { new Security("Iron Ore", 100ul) }); var actual = target.CreateSellOrder("Iron Ore", 101ul, 1ul); Assert.IsNull(actual); }
private static TradeAccountModel ToTradeAccountModel(TradeAccount dto) { return(new TradeAccountModel { Id = dto.Id, AccountName = dto.AccountName, AccountAlias = dto.AccountAlias }); }
public void TradeAccountTest_CancelSellOrder() { var target = new TradeAccount(new Account(100ul), new List <Security> { new Security("Iron Ore", 100ul) }); var actual = target.CreateSellOrder("Iron Ore", 100ul, 1ul); actual.Cancel(); Assert.AreEqual(0, target.SellOrders.Count); }
public TradeAccount ChangeTradeRank(TradeAccount account) { var dto = GetById(account.Id); if (dto == null) { return(null); } dto.TradeRank = account.TradeRank; _dbContext.SaveChanges(); return(dto); }
public void TradeAccountTest_CreateBuyOrder_EdgeAfford_OK() { var target = new TradeAccount(new Account(100ul)); var actual = target.CreateBuyOrder("Iron Ore", 100ul, 1ul); Assert.IsNotNull(actual); Assert.AreEqual("Iron Ore", actual.SecurityName); Assert.AreEqual(100ul, actual.Quantity); Assert.AreEqual(1ul, actual.PricePerItem); Assert.AreEqual(0ul, target.BalanceAccount.Balance); Assert.AreEqual(1, target.BuyOrders.Count); }
private void InitializeMarketplaceDemo() { _marketplace = new Marketplace("Dreamstate Market"); _accountOne = new Account(100); accountViewOne.Bind(new TradeAccount(_accountOne), _marketplace); _accountTwo = new Account(100); var tradeTwo = new TradeAccount(_accountTwo, new List <Security> { new Security("Iron Ore", 10ul) }); accountViewTwo.Bind(tradeTwo, _marketplace); marketplaceView1.Bind(_marketplace); }
public void TradeAccountTest_ExecuteSellOrder_BalanceUpdated() { var target = new TradeAccount(new Account(100ul), new List <Security> { new Security("Iron Ore", 100ul) }); var actual = target.CreateSellOrder("Iron Ore", 100ul, 1ul); var buyAccount = new TradeAccount(new Account(100ul)); var buyOrder = buyAccount.CreateBuyOrder("Iron Ore", 100ul, 1ul); buyOrder.Execute(actual); Assert.AreEqual(200ul, target.BalanceAccount.Balance); }
public void TradeAccountTest_CreateSellOrder() { var target = new TradeAccount(new Account(100ul), new List <Security> { new Security("Iron Ore", 100ul) }); var actual = target.CreateSellOrder("Iron Ore", 100ul, 1ul); Assert.IsNotNull(actual); Assert.AreEqual("Iron Ore", actual.SecurityName); Assert.AreEqual(100ul, actual.Quantity); Assert.AreEqual(1ul, actual.PricePerItem); Assert.AreEqual(100ul, target.BalanceAccount.Balance); Assert.AreEqual(1, target.SellOrders.Count); }
/// <summary> /// If we have a trade pair of for instance ETH - BTC then to exhange x-ETH to y-BTC we're doing a sell order. /// In other words the from currency is the one that dictates. /// </summary> public ExchangeOrderAction(ExchangeTradePair tradePair, ExchangeOrderType orderType, decimal txAmountInPreferredCurrency, Currency txCurrency) { this.TradePair = tradePair; this.OrderType = orderType; this.BaseCurrency = txCurrency; // The base currency is the to currency this.EstimatedCost = this.TradePair.FeePercent / 100m * txAmountInPreferredCurrency; this.MaxExposureCost = 0m; // We set this to zero as order actions are instantaneous. this.EstimatedTimeToExecute = new TimeSpan(0, 0, 10); // We arbitrarly set the estimated time to execute to 10seconds. Generally, buying or selling at market price will be executed immediately. this.TradingIntegration = tradePair.Exchange.TradingIntegration; // It's good to assume that if this point is reached then the exchange trading was integrated. this.TransactionAmount = txAmountInPreferredCurrency; // In a trade pair of ETH -> BTC we always consider the from as the ETH this.FromAccount = this.TradePair.Exchange.TradeAccounts.Where(x => x.Currency == this.TradePair.TradePair.FromCurrency).Single(); this.ToAccount = this.TradePair.Exchange.TradeAccounts.Where(x => x.Currency == this.TradePair.TradePair.ToCurrency).Single(); }
/// <summary> /// 交易账户信息回报 /// </summary> private void Platform_OnRtnTradeAccount(TradeAccount taf) { lock (this._lockAllTradeAccount) { int index = _OcAllTradeAccount.IndexOf(taf); if (index == -1) { _OcAllTradeAccount.Insert(0, taf); } else { _OcAllTradeAccount[index].CThostFtdcTradingAccountFieldInstance = taf.CThostFtdcTradingAccountFieldInstance; } } }
public async Task <int> RecordTrade(Trade trade, TradeAccount ta) { try { using (MySqlConnection connection = Connection) { string storeQuery = "INSERT INTO Trade (Ticker, Type, Amount, Price, Quantity, Date) values (@Ticker, @Type, @Amount, @Price, @Quantity, @Date)"; var @storeParams = new { Ticker = trade.Ticker, Type = trade.Type, Amount = trade.Amount, Price = trade.Price, Quantity = trade.Quantity, Date = trade.Date }; connection.Open(); await connection.ExecuteAsync(storeQuery, storeParams); string idQuery = "SELECT Id FROM Trade WHERE Ticker = @Ticker AND Amount = @Amount"; var @idParams = new { Ticker = trade.Ticker, Amount = trade.Amount }; int result = await connection.QueryFirstOrDefaultAsync <int>(idQuery, idParams); if (trade.Type == true) { string trackAssetQ = "INSERT INTO OwnedAssets (TradeAccount, Symbol, Quantity, Price) VALUES (@ta, @symbol, @quantity, @price)"; var @trackAssetP = new { ta = ta.Id, symbol = trade.Ticker, quantity = trade.Quantity, price = trade.Price }; await connection.ExecuteAsync(trackAssetQ, trackAssetP); return(result); } // Remove from owned assets if sold string query = "DELETE FROM OwnedAssets WHERE TradeAccount=@tId AND Symbol=@symbol AND Quantity=@quantity"; var @params = new { tId = ta.Id, symbol = trade.Ticker, quantity = trade.Quantity }; await connection.ExecuteAsync(query, @params); return(result); } } catch (Exception e) { Console.WriteLine(TAG + e); return(0); } }
private static async Task SynchronizeAccounts(IExchangeTrader exchangeIntegration, RBBotContext dbContext) { Exchange exchangeModel = exchangeIntegration.Exchange; // Get the balances from the exchange integration var exchangebalances = (await exchangeIntegration.GetBalancesAsync()).ToDictionary(x => x.CurrencyCode, y => y); // Get the exchange's trading accounts. var existingAccounts = exchangeModel.TradeAccounts.ToDictionary(x => x.Currency.Code, y => y); // If the account exists already, then update. existingAccounts.Where(x => exchangebalances.Keys.Contains(x.Key)).ToList().ForEach(x => { var exCurr = exchangebalances[x.Key]; var acc = existingAccounts[x.Key]; acc.Balance = exCurr.Balance; acc.LastUpdate = exCurr.Timestamp; if (exCurr.ExchangeIdentifier != null) { acc.ExchangeIdentifier = exCurr.ExchangeIdentifier; } if (exCurr.Address != null) { acc.Address = exCurr.Address; } }); // If the account doesn't exist, then create it. exchangebalances.Keys.Where(x => !existingAccounts.Keys.Contains(x)).ToList().ForEach(x => { var b = exchangebalances[x]; TradeAccount acc = new TradeAccount() { Address = b.Address, Balance = b.Balance, Exchange = exchangeModel, ExchangeIdentifier = b.ExchangeIdentifier, LastUpdate = b.Timestamp, Currency = dbContext.Currencies.Where(c => c.Code == b.CurrencyCode).Single() }; dbContext.TradeAccounts.Add(acc); }); }
private long GetOrCreateTradeAccountId(TradeAccount tradeAcc) { if (_tradeAccountModel.Contains(tradeAcc.AccountName)) { return(_tradeAccountModel.GetById(tradeAcc.AccountName).Id); } var result = _importJobRepository.AddOrUpdateTradeAccount(tradeAcc); // for generated id _importJobRepository.SaveChanges(); _tradeAccountModel.Add(result.AccountName, new TradeAccountModel { Id = result.Id }); return(result.Id); }
public async Task <ActionResult> PutTradeAccount(int id, [FromBody] TradeAccount ta) { if (ta.Id != id) { return(BadRequest()); } if (_portfolioProvider.TradeAccountExists(id)) { await _portfolioProvider.UpdateTradeAccount(ta, id); } else { return(NotFound()); } return(NoContent()); }
private void ProcessTradingPermissions(string tradingPermsStr, TradeAccount tradeAccount) { if (string.IsNullOrEmpty(tradingPermsStr)) { return; } var tradingPerms = tradingPermsStr.Split(',').ToList(); var accountTradePerms = tradeAccount.TradingPermissions.Select(per => per.Name).ToList(); var permsForAdding = tradingPerms.Except(accountTradePerms).ToList(); var permsForDeleting = accountTradePerms.Except(tradingPerms).ToList(); permsForAdding.ForEach(perm => { var dto = GetOrCreateTradingPermission(perm); tradeAccount.TradingPermissions.Add(dto); }); permsForDeleting.ForEach(perm => { var dto = GetOrCreateTradingPermission(perm); tradeAccount.TradingPermissions.Remove(dto); }); }
void CommonMgrSeed(AlpsContext context) { #region 初始化管理员 AlpsRole role = AlpsRole.Create("Admin", "管理员"); context.AlpsRoles.Add(role); AlpsUser user = AlpsUser.Create("a", "a", "李", "123456", "223344"); user.AddRole(role); role = AlpsRole.Create("User", "用户"); context.AlpsRoles.Add(role); user.AddRole(role); context.AlpsUsers.Add(user); user = AlpsUser.Create("b", "b", "张三", "112233", "789789"); user.AddRole(role); context.AlpsUsers.Add(user); role = AlpsRole.Create("Cashier", "出纳"); context.AlpsRoles.Add(role); user = AlpsUser.Create("cw", "cw", "财务", "11", "22"); user.AddRole(role); context.AlpsUsers.Add(user); #endregion #region 初始化地址 context.Countries.Add(Country.Create("菲律宾")); Country country = Country.Create("中国"); context.Countries.Add(country); context.Provinces.Add(Province.Create("浙江省", country.ID)); context.Provinces.Add(Province.Create("广东省", country.ID)); context.Provinces.Add(Province.Create("江西省", country.ID)); context.Provinces.Add(Province.Create("湖南省", country.ID)); Province province = Province.Create("福建省", country.ID); context.Provinces.Add(province); context.Cities.Add(City.Create("泉州市", province.ID)); context.Cities.Add(City.Create("莆田市", province.ID)); context.Cities.Add(City.Create("宁德市", province.ID)); City city = City.Create("福州市", province.ID); context.Cities.Add(city); context.Counties.Add(County.Create("福清市", city.ID)); context.Counties.Add(County.Create("闽候县", city.ID)); context.Counties.Add(County.Create("鼓楼区", city.ID)); County county = County.Create("长乐区", city.ID); context.Counties.Add(county); context.SaveChanges(); #endregion #region 初始化部门 Department d = Department.Create("供销科"); context.Departments.Add(d); d = Department.Create("轧钢车间"); productDepartmentID = d.ID; context.Departments.Add(d); d = Department.Create("焊管车间"); context.Departments.Add(d); d = Department.Create("采购部"); context.Departments.Add(d); context.SaveChanges(); departmentID = d.ID; #endregion #region 初始化客户 Address address = Address.Create(county, "青口钢材市场"); Customer c = Customer.Create("江水金", address); context.Customers.Add(c); address = Address.Create(county, "青口钢材市场"); c = Customer.Create("陈依寿", address); context.Customers.Add(c); address = Address.Create(county, "青口钢材市场"); c = Customer.Create("林光江", address); context.Customers.Add(c); context.SaveChanges(); customerID = c.ID; #endregion #region 初始化供应商 SupplierClass sc = SupplierClass.Create("配件供应商"); context.SupplierClasses.Add(sc); sc = SupplierClass.Create("煤碳供应商"); context.SupplierClasses.Add(sc); SupplierClass gpsc = SupplierClass.Create("坯料供应商"); context.SupplierClasses.Add(gpsc); address = Address.Create(county, "漳州"); Supplier s = Supplier.Create("三宝", gpsc.ID, address); context.Suppliers.Add(s); address = Address.Create(county, "罗源"); s = Supplier.Create("亿鑫", gpsc.ID, address); context.Suppliers.Add(s); address = Address.Create(county, "松下镇"); s = Supplier.Create("大东海", gpsc.ID, address); context.Suppliers.Add(s); address = Address.Create(county, "吴航镇"); s = Supplier.Create("锦强", sc.ID, address); context.Suppliers.Add(s); context.SaveChanges(); supplierID = s.ID; #endregion #region 初始化交易账户 TradeAccount ta = TradeAccount.Create("宏建", TradeAccountType.SupplierAndCustomer, "13900000000", ""); context.TradeAccounts.Add(ta); ta = TradeAccount.Create("富鑫", TradeAccountType.SupplierAndCustomer, "13900000001", ""); context.TradeAccounts.Add(ta); ta = TradeAccount.Create("江水金", TradeAccountType.Customer, "13900000003", ""); context.TradeAccounts.Add(ta); ta = TradeAccount.Create("陈依寿", TradeAccountType.Customer, "13900000005", ""); context.TradeAccounts.Add(ta); ta = TradeAccount.Create("永盛金属", TradeAccountType.Customer, "13900000006", ""); context.TradeAccounts.Add(ta); ta = TradeAccount.Create("永盛钢贸", TradeAccountType.Customer, "13900000006", ""); context.TradeAccounts.Add(ta); context.SaveChanges(); #endregion #region 初始化单位 Unit unit = Unit.Create("吨", 1, false, 1000); context.Units.Add(unit); unitID = unit.ID; context.Units.Add(Unit.Create("公斤", 1, true)); context.Units.Add(Unit.Create("件", 2, true)); context.SaveChanges(); #endregion #region 初始化仓位 context.Positions.Add(new Position() { Name = "新建616", Number = "616", Warehouse = "新建仓库" }); Position position = new Position() { Name = "小槽315", Number = "315", Warehouse = "小槽仓库" }; context.Positions.Add(position); positionID = position.ID; position = new Position() { Name = "坯场-1", Number = "901", Warehouse = "坯场" }; context.Positions.Add(position); position = new Position() { Name = "坯场-2", Number = "902", Warehouse = "坯场" }; context.Positions.Add(position); context.SaveChanges(); #endregion #region 初始化类别 Catagory nCatagory = Catagory.Create("钢材"); nCatagory.AddChildCatagory(Catagory.Create("槽钢") .AddChildCatagory(Catagory.Create("5#")).AddChildCatagory(Catagory.Create("6.3#")). AddChildCatagory(Catagory.Create("8#")).AddChildCatagory(Catagory.Create("10#")) .AddChildCatagory(Catagory.Create("12#")).AddChildCatagory(Catagory.Create("14#")) .AddChildCatagory(Catagory.Create("16#")).AddChildCatagory(Catagory.Create("18#")) .AddChildCatagory(Catagory.Create("20#"))) .AddChildCatagory(Catagory.Create("角钢") .AddChildCatagory(Catagory.Create("3#")).AddChildCatagory(Catagory.Create("4#")) .AddChildCatagory(Catagory.Create("5#")).AddChildCatagory(Catagory.Create("6#"))) .AddChildCatagory(Catagory.Create("工字钢") .AddChildCatagory(Catagory.Create("10#")).AddChildCatagory(Catagory.Create("12#")) .AddChildCatagory(Catagory.Create("14#")).AddChildCatagory(Catagory.Create("16#")) .AddChildCatagory(Catagory.Create("18#")).AddChildCatagory(Catagory.Create("20a#"))); context.Catagories.Add(nCatagory); nCatagory = Catagory.Create("坯料").AddChildCatagory(Catagory.Create("连铸坯")); context.Catagories.Add(nCatagory); nCatagory = Catagory.Create("镀锌板管") .AddChildCatagory(Catagory.Create("方管").AddChildCatagory(Catagory.Create("16方")).AddChildCatagory(Catagory.Create("20方")).AddChildCatagory(Catagory.Create("32方"))) .AddChildCatagory(Catagory.Create("矩形管").AddChildCatagory(Catagory.Create("20*40")).AddChildCatagory(Catagory.Create("30*50")).AddChildCatagory(Catagory.Create("40*60"))) .AddChildCatagory(Catagory.Create("圆管").AddChildCatagory(Catagory.Create("2寸")).AddChildCatagory(Catagory.Create("3寸")).AddChildCatagory(Catagory.Create("4寸"))); context.Catagories.Add(nCatagory); nCatagory = Catagory.Create("轧辊"); context.Catagories.Add(nCatagory); context.SaveChanges(); #endregion #region 初始化产品 Product product = null; Catagory associatedCatagory = context.Catagories.FirstOrDefault(p => p.Name == "5#"); for (int i = 13; i < 30; i = i + 2) { product = Product.Create(associatedCatagory.Name + i.ToString() + "-" + (i + 1).ToString() + "Kg", associatedCatagory.Name + i.ToString() + "-" + (i + 1).ToString() + "Kg", "系统创建", PricingMethod.PricingByWeight, 2000, unitID); product.SetCatagory(associatedCatagory); context.Products.Add(product); } associatedCatagory = context.Catagories.FirstOrDefault(p => p.Name == "6.3#"); for (int i = 15; i < 38; i = i + 2) { product = Product.Create(associatedCatagory.Name + i.ToString() + "-" + (i + 1).ToString() + "Kg", associatedCatagory.Name + i.ToString() + "-" + (i + 1).ToString() + "Kg", "系统创建", PricingMethod.PricingByWeight, 2000, unitID); product.SetCatagory(associatedCatagory); context.Products.Add(product); } associatedCatagory = context.Catagories.FirstOrDefault(p => p.Name == "8#"); for (int i = 17; i < 48; i = i + 2) { product = Product.Create(associatedCatagory.Name + i.ToString() + "-" + (i + 1).ToString() + "Kg", associatedCatagory.Name + i.ToString() + "-" + (i + 1).ToString() + "Kg", "系统创建", PricingMethod.PricingByWeight, 2000, unitID); product.SetCatagory(associatedCatagory); context.Products.Add(product); } foreach (Catagory childCatagory in context.Catagories.FirstOrDefault(p => p.Name == "工字钢").Children) { product = Product.Create(childCatagory.Name + "下偏3-5%", childCatagory.Name + "下偏3-5%", "系统创建", PricingMethod.PricingByWeight, 2000, unitID); product.SetCatagory(childCatagory); context.Products.Add(product); product = Product.Create(childCatagory.Name + "下偏8-10%", childCatagory.Name + "下偏8-10%", "系统创建", PricingMethod.PricingByWeight, 2000, unitID); product.SetCatagory(childCatagory); context.Products.Add(product); product = Product.Create(childCatagory.Name + "下偏18-20%", childCatagory.Name + "下偏18-20%", "系统创建", PricingMethod.PricingByWeight, 2000, unitID); product.SetCatagory(childCatagory); context.Products.Add(product); } associatedCatagory = context.Catagories.FirstOrDefault(p => p.Name == "连铸坯"); product = Product.Create("150*150", "150*150连铸坯", "系统创建", PricingMethod.PricingByWeight, 2000, unitID); product.SetCatagory(associatedCatagory); context.Products.Add(product); product = Product.Create("120*120", "120*120连铸坯", "系统创建", PricingMethod.PricingByWeight, 2000, unitID); product.SetCatagory(associatedCatagory); context.Products.Add(product); context.SaveChanges(); #endregion #region 初始化SKU ProductSku sku = null; foreach (Product p in context.Products.Where(p => p.Catagory.Name == "5#")) { //sku = ProductSku.Create(p, "6米*144条", "系统初始化"); sku = ProductSku.Create(p.ID, p.Name + " " + "6米*144条", "系统初始化", "", true, "", 3800, 2.3m, 0, 0); context.ProductSkus.Add(sku); } gcSkuID = sku.ID; foreach (Product p in context.Products.Where(p => p.Catagory.Name == "6.3#")) { sku = ProductSku.Create(p.ID, p.Name + " " + "6米*96条", "系统初始化", "", true, "", 3800, 2.3m, 0, 0); //sku = ProductSku.Create(p, "6米*96条", "系统初始化"); context.ProductSkus.Add(sku); } foreach (Product p in context.Products.Where(p => p.Catagory.Name == "8#")) { sku = ProductSku.Create(p.ID, p.Name + " " + "6米*84条", "系统初始化", "", true, "", 3800, 3.6m, 0, 0); //sku = ProductSku.Create(p, "6米*84条", "系统初始化"); context.ProductSkus.Add(sku); sku = ProductSku.Create(p.ID, p.Name + " " + "6米*64条", "系统初始化", "", true, "", 3800, 3.6m, 0, 0); //sku = ProductSku.Create(p, "9米*64条", "系统初始化"); context.ProductSkus.Add(sku); } // foreach (Product p in context.Products.Where(p => p.Catagory.Name == "连铸坯")) // { // sku = ProductSku.Create(p.ID, p.Name + " " + "6米", "系统初始化", "", false); // //sku = ProductSku.Create(p, "6米", "系统初始化"); // context.ProductSkus.Add(sku); // sku = ProductSku.Create(p.ID, p.Name + " " + "12米", "系统初始化", "", false); // //sku = ProductSku.Create(p, "12米", "系统初始化"); // context.ProductSkus.Add(sku); // } var gp = context.Products.FirstOrDefault(p => p.Name == "150*150"); var newSku = ProductSku.Create(gp.ID, "亿鑫150*150*12M", "", "9001", false); context.ProductSkus.Add(newSku); gpSkuID = newSku.ID; newSku = ProductSku.Create(gp.ID, "大东海150*150*12M", "", "9002", false); context.ProductSkus.Add(newSku); newSku = ProductSku.Create(gp.ID, "春兴150*150*12M", "", "9003", false); context.ProductSkus.Add(newSku); newSku = ProductSku.Create(gp.ID, "东华150*150*12M", "", "9003", false); context.ProductSkus.Add(newSku); context.SaveChanges(); #endregion }
private async Task <FileStatus> ProcessAcctStatusReportFileReport(ImportedFile file, string nameBaseNode, string sqlLikeExpression, Stream stream) { if (stream == null || stream.Length == 0) { return(await Task.FromResult(FileStatus.Failed)); } var tradeAccountsForAdding = new List <TradeAccount>(); var tradeAccountsForUpdating = new List <TradeAccount>(); if (stream.Position > 0) { stream.Position = 0; } var document = XDocument.Load(stream); var elements = document.Element(nameBaseNode)?.Element("Accounts")?.Elements("Account").ToList(); if (elements != null && elements.Any()) { elements.ForEach(e => { try { var tradeAccount = new TradeAccount { AccountName = _fileNameMatcher.GetCorrectAccountId(e.Attribute(XName.Get("id"))?.Value), MasterAccountId = file.MasterAccountId, AccountAlias = e.Attribute(XName.Get("alias"))?.Value, DateOpened = DateHelper.ParseDateTime(e.Attribute(XName.Get("date_opened"))?.Value), DateClosed = DateHelper.ParseDateTime(e.Attribute(XName.Get("date_closed"))?.Value), DateFunded = DateHelper.ParseDateTime(e.Attribute(XName.Get("date_funded"))?.Value), TradeStatus = e.Attribute(XName.Get("status"))?.Value, Mobile = e.Attribute(XName.Get("mobile"))?.Value }; if (_tradeAccountModel.Contains(tradeAccount.AccountName)) { tradeAccount.Id = _tradeAccountModel.GetById(tradeAccount.AccountName).Id; tradeAccount.ImportedFileId = file.Id; tradeAccountsForUpdating.Add(tradeAccount); } else { tradeAccount.ImportedFile = file; tradeAccountsForAdding.Add(tradeAccount); } } catch (Exception ex) { GlobalLogger.LogError($"Error while parsing TradeCash record. \nRow: {e}", ex, GetType().Name, true); } }); } try { _importJobRepository.AddRangeTradeAccounts(tradeAccountsForAdding); _importJobRepository.SaveChanges(); } catch (Exception ex) { GlobalLogger.LogError($"Error while adding TradeAccount records to DB.", ex, GetType().Name, true); return(await Task.FromResult(FileStatus.Failed)); } foreach (var tradeAccount in tradeAccountsForUpdating) { try { _importJobRepository.AddOrUpdateTradeAccount(tradeAccount); } catch (Exception ex) { GlobalLogger.LogError($"Error while updating TradeAccount record to DB.", ex, GetType().Name, true); return(await Task.FromResult(FileStatus.Failed)); } } _importJobRepository.SaveChanges(); GlobalLogger.LogInfo($"Trade Accounts: [{tradeAccountsForAdding.Count}] added.", GetType().Name, true); GlobalLogger.LogInfo($"Trade Accounts: [{tradeAccountsForUpdating.Count}] updated.", GetType().Name, true); RefillTradeAccounts(); GC.Collect(); return(await Task.FromResult(FileStatus.Success)); }
/*private async Task<FileStatus> ProcessAcctStatusReportFileReport(ImportedFile file, string nameBaseNode, * string sqlLikeExpression, Stream stream) * { * if (stream == null || stream.Length == 0) return await Task.FromResult(FileStatus.Failed); * * * // Find last file * var nameCurrentFile = _importJobRepository.ImportedFilesQuery() * .Where(curFile => curFile.OriginalFileName.Contains(sqlLikeExpression) * && curFile.FileState == FileState.Imported && * curFile.FileStatus == FileStatus.Success && * curFile.MasterAccountId == file.MasterAccountId) * .OrderByDescending(currFile => currFile.FileCreateDate) * .FirstOrDefault(); * * // If exists the same earlier files, so it will be need compare * if (nameCurrentFile != null) * { * var streamCurrentFile = _extractFileService.ExtractFile(nameCurrentFile); * var streamNewFile = stream; * * var xDocCurrFile = XDocument.Load(streamCurrentFile); * var xDocNewFile = XDocument.Load(streamNewFile); * * // If detect new changes, else we just parsing needed information * if (!XmlHelper.CompareXml(xDocCurrFile, xDocNewFile, out var resultXml)) * return await Task.FromResult(FileStatus.Success); * * var tradeAccountForUpdating = new List<TradeAccount>(); * var tradeAccountsForAdding = new List<TradeAccount>(); * * // xDocCurrFile./ * * // Old xml * var currSource = xDocCurrFile; * var currRoot = currSource.Element(nameBaseNode)?.Element("Accounts")?.Elements("Account") * .ToList(); * * // Xml with detected changes * var newDoc = XDocument.Load(new StringReader(resultXml)); * var newRoot = newDoc.Element("xmldiff")?.Element("node")?.Element("node"); * * if (newRoot == null || currRoot == null) * return await Task.FromResult(FileStatus.Failed); * * // CHANGES * var changedAccounts = newRoot.Elements("node").ToList(); * if (changedAccounts.Any()) * { * changedAccounts.ForEach(account => * { * // existing account (account name) * var match = account.Attribute("match")?.Value; * if (match == null) return; * var indexNode = int.Parse(match) - 1; * if (indexNode >= currRoot.Count) return; * var accountName = currRoot[indexNode].Attribute("id")?.Value; * accountName = _fileNameMatcher.GetCorrectAccountId(accountName); * * var existingAccount = * _importJobRepository.GetTradeAccountById(_tradeAccountModel.GetById(accountName).Id); * var changed = false; * * // tracked fields for updating, must be with prefix @ * var trackedChangeAttributes = new[] * {"@status", "@date_opened", "@date_closed", "@alias", "@date_funded", "@mobile"}; * var changes = account.Elements("change") * .Where(c => trackedChangeAttributes.Contains(c.Attribute("match")?.Value)).ToList(); * // update fields * changes.ForEach(c => * { * var value = c.Value; * switch (c.Attribute("match")?.Value) * { * case "@status": * { * existingAccount.TradeStatus = value; * changed = true; * break; * } * case "@date_opened": * existingAccount.DateOpened = DateHelper.ParseDateTime(value); * changed = true; * break; * case "@date_closed": * existingAccount.DateClosed = DateHelper.ParseDateTime(value); * changed = true; * break; * case "@alias": * existingAccount.AccountAlias = value; * changed = true; * break; * case "@date_funded": * existingAccount.DateFunded = DateHelper.ParseDateTime(value); * changed = true; * break; * case "@mobile": * existingAccount.Mobile = value; * changed = true; * break; * } * }); * * // tracked fields for adding in change account * var trackedAddAttributes = new[] * {"status", "date_opened", "date_closed", "alias", "date_funded", "mobile"}; * var adds = account.Elements("add") * .Where(c => trackedAddAttributes.Contains(c.Attribute("name")?.Value)).ToList(); * adds.ForEach(add => * { * var value = add.Value; * switch (add.Attribute("name")?.Value) * { * case "status": * { * existingAccount.TradeStatus = value; * changed = true; * break; * } * case "date_opened": * existingAccount.DateOpened = DateHelper.ParseDateTime(value); * changed = true; * break; * case "date_closed": * existingAccount.DateClosed = DateHelper.ParseDateTime(value); * changed = true; * break; * case "alias": * existingAccount.AccountAlias = value; * changed = true; * break; * case "date_funded": * existingAccount.DateFunded = DateHelper.ParseDateTime(value); * changed = true; * break; * case "mobile": * existingAccount.Mobile = value; * changed = true; * break; * } * }); * * if (changed) * { * tradeAccountForUpdating.Add(existingAccount); * } * }); * } * * // NEW ACCOUNTS * var addedNodes = newRoot.Elements("add").ToList(); * * if (addedNodes.Any()) * { * // New accounts between exists * var addedAccountBetween = addedNodes.Where(node => * node.Attributes().Any(attr => attr.Name == "name" && attr.Value == "Account")).ToList(); * * if (addedAccountBetween.Any()) * { * addedAccountBetween.ForEach(account => * { * var xElements = account.Elements("add").ToList(); * var newTradeAccount = new TradeAccount * { * AccountName = XmlHelper.GetValueBetweenAdded(xElements, "id"), * MasterAccountId = file.MasterAccountId, * DateOpened = * DateHelper.ParseDateTime(XmlHelper.GetValueBetweenAdded(xElements, "date_opened")), * DateClosed = * DateHelper.ParseDateTime(XmlHelper.GetValueBetweenAdded(xElements, "date_closed")), * AccountAlias = XmlHelper.GetValueBetweenAdded(xElements, "alias"), * DateFunded = * DateHelper.ParseDateTime(XmlHelper.GetValueBetweenAdded(xElements, "date_funded")), * TradeStatus = XmlHelper.GetValueBetweenAdded(xElements, "status"), * Mobile = XmlHelper.GetValueBetweenAdded(xElements, "mobile") * }; * * tradeAccountsForAdding.Add(newTradeAccount); * }); * } * * var addedAccountsBlocks = addedNodes.Where(node => !node.HasAttributes).ToList(); * * if (addedAccountsBlocks.Any()) * { * var addedAccounts = new List<XElement>(); * addedAccountsBlocks.Select(block => block.Elements("Account")).ToList().ForEach(list => * { * var xElements = list.ToList(); * if (xElements.Any()) * { * addedAccounts.AddRange(xElements); * } * }); * if (addedAccounts.Any()) * { * addedAccounts.ForEach(account => * { * var newTradeAccount = new TradeAccount * { * AccountName = account.Attribute("id")?.Value, * MasterAccountId = file.MasterAccountId, * DateOpened = DateHelper.ParseDateTime(account.Attribute("date_opened")?.Value), * DateClosed = DateHelper.ParseDateTime(account.Attribute("date_closed")?.Value), * AccountAlias = account.Attribute("alias")?.Value, * DateFunded = DateHelper.ParseDateTime(account.Attribute("date_funded")?.Value), * TradeStatus = account.Attribute("status")?.Value, * Mobile = account.Attribute("mobile")?.Value * }; * * tradeAccountsForAdding.Add(newTradeAccount); * }); * } * } * * { * var counter = 0; * tradeAccountForUpdating.ForEach(acc => * { * try * { * if (_tradeAccountModel.Contains(acc.AccountName)) * { * _importJobRepository.UpdateTradeAccount(acc); * } * } * catch (Exception ex) * { * loggerException.Error( * this.GetErrorLogMessage( * $"Error while updating exists trade account {acc.AccountName}")); * loggerException.Error(this.GetErrorLogMessage(ex)); * Console.WriteLine( * $"ImportJob: Error while updating exists trade account {acc.AccountName}"); * return; * } * * if (counter % 100 == 0) * { * Console.WriteLine( * $"Handled {counter} of {tradeAccountForUpdating.Count} trade accounts records and updated"); * logger.Log(LogLevel.Info, * $"import$ Handled {counter} of {tradeAccountForUpdating.Count} trade accounts records and updated"); * } * ++counter; * // logger.Log(LogLevel.Info, * // $"import$ImportJob: Trade account {acc.AccountName} has been updated"); * // Console.WriteLine($"ImportJob: Trade account {acc.AccountName} has been updated"); * }); * } * * { * var counter = 0; * tradeAccountsForAdding.ForEach(acc => * { * try * { * if (!_tradeAccountModel.Contains(acc.AccountName)) * { * _importJobRepository.AddTradeAccount(acc); * } * else * { * var yetExistingErrorAcc = * _importJobRepository.GetTradeAccountById(_tradeAccountModel * .GetById(acc.AccountName) * .Id); * yetExistingErrorAcc.TradeStatus = acc.TradeStatus; * yetExistingErrorAcc.DateOpened = acc.DateOpened; * yetExistingErrorAcc.DateClosed = acc.DateClosed; * yetExistingErrorAcc.AccountAlias = acc.AccountAlias; * yetExistingErrorAcc.MasterAccountId = acc.MasterAccountId; * yetExistingErrorAcc.DateFunded = acc.DateFunded; * yetExistingErrorAcc.Mobile = acc.Mobile; * * _importJobRepository.UpdateTradeAccount(yetExistingErrorAcc); * * // logger.Log(LogLevel.Info, * // $"import$ImportJob: Trade account {acc.AccountName} has been updated"); * // Console.WriteLine($"ImportJob: Trade account {acc.AccountName} has been updated"); * } * } * catch (Exception ex) * { * loggerException.Error( * this.GetErrorLogMessage($"Error while adding new trade account {acc.AccountName}")); * loggerException.Error(this.GetErrorLogMessage(ex)); * Console.WriteLine($"ImportJob: Error while adding new trade account {acc.AccountName}"); * return; * } * * if (counter % 100 == 0) * { * Console.WriteLine( * $"Handled {counter} of new {tradeAccountsForAdding.Count} trade accounts records and added"); * logger.Log(LogLevel.Info, * $"import$ Handled {counter} of new {tradeAccountsForAdding.Count} trade accounts records and added"); * } * ++counter; * * // logger.Log(LogLevel.Info, $"import$ImportJob: Trade account {acc.AccountName} has been added"); * // Console.WriteLine($"ImportJob: Trade account {acc.AccountName} has been added"); * }); * } * * _importJobRepository.Save(); * * RefillTradeAccounts(); * * return await Task.FromResult(FileStatus.Success); * } * } * * // If name current file is null it means that database is empty * var pathNewFile = stream; * var xDoc = XDocument.Load(pathNewFile); * var xRoot = xDoc.Element(nameBaseNode)?.Element("Accounts"); * * if (xRoot == null) return await Task.FromResult(FileStatus.Failed); * * var newAccounts = new List<TradeAccount>(); * var accounts = xRoot.Elements("Account").ToList(); * * accounts.ForEach(account => * { * var newTradeAccount = new TradeAccount * { * AccountName = account.Attribute("id")?.Value, * MasterAccountId = file.MasterAccountId, * DateOpened = DateHelper.ParseDateTime(account.Attribute("date_opened")?.Value), * DateClosed = DateHelper.ParseDateTime(account.Attribute("date_closed")?.Value), * AccountAlias = account.Attribute("alias")?.Value, * DateFunded = DateHelper.ParseDateTime(account.Attribute("date_funded")?.Value), * TradeStatus = account.Attribute("status")?.Value, * Mobile = account.Attribute("mobile")?.Value * }; * * newAccounts.Add(newTradeAccount); * }); * * { * var counter = 0; * * newAccounts.ForEach(acc => * { * try * { * if (!_tradeAccountModel.Contains(acc.AccountName)) * { * _importJobRepository.AddTradeAccount(acc); * } * else * { * var yetExistingErrorAcc = * _importJobRepository.GetTradeAccountById(_tradeAccountModel.GetById(acc.AccountName) * .Id); * yetExistingErrorAcc.TradeStatus = acc.TradeStatus; * yetExistingErrorAcc.DateOpened = acc.DateOpened; * yetExistingErrorAcc.DateClosed = acc.DateClosed; * yetExistingErrorAcc.AccountAlias = acc.AccountAlias; * yetExistingErrorAcc.MasterAccountId = acc.MasterAccountId; * yetExistingErrorAcc.DateFunded = acc.DateFunded; * yetExistingErrorAcc.Mobile = acc.Mobile; * * _importJobRepository.UpdateTradeAccount(yetExistingErrorAcc); * * logger.Log(LogLevel.Info, * $"import$ImportJob: Trade account {acc.AccountName} has been updated"); * Console.WriteLine($"ImportJob: Trade account {acc.AccountName} has been updated"); * } * } * catch (Exception ex) * { * loggerException.Error( * this.GetErrorLogMessage($"Error while adding new trade account {acc.AccountName}.")); * loggerException.Error(this.GetErrorLogMessage(ex)); * Console.WriteLine($"ImportJob: Error while adding new trade account {acc.AccountName}"); * return; * } * * if (counter % 100 == 0) * { * Console.WriteLine($"Handled {counter} of {newAccounts.Count} trade account records"); * logger.Log(LogLevel.Info, * $"import$ Handled {counter} of {newAccounts.Count} trade account records"); * } * ++counter; * // logger.Log(LogLevel.Info, $"import$ImportJob: Trade account {acc.AccountName} has been added"); * // Console.WriteLine($"ImportJob: Trade account {acc.AccountName} has been added"); * }); * } * * _importJobRepository.Save(); * * RefillTradeAccounts(); * * logger.Log(LogLevel.Info, * $"import$ImportJob: {accounts.Count()} accounts have been detected and added"); * Console.WriteLine($"ImportJob: {accounts.Count()} accounts have been detected and added"); * * * return await Task.FromResult(FileStatus.Success); * }*/ private async Task <FileStatus> ProcessAcctStatusReportFileReport(ImportedFile file, string nameBaseNode, string sqlLikeExpression, Stream stream) { if (stream == null || stream.Length == 0) { return(await Task.FromResult(FileStatus.Failed)); } var tradeAccounts = new List <TradeAccount>(); if (stream.Position > 0) { stream.Position = 0; } var document = XDocument.Load(stream); var elements = document.Element(nameBaseNode)?.Element("Accounts")?.Elements("Account").ToList(); if (elements != null && elements.Any()) { elements.ForEach(e => { try { var newTradeAccount = new TradeAccount { AccountName = _fileNameMatcher.GetCorrectAccountId(e.Attribute(XName.Get("id"))?.Value), MasterAccountId = file.MasterAccountId, AccountAlias = e.Attribute(XName.Get("alias"))?.Value, DateOpened = DateHelper.ParseDateTime(e.Attribute(XName.Get("date_opened"))?.Value), DateClosed = DateHelper.ParseDateTime(e.Attribute(XName.Get("date_closed"))?.Value), DateFunded = DateHelper.ParseDateTime(e.Attribute(XName.Get("date_funded"))?.Value), TradeStatus = e.Attribute(XName.Get("status"))?.Value, Mobile = e.Attribute(XName.Get("mobile"))?.Value }; tradeAccounts.Add(newTradeAccount); } catch (Exception ex) { Console.WriteLine($"Error while parsing TradeCash record. \nRow: {e} \nException: {ex}"); loggerException.Error(this.GetErrorLogMessage(ex)); } }); } { var counter = 0; var newAccCounter = 0; var updatingAccCounter = 0; foreach (var tradeAccount in tradeAccounts) { try { if (_tradeAccountModel.Contains(tradeAccount.AccountName)) { var existingAccount = _importJobRepository.GetTradeAccountByAccountName(tradeAccount.AccountName); existingAccount.AccountAlias = tradeAccount.AccountAlias; existingAccount.DateOpened = tradeAccount.DateOpened; existingAccount.DateClosed = tradeAccount.DateClosed; existingAccount.DateFunded = tradeAccount.DateFunded; existingAccount.TradeStatus = tradeAccount.TradeStatus; existingAccount.Mobile = tradeAccount.Mobile; ++updatingAccCounter; } else { _importJobRepository.AddOrUpdateTradeAccount(tradeAccount); ++newAccCounter; } if (counter % 100 == 0) { Console.WriteLine( $"ImportJob: Handled {counter} of {tradeAccounts.Count} trade accounts records"); logger.Log(LogLevel.Info, $"import$ImportJob: Handled {counter} of {tradeAccounts.Count} trade accounts records"); _importJobRepository.SaveChanges(); } } catch (Exception ex) { Console.WriteLine($"Error while adding TradeAccount record to DB. Exception: {ex}"); loggerException.Error(this.GetErrorLogMessage(ex)); } counter++; } Console.WriteLine($"ImportJob: {newAccCounter} trade accounts have been added"); logger.Log(LogLevel.Info, $"import$ImportJob: {newAccCounter} trade accounts have been added"); Console.WriteLine($"ImportJob: {updatingAccCounter} trade accounts have been updated"); logger.Log(LogLevel.Info, $"import$ImportJob: {updatingAccCounter} trade accounts have been updated"); } _importJobRepository.SaveChanges(); RefillTradeAccounts(); GC.Collect(); return(await Task.FromResult(FileStatus.Success)); }
public async Task <bool> UpdateTradeAccount(TradeAccount tradeAccount, int id) { try { int result = -1; using (MySqlConnection connection = Connection) { // update TradeStratiegies var stratQ = @"UPDATE TradeStrategies SET BlueChip=@bluechip, LongTerm=@longterm, Swing=@swing, Scalp=@scalp, Day=@day WHERE Id = @stratID"; var @stratP = new { bluechip = tradeAccount.Preference.TradeStrategy.BlueChip, longterm = tradeAccount.Preference.TradeStrategy.LongTerm, swing = tradeAccount.Preference.TradeStrategy.Swing, scalp = tradeAccount.Preference.TradeStrategy.Scalp, day = tradeAccount.Preference.TradeStrategy.Day, stratId = tradeAccount.Preference.TradeStrategy.Id }; connection.Open(); result = await connection.ExecuteAsync(stratQ, @stratP); // Updateat Sectors var secQ = "UPDATE Sectors SET InformationTechnology=@infoTech, HealthCare=@healthCare, Financials=@fin, ConsumerDiscretionary=@consumeD, Communication=@comm, Industrials=@indust, ConsumerStaples=@consumS, Energy=@energy, Utilities=@util, RealEstate=@realE, Materials=@mat WHERE Id=@secId"; var @secP = new { infoTech = tradeAccount.Preference.Sector.InformationTechnology, healthCare = tradeAccount.Preference.Sector.HealthCare, fin = tradeAccount.Preference.Sector.Financials, consumeD = tradeAccount.Preference.Sector.ConsumerDiscretionary, comm = tradeAccount.Preference.Sector.Communication, indust = tradeAccount.Preference.Sector.Industrials, consumS = tradeAccount.Preference.Sector.ConsumerStaples, energy = tradeAccount.Preference.Sector.Energy, util = tradeAccount.Preference.Sector.Utilities, realE = tradeAccount.Preference.Sector.RealEstate, mat = tradeAccount.Preference.Sector.Materials, secId = tradeAccount.Preference.Sector.Id }; result = await connection.ExecuteAsync(secQ, @secP); // Update Preference var prefQ = @"UPDATE Preference SET CapitalToRisk=@capital WHERE Id=@prefId"; var @prefP = new { capital = tradeAccount.Preference.CapitalToRisk, prefId = tradeAccount.Preference.Id }; result = await connection.ExecuteAsync(prefQ, @prefP); // Update TradeAccount var tradeQ = @"UPDATE TradeAccount SET Title=@title, Description=@desc, Amount=@amount, Profit=@profit, Loss=@loss, Net=@net, NumTrades=@numTrades, NumSTrades=@numSTrades, NumFTrades=@numFTrades, Invested=@invested, Cash=@cash, DateModified=@dateModified WHERE Id=@tId"; var @tradeP = new { title = tradeAccount.Title, desc = tradeAccount.Description, amount = tradeAccount.Amount, profit = tradeAccount.Profit, loss = tradeAccount.Loss, net = tradeAccount.Net, numTrades = tradeAccount.NumTrades, numSTrades = tradeAccount.NumSTrades, numFTrades = tradeAccount.NumFTrades, invested = tradeAccount.Invested, cash = tradeAccount.Cash, dateModified = DateTime.Now, tId = tradeAccount.Id }; result = await connection.ExecuteAsync(tradeQ, @tradeP); } return(result > 0); } catch (Exception err) { Console.WriteLine(TAG + err); return(false); } }
public async Task <bool> InsertTradeAccount(TradeAccount ta) { try { int result = -1; using (MySqlConnection connection = Connection) { // Add entry to TradeStratiegies var stratQ = @"INSERT INTO TradeStrategies (BlueChip, LongTerm, Swing, Scalp, Day) VALUES (@bluechip, @longterm, @swing, @scalp, @day)"; var @stratP = new { bluechip = ta.Preference.TradeStrategy.BlueChip, longterm = ta.Preference.TradeStrategy.LongTerm, swing = ta.Preference.TradeStrategy.Swing, scalp = ta.Preference.TradeStrategy.Scalp, day = ta.Preference.TradeStrategy.Day, }; result = await connection.ExecuteAsync(stratQ, @stratP); // REtrieve strat id int stratId = await connection.QueryFirstOrDefaultAsync <int>("SELECT id FROM TradeStrategies ORDER BY id DESC LIMIT 1", null); // Add entry to Sectors var secQ = "INSERT INTO Sectors (InformationTechnology, HealthCare, Financials, ConsumerDiscretionary, Communication, Industrials, ConsumerStaples, Energy, Utilities, RealEstate, Materials) VALUES (@infoTech, @healthCare, @fin, @consumeD, @comm, @indust, @consumS, @energy, @util, @realE, @mat)"; var @secP = new { infoTech = ta.Preference.Sector.InformationTechnology, healthCare = ta.Preference.Sector.HealthCare, fin = ta.Preference.Sector.Financials, consumeD = ta.Preference.Sector.ConsumerDiscretionary, comm = ta.Preference.Sector.Communication, indust = ta.Preference.Sector.Industrials, consumS = ta.Preference.Sector.ConsumerStaples, energy = ta.Preference.Sector.Energy, util = ta.Preference.Sector.Utilities, realE = ta.Preference.Sector.RealEstate, mat = ta.Preference.Sector.Materials }; result = await connection.ExecuteAsync(secQ, @secP); // REtrieve sector id int sectorId = await connection.QueryFirstOrDefaultAsync <int>("SELECT id FROM Sectors ORDER BY id DESC LIMIT 1", null); // Add entry to Preference var prefQ = @"INSERT INTO Preference (RiskLevel, TradeStrategy, Sector, CapitalToRisk) VALUES (@risk, @strat, @sector, @capital)"; var @prefP = new { risk = ta.Preference.RiskLevel.Id, strat = stratId, sector = sectorId, capital = ta.Preference.CapitalToRisk }; connection.Open(); result = await connection.ExecuteAsync(prefQ, @prefP); // Retrieve preference id int prefId = await connection.QueryFirstOrDefaultAsync <int>("SELECT id FROM Preference ORDER BY id DESC LIMIT 1", null); // Add entry to TradeAccount var tradeQ = @"INSERT INTO TradeAccount (Portfolio, Preference, Title, Description, Amount, Profit, Loss, Net, NumTrades, NumSTrades, NumFTrades, Invested, Cash, DateCreated) VALUES (@port, @pref, @title, @desc, @amount, @profit, @loss, @net, @numTrades, @numSTrades, @numFTrades, @invested, @cash, @dateCreated)"; var @tradeP = new { port = ta.Portfolio.Id, pref = prefId, title = ta.Title, desc = ta.Description, amount = ta.Amount, profit = 0, loss = 0, net = 0, numTrades = 0, numSTrades = 0, numFTrades = 0, invested = 0, cash = ta.Cash, dateCreated = DateTime.Now }; result = await connection.ExecuteAsync(tradeQ, @tradeP); // Update portfolio var portQ = @"UPDATE Portfolio SET Cash = @cash WHERE Id=@pId"; var @portP = new { cash = ta.Portfolio.Cash - ta.Amount, pId = ta.Portfolio.Id }; result = await connection.ExecuteAsync(portQ, @portP); } return(result > 0); } catch (Exception err) { Console.WriteLine(TAG + err); return(false); } }
protected static List <TradeOpportunityRequirement> GetAccountRequirements(string requirementPrefix, ExchangeTradePair tradePair, Currency currency, out TradeAccount account) { account = tradePair.Exchange.TradeAccounts.Where(x => x.Currency == currency).SingleOrDefault(); var reqs = new List <TradeOpportunityRequirement>(); reqs.Add(new TradeOpportunityRequirement() { RequirementMet = account != null, ItemIdentifier = $"{requirementPrefix} Account - {currency.Code}", Message = account == null ? $"Account in {currency.Code} doesn't exists on {tradePair.Exchange}" : "", Timestamp = DateTime.UtcNow, TradeOpportunityRequirementTypeId = TradeOpportunityRequirementType.RequirementTypes.Where(x => x.Code == "EXC-ACC-EXIST").Single().Id, }); // if the first requirement is met, then proceed to the second one. if (reqs.First().RequirementMet) { reqs.Add(new TradeOpportunityRequirement() { RequirementMet = account.Balance > 0m, ItemIdentifier = $"{requirementPrefix} Account - {currency.Code}", Message = account.Balance <= 0m ? $"Account in {currency.Code} has zero balance on {tradePair.Exchange}" : "", Timestamp = DateTime.UtcNow, TradeOpportunityRequirementTypeId = TradeOpportunityRequirementType.RequirementTypes.Where(x => x.Code == "EXC-ACC-BAL").Single().Id, }); bool noAddress = string.IsNullOrEmpty(account.Address); reqs.Add(new TradeOpportunityRequirement() { RequirementMet = !noAddress, ItemIdentifier = $"{requirementPrefix} Account - {currency.Code}", Message = noAddress ? $"Account in {currency.Code} has no address on {tradePair.Exchange}" : "", Timestamp = DateTime.UtcNow, TradeOpportunityRequirementTypeId = TradeOpportunityRequirementType.RequirementTypes.Where(x => x.Code == "EXC-ACC-ADDR").Single().Id, }); } return(reqs); }
private void TradeAccountOnUpdated(object sender, TradeAccount e) { UpdateAll(); }
public async Task <TradeAccount> GetTradeAccount(int?tId) { try { using (MySqlConnection connection = Connection) { string sQuery = "SELECT Id, Title, Description, Amount, Profit, Loss, Net, NumTrades, NumSTrades, NumFTrades, Invested, Cash, DateCreated, DateModified FROM TradeAccount ta WHERE ta.Id = @id"; var @param = new { id = tId }; connection.Open(); TradeAccount ta = await connection.QueryFirstOrDefaultAsync <TradeAccount>(sQuery, @param); // get preference Id var prefIdQ = "SELECT Preference FROM TradeAccount WHERE Id = @id"; var @prefIdParam = new { id = tId }; int prefID = await connection.QueryFirstOrDefaultAsync <int>(prefIdQ, @prefIdParam); // get risk level id var riskIdQ = "SELECT RiskLevel FROM Preference WHERE Id = @pId"; var @riskIdParam = new { pId = prefID }; int riskId = await connection.QueryFirstOrDefaultAsync <int>(riskIdQ, @riskIdParam); // get risk level var riskQ = "SELECT Id, Risk, DateAdded FROM RiskLevels WHERE Id = @rId"; var @riskParam = new { rId = riskId }; RiskLevel riskLevel = await connection.QueryFirstOrDefaultAsync <RiskLevel>(riskQ, @riskParam); // get strat id var stratIdQ = "SELECT TradeStrategy FROM Preference WHERE Id = @pId"; var @stratIdParam = new { pId = prefID }; int stratId = await connection.QueryFirstOrDefaultAsync <int>(stratIdQ, @stratIdParam); // get trade strat var stratQ = "SELECT Id, BlueChip, LongTerm, Swing, Scalp, Day FROM TradeStrategies WHERE Id = @sId"; var @stratParam = new { sId = stratId }; TradeStrategy strategy = await connection.QueryFirstOrDefaultAsync <TradeStrategy>(stratQ, @stratParam); // get sector id var secIdQ = "SELECT Sector FROM Preference WHERE Id = @pId"; var @secIdParam = new { pId = prefID }; int secId = await connection.QueryFirstOrDefaultAsync <int>(secIdQ, @secIdParam); // get sector var secQ = "SELECT Id, InformationTechnology, HealthCare, Financials, ConsumerDiscretionary, Communication, Industrials, ConsumerStaples, Energy, Utilities, RealEstate, Materials FROM Sectors WHERE Id = @secId"; var @secParam = new { secId = secId }; Sector sector = await connection.QueryFirstOrDefaultAsync <Sector>(secQ, @secParam); // get preference var prefQ = "SELECT Id, CapitalToRisk FROM Preference WHERE Id = @pId"; var @prefParam = new { pId = prefID }; ta.Preference = await connection.QueryFirstOrDefaultAsync <Preference>(prefQ, @prefParam); ta.Preference.RiskLevel = riskLevel; ta.Preference.TradeStrategy = strategy; ta.Preference.Sector = sector; // get portfolio id var portIdQ = "SELECT Portfolio FROM TradeAccount WHERE Id = @tId"; var @portIdParam = new { tId = ta.Id }; int _portId = await connection.QueryFirstOrDefaultAsync <int>(portIdQ, @portIdParam); // get portfolio var portQ = "SELECT Id, Amount, Profit, Loss, Net, Invested, Cash FROM Portfolio WHERE Id = @portId"; var @portParam = new { portId = _portId }; Portfolio port = await connection.QueryFirstOrDefaultAsync <Portfolio>(portQ, @portParam); ta.Portfolio = port; return(ta); } } catch (Exception err) { Console.WriteLine(TAG + err); return(null); } }
public void UpdateTradeAccount(TradeAccount tradeAccount) { _dbContext.TradeAccounts.AddOrUpdate(tradeAccount); }
public TradeAccount AddOrUpdateTradeAccount(TradeAccount tradeAccount) { _dbContext.TradeAccounts.AddOrUpdate(tradeAccount); return(tradeAccount); }
public async Task <ActionResult <bool> > PostTradeAccount([FromBody] TradeAccount ta) { return(await _portfolioProvider.InsertTradeAccount(ta)); }