/*  This is the security type. Valid values are:
         *  STK
         *  OPT
         *  FUT
         *  IND
         *  FOP
         *  CASH
         *  BAG
         */
        private void RequestMarketData(params Currencies[] symbols)
        {
            m_tickers = new ForexTicker[symbols.Length, symbols.Length];
            m_a       = new Matrix(symbols.Length, symbols.Length);
            m_b       = new Matrix(symbols.Length, symbols.Length);
            m_c       = new Matrix(symbols.Length, symbols.Length);

            myGrid.Children.Clear();
            myGrid.RowDefinitions.Clear();
            myGrid.ColumnDefinitions.Clear();

            myGrid.RowDefinitions.Add(new RowDefinition());
            myGrid.ColumnDefinitions.Add(new ColumnDefinition());
            int OFFSET = 1;

            for (int i = 0; i < symbols.Length; i++)
            {
                for (int j = 0; j < symbols.Length; j++)
                {
                    if (i == 0)
                    {
                        myGrid.ColumnDefinitions.Add(new ColumnDefinition());
                        Label lbl = new Label();
                        lbl.Content = symbols[j];
                        Grid.SetRow(lbl, 0);
                        Grid.SetColumn(lbl, j + OFFSET);
                        myGrid.Children.Add(lbl);
                    }

                    if (j == 0)
                    {
                        myGrid.RowDefinitions.Add(new RowDefinition());
                        Label lbl = new Label();
                        lbl.Content = symbols[i];
                        Grid.SetRow(lbl, i + OFFSET);
                        Grid.SetColumn(lbl, 0);
                        myGrid.Children.Add(lbl);
                    }

                    if (i != j)
                    {
                        ForexTicker ticker = new ForexTicker(i, j, symbols[i], symbols[j]);
                        Grid.SetRow(ticker, i + OFFSET);
                        Grid.SetColumn(ticker, j + OFFSET);
                        myGrid.Children.Add(ticker);
                        m_tickers[i, j] = ticker;

                        if (m_tws.serverVersion > 0)
                        {
                            if (ticker.IsNormalized)
                            {
                                m_tws.reqMktData2(ticker.Id, ticker.LocalSymbol, "CASH", "SMART", "IDEALPRO", ticker.LocalCurrency, Contract.GENERIC_TICK_TAGS, 0);
                            }
                        }
                    }
                }
            }
        }
        private void m_tws_tickPrice(int id, int tickType, double price, int canAutoExecute)
        {
            int i = id & 0xFFFF;
            int j = (id >> 16) & 0xFFFF;

            ForexTicker ticker = m_tickers[i, j];

            if (ticker != null)
            {
                ticker.Price = price;
            }

            ticker = m_tickers[j, i];
            if (ticker != null)
            {
                ticker.Price = price;
            }
        }
        private void m_tws_errMsg(int id, int errorCode, string errorMsg)
        {
            StatusError(errorMsg + " [" + id + ":" + errorCode + "]");

            if (errorCode == NO_SECURITY_DEF_FOUND)
            {
                int i = id & 0xFFFF;
                int j = (id >> 16) & 0xFFFF;


                ForexTicker ticker = m_tickers[i, j];
                if (ticker != null)
                {
                    ticker.Price = 1;
                    //myGrid.Children.Remove(ticker);
                    //m_tickers[i, j] = null;
                }
            }
        }
        private void CalculateA()
        {
            if (!CanCalculateArbitrage())
            {
                return;
            }

            Dispatcher.Invoke(() =>
            {
                for (int i = 0; i < m_tickers.GetLength(0); i++)
                {
                    for (int j = 0; j < m_tickers.GetLength(1); j++)
                    {
                        ForexTicker tickerLeft  = m_tickers[i, j];
                        ForexTicker tickerRight = m_tickers[j, i];
                        m_a[i, j] = tickerLeft != null && tickerRight != null ? tickerLeft.Price : 1;
                    }
                }
            });
        }
        private void client_RateTick(int id, DateTime dt, double bid, double ask, double price, bool dealable)
        {
            int i = id & 0xFFFF;
            int j = (id >> 16) & 0xFFFF;

            Dispatcher.Invoke(() =>
            {
                ForexTicker ticker = m_tickers[i, j];
                if (ticker != null)
                {
                    ticker.Price = price;
                }

                ticker = m_tickers[j, i];
                if (ticker != null)
                {
                    ticker.Price = price;
                }
            });
        }
        /*  This is the security type. Valid values are:
            STK
            OPT
            FUT
            IND
            FOP
            CASH
            BAG
         */
        private void RequestMarketData(params Currencies[] symbols)
        {
            m_tickers = new ForexTicker[symbols.Length, symbols.Length];
            m_a = new Matrix(symbols.Length, symbols.Length);
            m_b = new Matrix(symbols.Length, symbols.Length);
            m_c = new Matrix(symbols.Length, symbols.Length);

            myGrid.Children.Clear();
            myGrid.RowDefinitions.Clear();
            myGrid.ColumnDefinitions.Clear();

            myGrid.RowDefinitions.Add(new RowDefinition());
            myGrid.ColumnDefinitions.Add(new ColumnDefinition());
            int OFFSET = 1;

            for (int i = 0; i < symbols.Length; i++)
            {
                for (int j = 0; j < symbols.Length; j++)
                {
                    if (i == 0)
                    {
                        myGrid.ColumnDefinitions.Add(new ColumnDefinition());
                        Label lbl = new Label();
                        lbl.Content = symbols[j];
                        Grid.SetRow(lbl, 0);
                        Grid.SetColumn(lbl, j + OFFSET);
                        myGrid.Children.Add(lbl);
                    }

                    if (j == 0)
                    {
                        myGrid.RowDefinitions.Add(new RowDefinition());
                        Label lbl = new Label();
                        lbl.Content = symbols[i];
                        Grid.SetRow(lbl, i + OFFSET);
                        Grid.SetColumn(lbl, 0);
                        myGrid.Children.Add(lbl);
                    }

                    if (i != j)
                    {
                        ForexTicker ticker = new ForexTicker(i, j, symbols[i], symbols[j]);
                        Grid.SetRow(ticker, i + OFFSET);
                        Grid.SetColumn(ticker, j + OFFSET);
                        myGrid.Children.Add(ticker);
                        m_tickers[i,j] = ticker;

                        if (m_tws.serverVersion > 0)
                        {
                            if (ticker.IsNormalized) m_tws.reqMktData2(ticker.Id, ticker.LocalSymbol, "CASH", "SMART", "IDEALPRO", ticker.LocalCurrency, Contract.GENERIC_TICK_TAGS, 0);
                        }
                    }
                }
            }
        }