Exemple #1
0
        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)
            }
                                                                );
        }