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