Пример #1
0
        //Interfaces
        //Connection and Server
        public virtual void error(int tickerId, int errorCode, string errorMsg)
        {
            if (errorCode == 504)   //Not connected
            {
                Console.WriteLine("Connecting again...");
                msg.logError(clientSocket.getCurrentLocalTime(), errorCode, "TWS", 0, 0, errorMsg, "");
                (clientSocket as EClientSocket).eConnect("127.0.0.1", 7496, 0);
                Thread.Sleep(sleepTime);
                return;
            }
            if (errorCode == 1100 || errorCode == 1300) // Connectivity between IB and the TWS has been lost
            {
                string subject = "Sys Error " + errorCode + " : " + errorMsg;
                string body    = "";
                msg.sendEmail(subject, body);
            }
            if (errorCode == 1102) // Connectivity between IB and TWS has been restored- data maintained
            {
                string subject = "Reconnected " + errorCode + " : " + errorMsg;
                string body    = "";
                msg.sendEmail(subject, body);
            }
            //if (errorCode == 2108) //Market data farm connection is inactive but should be available upon demand.hfarm
            //{
            //    if (requireLiveBars)
            //    {
            //        Console.WriteLine("Requesting Live Bars...");
            //        msg.logError(clientSocket.getCurrentLocalTime(), errorCode, "TWS", 0, 0, errorMsg, "");
            //        foreach (var pair in contracts)
            //        {
            //            int bar_id = tg.get();
            //            clientSocket.reqRealTimeBars(pair.Key, pair.Value, 0, "TRADES", false, new List<TagValue>());
            //        }
            //    }
            //}
            bool found_owner = false;

            foreach (KeyValuePair <int, Strategy> pair in strategies)
            {
                Strategy strategy = pair.Value;
                if (strategy.hasReqIDWrapper(tickerId))
                {
                    found_owner = true;
                    ThreadPool.UnsafeQueueUserWorkItem(new WaitCallback(strategy.onErrorWrapper), new ErrorParameters(tickerId, errorCode, errorMsg));
                }
            }
            if (!found_owner)
            {
                int contract_id = mm.getContractID(tickerId);
                msg.logError(clientSocket.getCurrentLocalTime(), errorCode, "TWS", contract_id, 0, errorMsg, "");
            }
        }
Пример #2
0
        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));
        }