예제 #1
0
        public StrategyHelper(Framework framework, SmartQuant.Strategy strategy)
        {
            this.framework = framework;
            this.strategy  = strategy;

            this.DualPositionContainer = new DualPositionContainer(framework);
            this.OpenCloseHelper       = new OpenCloseHelper(framework, strategy);
            this.PositionHelper        = new PositionHelper(framework);

            this.Strategies = new Dictionary <int, InstrumentStrategyHelper>();

            {
                // 创建多空两套持仓,只是显示用,实际上不以此为依据
                Long = new Portfolio(framework, strategy.Name + "_Long");
                framework.PortfolioManager.Add(Long);
                Long.Parent = strategy.Portfolio;

                Short = new Portfolio(framework, strategy.Name + "_Short");
                framework.PortfolioManager.Add(Short);
                Short.Parent = strategy.Portfolio;
            }

            {
                // 在实际下单时需要使用指定所操作的Portfolio
                OpenCloseHelper.Long  = Long;
                OpenCloseHelper.Short = Short;
            }
        }
예제 #2
0
        // 这里假设已经挂的单子已经是按最优数量进行处理过,目标是直接挂单
        // 目前对前两层做智能开平,后面的全用开仓单
        // 因为后面的使用平仓单,还要处理复杂的大量开挂单的问题。
        // 实际上不能太深,因为深了占用资金
        public int 补单(OrderBook_OneSide_Order buy1, OrderBook_OneSide_Size buy2)
        {
            int cnt = 0;

            // 方向不对,不可能补单
            if (buy1.Side != buy2.Side)
            {
                return(cnt);
            }

            int l = 0;

            // 由于在别的地方做了撤单,在这buy2中的数量是大于buy1的
            foreach (var b2 in buy2.Grid)
            {
                ++l;
                int    level = b2.Key;
                double size  = b2.Value;

                // 要补单的数量
                double leave = size - buy1.SizeByLevel(level);
                if (leave <= 0)
                {
                    continue;
                }

                double price = PriceHelper.GetPriceByLevel(level);
                cnt += (int)leave;

                // 超过两层的全用开仓
                if (l > 2)
                {
                    SendLimitOrder(buy2.Side, leave, price,
                                   OpenCloseHelper.GetOpenCloseString(EnumOpenClose.OPEN));
                    continue;
                }

                // 应当对容易平仓的位置进行平仓
                // 这个地方要测试一个,我只有10持仓,先挂10手平,第二个价格再挂自动生成的单是平还是开?检查数据计算是否正确
                // 补单是一次性的,还是分两笔,还是分两笔吧
                //double canqty = DualPosition.CanCloseQty(buy2.Side);

                //// 检查平仓,如果补单限为一次,那就把此行注释
                //if (canqty > 0)
                //{
                //    double min = Math.Min(leave, canqty);
                //    leave -= min;
                //    SendLimitOrder(buy2.Side, min, price,
                //        OpenCloseHelper.GetOpenCloseString(EnumOpenClose.CLOSE_TODAY));
                //}

                if (leave > 0)
                {
                    //SendLimitOrder(buy2.Side, leave, price,
                    //    OpenCloseHelper.GetOpenCloseString(DualPosition.CanClose(buy2.Side, leave)));
                }
            }

            return(cnt);
        }
예제 #3
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));
            }
        }
예제 #4
0
 protected override void OnStrategyStart()
 {
     OpenCloseHelper = new OpenCloseHelper(framework, this);
     OpenCloseHelper.SeparateOrder = SeparateOrder.SeparateCloseOpen;
     OpenCloseHelper.SendStyle     = SendStyle.OneByOne;
 }
예제 #5
0
 // 重新发单
 private void ResendOrder(Order order)
 {
     SendOrder(order.Side, OpenCloseHelper.CheckOpenClose(order), order.LeavesQty);
 }