public ActionResult DeleteStatsExample([DataSourceRequest] DataSourceRequest request, StatsExampleModel model) { try { if(model != null) { using(var ctx = new DataModelContext()) { var example = ctx.StatsExamples.Include("StatsType").Include("Orders").Single(e => e.Id == model.Id); example.Deleted = true; var lastOrder = example.Orders.OrderBy(o => o.Index).LastOrDefault(); if(lastOrder != null && !lastOrder.ClosePrice.HasValue) { using(var client = new OrderServiceClient()) { var response = client.GetPrice(new GetPriceDataContractRequest {SymbolId = example.StatsType.TypeId}); if(!string.IsNullOrEmpty(response.Error)) { LogManager.GetCurrentClassLogger().Error(response.Error); } var price = response.Price; if(price.HasValue) { var typeConfig = ((TransactionTypesConfigSection)ConfigurationManager.GetSection("TransactionTypesConfig")).Types.Cast<TypeElementConfig>().ToList().Single(tc => tc.Id == example.StatsType.TypeId); lastOrder.ClosePrice = lastOrder.OrderType == OrderTypes.Buy ? Math.Round(price.Value - Settings.Default.Spread * typeConfig.SpreadTickValue, HomeController.GetDecimalDigits(typeConfig.SpreadTickValue)) : Math.Round(price.Value + Settings.Default.Spread * typeConfig.SpreadTickValue, HomeController.GetDecimalDigits(typeConfig.SpreadTickValue)); lastOrder.Pips = Convert.ToInt32(Math.Round((lastOrder.OrderType == OrderTypes.Buy ? (lastOrder.ClosePrice.Value - lastOrder.OpenPrice) : (lastOrder.OpenPrice - lastOrder.ClosePrice.Value)) / typeConfig.SpreadTickValue, 0)); // Log var log = OrderLog.CreateLog(lastOrder, OrderLogTypes.Close); ctx.OrderLogs.Add(log); } } } // ctx.SaveChanges(); } } } catch(Exception ex) { LogManager.GetCurrentClassLogger().Error(ex); } // return this.Json(new[] {model}.ToDataSourceResult(request, this.ModelState)); }
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); } } }