예제 #1
0
 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;
     }
 }
예제 #2
0
 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;
     }
 }
예제 #3
0
 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);
         }
     }
 }
예제 #4
0
 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};
         }
     }
 }
예제 #5
0
 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);
     }
 }