예제 #1
0
        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);
        }
예제 #2
0
        /// <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));
        }
예제 #3
0
        //        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.
        }
예제 #4
0
        /// <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);
        }
예제 #5
0
        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));
        }
예제 #6
0
 public OrderViewModel(int number, float openValue, OrderType type, OrderCategory category)
 {
     this.number = number;
     this.value = openValue;
     this.type = type;
     this.category = category;
 }
예제 #7
0
        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);
        }
예제 #8
0
		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;
		}
예제 #9
0
 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"));
        }
예제 #11
0
 public CreateOrderCategoryViewModel MapToCreateOrderCategoryViewModel(OrderCategory orderCategory)
 {
     return(new CreateOrderCategoryViewModel
     {
         Id = orderCategory.Id,
         Name = orderCategory.Name
     });
 }
예제 #12
0
        public void AddDiscount(OrderCategory orderCategory, Discount discount)
        {
            if (!_discountsByCategory.ContainsKey(orderCategory))
            {
                _discountsByCategory[orderCategory] = new List <Discount>();
            }

            _discountsByCategory[orderCategory].Add(discount);
        }
예제 #13
0
 /// <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;
 }
예제 #14
0
		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;
		}
예제 #15
0
	    public void AddDiscount(OrderCategory orderCategory, Discount discount)
	    {
		    if (!_discountsByCategory.ContainsKey(orderCategory))
		    {
			    _discountsByCategory[orderCategory] = new List<Discount>();
		    }
			
			_discountsByCategory[orderCategory].Add(discount);
	    }
예제 #16
0
 public void CreateCategory(OrderCategory orderCategory)
 {
     if (_categoryRepository.GetBy(x => x.Name == orderCategory.Name).Any())
     {
         return;
     }
     _categoryRepository.Create(orderCategory);
     _contextProvider.CommitChanges();
 }
예제 #17
0
		/// <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);
        }
예제 #21
0
        public RepairTicket_OrderCategoryDTO(OrderCategory OrderCategory)
        {
            this.Id = OrderCategory.Id;

            this.Code = OrderCategory.Code;

            this.Name = OrderCategory.Name;

            this.Errors = OrderCategory.Errors;
        }
예제 #22
0
        public async Task <OrderCategory> Get(long Id)
        {
            OrderCategory OrderCategory = await UOW.OrderCategoryRepository.Get(Id);

            if (OrderCategory == null)
            {
                return(null);
            }
            return(OrderCategory);
        }
예제 #23
0
        public OrderReport_OrderCategoryDTO(OrderCategory OrderCategory)
        {
            this.Id = OrderCategory.Id;

            this.Code = OrderCategory.Code;

            this.Name = OrderCategory.Name;

            this.Errors = OrderCategory.Errors;
        }
예제 #24
0
        public Customer_OrderCategoryDTO(OrderCategory OrderCategory)
        {
            this.Id = OrderCategory.Id;

            this.Code = OrderCategory.Code;

            this.Name = OrderCategory.Name;

            this.Errors = OrderCategory.Errors;
        }
예제 #25
0
        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));
        }
예제 #27
0
        public void AddDiscount(OrderCategory category, Discount discount)
        {
            Contract.Assert(discount != null);

            if (!_discounts.ContainsKey(category))
            {
                _discounts[category] = new List <Discount>();
            }

            _discounts[category].Add(discount);
        }
예제 #28
0
        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);
        }
예제 #29
0
 /// <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));
        }
예제 #31
0
        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);
        }
예제 #32
0
	    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;
	    }
예제 #33
0
        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);
        }
예제 #34
0
        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));
        }
예제 #35
0
		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;
		}
예제 #36
0
파일: Order.cs 프로젝트: Zeghs/ZeroSystem
		/// <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;
		}
예제 #37
0
	    public decimal GetTotalPriceByOrderCategory(OrderCategory orderCategory)
	    {
		    return _ordersByCategory.Where(pair => pair.Key == orderCategory).Sum(pair => pair.Value.Sum(o => o.Price));
	    }
예제 #38
0
파일: Order.cs 프로젝트: MortalFlesh/Test
 public Order(string itemName, OrderCategory category, decimal price)
 {
     Category = category;
     Price = price;
     ItemName = itemName;
 }
예제 #39
0
		/// <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;
		}
예제 #40
0
		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;
		}