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); }
private TradeOrder SplitOrder(TradeOrder source, int splitContracts) { TradeOrder cTradeOrder = source.Clone(); //將原始下單資訊 Clone 一份 cTradeOrder.Contracts = splitContracts; //修改成要分拆的數量 int iContracts = source.Contracts; if (iContracts > 1) //如果原始的量超過 1 就計算手續費跟交易稅的平均值(有可能成交數量 > 1, 手續費與交易稅會合併計算) { cTradeOrder.Fee = source.Fee / iContracts * splitContracts; cTradeOrder.Tax = source.Tax / iContracts * splitContracts; source.Fee -= cTradeOrder.Fee; source.Tax -= cTradeOrder.Tax; } source.Contracts -= splitContracts; //分拆後的數量要從原始的下單資訊內扣除 return(cTradeOrder); //回傳分拆後的下單資訊 }
private void OrderDeal(TradeOrder trust, double dealPrice = 0) { trust.IsDealed = true; TradeOrder cDeal = trust.Clone(); cDeal.Price = (dealPrice == 0) ? Bars.Close[0] : dealPrice; cDeal.Time = Bars.Time[0]; SetTax(cDeal); double[] dValues = CalculateCommissions(cDeal); //計算交易佣金與手續費用(由策略使用者自行決定的佣金與手續費設定所計算出來的價格) cDeal.OtherFees = dValues[0]; cDeal.Fee = dValues[1]; __cDeals.Enqueue(cDeal); }