コード例 #1
0
        void SetOptionComputationTopicsValues(int tickerId, int field, TwsRtdServerData.OptionComputationData value)
        {
            TwsRtdServerMktDataRequest mktDataRequest = m_connection.GetMktDataRequest(tickerId);
            string tickTypeStr = TwsRtdServerData.GetTickTypeStrByTickId(field);

            if (mktDataRequest != null && tickTypeStr != null)
            {
                switch (tickTypeStr)
                {
                // assigning implied vol, delta, opt price, pv dividend, gamma, vega, theta and und price
                case TwsRtdServerData.BID_OPTION_COMPUTATION:
                    GetTopicAndAddUpdate(TwsRtdServerData.BID_TICK_ATTRIB, mktDataRequest, value.getTickAttrib());
                    GetTopicAndAddUpdate(TwsRtdServerData.BID_IMPLIED_VOL, mktDataRequest, value.getImpliedVolatility());
                    GetTopicAndAddUpdate(TwsRtdServerData.BID_DELTA, mktDataRequest, value.getDelta());
                    GetTopicAndAddUpdate(TwsRtdServerData.BID_OPT_PRICE, mktDataRequest, value.getOptPrice());
                    GetTopicAndAddUpdate(TwsRtdServerData.BID_PV_DIVIDEND, mktDataRequest, value.getPvDividend());
                    GetTopicAndAddUpdate(TwsRtdServerData.BID_GAMMA, mktDataRequest, value.getGamma());
                    GetTopicAndAddUpdate(TwsRtdServerData.BID_VEGA, mktDataRequest, value.getVega());
                    GetTopicAndAddUpdate(TwsRtdServerData.BID_THETA, mktDataRequest, value.getTheta());
                    GetTopicAndAddUpdate(TwsRtdServerData.BID_UND_PRICE, mktDataRequest, value.getUndPrice());
                    break;

                case TwsRtdServerData.ASK_OPTION_COMPUTATION:
                    GetTopicAndAddUpdate(TwsRtdServerData.ASK_TICK_ATTRIB, mktDataRequest, value.getTickAttrib());
                    GetTopicAndAddUpdate(TwsRtdServerData.ASK_IMPLIED_VOL, mktDataRequest, value.getImpliedVolatility());
                    GetTopicAndAddUpdate(TwsRtdServerData.ASK_DELTA, mktDataRequest, value.getDelta());
                    GetTopicAndAddUpdate(TwsRtdServerData.ASK_OPT_PRICE, mktDataRequest, value.getOptPrice());
                    GetTopicAndAddUpdate(TwsRtdServerData.ASK_PV_DIVIDEND, mktDataRequest, value.getPvDividend());
                    GetTopicAndAddUpdate(TwsRtdServerData.ASK_GAMMA, mktDataRequest, value.getGamma());
                    GetTopicAndAddUpdate(TwsRtdServerData.ASK_VEGA, mktDataRequest, value.getVega());
                    GetTopicAndAddUpdate(TwsRtdServerData.ASK_THETA, mktDataRequest, value.getTheta());
                    GetTopicAndAddUpdate(TwsRtdServerData.ASK_UND_PRICE, mktDataRequest, value.getUndPrice());
                    break;

                case TwsRtdServerData.LAST_OPTION_COMPUTATION:
                    GetTopicAndAddUpdate(TwsRtdServerData.LAST_TICK_ATTRIB, mktDataRequest, value.getTickAttrib());
                    GetTopicAndAddUpdate(TwsRtdServerData.LAST_IMPLIED_VOL, mktDataRequest, value.getImpliedVolatility());
                    GetTopicAndAddUpdate(TwsRtdServerData.LAST_DELTA, mktDataRequest, value.getDelta());
                    GetTopicAndAddUpdate(TwsRtdServerData.LAST_OPT_PRICE, mktDataRequest, value.getOptPrice());
                    GetTopicAndAddUpdate(TwsRtdServerData.LAST_PV_DIVIDEND, mktDataRequest, value.getPvDividend());
                    GetTopicAndAddUpdate(TwsRtdServerData.LAST_GAMMA, mktDataRequest, value.getGamma());
                    GetTopicAndAddUpdate(TwsRtdServerData.LAST_VEGA, mktDataRequest, value.getVega());
                    GetTopicAndAddUpdate(TwsRtdServerData.LAST_THETA, mktDataRequest, value.getTheta());
                    GetTopicAndAddUpdate(TwsRtdServerData.LAST_UND_PRICE, mktDataRequest, value.getUndPrice());
                    break;

                case TwsRtdServerData.MODEL_OPTION_COMPUTATION:
                    GetTopicAndAddUpdate(TwsRtdServerData.MODEL_TICK_ATTRIB, mktDataRequest, value.getTickAttrib());
                    GetTopicAndAddUpdate(TwsRtdServerData.MODEL_IMPLIED_VOL, mktDataRequest, value.getImpliedVolatility());
                    GetTopicAndAddUpdate(TwsRtdServerData.MODEL_DELTA, mktDataRequest, value.getDelta());
                    GetTopicAndAddUpdate(TwsRtdServerData.MODEL_OPT_PRICE, mktDataRequest, value.getOptPrice());
                    GetTopicAndAddUpdate(TwsRtdServerData.MODEL_PV_DIVIDEND, mktDataRequest, value.getPvDividend());
                    GetTopicAndAddUpdate(TwsRtdServerData.MODEL_GAMMA, mktDataRequest, value.getGamma());
                    GetTopicAndAddUpdate(TwsRtdServerData.MODEL_VEGA, mktDataRequest, value.getVega());
                    GetTopicAndAddUpdate(TwsRtdServerData.MODEL_THETA, mktDataRequest, value.getTheta());
                    GetTopicAndAddUpdate(TwsRtdServerData.MODEL_UND_PRICE, mktDataRequest, value.getUndPrice());
                    break;
                }
            }
        }
コード例 #2
0
        void SetTopicValue(int tickerId, int field, object value)
        {
            TwsRtdServerMktDataRequest mktDataRequest = m_connection.GetMktDataRequest(tickerId);
            string tickTypeStr = TwsRtdServerData.GetTickTypeStrByTickId(field);

            if (mktDataRequest != null && tickTypeStr != null)
            {
                GetTopicAndAddUpdate(tickTypeStr, mktDataRequest, value);
            }
        }
コード例 #3
0
        public List <int> SetAllLiveTopicsValues(string value)
        {
            // set all live topic values to value (e.g. in case of error) and return list of updated topic ids
            List <int> m_updatedTopicIds = new List <int>();

            foreach (TwsRtdServerTopic topic in m_topics.Values)
            {
                if (Array.IndexOf(TwsRtdServerData.DelayedTopics(), topic.TopicStr()) < 0)
                {
                    topic.TopicValue(value);
                    m_updatedTopicIds.Add(topic.TopicId());
                }
            }

            return(m_updatedTopicIds);
        }
コード例 #4
0
        // this method is called when new topic is requested
        public object ConnectData(int topicId, ref Array strings, ref bool newValues)
        {
            string connectionStr, mktDataRequestStr, topicStr;

            newValues = true;

            try
            {
                // parse input strings (connection, marketDataRequest and topic)
                connectionStr     = TwsRtdServerConnection.ParseConnectionStrings(strings);
                mktDataRequestStr = TwsRtdServerMktDataRequest.ParseMktDataRequestStrings(strings);
                topicStr          = TwsRtdServerTopic.ParseTopicStrings(strings);

                // check that connectioStr, mktDataRequestStr and topicStr is not null
                if (connectionStr == null)
                {
                    return("TwsRtdServer: Cannot parse connection strings");
                }
                if (mktDataRequestStr == null)
                {
                    return("TwsRtdServer: Cannot parse mktDataRequest strings");
                }
                if (topicStr == null)
                {
                    return("TwsRtdServer: Cannot parse topic strings");
                }

                TwsRtdServerConnection connection = null;
                // find connection from RTD server to TWS (to reuse existing connection and not to create new one)
                if (!m_connections.TryGetValue(connectionStr, out connection))
                {
                    // if connection is not found, then create new one and add it to collection
                    connection = new TwsRtdServerConnection(this, connectionStr);

                    // save connection
                    m_connections.Add(connectionStr, connection);
                }

                if (connection != null && connection.GetErrorCode() != -1)
                {
                    // error connecting to TWS
                    return("TwsRtdServer error: " + connection.GetErrorText());
                }

                TwsRtdServerMktDataRequest mktDataRequest = connection.GetOrAddMktDataRequest(mktDataRequestStr);
                string errorStr = null;

                if (mktDataRequest != null)
                {
                    // save topicId -> connection/mktDataRequest/topicStr map
                    m_topicIdMap.Add(topicId, new TwsRtdServerTopicIdMap(connectionStr, mktDataRequest.TwsReqId(), topicStr));
                    if (mktDataRequest.GetErrorCode() != -1 &&
                        mktDataRequest.GetErrorCode() != TwsRtdServerErrors.REQUESTED_MARKET_DATA_NOT_SUBSCRIBED)
                    {
                        // error creating market data request
                        return(errorStr = "TwsRtdServer error: " + mktDataRequest.GetErrorText());
                    }
                }
                else
                {
                    // error creating market data request
                    return(errorStr = "TwsRtdServer error: market data request creation error");
                }

                TwsRtdServerTopic topic = mktDataRequest.GetOrAddTopic(topicStr, topicId);
                if (topic == null)
                {
                    // error creating topic
                    return(errorStr = "TwsRtdServer error: topic creation error");
                }

                // check if topic is delayed type
                if (topic != null && Array.IndexOf(TwsRtdServerData.DelayedTopics(), topic.TopicStr()) < 0 &&
                    mktDataRequest.GetErrorCode() == TwsRtdServerErrors.REQUESTED_MARKET_DATA_NOT_SUBSCRIBED)
                {
                    errorStr = "TwsRtdServer error: " + mktDataRequest.GetErrorText();
                }

                return((topic != null && errorStr == null) ? topic.TopicValue() : errorStr);
            }
            catch
            {
                return("RTDServer: Error connecting data");
            }
        }
コード例 #5
0
        public static string ParseTopicStrings(Array strings)
        {
            string topicStr = null;

            if (strings != null)
            {
                foreach (string s in strings)
                {
                    if (topicStr == null && s.ToLower().IndexOf(TwsRtdServerData.QT) >= 0)
                    {
                        // parse string like "qt=Bid"
                        // "qt" string should have priority than topic specified at other places
                        topicStr = s.Substring(TwsRtdServerData.QT.Length, s.Length - TwsRtdServerData.QT.Length).ToUpper();

                        if (Array.IndexOf(TwsRtdServerData.AllowedTopics(), topicStr) >= 0)
                        {
                            return(topicStr);
                        }
                        else
                        {
                            // if invalid "qt" is specified
                            return(null);
                        }
                    }

                    if (topicStr == null && !s.ToLower().Contains(TwsRtdServerData.LOCALSYMBOL_STR) && s.ToLower().Contains(TwsRtdServerData.CHAR_SPACE.ToString()))
                    {
                        // pasre string like "IBM Bid" or "BRK B Bid"
                        topicStr = s.Substring(s.LastIndexOf(TwsRtdServerData.CHAR_SPACE) + 1, s.Length - 1 - s.LastIndexOf(TwsRtdServerData.CHAR_SPACE)).ToUpper();

                        if (Array.IndexOf(TwsRtdServerData.AllowedTopics(), topicStr) >= 0)
                        {
                            return(topicStr);
                        }
                        else
                        {
                            topicStr = null;
                            continue;
                        }
                    }

                    if (topicStr == null)
                    {
                        // pasre string like "Bid"
                        topicStr = s.ToUpper();

                        if (Array.IndexOf(TwsRtdServerData.AllowedTopics(), topicStr) >= 0)
                        {
                            return(topicStr);
                        }
                        else
                        {
                            topicStr = null;
                            continue;
                        }
                    }
                }
            }

            if (topicStr == null)
            {
                // topic not found, use default
                topicStr = TwsRtdServerData.LAST;
            }

            return(topicStr);
        }
コード例 #6
0
        public static string ParseMktDataRequestStrings(Array strings)
        {
            string mktDataRequestStr = null;

            // contract
            string symbolStr               = null;
            string exchStr                 = null;
            string primExchStr             = null;
            string secTypeStr              = null;
            string expirationStr           = null;
            string rightStr                = null;
            string strikeStr               = null;
            string currencyStr             = null;
            string multiplierStr           = null;
            string localSymbolStr          = null;
            string conIdStr                = null;
            string tradingClassStr         = null;
            string comboStr                = null;
            string deltaNeutralContractStr = null;
            string optionsStr              = null;
            string genTicksStr             = null;

            if (strings != null)
            {
                // simple syntax: first string should represent ticker
                if (strings.Length > 0)
                {
                    string tickerStr = (string)strings.GetValue(0);
                    if (tickerStr.IndexOf(TwsRtdServerData.CHAR_EQUAL) < 0)
                    {
                        if (tickerStr.IndexOf(TwsRtdServerData.CHAR_SPACE) >= 0)
                        {
                            // parse ticker string like IBM@SMART Bid, BRK B@SMART Bid, where the topic is specified within the ticker string itself
                            string lastStr = tickerStr.Substring(tickerStr.LastIndexOf(TwsRtdServerData.CHAR_SPACE) + 1, tickerStr.Length - 1 - tickerStr.LastIndexOf(TwsRtdServerData.CHAR_SPACE)).ToUpper();

                            if (Array.IndexOf(TwsRtdServerData.AllowedTopics(), lastStr) >= 0)
                            {
                                tickerStr = tickerStr.ToUpper().Substring(0, tickerStr.LastIndexOf(TwsRtdServerData.CHAR_SPACE));
                            }
                        }

                        if (tickerStr.IndexOf(TwsRtdServerData.CHAR_DOT) >= 0 && tickerStr.ToLower().IndexOf(TwsRtdServerData.HOST_STR) < 0 &&
                            tickerStr.ToLower().IndexOf(TwsRtdServerData.DELTANEUTRALCONTRACT_STR) < 0 && tickerStr.ToUpper().IndexOf(TwsRtdServerData.CHAR_SLASH + TwsRtdServerData.CASH_STR) >= 0)
                        {
                            // parse string like "EUR.USD/CASH"
                            string[] contractStrings = tickerStr.ToUpper().Split(TwsRtdServerData.CHAR_SLASH);
                            if (contractStrings.Length >= 2)
                            {
                                secTypeStr = contractStrings[1].ToUpper();
                            }
                            // "EUR.USD"
                            string symbolAndCashStr = contractStrings[0].ToUpper();
                            symbolStr   = symbolAndCashStr.Substring(0, symbolAndCashStr.IndexOf(TwsRtdServerData.CHAR_DOT));
                            currencyStr = symbolAndCashStr.Substring(symbolAndCashStr.IndexOf(TwsRtdServerData.CHAR_DOT) + 1, symbolAndCashStr.Length - symbolAndCashStr.IndexOf(TwsRtdServerData.CHAR_DOT) - 1);
                            exchStr     = TwsRtdServerData.DEFAULT_CASH_EXCHANGE;
                            //break;
                        }
                        else if (tickerStr.IndexOf(TwsRtdServerData.CHAR_SLASH) >= 0)
                        {
                            // parse string like "IBM@SMART/NYSE/OPT/201701/C/90/USD"
                            string[] contractStrings = tickerStr.ToUpper().Split(TwsRtdServerData.CHAR_SLASH);
                            if (contractStrings.Length >= 7)
                            {
                                currencyStr = contractStrings[6].ToUpper();
                            }
                            if (contractStrings.Length >= 6)
                            {
                                strikeStr = contractStrings[5].ToUpper();
                            }
                            if (contractStrings.Length >= 5)
                            {
                                rightStr = contractStrings[4].ToUpper();
                            }
                            if (contractStrings.Length >= 4)
                            {
                                expirationStr = contractStrings[3].ToUpper();
                            }
                            if (contractStrings.Length >= 3)
                            {
                                secTypeStr = contractStrings[2].ToUpper();
                            }
                            if (contractStrings.Length >= 2)
                            {
                                primExchStr = contractStrings[1].ToUpper();
                            }
                            string symbolAndExchStr = contractStrings[0].ToUpper();
                            if (symbolAndExchStr.IndexOf(TwsRtdServerData.CHAR_AT) >= 0)
                            {
                                // symbol can contain dot (".") and case sensitive
                                symbolStr = symbolAndExchStr.Substring(0, symbolAndExchStr.IndexOf(TwsRtdServerData.CHAR_AT));
                                exchStr   = symbolAndExchStr.Substring(symbolAndExchStr.IndexOf(TwsRtdServerData.CHAR_AT) + 1, symbolAndExchStr.Length - symbolAndExchStr.IndexOf(TwsRtdServerData.CHAR_AT) - 1);
                            }
                            else
                            {
                                symbolStr = symbolAndExchStr;
                                exchStr   = TwsRtdServerData.DEFAULT_EXCHANGE;
                            }
                            //break;
                        }
                        else if (tickerStr.IndexOf(TwsRtdServerData.CHAR_AT) >= 0)
                        {
                            // parse string like "IBM@ARCA"
                            symbolStr = tickerStr.ToUpper().Substring(0, tickerStr.IndexOf(TwsRtdServerData.CHAR_AT));
                            exchStr   = tickerStr.ToUpper().Substring(tickerStr.IndexOf(TwsRtdServerData.CHAR_AT) + 1, tickerStr.Length - tickerStr.IndexOf(TwsRtdServerData.CHAR_AT) - 1);
                            //break;
                        }
                        else
                        {
                            // parse string like "IBM"
                            symbolStr = tickerStr.ToUpper();
                        }
                    }
                }


                // complex syntax
                foreach (string s in strings)
                {
                    if (symbolStr == null && s.ToLower().IndexOf(TwsRtdServerData.SYMBOL_STR) >= 0)
                    {
                        // parse string like "sym=IBM"
                        symbolStr = s.Substring(TwsRtdServerData.SYMBOL_STR.Length, s.Length - TwsRtdServerData.SYMBOL_STR.Length);
                    }
                    if (secTypeStr == null && s.ToLower().IndexOf(TwsRtdServerData.SECTYPE_STR) >= 0)
                    {
                        // parse string like "sec=OPT"
                        secTypeStr = s.Substring(TwsRtdServerData.SECTYPE_STR.Length, s.Length - TwsRtdServerData.SECTYPE_STR.Length).ToUpper();
                    }
                    if (expirationStr == null && s.ToLower().IndexOf(TwsRtdServerData.EXPIRATION_STR) >= 0)
                    {
                        // parse string like "exp=20170101"
                        expirationStr = s.Substring(TwsRtdServerData.EXPIRATION_STR.Length, s.Length - TwsRtdServerData.EXPIRATION_STR.Length).ToUpper();
                    }
                    if (strikeStr == null && s.ToLower().IndexOf(TwsRtdServerData.STRIKE_STR) >= 0)
                    {
                        // parse string like "strike=90"
                        strikeStr = s.Substring(TwsRtdServerData.STRIKE_STR.Length, s.Length - TwsRtdServerData.STRIKE_STR.Length).ToUpper();
                    }
                    if (rightStr == null && s.ToLower().IndexOf(TwsRtdServerData.RIGHT_STR) >= 0)
                    {
                        // parse string like "right=C"
                        rightStr = s.Substring(TwsRtdServerData.RIGHT_STR.Length, s.Length - TwsRtdServerData.RIGHT_STR.Length).ToUpper();
                    }
                    if (multiplierStr == null && s.ToLower().IndexOf(TwsRtdServerData.MULTIPLIER_STR) >= 0)
                    {
                        // parse string like "mult=100"
                        multiplierStr = s.Substring(TwsRtdServerData.MULTIPLIER_STR.Length, s.Length - TwsRtdServerData.MULTIPLIER_STR.Length).ToUpper();
                    }
                    if (exchStr == null && s.ToLower().IndexOf(TwsRtdServerData.EXCHANGE_STR) >= 0)
                    {
                        // parse string like "exch=SMART"
                        exchStr = s.Substring(TwsRtdServerData.EXCHANGE_STR.Length, s.Length - TwsRtdServerData.EXCHANGE_STR.Length).ToUpper();
                    }
                    if (primExchStr == null && s.ToLower().IndexOf(TwsRtdServerData.PRIMARYEXCH_STR) >= 0)
                    {
                        // parse string like "prim=NYSE"
                        primExchStr = s.Substring(TwsRtdServerData.PRIMARYEXCH_STR.Length, s.Length - TwsRtdServerData.PRIMARYEXCH_STR.Length).ToUpper();
                    }
                    if (currencyStr == null && s.ToLower().IndexOf(TwsRtdServerData.CURRENCY_STR) >= 0)
                    {
                        // parse string like "cur=USD"
                        currencyStr = s.Substring(TwsRtdServerData.CURRENCY_STR.Length, s.Length - TwsRtdServerData.CURRENCY_STR.Length).ToUpper();
                    }
                    if (conIdStr == null && s.ToLower().IndexOf(TwsRtdServerData.CONID_STR) >= 0)
                    {
                        // parse string like "conid=8314"
                        conIdStr = s.Substring(TwsRtdServerData.CONID_STR.Length, s.Length - TwsRtdServerData.CONID_STR.Length).ToUpper();
                    }
                    if (localSymbolStr == null && s.ToLower().IndexOf(TwsRtdServerData.LOCALSYMBOL_STR) >= 0)
                    {
                        // parse string like "loc=IBM1DM7"
                        localSymbolStr = s.Substring(TwsRtdServerData.LOCALSYMBOL_STR.Length, s.Length - TwsRtdServerData.LOCALSYMBOL_STR.Length);
                    }
                    if (tradingClassStr == null && s.ToLower().IndexOf(TwsRtdServerData.TRADINGCLASS_STR) >= 0)
                    {
                        // parse string like "tc=IBM1D"
                        tradingClassStr = s.Substring(TwsRtdServerData.TRADINGCLASS_STR.Length, s.Length - TwsRtdServerData.TRADINGCLASS_STR.Length).ToUpper();
                    }
                    if (comboStr == null && s.ToLower().IndexOf(TwsRtdServerData.COMBO_STR) >= 0)
                    {
                        // parse string like "cmb=..."
                        comboStr = s.Substring(TwsRtdServerData.COMBO_STR.Length, s.Length - TwsRtdServerData.COMBO_STR.Length).ToUpper();
                    }
                    if (deltaNeutralContractStr == null && s.ToLower().IndexOf(TwsRtdServerData.DELTANEUTRALCONTRACT_STR) >= 0)
                    {
                        // parse string like "und=..."
                        deltaNeutralContractStr = s.Substring(TwsRtdServerData.DELTANEUTRALCONTRACT_STR.Length, s.Length - TwsRtdServerData.DELTANEUTRALCONTRACT_STR.Length).ToUpper();
                    }
                    if (optionsStr == null && s.ToLower().IndexOf(TwsRtdServerData.OPTIONS_STR) >= 0)
                    {
                        // parse string like "opt=..."
                        optionsStr = s.Substring(TwsRtdServerData.OPTIONS_STR.Length, s.Length - TwsRtdServerData.OPTIONS_STR.Length).ToUpper();
                    }
                    if (genTicksStr == null && s.ToLower().IndexOf(TwsRtdServerData.GENTICKS_STR) >= 0)
                    {
                        // parse string like "genticks=..."
                        genTicksStr = s.Substring(TwsRtdServerData.GENTICKS_STR.Length, s.Length - TwsRtdServerData.GENTICKS_STR.Length).ToUpper();
                    }
                }
            }

            // defaults
            if (localSymbolStr == null || localSymbolStr.Length <= 0)
            {
                if ((secTypeStr == null || secTypeStr.Length <= 0) && conIdStr == null)
                {
                    secTypeStr = TwsRtdServerData.DEFAULT_SECTYPE;
                }
                if (exchStr == null || exchStr.Length <= 0)
                {
                    exchStr = TwsRtdServerData.DEFAULT_EXCHANGE;
                }
                if ((currencyStr == null || currencyStr.Length <= 0) && conIdStr == null)
                {
                    currencyStr = TwsRtdServerData.DEFAULT_CURRENCY;
                }
            }

            mktDataRequestStr = conIdStr + TwsRtdServerData.CHAR_UNDERSCORE +
                                symbolStr + TwsRtdServerData.CHAR_UNDERSCORE +
                                secTypeStr + TwsRtdServerData.CHAR_UNDERSCORE +
                                expirationStr + TwsRtdServerData.CHAR_UNDERSCORE +
                                strikeStr + TwsRtdServerData.CHAR_UNDERSCORE +
                                rightStr + TwsRtdServerData.CHAR_UNDERSCORE +
                                multiplierStr + TwsRtdServerData.CHAR_UNDERSCORE +
                                exchStr + TwsRtdServerData.CHAR_UNDERSCORE +
                                primExchStr + TwsRtdServerData.CHAR_UNDERSCORE +
                                currencyStr + TwsRtdServerData.CHAR_UNDERSCORE +
                                localSymbolStr + TwsRtdServerData.CHAR_UNDERSCORE +
                                tradingClassStr + TwsRtdServerData.CHAR_UNDERSCORE +
                                comboStr + TwsRtdServerData.CHAR_UNDERSCORE +
                                deltaNeutralContractStr + TwsRtdServerData.CHAR_UNDERSCORE +
                                optionsStr + TwsRtdServerData.CHAR_UNDERSCORE +
                                genTicksStr;

            return(mktDataRequestStr);
        }