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