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);
}
}
}
}
}