예제 #1
0
        public static List <Order> createBracketOrder(Order parent, double profitTarget, double stopTarget, DateTime expiry, OrderTemplate profitTemplate = null, OrderTemplate stopTemplate = null, OrderTemplate expiryTemplate = null)
        {
            List <Order> orders = new List <Order>();

            parent.Transmit = false;
            orders.Add(parent);
            if (expiry != DateTime.MinValue)
            {
                Order expiryOrder;
                if (expiryTemplate == null)
                {
                    expiryOrder           = new Order();
                    expiryOrder.OrderType = "MKT";
                }
                else
                {
                    expiryOrder = expiryTemplate.clone();
                    if (!expiryTemplate.isSet("OrderType"))
                    {
                        expiryOrder.OrderType = "MKT";
                    }
                }
                expiryOrder.GoodAfterTime = expiry.ToString("yyyyMMdd HH:mm:ss");
                expiryOrder.Action        = parent.Action.Equals("BUY") ? "SELL" : "BUY";
                expiryOrder.TotalQuantity = parent.TotalQuantity;
                //expiryOrder.OrderId = _og.get();
                expiryOrder.ParentId = parent.OrderId;
                expiryOrder.Transmit = false;
                orders.Add(expiryOrder);
            }
            if (profitTarget != 0)
            {
                Order profitOrder;
                if (profitTemplate == null)
                {
                    profitOrder           = new Order();
                    profitOrder.OrderType = "LMT";
                }
                else
                {
                    profitOrder = profitTemplate.clone();
                    if (!profitTemplate.isSet("OrderType"))
                    {
                        profitOrder.OrderType = "LMT";
                    }
                }
                profitOrder.Action        = parent.Action.Equals("BUY") ? "SELL" : "BUY";
                profitOrder.TotalQuantity = parent.TotalQuantity;
                profitOrder.LmtPrice      = profitTarget;
                //profitOrder.OrderId = _og.get();
                profitOrder.ParentId = parent.OrderId;
                profitOrder.Transmit = false;
                orders.Add(profitOrder);
            }
            if (stopTarget != 0)
            {
                Order stopOrder;
                if (stopTemplate == null)
                {
                    stopOrder           = new Order();
                    stopOrder.OrderType = "STP";
                }
                else
                {
                    stopOrder = stopTemplate.clone();
                    if (!stopTemplate.isSet("OrderType"))
                    {
                        stopOrder.OrderType = "STP";
                    }
                    if (stopOrder.OrderType == "STP LMT" && !stopTemplate.isSet("LmtPriceOffset"))
                    {
                        stopOrder.LmtPriceOffset = stopTarget * 0.1; // assume offset is 10% of stop price if not set
                    }
                }
                stopOrder.Action        = parent.Action.Equals("BUY") ? "SELL" : "BUY";
                stopOrder.TotalQuantity = parent.TotalQuantity;
                stopOrder.AuxPrice      = stopTarget;
                if (stopOrder.OrderType == "STP LMT")
                {
                    stopOrder.LmtPrice = stopTarget + stopOrder.LmtPriceOffset * (stopOrder.Action.Equals("BUY") ? 1 : -1);
                }
                //stopOrder.OrderId = _og.get();
                stopOrder.ParentId = parent.OrderId;
                stopOrder.Transmit = false;
                orders.Add(stopOrder);
            }
            orders[orders.Count() - 1].Transmit = true;
            return(orders);
        }
예제 #2
0
파일: BlockOrder.cs 프로젝트: kwangphys/QT
        public void sendOrder(
            Order ord,
            DateTime endTime,
            //bool mktOrdersOnly
            double profitTarget      = 0,
            double stopTarget        = 0,
            DateTime?expiryStartTime = null,
            DateTime?expiryEndTime   = null,
            DateTime?cancelAfter     = null
            )
        {
            _profitTarget    = profitTarget;
            _stopTarget      = stopTarget;
            _expiryStartTime = expiryStartTime;
            _expiryEndTime   = expiryEndTime;
            _cancelAfter     = cancelAfter;
            //Create order schedules
            int qty = (int)(ord.TotalQuantity);

            //Test Only
            //_unitSize = 2;
            //_maxOrderSize = 4;
            //_maxNOrders = 12;
            //qty = 20;

            int           maxNOrders         = Math.Min(_maxNOrders, (int)((qty - 0.5) / (double)(_unitSize)) + 1);
            int           minNOrders         = (int)((qty - 0.5) / (double)(_maxOrderSize)) + 1;
            Random        r                  = new Random();
            int           nOrders            = minNOrders >= maxNOrders ? maxNOrders : r.Next(minNOrders, maxNOrders + 1);
            int           minUnitSize        = Math.Min(_unitSize, qty / nOrders);
            int           remainQty          = qty - minUnitSize * nOrders;
            int           maxRemainOrderSize = _maxOrderSize - minUnitSize;
            List <double> qtySchedule        = new List <double>();

            if (remainQty == 0)
            {
                for (int i = 0; i < nOrders; ++i)
                {
                    qtySchedule.Add(0);
                }
            }
            else
            {
                for (int i = 0; i < nOrders; ++i)
                {
                    qtySchedule.Add(r.NextDouble());
                }
                double qsum      = qtySchedule.Sum();
                double qsmall    = 0;
                double qsmallnew = 0;
                for (int i = 0; i < nOrders; ++i)
                {
                    qtySchedule[i] *= remainQty / qsum;
                    if (qtySchedule[i] > maxRemainOrderSize)
                    {
                        qsmallnew     += qtySchedule[i] - maxRemainOrderSize;
                        qtySchedule[i] = maxRemainOrderSize;
                    }
                    else
                    {
                        qsmall    += qtySchedule[i];
                        qsmallnew += qtySchedule[i];
                    }
                }
                if (qsmallnew != qsmall)
                {
                    double qratio = qsmallnew / qsmall;
                    for (int i = 0; i < nOrders; ++i)
                    {
                        if (qtySchedule[i] < maxRemainOrderSize)
                        {
                            qtySchedule[i] *= qratio;
                        }
                    }
                }
                for (int i = 1; i < nOrders; ++i)
                {
                    qtySchedule[i] += qtySchedule[i - 1];
                }
            }
            List <double> timeSchedule = new List <double>();

            for (int i = 0; i < nOrders; ++i)
            {
                timeSchedule.Add(r.NextDouble());
            }
            timeSchedule.Sort();

            _orderSchedule = new List <Tuple <Order, DateTime> >();
            DateTime tstart      = Strategy.getExchangeTime(_socket.getCurrentLocalTime(), _zone);
            long     remainTicks = (endTime - tstart).Ticks;
            int      prerq       = 0;

            for (int i = 0; i < nOrders; ++i)
            {
                int rq = (int)(Math.Round(qtySchedule[i], 0));
                int q  = minUnitSize + rq - prerq;
                prerq = rq;
                long  ticks = (long)(timeSchedule[i] * remainTicks);
                Order o     = _entryTemplate.clone();
                o.Action        = ord.Action;
                o.TotalQuantity = q;
                if (!_entryTemplate.isSet("OrderType"))
                {
                    o.OrderType = "MKT";
                }
                //o.LmtPrice = 0;
                o.Transmit = false;
                //o.TrailStopPrice = 0;
                //o.TrailingPercent = 0;
                //o.SmartComboRoutingParams = new List<TagValue>();
                //o.SmartComboRoutingParams.Add(new TagValue("NonGuaranteed", "1"));
                DateTime t = tstart.AddTicks(ticks);
                _orderSchedule.Add(new Tuple <Order, DateTime>(o, t));
                _msg.logMessage(t, 1, "Information", "BlockOrder", _con.ConId, _stg_id, "Scheduled " + o.OrderType + " " + o.Action + " " + o.TotalQuantity.ToString());
            }
            _placeOrderEvent.Reset();
            _mktDataEvents[1].Reset();
            _mktDataEvents[2].Reset();
            _mktDataEvents[4].Reset();
            ThreadPool.QueueUserWorkItem(new WaitCallback(placeOrders));
        }