public int reqMktData(int strategy_id, Contract con, string source) { int tick_id = _db.getTickDataId(con.ConId, source); lock (_lock) { if (!_tickTickerMap.ContainsKey(tick_id)) { int ticker = _tg.get(); _tickTickerMap.Add(tick_id, ticker); _tickerTickMap.Add(ticker, tick_id); _tickerContractMap.Add(ticker, con.ConId); _tickerStrategiesMap.Add(ticker, new HashSet <int>(new int[] { strategy_id })); _socket.reqMktData(ticker, con, "", false, new List <TagValue>()); } else { _tickerStrategiesMap[_tickTickerMap[tick_id]].Add(strategy_id); } } return(_tickTickerMap[tick_id]); }
private void placeOrders(object dummy) { Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture; int iorder = 0; Random r = new Random(); long nticks = _expiryStartTime != null && _expiryEndTime != null ? ((DateTime)(_expiryEndTime) - (DateTime)(_expiryStartTime)).Ticks : 0; while (iorder < Count()) { DateTime t = Strategy.getLocalTime(_orderSchedule[iorder].Item2, _zone); _socket.sleepUntil(t, _placeOrderEvent); Order ord = _orderSchedule[iorder].Item1; double price = 0; if (_profitTarget != 0 || _stopTarget != 0) { bool success = false; while (!success) { int reqId = _tg.get(); lock (_lock) { _quotes[1] = 0; _quotes[2] = 0; _quotes[4] = 0; _quotes[6] = 0; _quotes[7] = 0; _quotes[9] = 0; _tickers.Add(reqId); } _socket.reqMktData(reqId, _con, "", true, null); _mktDataEvents[1].WaitOne(); _mktDataEvents[2].WaitOne(); if (Math.Abs(_quotes[2] - _quotes[1]) <= _minTick * _maxBidAskUnit) { if (_quotes[1] == 0 || _quotes[2] == 0) { _mktDataEvents[4].WaitOne(); if (_quotes[4] != 0) { price = _quotes[4]; success = true; } else { string m = "Quote Discrepancy. Bid=" + _quotes[1].ToString() + "/Ask=" + _quotes[2].ToString() + "/Last=" + _quotes[4].ToString(); _msg.logError(_socket.getCurrentLocalTime(), -3, "User", _con.ConId, _stg_id, m, ""); Thread.Sleep(100); } } else { price = (_quotes[1] + _quotes[2]) / 2.0; price = Math.Round((price / _minTick), 0) * _minTick; success = true; } } else { string m = "Quote Discrepancy. Bid=" + _quotes[1].ToString() + "/Ask=" + _quotes[2].ToString(); _msg.logError(_socket.getCurrentLocalTime(), -3, "User", _con.ConId, _stg_id, m, ""); Thread.Sleep(100); } } } double profit = _profitTarget == 0 ? 0 : price + (ord.Action == "BUY" ? _profitTarget : -_profitTarget); double stop = _stopTarget == 0 ? 0 : price + (ord.Action == "BUY" ? -_stopTarget : _stopTarget); DateTime expiry = nticks == 0 ? DateTime.MinValue : (Strategy.getLocalTime((DateTime)(_expiryStartTime), _zone)).AddTicks((long)(r.NextDouble() * nticks)); List <Order> ordSet = OrderFactory.createBracketOrder(ord, profit, stop, expiry, _profitTemplate, _stopTemplate, _expiryTemplate); _om.placeBracketOrders(_stg_id, _con, ordSet, _ref_con_id); _msg.logMessage(_socket.getCurrentLocalTime(), 1, "Information", "BlockOrder", _con.ConId, _stg_id, "Executed " + iorder.ToString() + ": " + ord.OrderId.ToString() + " " + ord.OrderType + " " + ord.Action + " " + ord.TotalQuantity.ToString()); foreach (Order order in ordSet) { lock (_lock) { _openOrders.Add(order.OrderId, order); _filledQtys.Add(order.OrderId, 0); } assignOrderID(order.OrderId); } iorder++; } _placeOrderEvent.Set(); if (_cancelAfter != null) { _socket.sleepUntil(Strategy.getLocalTime((DateTime)_cancelAfter, _zone), null); cancelUnfilledEntryOrders(); } }