Ejemplo n.º 1
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.
        }
Ejemplo n.º 2
0
		private double AdjustPrice(EOrderAction action) {
			IDOMData cDOM = Bars.DOM;
			double dASK = (cDOM == null) ? 0 : cDOM.Ask[0].Price;
			double dBID = (cDOM == null) ? 0 : cDOM.Bid[0].Price;

			return (action == EOrderAction.Buy || action == EOrderAction.BuyToCover) ? dASK : (action == EOrderAction.Sell || action == EOrderAction.SellShort) ? dBID : 0;
		}
Ejemplo n.º 3
0
		internal bool SendTrust(TradeOrder trust, bool isCancel = false) {
			EOrderAction cAction = trust.Action;
			bool bClose = cAction == EOrderAction.Sell || cAction == EOrderAction.BuyToCover;
			StringBuilder cBuilder = new StringBuilder(128);
			cBuilder.Append(__sLocalPipe).Append(",")
				.Append(trust.SymbolId).Append(",")
				.Append(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")).Append(",")
				.Append((cAction == EOrderAction.Buy || cAction == EOrderAction.BuyToCover) ? 'B' : (cAction == EOrderAction.Sell || cAction == EOrderAction.SellShort) ? 'S' : ' ').Append(",")
				.Append(trust.Contracts).Append(",")
				.Append(trust.Price).Append(",")
				.Append((isCancel) ? -1 : (bClose) ? 0 : 1).Append(",")
				.Append(Math.Round(Bars.Close.Value, __iDecimalPoint)).Append(",")
				.Append((isCancel) ? trust.Ticket : (trust.IsReverse) ? "1" : "0");

			string sCommand = cBuilder.ToString();
			bool bSuccess = __cPipeStream.Send(__sApiPipe, sCommand);  //發送委託單命令給下單機
			if (logger.IsInfoEnabled) logger.InfoFormat("[RealOrderService.Send] {0}", sCommand);

			if (bSuccess) {  //如果傳送成功
				trust.IsSended = true;  //設定已經傳送完畢
			} else {
				__cEntrusts.Remove(trust.Ticket);  //移除此筆尚未委託的委託單
			}
			return bSuccess;
		}
Ejemplo n.º 4
0
        internal bool CheckPosition(TradeOrder deal)
        {
            bool         bClosed = false;
            EOrderAction cAction = deal.Action;
            int          iSide   = (int)this.Side;
            int          iBSFlag = (cAction == EOrderAction.Buy || cAction == EOrderAction.BuyToCover) ? -1 : 1;

            Trade cTrade = new Trade();

            cTrade._EntryOrder = deal.Clone();

            if (iSide == iBSFlag)
            {
                Queue <Trade> cQueue = null;
                lock (__cPositions) {
                    __cPositions.TryGetValue(iBSFlag, out cQueue);
                }

                int iPrevCount = __cHistorys.Count;                     //保存目前歷史明細個數
                CalculatePosition(cQueue, cTrade);
                __iLatestHistoryCount = __cHistorys.Count - iPrevCount; //計算出新增的歷史明細個數

                if (this.OpenLots == 0)
                {
                    bClosed = true;
                }
            }
            else
            {
                AddPosition(cTrade);
            }
            return(bClosed);
        }
Ejemplo n.º 5
0
		private double AdjustPrice(EOrderAction action) {
			IDOMData cDOM = Bars.DOM;
			double dASK = (cDOM == null) ? 0 : cDOM.Ask[0].Price;
			double dBID = (cDOM == null) ? 0 : cDOM.Bid[0].Price;

			return (action == EOrderAction.Buy || action == EOrderAction.BuyToCover) ? dASK : (action == EOrderAction.Sell || action == EOrderAction.SellShort) ? dBID : 0;
		}
Ejemplo n.º 6
0
		private void OrderDeal(TradeOrder trust, double dealPrice = 0) {
			EOrderAction cAction = trust.Action;
			if (cAction == EOrderAction.Sell || cAction == EOrderAction.BuyToCover) {
				int iLots = __cCurrentPosition.OpenLots - __iUsedClosedTempLots;  //檢查平倉數量是否足夠
				if (trust.Contracts > iLots) {   //平倉數量不足(不下單)
					this.SendCancel(trust);  //取消此張平倉單
					return;
				} else {
					Interlocked.Add(ref __iUsedClosedTempLots, trust.Contracts);  //將此平倉量累加至暫存平倉量變數
				}
			}

			if (!trust.IsDealed) {
				trust.IsDealed = true;

				TradeOrder cDeal = trust.Clone();
				cDeal.Price = Math.Round((dealPrice == 0) ? Bars.Close.Value : dealPrice, __iDecimalPoint);
				cDeal.Time = Bars.Time.Value;
				SetTax(cDeal);

				double[] dValues = CalculateCommissions(cDeal);  //計算交易佣金與手續費用(由策略使用者自行決定的佣金與手續費設定所計算出來的價格)
				cDeal.OtherFees = dValues[0];
				cDeal.Fee = dValues[1];

				lock (__cDeals) {
					__cDeals.Enqueue(cDeal);
				}

				trust.Contracts = 0;
				OnResponse(trust, trust.SymbolId, ResponseType.Trust);
			}
		}
Ejemplo n.º 7
0
 /// <summary>
 ///   建構子
 /// </summary>
 /// <param name="lots">下單合約數量結構</param>
 /// <param name="name">下單名稱</param>
 /// <param name="action">下單進出場動作</param>
 /// <param name="exitInfo">平倉設定類別</param>
 public SOrderParameters(Contracts lots, string name, EOrderAction action, OrderExit exitInfo)
 {
     this.Lots         = lots;
     this.Name         = name;
     this.Action       = action;
     this.ExitTypeInfo = exitInfo;
 }
Ejemplo n.º 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;
		}
Ejemplo n.º 9
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;
 }
Ejemplo n.º 10
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;
		}
Ejemplo n.º 11
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;
		}
Ejemplo n.º 12
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 bool Send(EOrderAction action, OrderCategory category, double limitPrice, int lots, bool isReverse, double touchPrice = 0, string name = null, bool openNextBar = false) {
			limitPrice = Math.Round(limitPrice, __iDecimalPoint);
			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 && !cTrust.IsDealed) {  //如果已經委託完成且尚未成交就取消單號
							this.SendCancel(cTrust);
						} else {  //如果還沒有委託成功
							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 = Bars.Request.Symbol;
			cOrder.Time = Bars.Time.Value;
			cOrder.Ticket = (openNextBar) ? name : GetTrustID();
			__cEntrusts.Add(cOrder);  //加入至委託列表內

			if (openNextBar) {  //如果需要在下一根 Bars 下單, 就先保留 name 在佇列, 以方便比對委託單
				__cReserves.Enqueue(name);
				__cNextBarRequires.Add(name);
			} else {
				if (isReverse) {  //如果有反轉倉單
					CancelLimit(action);  //取消所有反向之前的限價委託單
				}
				
				this.SendTrust(cOrder);  //傳送新委託單(模擬成交)
			}
			return true;
		}
Ejemplo n.º 13
0
        private void AddPosition(Trade trade)
        {
            EOrderAction cAction = trade.EntryOrder.Action;
            int          iBSFlag = (cAction == EOrderAction.Buy || cAction == EOrderAction.BuyToCover) ? 1 : -1;

            Queue <Trade> cQueue = null;

            lock (__cPositions) {
                if (!__cPositions.TryGetValue(iBSFlag, out cQueue))
                {
                    this.Side = (iBSFlag == 1) ? EMarketPositionSide.Long : (iBSFlag == -1) ? EMarketPositionSide.Short : EMarketPositionSide.Flat;

                    cQueue = new Queue <Trade>(16);
                    __cPositions.Add(iBSFlag, cQueue);
                }
            }

            lock (cQueue) {
                cQueue.Enqueue(trade);
                this.OpenLots += trade._EntryOrder.Contracts;
            }
            this.Add(trade);
        }
Ejemplo n.º 14
0
        /// <summary>
        ///   送出下單命令
        /// </summary>
        /// <param name="new_name">新的下單名稱</param>
        /// <param name="numLots">下單數量</param>
        /// <returns>返回值: true=傳輸成功, false=傳輸失敗</returns>
        public bool Send(string new_name, int numLots)
        {
            int iPositionLots = GetPositionCount();

            numLots = (Info.Contracts.IsUserSpecified) ? numLots : Info.Contracts.Contract;
            numLots = (Info.IsExit && (!Info.OrderExit.IsTotal || numLots > iPositionLots)) ? iPositionLots : numLots;

            bool bRet     = true;
            int  iNumLots = (!Info.IsExit) ? iPositionLots : 0;

            if (iNumLots > 0)
            {
                string       sName   = string.Format("Close_{0}", ID);
                EOrderAction cAction = (Info.Action == EOrderAction.Buy) ? EOrderAction.BuyToCover : (Info.Action == EOrderAction.SellShort) ? EOrderAction.Sell : Info.Action;
                bRet = __cSender.Send(cAction, Info.Category, 0, iNumLots, true, 0, sName, Info.OnClose);
            }

            if (bRet && numLots > 0 && iNumLots == 0)
            {
                bRet = __cSender.Send(Info.Action, Info.Category, 0, numLots, false, 0, new_name, Info.OnClose);
            }
            return(bRet);
        }
Ejemplo n.º 15
0
        private void SignalObject_onTradeResponse(object sender, ResponseEvent e)
        {
            __cTradeService.AddResponse(e);

            if (__bShowTradeView)
            {
                if (GlobalSettings.Testing.AutoSwitchTradePage)
                {
                    ITradeOrder cOrder = e.TradeOrder;
                    switch (e.ResponseType)
                    {
                    case Zeghs.Orders.ResponseType.Trust:                              //委託回報
                        tabControl.BeginInvoke((MethodInvoker) delegate {
                            tabControl.SelectedIndex = 0;
                        });
                        break;

                    case Zeghs.Orders.ResponseType.Deal:                              //成交回報
                        EOrderAction cAction = cOrder.Action;
                        if (cAction == EOrderAction.Buy || cAction == EOrderAction.SellShort)
                        {
                            tabControl.BeginInvoke((MethodInvoker) delegate {
                                tabControl.SelectedIndex = 1;
                            });
                        }
                        else
                        {
                            tabControl.BeginInvoke((MethodInvoker) delegate {
                                tabControl.SelectedIndex = 2;
                            });
                        }
                        break;
                    }
                }
            }
        }
Ejemplo n.º 16
0
		private void CancelLimit(EOrderAction action) {
			if (__cEntrusts.Count > 0) {  //如果有委託單尚未成交(就可能是限價委託單)
				List<TradeOrder> cTrades = __cEntrusts.Trades;

				int iCount = cTrades.Count;
				if (iCount > 0) {
					EOrderAction cAction1 = EOrderAction.Buy, cAction2 = EOrderAction.Sell;
					if (action == EOrderAction.SellShort || action == EOrderAction.BuyToCover) { 
						cAction1 = EOrderAction.SellShort;
						cAction2 = EOrderAction.BuyToCover;
					}

					for (int i = iCount - 1; i >= 0; i--) {  //由下往上檢查(才不會因為 Remove 出現問題)
						TradeOrder cTrust = cTrades[i];
						if (!cTrust.IsDealed && cTrust.Price > 0) {  //尚未成交而且是限價單就處理
							EOrderAction cAction = cTrust.Action;
							if (cAction == cAction1 || cAction == cAction2) {
								this.SendCancel(cTrust);
							}
						}
					}
				}
			}
		}
Ejemplo n.º 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 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;
		}
Ejemplo n.º 18
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;
		}
Ejemplo n.º 19
0
 /// <summary>
 ///   建構子
 /// </summary>
 /// <param name="action">下單進出場動作</param>
 public SOrderParameters(EOrderAction action)
     : this(Contracts.Default, string.Empty, action, OrderExit.FromAll)
 {
 }
Ejemplo n.º 20
0
		/// <summary>
		///   建構子
		/// </summary>
		/// <param name="lots">下單合約數量結構</param>
		/// <param name="name">下單名稱</param>
		/// <param name="action">下單進出場動作</param>
		/// <param name="exitInfo">平倉設定類別</param>
		public SOrderParameters(Contracts lots, string name, EOrderAction action, OrderExit exitInfo) {
			this.Lots = lots;
			this.Name = name;
			this.Action = action;
			this.ExitTypeInfo = exitInfo;
		}
Ejemplo n.º 21
0
		/// <summary>
		///   建構子
		/// </summary>
		/// <param name="lots">下單合約數量結構</param>
		/// <param name="name">下單名稱</param>
		/// <param name="action">下單進出場動作</param>
		public SOrderParameters(Contracts lots, string name, EOrderAction action)
			: this(lots, name, action, OrderExit.FromAll) {
		}
Ejemplo n.º 22
0
		/// <summary>
		///   建構子
		/// </summary>
		/// <param name="lots">下單合約數量結構</param>
		/// <param name="action">下單進出場動作</param>
		/// <param name="exitInfo">平倉設定類別</param>
		public SOrderParameters(Contracts lots, EOrderAction action, OrderExit exitInfo)
			: this(lots, string.Empty, action, exitInfo) {
		}
Ejemplo n.º 23
0
		/// <summary>
		///   建構子
		/// </summary>
		/// <param name="action">下單進出場動作</param>
		/// <param name="name">下單名稱</param>
		public SOrderParameters(EOrderAction action, string name)
			: this(Contracts.Default, name, action, OrderExit.FromAll) {
		}
Ejemplo n.º 24
0
		private void CancelLimit(EOrderAction action) {
			if (__cEntrusts.Count > 0) {  //如果有委託單尚未成交(就可能是限價委託單)
				List<TradeOrder> cTrades = __cEntrusts.Trades;

				int iCount = cTrades.Count;
				if (iCount > 0) {
					EOrderAction cAction1 = EOrderAction.Buy, cAction2 = EOrderAction.Sell;
					if (action == EOrderAction.SellShort || action == EOrderAction.BuyToCover) { 
						cAction1 = EOrderAction.SellShort;
						cAction2 = EOrderAction.BuyToCover;
					}

					for (int i = iCount - 1; i >= 0; i--) {  //由下往上檢查(才不會因為 Remove 出現問題)
						TradeOrder cTrust = cTrades[i];
						if (!cTrust.IsDealed && cTrust.Price > 0) {  //尚未成交而且是限價單就處理
							EOrderAction cAction = cTrust.Action;
							if (cAction == cAction1 || cAction == cAction2) {
								AdjustClosedContract(cTrust);
								__cEntrusts.Remove(cTrust.Ticket);
							}
						}
					}
				}
			}
		}
Ejemplo n.º 25
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) {
				//檢查是否下單類型是平倉單或是反轉單(如果是平倉單需要檢查委託倉內的所有同向平倉單是否超過留倉數量, 如果是反轉單要取消所有開倉委託)
				if (isReverse || action == EOrderAction.Sell || action == EOrderAction.BuyToCover) {
					int iLots = 0;
					if (!isReverse) {
						iLots = __cCurrentPosition.OpenLots;
						if (lots > iLots) {  //檢查委託數量是否超過開倉量
							return false;
						} else {
							iLots -= lots;  //先將開倉數量減去委託數量
						}
					}

					int iCount = __cEntrusts.Count;
					if (iCount > 0) {
						bool bRet = isReverse;
						for (int i = 0; i < iCount; i++) {
							TradeOrder cTemp = __cEntrusts[i];
							if (isReverse) {  //如果是反轉單(取消所有新倉單)
								if (cTemp.IsTrusted && !cTemp.IsCancel && cTemp.Contracts > 0 && (cTemp.Action == EOrderAction.Buy || cTemp.Action == EOrderAction.SellShort)) {
									cTemp.IsCancel = SendTrust(cTemp, true);
								}
							} else if (cTemp.Contracts > 0 && cTemp.Action == action && !cTemp.Name.Equals(name)) {
								iLots -= cTemp.Contracts;
								if (iLots < 0) {
									bRet = true;
									break;
								}
							}
						}

						if (bRet) {
							return false;
						}
					}
				}

				limitPrice = Math.Round(limitPrice, __iDecimalPoint);
				TradeOrder cTrust = __cEntrusts.GetTradeFromName(name);
				if (cTrust != null) {
					if (openNextBar) {
						if (!cTrust.IsSended) {
							cTrust.Price = limitPrice;  //支援可以下出 NextBar 的限價單(沒有指定會以 0 送出)
							__cNextBarRequires.Add(name);  //標記 NextBar 時, 可以下單
							return true;
						}
					} else {
						if (cTrust.Price == limitPrice) {
							return true;
						} else {  //委託價格不一樣才處理
							if (cTrust.IsTrusted && !cTrust.IsCancel) {  //如果已經委託完成就取消單號
								cTrust.IsCancel = SendTrust(cTrust, 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);  //加入至委託列表內

				bool bReturn = true;
				if (openNextBar) {  //如果需要在下一根 Bars 下單, 就先保留 name 在佇列, 以方便比對委託單
					__cReserves.Enqueue(name);
					__cNextBarRequires.Add(name);
				} else {
					bReturn = SendTrust(cOrder);  //傳送新委託單給下單機
				}
				return bReturn;
			}
			return false;
		}
Ejemplo n.º 26
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;
		}
Ejemplo n.º 27
0
 /// <summary>
 ///   建構子
 /// </summary>
 /// <param name="action">下單進出場動作</param>
 /// <param name="name">下單名稱</param>
 public SOrderParameters(EOrderAction action, string name)
     : this(Contracts.Default, name, action, OrderExit.FromAll)
 {
 }
Ejemplo n.º 28
0
 public double GetTax(EOrderAction action, double tradeTotals)
 {
     //股票交易稅金只有在賣出或回補的時候要計算(買進或放空不需要交易稅)
     return((action == EOrderAction.Sell || action == EOrderAction.BuyToCover) ? tradeTotals * __dTaxRate : 0);
 }
Ejemplo n.º 29
0
			internal List<TradeOrder> CreateTrusts(int barNumber, double price, int count, int stepLots, double lowest, double highest, double priceScale) {
				if (__bCanceled) {  //如果取消旗標 = true(使用者取消) 表示此筆委託單不再建立鋪單委託
					return null;
				}

				List<TradeOrder> cResult = null;
				lock (__cGridPrices) {
					foreach (TradeOrder cOrder in __cGridPrices.Values) {
						if (!cOrder.IsTrusted || cOrder.IsCancel || cOrder.Contracts == 0) {
							return null;
						}
					}

					int iTotals = (int) Math.Ceiling((double) this.Contracts / stepLots);
					int iCount = (iTotals < count) ? iTotals : count;
					
					__cTrustOrder.BarNumber = barNumber;

					EOrderAction cAction = __cTrustOrder.Action;
					double dScale = (cAction == EOrderAction.Buy || cAction == EOrderAction.BuyToCover) ? -priceScale : priceScale;

					int iTotalV = 0;
					bool bLimit = false;
					cResult = new List<TradeOrder>(count);
					HashSet<string> cTPrices = new HashSet<string>();
					for (int i = 0; i < iCount; i++) {
						int iLots = this.Contracts - iTotalV;
						if (iLots <= 0) {
							break;
						}

						double dPrice = Math.Round(price + dScale * i, 2);
						if (dPrice <= lowest || dPrice >= highest) {
							bLimit = true;  //如果價格觸碰到漲跌停價格(設定價格極限旗標)
						}

						TradeOrder cTrust = null;
						string sName = string.Format("{0}|{1}", __cTrustOrder.Name, dPrice);
						if (__cGridPrices.TryGetValue(sName, out cTrust)) {
							if (cTrust.IsTrusted && !cTrust.IsCancel) {
								if (bLimit) {  //如果是漲跌停價格的委託單(數量相同就保留, 數量不同直接離開)
									if (cTrust.Contracts == iLots) {
										cTPrices.Add(sName);
									}
									break;
								} else {
									iTotalV += cTrust.Contracts;
									cTPrices.Add(sName);
								}
							}
						} else {
							int iContracts = (bLimit) ? iLots : (iLots < stepLots) ? iLots : stepLots;
							iTotalV += iContracts;

							TradeOrder cOrder = new TradeOrder() {
								Action = __cTrustOrder.Action,
								BarNumber = __cTrustOrder.BarNumber,
								Category = __cTrustOrder.Category,
								Contracts = iContracts,
								Name = sName,
								Price = dPrice,
								IsReverse = false
							};
							
							cResult.Add(cOrder);
							cTPrices.Add(sName);
							__cGridPrices.Add(sName, cOrder);
						}
					}

					//計算欲取消的委託單
					foreach (string sName in __cGridPrices.Keys) {
						if (!cTPrices.Contains(sName)) {
							TradeOrder cTrust = __cGridPrices[sName];
							if (cTrust.IsTrusted && !cTrust.IsCancel) {
								cResult.Add(cTrust);
							}
						}
					}
				}
				return cResult;
			}
Ejemplo n.º 30
0
 /// <summary>
 ///   建構子
 /// </summary>
 /// <param name="lots">下單合約數量結構</param>
 /// <param name="action">下單進出場動作</param>
 /// <param name="exitInfo">平倉設定類別</param>
 public SOrderParameters(Contracts lots, EOrderAction action, OrderExit exitInfo)
     : this(lots, string.Empty, action, exitInfo)
 {
 }
Ejemplo n.º 31
0
        private void TradeTimer_onElapsed(object sender, ElapsedEventArgs e)
        {
            bool bBusy = false;

            lock (__oLock) {
                bBusy = __bTradeBusy;
                if (!bBusy)
                {
                    __bTradeBusy = true;
                }
            }

            if (!bBusy)
            {
                bool bUpdate = __cQueue.Count > 0;
                while (__cQueue.Count > 0)
                {
                    ResponseEvent cResponse = null;
                    lock (__cQueue) {
                        cResponse = __cQueue.Dequeue();
                    }

                    ResponseType cType = cResponse.ResponseType;
                    if (cType == ResponseType.Update)
                    {
                        continue;
                    }

                    string      sSymbolId = cResponse.SymbolId;
                    ITradeOrder cOrder    = cResponse.TradeOrder;
                    string      sTicket   = cOrder.Ticket;
                    switch (cType)
                    {
                    case ResponseType.Cancel:                             //取消委託
                    case ResponseType.Trust:                              //委託回報
                        if (cType == ResponseType.Cancel)
                        {
                            __cTrusts.Remove(sTicket);
                        }
                        else
                        {
                            if (cOrder.Contracts == 0)
                            {
                                __cTrusts.Remove(sTicket);
                            }
                            else
                            {
                                __cTrusts.Add(new _TradeInfo(cOrder, sSymbolId));
                            }
                        }
                        break;

                    case ResponseType.Deal:                              //成交回報
                        EOrderAction cAction = cOrder.Action;
                        if (cAction == EOrderAction.Buy || cAction == EOrderAction.SellShort)
                        {
                            TradeList <ITrade> cOpenTrades = cResponse.OpenTrades;
                            if (cOpenTrades != null && cOpenTrades.Count > 0)
                            {
                                ITrade cTrade = cOpenTrades.GetTrade(sTicket);
                                if (cTrade != null)
                                {
                                    __cOpens.Add(new _TradeInfo(cTrade, sSymbolId));
                                }
                            }
                        }
                        else
                        {
                            List <ITrade> cCloseTrades  = cResponse.CloseTrades;
                            int           iHistoryCount = cResponse.LatestHistoryCount;
                            if (iHistoryCount > 0)
                            {
                                int iHistoryIndex = cResponse.LatestHistoryIndex;
                                if (iHistoryIndex > -1)
                                {
                                    for (int i = 0; i < iHistoryCount; i++)
                                    {
                                        ITrade cTrade = cCloseTrades[iHistoryIndex + i];
                                        __cCloses.Add(new _TradeInfo(cTrade.EntryOrder, sSymbolId, 0));
                                        __cCloses.Add(new _TradeInfo(cTrade.ExitOrder, sSymbolId, cTrade.Profit));

                                        if (cTrade.IsTradeClosed)
                                        {
                                            __cOpens.Remove(cTrade.Ticket);
                                        }
                                    }
                                }
                            }
                        }
                        break;
                    }
                }

                if (bUpdate)
                {
                    __cUpdateTimer.Start();
                    onUpdate(this, EventArgs.Empty);
                }

                lock (__oLock) {
                    __bTradeBusy = false;
                }
            }
        }
Ejemplo n.º 32
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;
		}
Ejemplo n.º 33
0
		/// <summary>
		///   建構子
		/// </summary>
		/// <param name="action">下單進出場動作</param>
		public SOrderParameters(EOrderAction action) 
			: this(Contracts.Default, string.Empty, action, OrderExit.FromAll) {
		}
Ejemplo n.º 34
0
 public double GetTax(EOrderAction action, double tradeTotals)
 {
     return(tradeTotals * __dTaxRate);
 }
Ejemplo n.º 35
0
 /// <summary>
 ///   建構子
 /// </summary>
 /// <param name="lots">下單合約數量結構</param>
 /// <param name="name">下單名稱</param>
 /// <param name="action">下單進出場動作</param>
 public SOrderParameters(Contracts lots, string name, EOrderAction action)
     : this(lots, name, action, OrderExit.FromAll)
 {
 }