//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, ""); } }
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)); }