/// <summary> /// 计算平昨仓和平 /// </summary> /// <param name="pos"></param> /// <param name="OpenClose"></param> /// <returns></returns> public double GetCloseAndQty(PositionRecord pos,out EnumOpenClose OpenClose) { double qty = 0;//可平仓量 OpenClose = EnumOpenClose.CLOSE;//开平标志,默认设置为平昨仓 if (IsSHFE)//是否上交所 { // 上海,先检查今仓可平量,今仓可平量=实际今仓量-挂平今量 qty = pos.QtyToday - pos.FrozenCloseToday; if (qty > 0)//今仓可平量>0时 { OpenClose = EnumOpenClose.CLOSE_TODAY;//设置平今标志 } else//今仓可平量==0时 { // 计算出昨可平仓量,再查挂的昨平仓有多少,昨仓=(实际持仓-实际今仓)-(挂平仓量 - 挂平今量) qty = (pos.Qty - pos.QtyToday) - (pos.FrozenClose - pos.FrozenCloseToday); } } else { // 非上海,直接返回 qty = pos.Qty - pos.FrozenClose; } return qty; }
public EnumOpenClose GetOpenClose(Order order) { EnumOpenClose OpenClose = EnumOpenClose.OPEN; Order_OpenClose.TryGetValue(order, out OpenClose); return(OpenClose); }
/// <summary> /// 进行下单,最小手续费处理原则 /// </summary> public virtual void Process() { // 非交易时段,不处理 if (!TimeHelper.IsTradingTime()) { return; } // 计算仓差 double dif = TargetPosition - DualPosition.NetQty; double qty = 0; OrderSide Side = OrderSide.Buy; TextParameter.OpenClose = EnumOpenClose.OPEN; if (dif == 0)// 持仓量相等 { // 把所有的挂单全撤了 DualPosition.Cancel(); return; } else if (dif > 0 && !DualPosition.IsPending)// 表示要增加净持仓 { // 是否有在途增仓订单,超数了 // 是否有在途减仓订单,全取消息 qty = dif; Side = OrderSide.Buy; EnumOpenClose oc = EnumOpenClose.CLOSE; double q = CloseTodayHelper.GetCloseAndQty(DualPosition.Short, out oc); if (q > 0) { // 按最小数量进行平仓 qty = Math.Min(qty, q); TextParameter.OpenClose = oc; } } else if (!DualPosition.IsPending) // 减少净持仓 { qty = -dif; Side = OrderSide.Sell; EnumOpenClose oc = EnumOpenClose.CLOSE; double q = CloseTodayHelper.GetCloseAndQty(DualPosition.Long, out oc); if (q > 0) { // 按最小数量进行平仓 qty = Math.Min(qty, q); TextParameter.OpenClose = oc; } } if (qty > 0) { qty = Math.Min(qty, MaxQtyPerLot); // 下单 SendOrder(Side, qty); } }
public override void OnOrderRejected(Order order) { double LeavesQty = order.LeavesQty; double flag = order.Side == OrderSide.Buy ? 1 : -1; EnumOpenClose OpenClose = DualPosition.OrderRejected(order); lock (this) { if (EnumOpenClose.OPEN == OpenClose) { // 开仓被拒绝,不再新开仓 // 有可能是钱不够 // 有可能是超出持仓限制 // 有可能是非交易时间 TargetPosition -= flag * LeavesQty; return; } EnumError error = TextResponse.FromText(order.Text); // 无法平仓,不重发单 // 能出现这个问题是持仓计算错误,这已经是策略持仓计算错误了 if (error == EnumError.OVER_CLOSETODAY_POSITION || error == EnumError.OVER_CLOSEYESTERDAY_POSITION || error == EnumError.OVER_CLOSE_POSITION) { TargetPosition -= flag * LeavesQty; return; } // 当前状态禁止此项操作,时间不对,应当等下次操作 } }
private void InitSettings() { accountsFile = string.Format(@"{0}\{1}.Accounts.xml", Framework.Installation.IniDir, this.Name); serversFile = string.Format(@"{0}\{1}.Servers.xml", Framework.Installation.IniDir, this.Name); brokersFile = string.Format(@"{0}\{1}.Brokers.xml", Framework.Installation.IniDir, this.Name); ApiTempPath = Framework.Installation.TempDir.FullName; ResumeType = THOST_TE_RESUME_TYPE.THOST_TERT_QUICK; HedgeFlagType = TThostFtdcHedgeFlagType.Speculation; _DefaultOpenClose = EnumOpenClose.OPEN; SwitchMakertOrderToLimitOrder = false; _bWantMdConnect = true; _bWantTdConnect = true; #if CTP _SupportMarketOrder = String.Format("{0};{1};{2};", ExchangID.DCE, ExchangID.CZCE, ExchangID.CFFEX); _SupportCloseToday = ExchangID.SHFE + ";"; #elif CTPZQ #endif LastPricePlusNTicks = 10; LoadAccounts(); LoadServers(); serversList.ListChanged += ServersList_ListChanged; accountsList.ListChanged += AccountsList_ListChanged; }
public double GetCloseAndQty(PositionRecord pos,out EnumOpenClose OpenClose) { double qty = 0; OpenClose = EnumOpenClose.CLOSE; if (IsSHFE) { // 上海,先检查今仓 qty = pos.QtyToday - pos.FrozenCloseToday; if (qty > 0) { OpenClose = EnumOpenClose.CLOSE_TODAY; } else { // 先算出昨仓,再查挂的昨平仓有多少 qty = (pos.Qty - pos.QtyToday) - (pos.FrozenClose - pos.FrozenCloseToday); } } else { // 非上海,直接返回 qty = pos.Qty - pos.FrozenClose; } return qty; }
public static EnumOpenClose CheckOpenClose(Order order) { string text = order.Text; EnumOpenClose OpenClose = EnumOpenClose.OPEN; if (text.StartsWith("{") && text.EndsWith("}")) { TextParameter parameter = JsonConvert.DeserializeObject <TextParameter>(text); switch (parameter.Type) { case EnumGroupType.COMMON: { TextCommon t = JsonConvert.DeserializeObject <TextCommon>(text); OpenClose = t.OpenClose; } break; case EnumGroupType.QUOTE: { TextQuote t = JsonConvert.DeserializeObject <TextQuote>(text); OpenClose = t.OpenClose; } break; } } return(OpenClose); }
public double GetCloseAndQty(PositionRecord pos, out EnumOpenClose OpenClose) { double qty = 0; OpenClose = EnumOpenClose.CLOSE; if (IsSHFE) { // 上海,先检查今仓 qty = pos.QtyToday - pos.FrozenCloseToday; if (qty > 0) { OpenClose = EnumOpenClose.CLOSE_TODAY; } else { // 先算出昨仓,再查挂的昨平仓有多少 qty = (pos.Qty - pos.QtyToday) - (pos.FrozenClose - pos.FrozenCloseToday); } } else { // 非上海,直接返回 qty = pos.Qty - pos.FrozenClose; } return(qty); }
/// <summary> /// 平今仓转换成平昨仓标志 /// </summary> /// <param name="OpenClose"></param> /// <returns></returns> public EnumOpenClose Transform(EnumOpenClose OpenClose) { if (!IsSHFE) { if (OpenClose == EnumOpenClose.CLOSE_TODAY) return EnumOpenClose.CLOSE; } return OpenClose; }
public EnumOpenClose Transform(EnumOpenClose OpenClose) { if (!IsSHFE) { if (OpenClose == EnumOpenClose.CLOSE_TODAY) { return(EnumOpenClose.CLOSE); } } return(OpenClose); }
// 最小手续费处理原则 public void Process() { // 非交易时段,无法处理 if (!TimeHelper.IsTradingTime()) { return; } // 计算仓差 double dif = TargetPosition - DualPosition.NetQty; double qty = 0; OrderSide Side = OrderSide.Buy; EnumOpenClose oc = EnumOpenClose.OPEN; if (dif == 0)// 持仓量相等 { // 把所有的挂单先撤了 } else if (dif > 0 && !DualPosition.IsPending)// 表示要增加净持仓 { // 是否有在途增仓订单,超数了 // 是否有在途减仓订单,全取消息 qty = dif; Side = OrderSide.Buy; if (DualPosition.Short.Qty > 0) { // 按最小数量进行平仓 qty = Math.Min(qty, DualPosition.Short.Qty); oc = EnumOpenClose.CLOSE; } } else if (!DualPosition.IsPending) // 减少净持仓 { qty = -dif; Side = OrderSide.Sell; if (DualPosition.Long.Qty > 0) { // 按最小数量进行平仓 qty = Math.Min(qty, DualPosition.Long.Qty); oc = EnumOpenClose.CLOSE; } } if (qty > 0) { qty = Math.Min(qty, MaxQtyPerLot); // 下单 SendOrder(Side, oc, qty); } }
public static string GetOpenCloseString(EnumOpenClose oc) { switch (oc) { case EnumOpenClose.OPEN: return OPEN_PREFIX; case EnumOpenClose.CLOSE: return CLOSE_TODAY_PREFIX; default: return OPEN_PREFIX; } }
public static EnumOpenClose CheckOpenClose(Order order) { string text = order.Text; EnumOpenClose OpenClose = EnumOpenClose.OPEN; if (text.StartsWith("{") && text.EndsWith("}")) { TextCommon parameter = JsonConvert.DeserializeObject <TextCommon>(text); OpenClose = parameter.OpenClose; } return(OpenClose); }
public static string GetOpenCloseString(EnumOpenClose oc) { switch (oc) { case EnumOpenClose.OPEN: return TextCommon.Open; case EnumOpenClose.CLOSE: return TextCommon.Close; case EnumOpenClose.CLOSE_TODAY: return TextCommon.CloseToday; default: return TextCommon.Open; } }
public EnumOpenClose OrderRejected(Order order) { lock (this) { EnumOpenClose OpenClose = EnumOpenClose.OPEN; Order_OpenClose.TryGetValue(order, out OpenClose); if (EnumOpenClose.OPEN == OpenClose) { if (order.Side == OrderSide.Buy) { Long.FrozenOpen -= order.LeavesQty; } else { Short.FrozenOpen -= order.LeavesQty; } } else { if (order.Side == OrderSide.Buy) { Short.FrozenClose -= order.LeavesQty; } else { Long.FrozenClose -= order.LeavesQty; } } if (order.IsDone) { if (order.Side == OrderSide.Buy) { Buy.Remove(order); } else { Sell.Remove(order); } } Order_OpenClose.Remove(order); return(OpenClose); } }
public static string GetOpenCloseString(EnumOpenClose oc) { switch (oc) { case EnumOpenClose.OPEN: return(TextCommon.Open); case EnumOpenClose.CLOSE: return(TextCommon.Close); case EnumOpenClose.CLOSE_TODAY: return(TextCommon.CloseToday); default: return(TextCommon.Open); } }
public static TThostFtdcOffsetFlagType ToCTP(EnumOpenClose offset) { switch (offset) { case EnumOpenClose.OPEN: return(TThostFtdcOffsetFlagType.Open); case EnumOpenClose.CLOSE: return(TThostFtdcOffsetFlagType.Close); case EnumOpenClose.CLOSE_TODAY: return(TThostFtdcOffsetFlagType.CloseToday); default: return(TThostFtdcOffsetFlagType.Open); } }
public void NewOrder(Order order) { lock (this) { if (!order.IsPendingNew) { return; } EnumOpenClose OpenClose = OpenCloseHelper.CheckOpenClose(order); if (EnumOpenClose.OPEN == OpenClose) { if (order.Side == OrderSide.Buy) { Long.FrozenOpen += order.Qty; } else { Short.FrozenOpen += order.Qty; } } else { if (order.Side == OrderSide.Buy) { Short.FrozenClose += order.Qty; } else { Long.FrozenClose += order.Qty; } } if (order.Side == OrderSide.Buy) { Buy.Add(order); } else { Sell.Add(order); } Order_OpenClose[order] = OpenClose; } }
/// <summary> /// 单子被撤 /// </summary> /// <param name="order"></param> /// <returns></returns> public EnumOpenClose OrderCancelled(Order order) { lock (this) { EnumOpenClose OpenClose = GetOpenClose(order); if (PositionSide.Long == OpenCloseHelper.CheckLongShort(order, OpenClose)) { ++Long.CumCancelCnt; } else { ++Short.CumCancelCnt; } OrderRejected(order); return(OpenClose); } }
public static PositionSide CheckLongShort(Order order,EnumOpenClose OpenClose) { if (EnumOpenClose.OPEN == OpenClose) { if (order.Side == OrderSide.Buy) { return PositionSide.Long; } } else { if (order.Side == OrderSide.Buy) { } else { return PositionSide.Long; } } return PositionSide.Short; }
public static PositionSide CheckLongShort(Order order, EnumOpenClose OpenClose) { if (EnumOpenClose.OPEN == OpenClose) { if (order.Side == OrderSide.Buy) { return(PositionSide.Long); } } else { if (order.Side == OrderSide.Buy) { } else { return(PositionSide.Long); } } return(PositionSide.Short); }
// 下单操作 private void SendOrder(OrderSide side, EnumOpenClose oc, double qty) { if (!TimeHelper.IsTradingTime()) { return; } if (qty <= 0) { return; } // 为减少滑点,对数量少的单子直接市价单 bool bMarketOrder = false; if (EnumOpenClose.OPEN == oc) { if (qty <= MarketOpenPriceThreshold) { bMarketOrder = true; } } else { if (qty <= MarketClosePriceThreshold) { bMarketOrder = true; } } if (bMarketOrder) { SendMarketOrder(side, qty, OpenCloseHelper.GetOpenCloseString(oc)); } else { SendLimitOrder(side, qty, PriceHelper.GetMatchPrice(this, side, 2), OpenCloseHelper.GetOpenCloseString(oc)); } }
// 下单操作 private void SendOrder(OrderSide side, EnumOpenClose oc, double qty) { if (qty <= 0) { return; } // 为减少滑点,对数量少的单子直接市价单 bool bMarketOrder = false; if (EnumOpenClose.OPEN == oc) { if (qty <= MarketOpenPriceThreshold) bMarketOrder = true; } else { if (qty <= MarketClosePriceThreshold) bMarketOrder = true; } if (bMarketOrder) { SendMarketOrder(side, qty, OpenCloseHelper.GetOpenCloseString(oc)); } else { SendLimitOrder(side, qty, GetPrice(side, 2), OpenCloseHelper.GetOpenCloseString(oc)); } }
public static PositionSide CheckLongShort(Order order) { EnumOpenClose OpenClose = CheckOpenClose(order); return(CheckLongShort(order, OpenClose)); }
public void Filled(Order order) { lock (this) { EnumOpenClose OpenClose = EnumOpenClose.OPEN; Order_OpenClose.TryGetValue(order, out OpenClose); if (EnumOpenClose.OPEN == OpenClose) { if (order.Side == OrderSide.Buy) { Long.Qty += order.LastQty; Long.FrozenOpen -= order.LastQty; Long.CumOpenQty += order.LastQty; Long.HoldingCost += order.LastPrice * order.LastQty; } else { Short.Qty += order.LastQty; Short.FrozenOpen -= order.LastQty; Short.CumOpenQty += order.LastQty; Short.HoldingCost += order.LastPrice * order.LastQty; } } else { if (order.Side == OrderSide.Buy) { Short.Qty -= order.LastQty; Short.FrozenClose -= order.LastQty; if (Short.Qty == 0) { Short.HoldingCost = 0; } else { Short.HoldingCost -= order.LastPrice * order.LastQty; } } else { Long.Qty -= order.LastQty; Long.FrozenClose -= order.LastQty; if (Long.Qty == 0) { Long.HoldingCost = 0; } else { Long.HoldingCost -= order.LastPrice * order.LastQty; } } } if (order.IsDone) { if (order.Side == OrderSide.Buy) { Buy.Remove(order); } else { Sell.Remove(order); } } Order_OpenClose.Remove(order); } }
private void InitSettings() { accountsFile = string.Format(@"{0}\{1}.Accounts.xml", Framework.Installation.IniDir,this.Name); serversFile = string.Format(@"{0}\{1}.Servers.xml", Framework.Installation.IniDir, this.Name); brokersFile = string.Format(@"{0}\{1}.Brokers.xml", Framework.Installation.IniDir, this.Name); ApiTempPath = Framework.Installation.TempDir.FullName; ResumeType = THOST_TE_RESUME_TYPE.THOST_TERT_QUICK; HedgeFlagType = TThostFtdcHedgeFlagType.Speculation; _DefaultOpenClose = EnumOpenClose.OPEN; SwitchMakertOrderToLimitOrder = false; _bWantMdConnect = true; _bWantTdConnect = true; #if CTP _SupportMarketOrder = String.Format("{0};{1};{2};", ExchangID.DCE, ExchangID.CZCE, ExchangID.CFFEX); _SupportCloseToday = ExchangID.SHFE + ";"; #elif CTPZQ #endif LastPricePlusNTicks = 10; LoadAccounts(); LoadServers(); serversList.ListChanged += ServersList_ListChanged; accountsList.ListChanged += AccountsList_ListChanged; }
public EnumOpenClose OrderRejected(Order order) { lock (this) { EnumOpenClose OpenClose = EnumOpenClose.OPEN; Order_OpenClose.TryGetValue(order, out OpenClose); switch (OpenClose) { case EnumOpenClose.OPEN: if (order.Side == OrderSide.Buy) { Long.FrozenOpen -= order.LeavesQty; } else { Short.FrozenOpen -= order.LeavesQty; } break; case EnumOpenClose.CLOSE: if (order.Side == OrderSide.Buy) { Short.FrozenClose -= order.LeavesQty; } else { Long.FrozenClose -= order.LeavesQty; } break; case EnumOpenClose.CLOSE_TODAY: if (order.Side == OrderSide.Buy) { Short.FrozenCloseToday -= order.LeavesQty; Short.FrozenClose -= order.LeavesQty; } else { Long.FrozenCloseToday -= order.LeavesQty; Long.FrozenClose -= order.LeavesQty; } break; default: break; } if (order.IsDone) { if (order.Side == OrderSide.Buy) { Buy.Remove(order); } else { Sell.Remove(order); } } Order_OpenClose.Remove(order); return(OpenClose); } }
/// <summary> /// 有订单成交 /// </summary> /// <param name="order"></param> public void Filled(Order order) { lock (this) { EnumOpenClose OpenClose = EnumOpenClose.OPEN; Order_OpenClose.TryGetValue(order, out OpenClose); switch (OpenClose) { case EnumOpenClose.OPEN: if (order.Side == OrderSide.Buy) { Long.Qty += order.LastQty; Long.QtyToday += order.LastQty; Long.FrozenOpen -= order.LastQty; Long.CumOpenQty += order.LastQty; Long.HoldingCost += order.LastPrice * order.LastQty; } else { Short.Qty += order.LastQty; Short.QtyToday += order.LastQty; Short.FrozenOpen -= order.LastQty; Short.CumOpenQty += order.LastQty; Short.HoldingCost += order.LastPrice * order.LastQty; } break; case EnumOpenClose.CLOSE: if (order.Side == OrderSide.Buy) { Short.Qty -= order.LastQty; Short.FrozenClose -= order.LastQty; if (Short.Qty == 0) { Short.HoldingCost = 0; } else { Short.HoldingCost -= order.LastPrice * order.LastQty; } } else { Long.Qty -= order.LastQty; Long.FrozenClose -= order.LastQty; if (Long.Qty == 0) { Long.HoldingCost = 0; } else { Long.HoldingCost -= order.LastPrice * order.LastQty; } } break; case EnumOpenClose.CLOSE_TODAY: if (order.Side == OrderSide.Buy) { Short.Qty -= order.LastQty; Short.QtyToday -= order.LastQty; Short.FrozenClose -= order.LastQty; Short.FrozenCloseToday -= order.LastQty; if (Short.Qty == 0) { Short.HoldingCost = 0; } else { Short.HoldingCost -= order.LastPrice * order.LastQty; } } else { Long.Qty -= order.LastQty; Long.QtyToday -= order.LastQty; Long.FrozenClose -= order.LastQty; Long.FrozenCloseToday -= order.LastQty; if (Long.Qty == 0) { Long.HoldingCost = 0; } else { Long.HoldingCost -= order.LastPrice * order.LastQty; } } break; default: break; } if (order.IsDone) { if (order.Side == OrderSide.Buy) { Buy.Remove(order); } else { Sell.Remove(order); } } Order_OpenClose.Remove(order); } }
private Order SendOrderEx(Future future, double priceLimite, int volume, EnumBuySell buySell, EnumOpenClose openClose) { return(SendOrder(DefaultAccount, future.ID, future.Market, future.ExchangeID, priceLimite, volume, buySell, openClose, EnumOrderPriceType.市价, EnumOrderTimeForce.当日有效, EnumHedgeFlag.投机)); }
/// <summary> /// 报单函数 /// </summary> /// <param name="_buysell">(*下单必填)买卖方向(1 - 买入,2 - 卖出)</param> /// <param name="_openclose">(*下单必填)开平仓标记:1、开仓(新订);2、平今;3、平昨;4、平仓(先订先转); /// 5、平仓(转今优先);6、指定仓平仓;</param> /// <param name="_price">委托价格</param> /// <param name="_volume">委托数量</param> /// <param name="_tradeno">交易流水</param> /// <returns></returns> public bool ForLimitOrder(EnumBuySell _buysell, EnumOpenClose _openclose, int _price, int _volume, string _contractId, string _tradeno) { Orderf orf = new Orderf(); orf.contract_no = contractID; orf.contract_id = _contractId; orf.is_deposit = "1"; orf.trade_type = "1"; //买卖方向 if (_buysell == EnumBuySell.买入) { orf.buyorsell = "1"; } else { orf.buyorsell = "2"; } //开平标志 if (_openclose == EnumOpenClose.开仓_新订) { orf.offset_flag = "1"; } else if (_openclose == EnumOpenClose.平今) { orf.offset_flag = "2"; } else if (_openclose == EnumOpenClose.平昨) { orf.offset_flag = "3"; } else if (_openclose == EnumOpenClose.平仓_先订先转) { orf.offset_flag = "4"; } else if (_openclose == EnumOpenClose.平仓_转今优先) { orf.offset_flag = "5"; } else { orf.offset_flag = "6"; } orf.order_price = _price + ""; orf.order_qtt = _volume + ""; try { if (manageTrade != null) { return(manageTrade.ForJHTradeOrderfRequest(orf, _tradeno)); } else { return(false); } } catch { return(false); } }
public static TThostFtdcOffsetFlagType ToCTP(EnumOpenClose offset) { switch (offset) { case EnumOpenClose.OPEN: return TThostFtdcOffsetFlagType.Open; case EnumOpenClose.CLOSE: return TThostFtdcOffsetFlagType.Close; case EnumOpenClose.CLOSE_TODAY: return TThostFtdcOffsetFlagType.CloseToday; default: return TThostFtdcOffsetFlagType.Open; } }
/// <summary> /// 产生了新订单 /// </summary> /// <param name="order"></param> public void NewOrder(Order order) { lock (this) { if (!order.IsPendingNew) { return; } // 非上海的,平今要转成平仓 EnumOpenClose OpenClose = CloseTodayHelper.Transform(OpenCloseHelper.CheckOpenClose(order)); switch (OpenClose) { case EnumOpenClose.OPEN: if (order.Side == OrderSide.Buy) { Long.FrozenOpen += order.Qty; } else { Short.FrozenOpen += order.Qty; } break; case EnumOpenClose.CLOSE: if (order.Side == OrderSide.Buy) { Short.FrozenClose += order.Qty; } else { Long.FrozenClose += order.Qty; } break; case EnumOpenClose.CLOSE_TODAY: if (order.Side == OrderSide.Buy) { Short.FrozenCloseToday += order.Qty; Short.FrozenClose += order.Qty; } else { Long.FrozenCloseToday += order.Qty; Long.FrozenClose += order.Qty; } break; default: break; } if (order.Side == OrderSide.Buy) { Buy.Add(order); } else { Sell.Add(order); } Order_OpenClose[order] = OpenClose; } }
/// <summary> /// 产生了新订单 /// </summary> /// <param name="order"></param> public void NewOrder(Order order) { lock (this) { if (!order.IsPendingNew) { return; } double Qty = order.Qty; // 非上海的,平今要转成平仓 EnumOpenClose OpenClose = CloseTodayHelper.Transform(OpenCloseHelper.CheckOpenClose(order)); Order_OpenClose[order] = OpenClose; switch (OpenClose) { case EnumOpenClose.OPEN: if (order.Side == OrderSide.Buy) { //Long.FrozenOpen += Qty; Long.NewOrderOpen(Qty); } else { //Short.FrozenOpen += Qty; Short.NewOrderOpen(Qty); } break; case EnumOpenClose.CLOSE: if (order.Side == OrderSide.Buy) { //Short.FrozenClose += Qty; Short.NewOrderClose(Qty); } else { //Long.FrozenClose += Qty; Long.NewOrderClose(Qty); } break; case EnumOpenClose.CLOSE_TODAY: if (order.Side == OrderSide.Buy) { //Short.FrozenCloseToday += Qty; //Short.FrozenClose += Qty; Short.NewOrderCloseToday(Qty); } else { //Long.FrozenCloseToday += Qty; //Long.FrozenClose += Qty; Long.NewOrderCloseToday(Qty); } break; default: MessageBox.Show("NewOrder"); break; } if (order.Side == OrderSide.Buy) { Buy.Add(order); } else { Sell.Add(order); } } }
/// <summary> /// 有订单成交 /// </summary> /// <param name="order"></param> public void Filled(Order order) { lock (this) { double LastQty = order.LastQty; double LastPrice = order.LastPrice; bool IsDone = order.IsDone; EnumOpenClose OpenClose = GetOpenClose(order); switch (OpenClose) { case EnumOpenClose.OPEN: if (order.Side == OrderSide.Buy) { //Long.Qty += LastQty; //Long.QtyToday += LastQty; //Long.FrozenOpen -= LastQty; //Long.CumOpenQty += LastQty; //Long.HoldingCost += LastPrice * LastQty; Long.FilledOpen(LastQty, LastPrice); } else { //Short.Qty += LastQty; //Short.QtyToday += LastQty; //Short.FrozenOpen -= LastQty; //Short.CumOpenQty += LastQty; //Short.HoldingCost += LastPrice * LastQty; Short.FilledOpen(LastQty, LastPrice); } break; case EnumOpenClose.CLOSE: if (order.Side == OrderSide.Buy) { //Short.Qty -= LastQty; //Short.FrozenClose -= LastQty; //if (Short.Qty == 0) //{ // Short.HoldingCost = 0; //} //else //{ // Short.HoldingCost -= LastPrice * LastQty; //} Short.FilledClose(LastQty, LastPrice); } else { //Long.Qty -= LastQty; //Long.FrozenClose -= LastQty; //if (Long.Qty == 0) //{ // Long.HoldingCost = 0; //} //else //{ // Long.HoldingCost -= LastPrice * LastQty; //} Long.FilledClose(LastQty, LastPrice); } break; case EnumOpenClose.CLOSE_TODAY: if (order.Side == OrderSide.Buy) { //Short.Qty -= LastQty; //Short.QtyToday -= LastQty; //Short.FrozenClose -= LastQty; //Short.FrozenCloseToday -= LastQty; //if (Short.Qty == 0) //{ // Short.HoldingCost = 0; //} //else //{ // Short.HoldingCost -= LastPrice * LastQty; //} Short.FilledCloseToday(LastQty, LastPrice); } else { //Long.Qty -= LastQty; //Long.QtyToday -= LastQty; //Long.FrozenClose -= LastQty; //Long.FrozenCloseToday -= LastQty; //if (Long.Qty == 0) //{ // Long.HoldingCost = 0; //} //else //{ // Long.HoldingCost -= LastPrice * LastQty; //} Long.FilledCloseToday(LastQty, LastPrice); } break; default: MessageBox.Show("Filled"); break; } if (IsDone) { if (order.Side == OrderSide.Buy) { Buy.Remove(order); } else { Sell.Remove(order); } Order_OpenClose.Remove(order); } } }
public EnumOpenClose OrderRejected(Order order) { lock (this) { double LeavesQty = order.LeavesQty; EnumOpenClose OpenClose = GetOpenClose(order); switch (OpenClose) { case EnumOpenClose.OPEN: if (order.Side == OrderSide.Buy) { //Long.FrozenOpen -= LeavesQty; Long.OrderRejectedOpen(LeavesQty); } else { //Short.FrozenOpen -= LeavesQty; Short.OrderRejectedOpen(LeavesQty); } break; case EnumOpenClose.CLOSE: if (order.Side == OrderSide.Buy) { //Short.FrozenClose -= LeavesQty; Short.OrderRejectedClose(LeavesQty); } else { //Long.FrozenClose -= LeavesQty; Long.OrderRejectedClose(LeavesQty); } break; case EnumOpenClose.CLOSE_TODAY: if (order.Side == OrderSide.Buy) { //Short.FrozenCloseToday -= LeavesQty; //Short.FrozenClose -= LeavesQty; Short.OrderRejectedCloseToday(LeavesQty); } else { //Long.FrozenCloseToday -= LeavesQty; //Long.FrozenClose -= LeavesQty; Long.OrderRejectedCloseToday(LeavesQty); } break; default: MessageBox.Show("OrderRejected"); break; } //if (IsDone) { if (order.Side == OrderSide.Buy) { Buy.Remove(order); } else { Sell.Remove(order); } Order_OpenClose.Remove(order); } return(OpenClose); } }