using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using TradeIdeas.TIProData; using System.Windows.Forms.DataVisualization.Charting; using TradeIdeas.TIProData.Configuration; using TradeIdeas.TIProData.Interfaces; /* From dan on 8/10/12 * http://www.trade-ideas.com/StockInfo/_TopListResult.html?form=1&show0=D_Symbol&show1=D_Name&show2=Price&show3=Vol5&show4=RV&show5=U2&col_ver=1&MinRV=20&MinU2=1.5&MaxU2=-1.5&sort=MaxU0&X_NYSE=on&X_ARCA=on&X_AMEX=on&XN=on&hist=1&h_d=1343804400&h_h=9&h_m=35&WN=Knight+Flash&count=1000 * http://www.trade-ideas.com/StockInfo/_TopListResult.html?form=1&show0=D_Symbol&show1=D_Name&show2=Price&show3=Vol5&show4=RV&show5=U2&col_ver=1&MinRV=20&MinU2=1.5&MaxU2=-1.5&sort=MaxU0&X_NYSE=on&X_ARCA=on&X_AMEX=on&XN=on&hist=1&h_d=1343890800&h_h=9&h_m=35&WN=Day+After&count=1000 * U2 = p_up_15/price/bright_volatility * Also Interesting: * o p_up_5/price/bright_volatility * o p_up_10/price/bright_volatility * o p_up_30/price/bright_volatility * o (last_price-close_p)/close_p/bright_volatility * In Philip's account: * o U54 = 5 minute, [DUp5]/standard_deviation * o U55 = 10 minute, [DUp10]/standard_deviation * o U56 = 15 minute, [DUp15]/standard_deviation * o U57 = 30 minute, [DUp30]/standard_deviation * o BB = from yesterday's close */ namespace TradeIdeas.TIProGUI { public partial class MarketMaster : Form { private IConnectionMaster _connectionMaster; private Series _upSeries; private Series _downSeries; public ConfigurationWindowManager _configurationWindowManager; private struct TimeFilter { public string UserVisibile; public string FilterCode; public override string ToString() { return UserVisibile; } } public MarketMaster(IConnectionMaster connectionMaster) { _connectionMaster = connectionMaster; InitializeComponent(); if (!IsHandleCreated) CreateHandle(); _configurationWindowManager = new ConfigurationWindowManager(); _configurationWindowManager.LoadFromServer(_connectionMaster, ConfigurationType.TopList, OnLoaded); _upSeries = chart1.Series["Up"]; _downSeries = chart1.Series["Down"]; for (int i = 0; i < ITEM_COUNT; i++) { _upSeries.Points.Add(new DataPoint(_upSeries)); _downSeries.Points.Add(new DataPoint(_downSeries)); } timeFilterComboBox.Items.Add(new TimeFilter { UserVisibile = "5 Minutes", FilterCode = "U54" }); timeFilterComboBox.Items.Add(new TimeFilter { UserVisibile = "10 Minutes", FilterCode = "U55" }); timeFilterComboBox.Items.Add(new TimeFilter { UserVisibile = "15 Minutes", FilterCode = "U56" }); timeFilterComboBox.SelectedIndex = timeFilterComboBox.Items.Count - 1; timeFilterComboBox.Items.Add(new TimeFilter { UserVisibile = "30 Minutes", FilterCode = "U57" }); timeFilterComboBox.Items.Add(new TimeFilter { UserVisibile = "All Day", FilterCode = "BB" }); timeTrackBar.Value = 1; UpdateTimeLabel(); Padding margin = timeLabel.Margin; margin.Top = (loadButton.Height - timeLabel.Height) / 2; timeLabel.Margin = margin; margin = statusLabel.Margin; margin.Top = (loadButton.Height - statusLabel.Height) / 2; statusLabel.Margin = margin; } private void OnLoaded(ConfigurationWindowManager configurationWindowManager) { this.InvokeIfRequired(delegate { loadButton.Enabled = true; }); } private void timeTrackBar_Scroll(object sender, EventArgs e) { UpdateTimeLabel(); } private void UpdateTimeLabel() { DateTime time = DateTime.Today; time = time.AddHours(9.5); // Hard coded to NY Time. time = time.AddMinutes(timeTrackBar.Value * 5); // each tick is 5 minutes; timeLabel.Text = time.ToString("h:mm"); } private object _currentEpoch; private int _sentRequestCount; private int _receivedRequestCount; private static readonly TimeSpan OPEN = new TimeSpan(6, 30, 0); private const int ITEM_COUNT = 29; private void AddExchange(TopListStrategy strategy, string which) { Exchange exchange = _configurationWindowManager.FindExchange(which); if (null == which) // We'd find this sooner or later, but it's easier to track down if we report it here. throw new Exception("Could not find exchange: " + which); strategy.Exchanges.Add(exchange); } private void loadButton_Click(object sender, EventArgs e) { _currentEpoch = new Object(); _sentRequestCount = 0; _receivedRequestCount = 0; foreach (DataPoint point in _upSeries.Points) point.YValues = new double[] {}; foreach (DataPoint point in _downSeries.Points) point.YValues = new double[] { }; TopListStrategy upStrategy = new TopListStrategy(); AddExchange(upStrategy, "X_NYSE"); AddExchange(upStrategy, "X_ARCA"); AddExchange(upStrategy, "X_AMEX"); AddExchange(upStrategy, "XN"); upStrategy.MinFilters.Add(_configurationWindowManager.FindFilter("RV"), "15"); upStrategy.Columns.Clear(); upStrategy.History = true; TimeFilter userOption = (TimeFilter)timeFilterComboBox.SelectedItem; Filter filter = _configurationWindowManager.FindFilter(userOption.FilterCode); if (null == filter) { MessageBox.Show("Unable to find filter \"" + userOption.UserVisibile + "\" / \"" + userOption.FilterCode + "\".", "Configuration Error"); return; } TopListStrategy downStrategy = new TopListStrategy(upStrategy); upStrategy.MinFilters.Add(filter, "1.5"); downStrategy.MaxFilters.Add(filter, "-1.5"); TimeSpan time = OPEN.Add(TimeSpan.FromMinutes(timeTrackBar.Value * 5)); DateTime date = DateTime.Today; chart1.ChartAreas[0].AxisX.Enabled = AxisEnabled.True; CustomLabelsCollection labels = chart1.ChartAreas[0].AxisX.CustomLabels; labels.Clear(); for (int i = ITEM_COUNT - 1; i >= 0; i--) { while ((date.DayOfWeek == DayOfWeek.Saturday) || (date.DayOfWeek == DayOfWeek.Sunday)) date = date.AddDays(-1); /* I tried storing the axis labels in the data points and failed. Julio suggested * that I was missing the following code. * Set the following to enable the axis text: * chartArea1.AxisX.IsLabelAutoFit = false; * then the following to change the angle and interval:             * chartArea1.AxisX.LabelStyle.Angle = -60;             * chartArea1.AxisX.MajorTickMark.Interval = 0D; */ CustomLabel customLabel = new CustomLabel(); customLabel.FromPosition = i + 0.5; customLabel.ToPosition = i + 1.5; customLabel.Text = date.ToString("M/dd/yyyy"); chart1.ChartAreas[0].AxisX.CustomLabels.Add(customLabel); upStrategy.Time = date + time; downStrategy.Time = upStrategy.Time; RequestHistory(upStrategy.MakeConfigString(), _upSeries.Points[i]); RequestHistory(downStrategy.MakeConfigString(), _downSeries.Points[i]); date = date.AddDays(-1); } UpdateRequestCount(); } private void UpdateRequestCount() { if (_sentRequestCount > _receivedRequestCount) statusLabel.Text = "Loading (" + _receivedRequestCount + " / " + _sentRequestCount + ')'; else statusLabel.Text = "Done."; } private void RequestHistory(string configString, DataPoint point) { _sentRequestCount++; object originalEpoch = _currentEpoch; MarketSummaryRequest request = new MarketSummaryRequest(configString, _connectionMaster.SendManager); request.ResponseFromServer += delegate(MarketSummaryRequest sender) { this.InvokeIfRequired(delegate { if (originalEpoch != _currentEpoch) return; List result = request.SimpleResult; _receivedRequestCount++; if (null == result) { // Connection error. RequestHistory(configString, point); return; } UpdateRequestCount(); if (result.Count != 1) return; point.IsEmpty = false; point.YValues = new double[] { result[0].Y }; chart1.ChartAreas[0].RecalculateAxesScale(); }); }; request.SendRequest(); } } }