/// <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;
 }
Exemple #2
0
        public EnumOpenClose GetOpenClose(Order order)
        {
            EnumOpenClose OpenClose = EnumOpenClose.OPEN;

            Order_OpenClose.TryGetValue(order, out OpenClose);
            return(OpenClose);
        }
Exemple #3
0
        /// <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;
                }

                // 当前状态禁止此项操作,时间不对,应当等下次操作
            }
        }
Exemple #5
0
        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;
 }
Exemple #7
0
        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);
 }
Exemple #11
0
        // 最小手续费处理原则
        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);
        }
Exemple #14
0
 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;
     }
 }
Exemple #15
0
        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);
            }
        }
Exemple #17
0
        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);
            }
        }
Exemple #18
0
        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;
            }
        }
Exemple #19
0
        /// <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);
            }
        }
Exemple #20
0
 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);
 }
Exemple #22
0
        // 下单操作
        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));
        }
Exemple #25
0
        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;
        }
Exemple #27
0
        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);
            }
        }
Exemple #28
0
        /// <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);
            }
        }
Exemple #29
0
 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.投机));
 }
Exemple #30
0
        /// <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);
            }
        }
Exemple #31
0
 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;
     }
 }
Exemple #32
0
        /// <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;
            }
        }
Exemple #33
0
        /// <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);
                }
            }
        }
Exemple #34
0
        /// <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);
                }
            }
        }
Exemple #35
0
        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);
            }
        }