using System; using System.Collections.Generic; using System.Linq; using System.Text; using IBApi; namespace TradeIdeas.TIProGUI { public delegate void DisplayGroupReceivedHandler(int displayGroup); public delegate void ContractDetailsReceivedHandler(string symbol, int contractId); public delegate void ConnectionRefusedHandler(string message); public delegate void ConnectionAcknowledgedHandler(); /// /// First occurrence after connection has been established and actual requests can be submitted. If any requests are sent before /// this first event fires there is no guarantee that they'll work and they could literally cause the connection to terminate. /// public delegate void NextValidIdReceivedHandler(); public class ExternalLinkingIBClient : EWrapper { public event DisplayGroupReceivedHandler DisplayGroupReceived; public event ContractDetailsReceivedHandler ContractDetailsReceived; public event ConnectionRefusedHandler ConnectionRefused; public event ConnectionAcknowledgedHandler ConnectionAcknowledged; public event NextValidIdReceivedHandler NextValidIdReceived; /// /// Keeps track of request ids for symbol details. Key is request id, value is symbol. /// private Dictionary _requestIds = new Dictionary(); public ExternalLinkingIBClient() { } public void accountDownloadEnd(string account) { } public void accountSummary(int reqId, string account, string tag, string value, string currency) { } public void accountSummaryEnd(int reqId) { } public void bondContractDetails(int reqId, ContractDetails contract) { } public void commissionReport(CommissionReport commissionReport) { } public void connectionClosed() { } public void contractDetails(int reqId, ContractDetails contractDetails) { if (null != ContractDetailsReceived) ContractDetailsReceived(contractDetails.Contract.Symbol, contractDetails.Contract.ConId); } public void contractDetailsEnd(int reqId) { } public void currentTime(long time) { } public void deltaNeutralValidation(int reqId, DeltaNeutralContract deltaNeutralContract) { } private int _groupId = 0; public int GroupId { get { return _groupId; } } public void displayGroupList(int reqId, string groups) { string debugView = reqId + groups; string[] groupIds = groups.Split('|'); if (groupIds.Length > 0) { int.TryParse(groupIds[0], out _groupId); if (null != DisplayGroupReceived) DisplayGroupReceived(_groupId); } } public void displayGroupUpdated(int reqId, string contractInfo) { string debugView = reqId + contractInfo; } public void error(string str) { string debugView = str; GuiEnvironment.LogMessage("[ExternalLinkingIBClient] Error String: " + debugView); } public void error(Exception e) { GuiEnvironment.LogMessage("[ExternalLinkingIBClient] Error Exception: " + e.Message); if (e.Message.Contains("No connection could be made") && null != ConnectionRefused) ConnectionRefused(e.Message); } public void error(int id, int errorCode, string errorMsg, string advancedOrderRejectJson) { string debugView = "id = " + id + ", errorCode = " + errorCode + ", errorMsg = " + errorMsg + ", advancedOrderRejectJson = " + advancedOrderRejectJson; GuiEnvironment.LogMessage("[ExternalLinkingIBClient] Error with ID: " + debugView); } public void execDetails(int reqId, Contract contract, Execution execution) { } public void execDetailsEnd(int reqId) { } public void fundamentalData(int reqId, string data) { } public void historicalData(int reqId, string date, double open, double high, double low, double close, int volume, int count, double WAP, bool hasGaps) { } public void historicalDataEnd(int reqId, string start, string end) { } public void managedAccounts(string accountsList) { } public void marketDataType(int reqId, int marketDataType) { } private int _nextValidId = 0; public int NextValidId { get { return _nextValidId; } } public void nextValidId(int orderId) { if (null != NextValidIdReceived && orderId > 0) NextValidIdReceived(); _nextValidId = orderId; } public void openOrder(int orderId, Contract contract, Order order, OrderState orderState) { } public void openOrderEnd() { } public void positionEnd() { } public void realtimeBar(int reqId, long time, double open, double high, double low, double close, decimal volume, decimal WAP, int count) { } public void receiveFA(int faDataType, string faXmlData) { } public void scannerData(int reqId, int rank, ContractDetails contractDetails, string distance, string benchmark, string projection, string legsStr) { } public void scannerDataEnd(int reqId) { } public void scannerParameters(string xml) { } public void tickEFP(int tickerId, int tickType, double basisPoints, string formattedBasisPoints, double impliedFuture, int holdDays, string futureExpiry, double dividendImpact, double dividendsToExpiry) { } public void tickGeneric(int tickerId, int field, double value) { } public void tickOptionComputation(int tickerId, int field, double impliedVolatility, double delta, double optPrice, double pvDividend, double gamma, double vega, double theta, double undPrice) { } public void tickPrice(int tickerId, int field, double price, int canAutoExecute) { } public void tickSize(int tickerId, int field, decimal size) { } public void tickSnapshotEnd(int tickerId) { } public void tickString(int tickerId, int field, string value) { } public void updateAccountTime(string timestamp) { } public void updateAccountValue(string key, string value, string currency, string accountName) { } public void updateMktDepth(int tickerId, int position, int operation, int side, double price, decimal size) { } public void updateMktDepthL2(int tickerId, int position, string marketMaker, int operation, int side, double price, decimal size, bool isSmartDepth) { } public void updateNewsBulletin(int msgId, int msgType, string message, string origExchange) { } public void verifyCompleted(bool isSuccessful, string errorText) { } public void verifyMessageAPI(string apiData) { } public void updatePortfolio(Contract contract, decimal position, double marketPrice, double marketValue, double averageCost, double unrealisedPNL, double realisedPNL, string accountName) { } public void orderStatus(int orderId, string status, decimal filled, decimal remaining, double avgFillPrice, int permId, int parentId, double lastFillPrice, int clientId, string whyHeld, double mktCapPrice) { } public void position(string account, Contract contract, decimal pos, double avgCost) { } public void verifyAndAuthMessageAPI(string apiData, string xyzChallenge) { } public void verifyAndAuthCompleted(bool isSuccessful, string errorText) { } public void connectAck() { if (null != ConnectionAcknowledged) ConnectionAcknowledged(); } public void positionMulti(int requestId, string account, string modelCode, Contract contract, decimal pos, double avgCost) { } public void positionMultiEnd(int requestId) { } public void accountUpdateMulti(int requestId, string account, string modelCode, string key, string value, string currency) { } public void accountUpdateMultiEnd(int requestId) { } public void securityDefinitionOptionParameter(int reqId, string exchange, int underlyingConId, string tradingClass, string multiplier, HashSet expirations, HashSet strikes) { } public void securityDefinitionOptionParameterEnd(int reqId) { } public void softDollarTiers(int reqId, SoftDollarTier[] tiers) { } public void tickPrice(int tickerId, int field, double price, TickAttrib attribs) { } public void historicalData(int reqId, IBApi.Bar bar) { } public void historicalDataUpdate(int reqId, IBApi.Bar bar) { } public void familyCodes(FamilyCode[] familyCodes) { } public void symbolSamples(int reqId, ContractDescription[] contractDescriptions) { } public void mktDepthExchanges(DepthMktDataDescription[] depthMktDataDescriptions) { } public void tickNews(int tickerId, long timeStamp, string providerCode, string articleId, string headline, string extraData) { } public void smartComponents(int reqId, Dictionary> theMap) { } public void tickReqParams(int tickerId, double minTick, string bboExchange, int snapshotPermissions) { } public void newsProviders(NewsProvider[] newsProviders) { } public void newsArticle(int requestId, int articleType, string articleText) { } public void historicalNews(int requestId, string time, string providerCode, string articleId, string headline) { } public void historicalNewsEnd(int requestId, bool hasMore) { } public void headTimestamp(int reqId, string headTimestamp) { } public void histogramData(int reqId, HistogramEntry[] data) { } public void rerouteMktDataReq(int reqId, int conId, string exchange) { } public void rerouteMktDepthReq(int reqId, int conId, string exchange) { } public void marketRule(int marketRuleId, PriceIncrement[] priceIncrements) { } public void pnl(int reqId, double dailyPnL, double unrealizedPnL, double realizedPnL) { } public void pnlSingle(int reqId, decimal pos, double dailyPnL, double unrealizedPnL, double realizedPnL, double value) { } public void historicalTicks(int reqId, HistoricalTick[] ticks, bool done) { } public void historicalTicksBidAsk(int reqId, HistoricalTickBidAsk[] ticks, bool done) { } public void historicalTicksLast(int reqId, HistoricalTickLast[] ticks, bool done) { } public void tickByTickAllLast(int reqId, int tickType, long time, double price, decimal size, TickAttribLast attribs, string exchange, string specialConditions) { } public void tickByTickBidAsk(int reqId, long time, double bidPrice, double askPrice, decimal bidSize, decimal askSize, TickAttribBidAsk attribs) { } public void tickByTickMidPoint(int reqId, long time, double midPoint) { } public void orderBound(long orderId, int apiClientId, int apiOrderId) { } public void completedOrder(Contract contract, Order order, OrderState orderState) { } public void completedOrdersEnd() { } public void tickOptionComputation(int tickerId, int field, int tickAttrib, double impliedVolatility, double delta, double optPrice, double pvDividend, double gamma, double vega, double theta, double undPrice) { } public void replaceFAEnd(int reqId, string text) { } public void wshMetaData(int reqId, string dataJson) { } public void wshEventData(int reqId, string dataJson) { } public void historicalSchedule(int reqId, string startDateTime, string endDateTime, string timeZone, HistoricalSession[] sessions) { } public void userInfo(int reqId, string whiteBrandingId) { } } }