using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using TradeIdeas.TIProData; using TradeIdeas.MiscSupport; namespace TradeIdeas.TIProGUI.RealTimeStockRace { public class RaceSymbolTopList { /// /// Use this to cancel the top list request for the symbol data. /// private TopListRequest.Token _symbolRequestToken = null; private SymbolRequest _symbolListener = null; private string _symbol; private string _basedOnCode; private string _basedOnComplimentCode; private RowData _rowData = null; private bool _finished = false; private List _rows; private DateTime? _start; private DateTime? _end; public delegate void SymbolDataLookUpFinishedHandler(RaceSymbolTopList raceSymbolTopList, List rows, DateTime? start, DateTime? end); public event SymbolDataLookUpFinishedHandler SymbolDataLookupFinished; public delegate void SingleSymbolDataLookupFinishedHandler(RaceSymbolTopList raceSymbolTopList, RowData rowData); public event SingleSymbolDataLookupFinishedHandler SingleSymbolDataLookupFinished; /// /// Symbol. /// public string Symbol { get { return _symbol; } } /// /// Symbol RowData. /// public RowData RowData { get { return _rowData; } } /// /// Symbol RowData lookup finished. /// public bool Finished { get { return _finished; } } /// /// Starts the top list data feed for the current symbol. Cancels the previous request if there is one. /// /// /// /// public void StartTopListDataFeed(string symbol, string basedOnCode, string basedOnComplimentCode, List rows = null, DateTime? start = null, DateTime? end = null) { _symbol = symbol; _basedOnCode = basedOnCode; _basedOnComplimentCode = basedOnComplimentCode; _rows = rows; _start = start; _end = end; if (null != _symbolRequestToken) { _symbolRequestToken.Cancel(); _symbolRequestToken = null; } if (null != _symbolListener) { _symbolListener.SymbolReceived -= Listener_SymbolReceived; _symbolListener = null; } _symbolListener = new SymbolRequest(_symbol); _symbolListener.SymbolReceived += Listener_SymbolReceived; TopListRequest dataRequest = new TopListRequest(); dataRequest.SingleSymbol = _symbol; dataRequest.Streaming = true; dataRequest.OutsideMarketHours = true; // Add Symbol. dataRequest.AddExtraColumn("D_Symbol"); // Add Company Name. dataRequest.AddExtraColumn("D_Name"); // Add Price. dataRequest.AddExtraColumn("Price"); // Add Change from Close Dollars if needed. if (_basedOnCode != "FCD" && _basedOnComplimentCode != "FCD") dataRequest.AddExtraColumn("FCD"); // Add Change from Close Percent if needed. if (_basedOnCode != "FCP" && _basedOnComplimentCode != "FCP") dataRequest.AddExtraColumn("FCP"); // Add based on code. if (!string.IsNullOrEmpty(_basedOnCode)) dataRequest.AddExtraColumn(_basedOnCode); // Add based on compliment code. if (!string.IsNullOrEmpty(_basedOnComplimentCode)) dataRequest.AddExtraColumn(_basedOnComplimentCode); _symbolRequestToken = dataRequest.Send(ConnectionMaster.First.SendManager, _symbolListener, _symbol); } /// /// Stop the top list data feed. /// private void StopTopListDataFeed() { if (null != _symbolRequestToken) { _symbolRequestToken.Cancel(); _symbolRequestToken = null; } if (null != _symbolListener) { _symbolListener.SymbolReceived -= Listener_SymbolReceived; _symbolListener = null; } } private void Listener_SymbolReceived(string symbol, RowData rowData, DateTime? start, DateTime? end) { if (symbol == _symbol) { _rowData = rowData; _finished = true; StopTopListDataFeed(); if (SymbolDataLookupFinished != null) SymbolDataLookupFinished(this, _rows, _start, _end); if (SingleSymbolDataLookupFinished != null) SingleSymbolDataLookupFinished(this, _rowData); } } private delegate void SymbolReceivedHandler(string symbol, RowData rowData, DateTime? start, DateTime? end); private class SymbolRequest : TopListRequest.Listener { public event SymbolReceivedHandler SymbolReceived; public string Symbol { get; set; } public SymbolRequest(string symbol) { Symbol = symbol; } public void OnDisconnect(TopListRequest.Token token) { } public void OnMetaData(TopListRequest.Token token) { } public void OnRowData(List rows, DateTime? start, DateTime? end, TopListRequest.Token token) { if (rows.Count > 0) { RowData rowData = rows[0]; if (null != SymbolReceived) SymbolReceived(Symbol, rowData, start, end); } } } } }