private static void SaveTrackInDatabase(RobotContextBacktest context, int accountId, List <BalanceChange> transfers, int transfersInDbCount) { try { Logger.InfoFormat("Сохранение изменений в БД для счета {0}", accountId); int nextPosId; using (var conn = DatabaseContext.Instance.Make()) { nextPosId = Math.Max(conn.POSITION.Max(p => p.ID), conn.POSITION_CLOSED.Max(p => p.ID)) + 1; } Logger.InfoFormat("Запись {0} позиций для счета {1}", context.PosHistory.Count, accountId); // закрытые ордера var listPos = new List <POSITION_CLOSED>(); foreach (var pos in context.PosHistory) { var orderClosed = LinqToEntity.UndecorateClosedPosition(pos); orderClosed.ID = ++nextPosId; listPos.Add(orderClosed); } using (var conn = DatabaseContext.Instance.Make()) { conn.BulkInsert(listPos); conn.SaveChanges(); } // трансферы... var listTrans = transfers.Skip(transfersInDbCount).Select(t => new BALANCE_CHANGE { AccountID = accountId, Amount = t.Amount, ChangeType = (int)t.ChangeType, ValueDate = t.ValueDate, }).ToList(); // + трансферы по закрытым ордерам foreach (var pos in listPos) { var transfer = new BALANCE_CHANGE { AccountID = accountId, Amount = Math.Abs(pos.ResultDepo), ChangeType = (int)(pos.ResultDepo >= 0 ? BalanceChangeType.Profit : BalanceChangeType.Loss), ValueDate = pos.TimeExit, Position = pos.ID, }; listTrans.Add(transfer); } using (var conn = DatabaseContext.Instance.Make()) { conn.BulkInsert(listTrans); conn.SaveChanges(); } // открытые сделки - как есть using (var conn = DatabaseContext.Instance.Make()) { foreach (var pos in context.Positions) { var orderOpened = LinqToEntity.UndecorateOpenedPosition(pos); orderOpened.ID = ++nextPosId; conn.POSITION.Add(orderOpened); } conn.SaveChanges(); } Logger.InfoFormat("Сохранение успешно для счета {0}: {1} сделок сохранено", accountId, context.PosHistory.Count + context.Positions.Count); } catch (Exception ex) { Logger.Error("Ошибка сохранения трека пользователя в БД", ex); } }
public void Setup() { // подыграть за торговый контракт SetupFakeServer(); // инициализировать словари (прежде всего - словарь тикеров) TradeSharpDictionary.Initialize(MoqTradeSharpDictionary.Mock); connection = TradeSharpConnectionPersistent.InitializeTradeSharpConnection(); // пользователь - владелец тестового сервиса var ownerUser = new PLATFORM_USER { Email = "*****@*****.**", Login = "******", Title = "Vafel", RoleMask = 0, Password = "******", RegistrationDate = DateTime.Now }; connection.PLATFORM_USER.Add(ownerUser); connection.SaveChanges(); // добавить категорию сигналов var srv = new SERVICE { FixedPrice = 0, Currency = "USD", User = ownerUser.ID }; connection.SERVICE.Add(srv); connection.SaveChanges(); serviceId = srv.ID; // добавить пользователя var user = new PLATFORM_USER { Email = "*****@*****.**", Login = "******", Password = "******", Title = "test", RegistrationDate = DateTime.Now }; connection.PLATFORM_USER.Add(user); connection.SaveChanges(); testUserId = user.ID; // добавить счет и сделок var group = connection.ACCOUNT_GROUP.First(g => !g.IsReal); var account = new ACCOUNT { AccountGroup = group.Code, Currency = AccountCurrency, Balance = 30000 }; connection.ACCOUNT.Add(account); connection.SaveChanges(); testAccountId = account.ID; // назначить пользователя владельцем счета connection.PLATFORM_USER_ACCOUNT.Add(new PLATFORM_USER_ACCOUNT { Account = testAccountId, PlatformUser = testUserId, RightsMask = (int)AccountRights.Управление }); // подписать счет на сигнал connection.SUBSCRIPTION.Add(new SUBSCRIPTION { User = testUserId, Service = serviceId, RenewAuto = true, TimeEnd = DateTime.Now.Date.AddDays(1) }); connection.SUBSCRIPTION_SIGNAL.Add(new SUBSCRIPTION_SIGNAL { User = testUserId, Service = serviceId, AutoTrade = true, PercentLeverage = 120, MinVolume = 10000, TargetAccount = testAccountId }); connection.SaveChanges(); // позиции MakeOrdersForTest(); foreach (var order in ordersForTest) { var pos = LinqToEntity.UndecorateOpenedPosition(order); connection.POSITION.Add(pos); } connection.SaveChanges(); // прописать срез котировок var nowTime = DateTime.Now; Contract.Util.BL.QuoteStorage.Instance.UpdateValues(new [] { "EURUSD", "GBPUSD", "USDJPY", "EURGBP" }, new [] { new QuoteData(1.3820f, 1.3822f, nowTime), new QuoteData(1.5350f, 1.5354f, nowTime), new QuoteData(90.81f, 90.83f, nowTime), new QuoteData(1.1107f, 1.1112f, nowTime) } ); }