using System; using System.Collections.Generic; using System.Drawing; using System.Windows.Forms; using System.Windows.Forms.DataVisualization.Charting; using System.Xml; using TradeIdeas.TIProData; using TradeIdeas.TIProData.Interfaces; using TradeIdeas.XML; namespace TradeIdeas.TIProGUI { public partial class MarketSummaryHistogram : Form { private IConnectionMaster _connectionMaster; public MarketSummaryHistogram(IConnectionMaster connectionMaster) { _connectionMaster = connectionMaster; InitializeComponent(); if (!IsHandleCreated) CreateHandle(); foreach (Universe universe in Universe.VALUES) universeComboBox.Items.Add(universe); universeComboBox.SelectedIndex = 0; // Force the events to fire now. groupComboBox.SelectedIndex = 0; } private void UpdateIcon() { if (null == _option) filterIconPictureBox.Image = null; else filterIconPictureBox.Image = _connectionMaster.ImageCacheManager.GetFilter("Min" + _option.FilterCode); } private MarketSummaryRequest _outstandingRequest; private Option _option; private string _universe; private void RequestData() { _outstandingRequest = null; UpdateIcon(); if ((null == _option) || (null == _universe)) return; string configString = _universe + _option.Settings + "&col_ver=1"; if (configStringTextBox.Text != "") configString = configStringTextBox.Text; _outstandingRequest = new MarketSummaryRequest(configString, _connectionMaster.SendManager); _outstandingRequest.ResponseFromServer += _outstandingRequest_ResponseFromServer; _outstandingRequest.SendRequest(); } void _outstandingRequest_ResponseFromServer(MarketSummaryRequest sender) { this.InvokeIfRequired((MethodInvoker)delegate { if (sender == _outstandingRequest) { if (null == sender.SimpleResult) // Try again. RequestData(); else ShowData(sender.SimpleResult); } }); } private void ShowData(List items) { chart1.Series[0].Points.Clear(); foreach (MarketSummaryRequest.SimpleItem item in items) { DataPoint dataPoint = new DataPoint(chart1.Series[0]); dataPoint.YValues = new double[] { item.Y }; dataPoint.Color = _option.GetColor(item.X); dataPoint.AxisLabel = item.X.ToString(); chart1.Series[0].Points.Add(dataPoint); } chart1.Visible = true; } private struct Universe { public string Name; public string Code; public override string ToString() { return Name; } /// /// This should come from the server. We should only be able to send approved values. /// static public readonly Universe[] VALUES = new Universe[] { new Universe{ Code = "X_NYSE=on&X_ARCA=on&X_AMEX=on&XN=on&", Name = "Major US Markets" }, new Universe{ Code = "X_NYSE=on&X_ARCA=on&X_AMEX=on&XN=on&X_OTC=on&X_PINK=on&", Name = "All US Markets" }, new Universe{ Code = "X_CAT=on&X_CAV=on&", Name = "Canada" }, new Universe{ Code = "MaxPrice=0.9999&X_NYSE=on&X_ARCA=on&X_AMEX=on&XN=on&X_OTC=on&X_PINK=on&", Name = "Penny Stocks" }, new Universe{ Code = "", Name = "Manufacturing" }, new Universe{ Code = "", Name = "Finance" }, new Universe{ Code = "", Name = "[Other sectors...]" } }; } private enum Group { InRange, AsPercent }; private class Option { public string FilterCode { get; private set; } public string Settings { get; private set; } public Group Group { get; private set; } public string Time { get; private set; } private double _minColorValue; private double _maxColorValue; private Option(string filterCode, string settings, Group group, string time, double minColorValue, double maxColorValue) { FilterCode = filterCode; Settings = settings; Group = group; Time = time; _minColorValue = minColorValue; _maxColorValue = maxColorValue; InitGradientInfo(); } private static Color OFF_THE_TOP = Color.FromArgb(0, 255, 0); private static Color TOP = Color.FromArgb(0, 192, 0); private static Color MIDDLE = Color.Black; private static Color BOTTOM = Color.FromArgb(255, 0, 0); private static Color OFF_THE_BOTTOM = Color.FromArgb(255, 128, 128); private static GradientInfo.ColorForPoint TOP_POINT = new GradientInfo.ColorForPoint { Above = OFF_THE_TOP, At = TOP, Below = TOP }; private static GradientInfo.ColorForPoint MIDDLE_POINT = new GradientInfo.ColorForPoint { Above = MIDDLE, At = MIDDLE, Below = MIDDLE }; private static GradientInfo.ColorForPoint BOTTOM_POINT = new GradientInfo.ColorForPoint { Above = BOTTOM, At = BOTTOM, Below = OFF_THE_BOTTOM }; private GradientInfo _gradientInfo; private void InitGradientInfo() { _gradientInfo = new GradientInfo(); _gradientInfo.Add(_minColorValue, BOTTOM_POINT); _gradientInfo.Add((_minColorValue + _maxColorValue) / 2, MIDDLE_POINT); _gradientInfo.Add(_maxColorValue, TOP_POINT); } public Color GetColor(double value) { return _gradientInfo.GetColor(value); } public Color GetColor(double v1, double v2) { return GetColor((v1 + v2) / 2); } public override string ToString() { // This works on the simple assumption that we will be displayed in the // combo box listing the times. Not a great assumption, but okay for now. return Time; } public static List