public async Task <List <Attachment> > CreateAttachmentsAsync(OrderCategory category) { var fullPath = Path.Combine(".", "Templates", "CardTemplate.json"); var adaptiveCardTemplate = File.ReadAllText(fullPath); var cards = new List <Attachment>(); var cardConfigurations = await _cardConfigurationRepository.GetItemsAsync(); if (category != OrderCategory.All) { var categoryName = category.ToString(); cardConfigurations = cardConfigurations.Where(x => categoryName.Equals(x.OrderCategory, StringComparison.OrdinalIgnoreCase)); } // AttachmentLayoutTypes.Carousel max item 10 foreach (var configuration in cardConfigurations.Take(10)) { var cardTemplate = adaptiveCardTemplate .Replace("__TitleText__", configuration.TitleText) .Replace("__OrderType__", configuration.OrderType) .Replace("__OrderCategory__", configuration.OrderCategory) .Replace("__Description__", configuration.Description) .Replace("__ImageUrl__", configuration.ImageUrl); cards.Add(new Attachment() { ContentType = "application/vnd.microsoft.card.adaptive", Content = JsonConvert.DeserializeObject(cardTemplate), }); } return(cards); }
/// <summary> /// 产生订单编码 /// </summary> /// <param name="category">订单类型</param> /// <param name="shopId">商户id</param> /// <returns></returns> public string GenerateOrderNumber() { int shopId = mShopOrder.ShopId; OrderCategory category = GetOrderCategory(); return(OrderCodeGenerator.Generate(category, shopId)); }
// private double GetMarketPosition() // { // return this.Environment.IsAutoTradingMode ? StrategyInfo.MarketPositionAtBrokerForTheStrategy : StrategyInfo.MarketPosition; // } // private bool GetSignalDown(double crtdr, double rsi, Trend trend) // { // if(rsi >= RsiUpMinimumForShort && trend == Trend.Down) // { // if(crtdr * 100 + rsi >= 200 - ShortLimitDown) return true; // } // // return false; // } protected override void OnOrderRejected(EOrderAction action, OrderCategory category, int quantity, double stopPrice, double limitPrice) { LogAndMail("Order rejected: {0} {1} ({2} @ {3}/{4}).", action, quantity, category, stopPrice, limitPrice); DumpFileLog(); DumpMailLog(); ExecControl.RecalcLastBarAfter(TimeSpan.FromSeconds(recalcFrequency)); // If there were no instructions from MM-signal, we will keep waiting for them. }
/// <summary> /// 产生订单编码 /// </summary> /// <param name="category">订单类型</param> /// <param name="shopId">商户id</param> /// <returns></returns> public static string Generate(OrderCategory category, int shopId) { if (shopId > 99999) { throw new Exception("商户id不能超过6位"); } string categoryStr = ((int)category).ToString("00"); string shopIdStr = shopId.ToString("000000"); string timeStr = DateTime.Now.ToString("yyMMddhh"); int count = 0; ShopDbContext shopDb = DbContextFactory.ShopDb; if (category == OrderCategory.Conglomeration) { count = shopDb.ConglomerationOrder.Where(p => p.ShopId == shopId && p.CreateTime >= DateTime.Today).Count(); } else { count = shopDb.ShopOrders.Where(p => p.ShopId == shopId && p.AddTime >= DateTime.Today).Count(); } string countStr = (count + 1).ToString("0000"); string randomStr = new Random().Next(999).ToString("000"); return(categoryStr + shopIdStr + timeStr + countStr + randomStr); }
public async Task <ReadOrderModel> AddOrderAsync(CreateOrderModel model, CancellationToken cancellationToken) { var order = _mapper.Map <Order>(model); order.IconId = await _fileService.AddOrUpdateFileByIdAsync(model.Icon, order.IconId, cancellationToken); foreach (var categoryId in model.CategoryIds) { var category = await _categoryRepository.GetByIdAsync(categoryId, cancellationToken); var orderCategory = new OrderCategory { Order = order, Category = category }; order.Categories.Add(orderCategory); } await _orderRepository.AddAsync(order, cancellationToken); await _unitOfWork.SaveChangesAsync(cancellationToken); return(_mapper.Map <ReadOrderModel>(order)); }
public OrderViewModel(int number, float openValue, OrderType type, OrderCategory category) { this.number = number; this.value = openValue; this.type = type; this.category = category; }
private async Task <List <Attachment> > CreateAdaptiveCardAttachmentAsync(OrderCategory category) { string[] paths = { ".", "Templates", "orderCard.json" }; var fullPath = Path.Combine(paths); var adaptiveCardTemplate = File.ReadAllText(fullPath); var cards = new List <Attachment>(); var cardConfigurations = await _cardConfigurationService.GetCardConfigurationsAsync(); if (category != OrderCategory.All) { var categoryName = category.ToString(); cardConfigurations = cardConfigurations.Where(x => categoryName.Equals(x.OrderCategory, StringComparison.OrdinalIgnoreCase)); } foreach (var configuration in cardConfigurations.Take(10)) { var card = adaptiveCardTemplate; card = card.Replace(@"__TitleText__", configuration.TitleText); card = card.Replace(@"__OrderType__", configuration.OrderType); card = card.Replace(@"__OrderCategory__", configuration.OrderCategory); card = card.Replace(@"__Description__", configuration.Description); card = card.Replace(@"__ImageUrl__", configuration.ImageUrl); var adaptiveCard = new Attachment() { ContentType = "application/vnd.microsoft.card.adaptive", Content = JsonConvert.DeserializeObject(card), }; cards.Add(adaptiveCard); } return(cards); }
public override bool Send(EOrderAction action, OrderCategory category, double limitPrice, int lots, bool isReverse, double touchPrice = 0, string name = null, bool openNextBar = false) { bool bRet = false; lock (__oLock) { bRet = base.Send(action, category, (category == OrderCategory.Market) ? AdjustPrice(action) : limitPrice, lots, isReverse, touchPrice, name, openNextBar); } return bRet; }
public decimal GetTotalPriceByOrderCategory(OrderCategory category) { if (!_orders.ContainsKey(category)) { return(0); } return(_orders[category].Sum(c => c.Price)); }
public ActionResult DeleteConfirmed(int id) { OrderCategory orderCategory = db.OrderCategories.Find(id); db.OrderCategories.Remove(orderCategory); db.SaveChanges(); return(RedirectToAction("Index")); }
public CreateOrderCategoryViewModel MapToCreateOrderCategoryViewModel(OrderCategory orderCategory) { return(new CreateOrderCategoryViewModel { Id = orderCategory.Id, Name = orderCategory.Name }); }
public void AddDiscount(OrderCategory orderCategory, Discount discount) { if (!_discountsByCategory.ContainsKey(orderCategory)) { _discountsByCategory[orderCategory] = new List <Discount>(); } _discountsByCategory[orderCategory].Add(discount); }
/// <summary> /// 建構子 /// </summary> /// <param name="name">下單名稱</param> /// <param name="action">下單進出場動作列舉</param> /// <param name="category">下單類型</param> /// <param name="lots">下單合約數量</param> /// <param name="openNextBar">是否開倉在下一根 Bars</param> /// <param name="exitInfo">平倉設定類別</param> public Order(string name, EOrderAction action, OrderCategory category, Contracts lots, bool openNextBar, OrderExit exitInfo) { this.Name = name; this.Action = action; this.Category = category; this.Contracts = lots; this.OnClose = openNextBar; this.OrderExit = exitInfo; }
public override bool Send(EOrderAction action, OrderCategory category, double limitPrice, int lots, bool isReverse, double touchPrice = 0, string name = null, bool openNextBar = false) { __bReverse = isReverse; //取得反轉旗標 bool bRet = base.Send(action, category, (category == OrderCategory.Market) ? AdjustPrice(action) : limitPrice, lots, isReverse, touchPrice, name, openNextBar); if (bRet) { __iTimeCount = 0; } return bRet; }
public void AddDiscount(OrderCategory orderCategory, Discount discount) { if (!_discountsByCategory.ContainsKey(orderCategory)) { _discountsByCategory[orderCategory] = new List<Discount>(); } _discountsByCategory[orderCategory].Add(discount); }
public void CreateCategory(OrderCategory orderCategory) { if (_categoryRepository.GetBy(x => x.Name == orderCategory.Name).Any()) { return; } _categoryRepository.Create(orderCategory); _contextProvider.CommitChanges(); }
/// <summary> /// 傳送下單命令 /// </summary> /// <param name="action">下單進出場動作</param> /// <param name="category">下單類型</param> /// <param name="limitPrice">限價價格(市價=0)</param> /// <param name="lots">下單數量</param> /// <param name="isReverse">是否需反轉倉位</param> /// <param name="touchPrice">觸發或停損價格</param> /// <param name="name">下單註解</param> /// <param name="openNextBar">是否開倉在下一根 Bars</param> public override bool Send(EOrderAction action, OrderCategory category, double limitPrice, int lots, bool isReverse, double touchPrice = 0, string name = null, bool openNextBar = false) { if (this.Bars.IsLastBars) { double dPrice = Math.Round((limitPrice == 0) ? ((action == EOrderAction.Buy || action == EOrderAction.BuyToCover) ? Bars.DOM.Ask[0].Price : Bars.DOM.Bid[0].Price) : limitPrice, 2); //檢查是否為平倉單(如果是平倉單, 會把倉部位內所有的委託新倉單全部取消之後才會下平倉單) if (action == EOrderAction.Sell || action == EOrderAction.BuyToCover) { int iCancelCount = 0; lock (__cTrusts) { foreach (_Truster cTemp in __cTrusts.Values) { if (!cTemp.IsClosed) { TradeOrder[] cOrders = cTemp.GetTrustTickets(); if (cOrders != null) { cTemp.Cancel(); foreach (TradeOrder cOrder in cOrders) { if (cOrder.IsSended || cOrder.IsTrusted) { if (!cOrder.IsCancel && cOrder.Contracts > 0) { cOrder.IsCancel = this.SendTrust(cOrder, true); } ++iCancelCount; } } } } } } if (iCancelCount > 0) { return false; } __bClosedFlag = true; } if (__bClosedFlag && (action == EOrderAction.Buy || action == EOrderAction.SellShort)) { return false; } _Truster cTruster = null; lock (__cTrusts) { if (!__cTrusts.TryGetValue(name, out cTruster)) { TradeOrder cOrder = new TradeOrder(); cOrder.Action = action; cOrder.BarNumber = Bars.CurrentBar; cOrder.Category = category; cOrder.Contracts = lots; cOrder.IsReverse = false; cOrder.Name = name; cTruster = new _Truster(cOrder); __cTrusts.Add(name, cTruster); } } return SendTrust(cTruster, dPrice); } return false; }
public ActionResult Edit([Bind(Include = "OrderCat_ID,OrderCat_Status")] OrderCategory orderCategory) { if (ModelState.IsValid) { db.Entry(orderCategory).State = EntityState.Modified; db.SaveChanges(); return(RedirectToAction("Index")); } return(View(orderCategory)); }
public void Create_CategoryNotValid_ThrowsException() { var category = new OrderCategory { Name = null }; _initializer.OrderCategoryRepository.Create(category); Assert.That(() => _initializer.CommitProvider.CommitChanges(), Throws.Exception); }
public void Create_CreatedCategory_ThrowsNoExceptions() { var category = new OrderCategory { Name = "New category" }; _initializer.OrderCategoryRepository.Create(category); Assert.That(() => _initializer.CommitProvider.CommitChanges(), Throws.Nothing); }
public RepairTicket_OrderCategoryDTO(OrderCategory OrderCategory) { this.Id = OrderCategory.Id; this.Code = OrderCategory.Code; this.Name = OrderCategory.Name; this.Errors = OrderCategory.Errors; }
public async Task <OrderCategory> Get(long Id) { OrderCategory OrderCategory = await UOW.OrderCategoryRepository.Get(Id); if (OrderCategory == null) { return(null); } return(OrderCategory); }
public OrderReport_OrderCategoryDTO(OrderCategory OrderCategory) { this.Id = OrderCategory.Id; this.Code = OrderCategory.Code; this.Name = OrderCategory.Name; this.Errors = OrderCategory.Errors; }
public Customer_OrderCategoryDTO(OrderCategory OrderCategory) { this.Id = OrderCategory.Id; this.Code = OrderCategory.Code; this.Name = OrderCategory.Name; this.Errors = OrderCategory.Errors; }
public void DeleteCategory(OrderCategory category) { var orders = _orderRepository.GetBy(x => x.Category.Id == category.Id); foreach (var order in orders) { Delete(order); } _categoryRepository.Delete(category); _contextProvider.CommitChanges(); }
public ActionResult Create([Bind(Include = "OrderCat_ID,OrderCat_Status")] OrderCategory orderCategory) { if (ModelState.IsValid) { db.OrderCategories.Add(orderCategory); db.SaveChanges(); return(RedirectToAction("Index")); } return(View(orderCategory)); }
public void AddDiscount(OrderCategory category, Discount discount) { Contract.Assert(discount != null); if (!_discounts.ContainsKey(category)) { _discounts[category] = new List <Discount>(); } _discounts[category].Add(discount); }
public void CreateCategory_CreatedCategory_ThrowsNoExceptions() { var expected = new OrderCategory { Name = "new category" }; Assert.That(() => _initializer.OrderService.CreateCategory(expected), Throws.Nothing); var actual = _initializer.OrderCategoryRepository.GetBy(x => x.Name == expected.Name).First(); Assert.AreEqual(expected, actual); }
/// <summary> /// Instantiates the order. /// </summary> /// <param name="orderParams">Parameters for the order.</param> /// <param name="orderCategory">Order category.</param> /// <param name="openNext">Indicates whether the order must be placed at the open /// of next bar.</param> public BaseOrder( SOrderParameters orderParams, OrderCategory orderCategory, bool openNext) { OrderParams = orderParams; Info = new Order( orderParams.Name, orderParams.Action, orderCategory, orderParams.Lots, openNext, orderParams.ExitTypeInfo); ID = GetHashCode(); }
// GET: OrderCategories/Delete/5 public ActionResult Delete(int?id) { if (id == null) { return(new HttpStatusCodeResult(HttpStatusCode.BadRequest)); } OrderCategory orderCategory = db.OrderCategories.Find(id); if (orderCategory == null) { return(HttpNotFound()); } return(View(orderCategory)); }
public decimal GetTotalPriceWithDiscountByOrderCategory(OrderCategory orderCategory) { var total = GetTotalPriceByOrderCategory(orderCategory); var discountListsByCategory = _discountsByCategory.Where(pair => pair.Key == orderCategory).Select(pair => pair.Value); foreach (var discountList in discountListsByCategory) { foreach (var discount in discountList.OrderBy(d => d.Priority)) { total = discount.Apply(total); } } return(total); }
public decimal GetTotalPriceWithDiscountByOrderCategory(OrderCategory orderCategory) { var total = GetTotalPriceByOrderCategory(orderCategory); var discountListsByCategory = _discountsByCategory.Where(pair => pair.Key == orderCategory).Select(pair => pair.Value); foreach (var discountList in discountListsByCategory) { foreach (var discount in discountList.OrderBy(d => d.Priority)) { total = discount.Apply(total); } } return total; }
public decimal GetTotalPriceWithDiscountByOrderCategory(OrderCategory category) { var amount = GetTotalPriceByOrderCategory(category); if (!_discounts.ContainsKey(category)) { return(amount); } foreach (var discount in _discounts[category].OrderBy(d => d.Priority)) { amount = discount.ApplyDiscount(amount); } return(amount); }
public async Task <ReadOrderModel> UpdateOrderAsync(UpdateOrderModel model, Guid id, CancellationToken cancellationToken) { var order = await _orderRepository.GetByIdAsync(id, cancellationToken); order.Title = model.Title; order.Description = model.Description; order.Price = model.Price; order.IconId = await _fileService.AddOrUpdateFileByIdAsync(model.Icon, order.IconId, cancellationToken); var categoryIds = order.Categories.Select(i => i.Category.Id).ToList(); foreach (var categoryId in categoryIds) { if (!model.CategoryIds.Contains(categoryId)) { var orderCategory = order.Categories.First(i => i.Category.Id == categoryId); order.Categories.Remove(orderCategory); } } await _unitOfWork.SaveChangesAsync(cancellationToken); foreach (var categoryId in model.CategoryIds) { if (!categoryIds.Contains(categoryId)) { var category = await _categoryRepository.GetByIdAsync(categoryId, cancellationToken); var orderCategory = new OrderCategory { Category = category, Order = order }; order.Categories.Add(orderCategory); } } _orderRepository.Update(order); await _unitOfWork.SaveChangesAsync(cancellationToken); return(_mapper.Map <ReadOrderModel>(order)); }
private bool CheckTrust(EOrderAction action, OrderCategory category, double limitPrice, int lots, string name, bool isReverse, bool openNextBar) { TradeOrder cTrust = __cEntrusts.GetTradeFromName(name); if (cTrust != null) { if (openNextBar) { __cNextBarRequires.Add(name); //標記 NextBar 時, 可以下單 return true; } else { if (cTrust.Price == limitPrice) { //委託價格一樣就忽略 return false; } else { if (cTrust.IsTrusted) { //如果已經委託完成就取消單號 string sTicket = cTrust.Ticket; //委託單號 AdjustClosedContract(cTrust); //調整平倉數量(如果是平倉單就要調整) __cEntrusts.Remove(cTrust.Ticket); //從委託陣列中移除 } else { //如果還沒有委託成功 return false; //直接離開(可能需要等到委託成功之後才能處理) } } } } if (action == EOrderAction.Sell || action == EOrderAction.BuyToCover) { int iLots = __cCurrentPosition.OpenLots - __iUsedClosedTempLots; //檢查平倉數量是否足夠 if (lots > iLots) { //平倉數量不足(不下單) return false; } else { lock (__oTempLock) { __iUsedClosedTempLots += lots; } } } TradeOrder cOrder = new TradeOrder(); //建立預約委託單的資訊 cOrder.Action = action; cOrder.BarNumber = Bars.CurrentBar; cOrder.Category = category; cOrder.Contracts = lots; cOrder.Name = name; cOrder.Price = limitPrice; cOrder.IsReverse = isReverse; cOrder.SymbolId = Bars.Request.Symbol; cOrder.Time = Bars.Time[0]; cOrder.Ticket = (openNextBar) ? name : GetTrustID(); __cEntrusts.Add(cOrder); //加入至委託列表內 if (openNextBar) { //如果需要在下一根 Bars 下單, 就先保留 name 在佇列, 以方便比對委託單 __cReserves.Enqueue(name); __cNextBarRequires.Add(name); } else { if (isReverse) { //如果有反轉倉單 CancelLimit(action); //取消所有反向之前的限價委託單 } SendTrust(cOrder); //傳送新委託單給下單機 } return true; }
public decimal GetTotalPriceByOrderCategory(OrderCategory orderCategory) { return _ordersByCategory.Where(pair => pair.Key == orderCategory).Sum(pair => pair.Value.Sum(o => o.Price)); }
public Order(string itemName, OrderCategory category, decimal price) { Category = category; Price = price; ItemName = itemName; }
/// <summary> /// 傳送下單命令 /// </summary> /// <param name="action">下單進出場動作</param> /// <param name="category">下單類型</param> /// <param name="limitPrice">限價價格(市價=0)</param> /// <param name="lots">下單數量</param> /// <param name="isReverse">是否需反轉倉位</param> /// <param name="touchPrice">觸發或停損價格</param> /// <param name="name">下單註解</param> /// <param name="openNextBar">是否開倉在下一根 Bars</param> public virtual bool Send(EOrderAction action, OrderCategory category, double limitPrice, int lots, bool isReverse, double touchPrice = 0, string name = null, bool openNextBar = false) { if (this.Bars.IsLastBars) { return CheckTrust(action, category, limitPrice, lots, name, isReverse, openNextBar); } return false; }
private bool CheckTrust(EOrderAction action, OrderCategory category, double limitPrice, int lots, string name, bool isReverse, bool openNextBar) { TradeOrder cTrust = __cEntrusts.GetTradeFromName(name); if (cTrust == null) { if (action == EOrderAction.Sell || action == EOrderAction.BuyToCover) { bool bRet = false; int iCount = __cEntrusts.Count; if (iCount > 0) { EOrderAction cAction = (action == EOrderAction.Buy || action == EOrderAction.BuyToCover) ? EOrderAction.SellShort : (action == EOrderAction.SellShort || action == EOrderAction.Sell) ? EOrderAction.Buy : action; for (int i = 0; i < iCount; i++) { TradeOrder cTemp = __cEntrusts[i]; if (cTemp.IsTrusted && cTemp.Action == cAction && cTemp.Contracts > 0) { if (!cTemp.IsCancel) { SendTrust(cTemp, cTemp.Ticket); //取消委託單 cTemp.IsCancel = true; } bRet = true; } } } if (bRet || __cDeals.Count > 0) { return false; } } } else { if (openNextBar) { if (!cTrust.IsSended) { cTrust.Price = limitPrice; //支援可以下出 NextBar 的限價單(沒有指定會以 0 送出) __cNextBarRequires.Add(name); //標記 NextBar 時, 可以下單 return true; } return false; } else { if (cTrust.Price == limitPrice) { //委託價格一樣就忽略 return false; } else { if (cTrust.IsTrusted && !cTrust.IsCancel) { //如果已經委託完成就取消單號 SendTrust(cTrust, cTrust.Ticket); //向下單機傳送取消委託單的命令 cTrust.IsCancel = true; } return false; } } } TradeOrder cOrder = new TradeOrder(); //建立預約委託單的資訊 cOrder.Action = action; cOrder.BarNumber = Bars.CurrentBar; cOrder.Category = category; cOrder.Contracts = lots; cOrder.Name = name; cOrder.Price = limitPrice; cOrder.IsReverse = isReverse; cOrder.SymbolId = GetOrderSymbol(); cOrder.Time = DateTime.Now; cOrder.Ticket = (openNextBar) ? name : GetTrustID(); __cEntrusts.Add(cOrder); //加入至委託列表內 if (openNextBar) { //如果需要在下一根 Bars 下單, 就先保留 name 在佇列, 以方便比對委託單 __cReserves.Enqueue(name); __cNextBarRequires.Add(name); } else { if (__cCloseOrder == null) { SendTrust(cOrder); //傳送新委託單給下單機 } } return true; }