protected void Application_Start() { try { _logger.Info("App is starting..."); // AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); // DB Database.SetInitializer(new CreateDatabaseIfNotExists<DataModelContext>()); var ctx = new DataModelContext(); try { _logger.Info("Database inited. Version: {0}", ctx.GetDbVersion()); _logger.Info("Transactions count: {0}", this.Application["TransactionsCount"] = ctx.GetTransactionsCount()); } finally { ctx.Dispose(); } // StatsExample.ValidPeriod = Settings.Default.ExampleValidPeriod; // _logger.Info("App started."); } catch(Exception ex) { _logger.Error(ex); throw; } }
public static bool Start() { try { // DB init _logger.Info("Database initialization started..."); Database.SetInitializer(new MigrateDatabaseToLatestVersion<DataModelContext, Configuration>()); var ctx = new DataModelContext(); try { _logger.Info("Database inited. Version: {0}", ctx.GetDbVersion()); _logger.Info("Transactions count: {0}", ctx.GetTransactionsCount()); } finally { ctx.Dispose(); } // StatsExample.ValidPeriod = Settings.Default.ExampleValidPeriod; // Start WCF hosts StartHosts(); // Start schedulers StartSchedulers(); // PricesProvider.Start(); OrderManager.Start(); // return true; } catch(Exception ex) { _logger.Info(string.Format("Error while starting server: {0}", ex)); // Stop(); // return false; } }
public JsonResult GetPrice(string id, long exampleId, int openOrdersFlags, int closeOrdersFlags) { using(var ctx = new DataModelContext()) { using(var client = new OrderServiceClient()) { var orders = ctx.Orders.Where(o => o.StatsExampleId == exampleId).OrderBy(o => o.Index).ToList(); var idxsForReload = new List<int>(); // Check orders state foreach(var order in orders) { if(((openOrdersFlags >> order.Index) & 1) == 0) { idxsForReload.Add(order.Index); continue; } if(order.ClosePrice.HasValue && ((closeOrdersFlags >> order.Index) & 1) == 0) idxsForReload.Add(order.Index); } var lastOrder = orders.LastOrDefault(); if(lastOrder != null && lastOrder.ClosePrice.HasValue && idxsForReload.Contains(lastOrder.Index) && lastOrder.Index < ctx.GetTransactionsCount() - 1 && !idxsForReload.Contains(lastOrder.Index + 1)) idxsForReload.Add(lastOrder.Index + 1); // var response = client.GetPrice(new GetPriceDataContractRequest {SymbolId = id}); if(response.MarketIsClosed) return this.Json(new {MarketIsClosed = true}, JsonRequestBehavior.AllowGet); // return this.Json(new { response.Price, TotalPips = orders.Count == 0 ? 0 : orders.Sum(o => o.Pips), IdxsForReload = idxsForReload }, JsonRequestBehavior.AllowGet); } } }
public static SetOrderResponse CreateOrder(long exampleId, OrderTypes orderType, double? takeProfit, double? stopLoss) { using(var ctx = new DataModelContext()) { var example = ctx.StatsExamples.Include("StatsType").Include("Orders").Single(e => e.Id == exampleId); // Check if example is not valid if(!example.IsValid) { return new SetOrderResponse {Error = SetOrderErrors.Other}; } // var index = example.Orders.Count; if(index >= ctx.GetTransactionsCount()) return new SetOrderResponse {Error = SetOrderErrors.Other}; // var price = PricesProvider.GetPrice(example.StatsType.TypeId); if(!price.HasValue) return new SetOrderResponse {Error = SetOrderErrors.PriceError}; // var buyPrice = PricesProvider.GetBuyPrice(price.Value, example.StatsType.TypeId); var sellPrice = PricesProvider.GetSellPrice(price.Value, example.StatsType.TypeId); if(orderType == OrderTypes.Buy) { var error = SetOrderErrors.None; // Check take profit value if(takeProfit.HasValue && takeProfit.Value <= sellPrice) error |= SetOrderErrors.WrongTakeProfitValue; // Check Stop loss value if(stopLoss.HasValue && stopLoss.Value >= sellPrice) error |= SetOrderErrors.WrongStopLossValue; // if(error != SetOrderErrors.None) return new SetOrderResponse {Error = error}; // Create order var order = new Order { OpenPrice = buyPrice, Index = index, OrderType = orderType, StatsExampleId = exampleId, TakeProfit = takeProfit, StopLoss = stopLoss }; ctx.Orders.Add(order); // log var log = OrderLog.CreateLog(order, OrderLogTypes.Open); ctx.OrderLogs.Add(log); // ctx.SaveChanges(); // lock(_openOrders) { _openOrders.Add(new OpenOrder { SymbolId = example.StatsType.TypeId, Order = order }); } // LogManager.GetCurrentClassLogger().Debug("Order created [0]", order.Id); // return new SetOrderResponse {Order = order, Error = SetOrderErrors.None}; } else { var error = SetOrderErrors.None; // Check take profit value if(takeProfit.HasValue && takeProfit.Value >= buyPrice) error |= SetOrderErrors.WrongTakeProfitValue; // Check Stop loss value if(stopLoss.HasValue && stopLoss.Value <= buyPrice) error |= SetOrderErrors.WrongStopLossValue; // if(error != SetOrderErrors.None) return new SetOrderResponse {Error = error}; // Create order var order = new Order { OpenPrice = sellPrice, Index = index, OrderType = orderType, StatsExampleId = exampleId, TakeProfit = takeProfit, StopLoss = stopLoss }; ctx.Orders.Add(order); // log var log = OrderLog.CreateLog(order, OrderLogTypes.Open); ctx.OrderLogs.Add(log); // ctx.SaveChanges(); // lock(_openOrders) { _openOrders.Add(new OpenOrder { SymbolId = example.StatsType.TypeId, Order = order }); } // LogManager.GetCurrentClassLogger().Debug("Order created [0]", order.Id); // return new SetOrderResponse {Order = order, Error = SetOrderErrors.None}; } } }
public ActionResult Index(string id) { using(var ctx = new DataModelContext()) { this.ViewBag.IdLink = id; // var statsExample = ctx.StatsExamples.Include("Orders").Include("StatsType").Include("Orders.Logs").SingleOrDefault(e => e.IdLink == id && !e.Deleted); if(statsExample == null) return this.RedirectToAction("NotFoundExample"); this.ViewData["StatsTypeName"] = statsExample.StatsType.Name; var typeConfig = ((TransactionTypesConfigSection)ConfigurationManager.GetSection("TransactionTypesConfig")).Types.Cast<TypeElementConfig>().ToList().Single(tc => tc.Id == statsExample.StatsType.TypeId); this.ViewBag.Symbol = typeConfig.Id; this.ViewBag.Spread = Settings.Default.Spread; this.ViewBag.SpreadTickValue = typeConfig.SpreadTickValue; this.ViewBag.DecimalDigits = GetDecimalDigits(typeConfig.SpreadTickValue); this.ViewBag.ExampleId = statsExample.Id; this.ViewBag.ExampleIsValid = statsExample.IsValid; // var models = statsExample.Orders.OrderBy(o => o.Index).Select(o => (TransactionModel)o).ToList(); var transactionsCount = ctx.GetTransactionsCount(); if(transactionsCount > models.Count) { for(var idx = models.Count; idx < transactionsCount; idx++) { models.Add(new TransactionModel { StatsExampleId = statsExample.Id, Index = idx, Active = idx == 0 || (models[idx - 1].BuyPrice.HasValue && models[idx - 1].SellPrice.HasValue), BuyEnabled = idx == 0 || (models[idx - 1].BuyPrice.HasValue && models[idx - 1].SellPrice.HasValue), SellEnabled = idx == 0 || (models[idx - 1].BuyPrice.HasValue && models[idx - 1].SellPrice.HasValue), ExampleIsValid = statsExample.IsValid }); } } // return this.View(models); } }