Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
 private static TradeAccountModel ToTradeAccountModel(TradeAccount dto)
 {
     return(new TradeAccountModel
     {
         Id = dto.Id,
         AccountName = dto.AccountName,
         AccountAlias = dto.AccountAlias
     });
 }
Ejemplo n.º 6
0
        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);
        }
Ejemplo n.º 7
0
        public TradeAccount ChangeTradeRank(TradeAccount account)
        {
            var dto = GetById(account.Id);

            if (dto == null)
            {
                return(null);
            }
            dto.TradeRank = account.TradeRank;
            _dbContext.SaveChanges();
            return(dto);
        }
Ejemplo n.º 8
0
        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);
        }
Ejemplo n.º 9
0
        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);
        }
Ejemplo n.º 10
0
        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);
        }
Ejemplo n.º 11
0
        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);
        }
Ejemplo n.º 12
0
        /// <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();
        }
Ejemplo n.º 13
0
 /// <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;
         }
     }
 }
Ejemplo n.º 14
0
        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);
            }
        }
Ejemplo n.º 15
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);
            });
        }
Ejemplo n.º 16
0
        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);
            });
        }
Ejemplo n.º 19
0
            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
            }
Ejemplo n.º 20
0
        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));
        }
Ejemplo n.º 22
0
        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);
            }
        }
Ejemplo n.º 23
0
        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);
            }
        }
Ejemplo n.º 24
0
        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);
        }
Ejemplo n.º 25
0
 private void TradeAccountOnUpdated(object sender, TradeAccount e)
 {
     UpdateAll();
 }
Ejemplo n.º 26
0
        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);
            }
        }
Ejemplo n.º 27
0
 public void UpdateTradeAccount(TradeAccount tradeAccount)
 {
     _dbContext.TradeAccounts.AddOrUpdate(tradeAccount);
 }
Ejemplo n.º 28
0
 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));
 }