/** * @brief Starts a subscription to market scan results based on the provided parameters. * @param reqId the request's identifier * @param subscription summary of the scanner subscription including its filters. * @sa reqScannerParameters, ScannerSubscription, EWrapper::scannerData */ public void reqScannerSubscription(int reqId, ScannerSubscription subscription) { if (!CheckConnection()) return; const int VERSION = 3; List<byte> paramsList = new List<byte>(); paramsList.AddParameter(OutgoingMessages.RequestScannerSubscription); paramsList.AddParameter(VERSION); paramsList.AddParameter(reqId); paramsList.AddParameterMax(subscription.NumberOfRows); paramsList.AddParameter(subscription.Instrument); paramsList.AddParameter(subscription.LocationCode); paramsList.AddParameter(subscription.ScanCode); paramsList.AddParameterMax(subscription.AbovePrice); paramsList.AddParameterMax(subscription.BelowPrice); paramsList.AddParameterMax(subscription.AboveVolume); paramsList.AddParameterMax(subscription.MarketCapAbove); paramsList.AddParameterMax(subscription.MarketCapBelow); paramsList.AddParameter(subscription.MoodyRatingAbove); paramsList.AddParameter(subscription.MoodyRatingBelow); paramsList.AddParameter(subscription.SpRatingAbove); paramsList.AddParameter(subscription.SpRatingBelow); paramsList.AddParameter(subscription.MaturityDateAbove); paramsList.AddParameter(subscription.MaturityDateBelow); paramsList.AddParameterMax(subscription.CouponRateAbove); paramsList.AddParameterMax(subscription.CouponRateBelow); paramsList.AddParameter(subscription.ExcludeConvertible); if (serverVersion >= 25) { paramsList.AddParameterMax(subscription.AverageOptionVolumeAbove); paramsList.AddParameter(subscription.ScannerSettingPairs); } if (serverVersion >= 27) { paramsList.AddParameter(subscription.StockTypeFilter); } Send(paramsList, EClientErrors.FAIL_SEND_REQSCANNER); }
/** * @brief Places an order * @param id the order's unique identifier. Use a sequential id starting with the id received at the nextValidId method. * @param contract the order's contract * @param order the order * @sa nextValidId, reqAllOpenOrders, reqAutoOpenOrders, reqOpenOrders, cancelOrder, reqGlobalCancel, EWrapper::openOrder, EWrapper::orderStatus, Order, Contract */ public void placeOrder(int id, Contract contract, Order order) { if (!CheckConnection()) return; if (!VerifyOrder(order, id, StringsAreEqual(Constants.BagSecType, contract.SecType))) return; if (!VerifyOrderContract(contract, id)) return; int MsgVersion = (serverVersion < MinServerVer.NOT_HELD ) ? 27 : 41; List<byte> paramsList = new List<byte>(); paramsList.AddParameter(OutgoingMessages.PlaceOrder); paramsList.AddParameter(MsgVersion); paramsList.AddParameter(id); if (serverVersion >= MinServerVer.PLACE_ORDER_CONID) { paramsList.AddParameter(contract.ConId); } paramsList.AddParameter(contract.Symbol); paramsList.AddParameter(contract.SecType); paramsList.AddParameter(contract.Expiry); paramsList.AddParameter(contract.Strike); paramsList.AddParameter(contract.Right); if (serverVersion >= 15) { paramsList.AddParameter(contract.Multiplier); } paramsList.AddParameter(contract.Exchange); if (serverVersion >= 14) { paramsList.AddParameter(contract.PrimaryExch); } paramsList.AddParameter(contract.Currency); if (serverVersion >= 2) { paramsList.AddParameter(contract.LocalSymbol); } if (serverVersion >= MinServerVer.TRADING_CLASS) { paramsList.AddParameter(contract.TradingClass); } if (serverVersion >= MinServerVer.SEC_ID_TYPE) { paramsList.AddParameter(contract.SecIdType); paramsList.AddParameter(contract.SecId); } // paramsList.AddParameter main order fields paramsList.AddParameter(order.Action); paramsList.AddParameter(order.TotalQuantity); paramsList.AddParameter(order.OrderType); if (serverVersion < MinServerVer.ORDER_COMBO_LEGS_PRICE) { paramsList.AddParameter(order.LmtPrice == Double.MaxValue ? 0 : order.LmtPrice); } else { paramsList.AddParameterMax(order.LmtPrice); } if (serverVersion < MinServerVer.TRAILING_PERCENT) { paramsList.AddParameter(order.AuxPrice == Double.MaxValue ? 0 : order.AuxPrice); } else { paramsList.AddParameterMax(order.AuxPrice); } // paramsList.AddParameter extended order fields paramsList.AddParameter(order.Tif); paramsList.AddParameter(order.OcaGroup); paramsList.AddParameter(order.Account); paramsList.AddParameter(order.OpenClose); paramsList.AddParameter(order.Origin); paramsList.AddParameter(order.OrderRef); paramsList.AddParameter(order.Transmit); if (serverVersion >= 4) { paramsList.AddParameter(order.ParentId); } if (serverVersion >= 5) { paramsList.AddParameter(order.BlockOrder); paramsList.AddParameter(order.SweepToFill); paramsList.AddParameter(order.DisplaySize); paramsList.AddParameter(order.TriggerMethod); if (serverVersion < 38) { // will never happen paramsList.AddParameter(/* order.ignoreRth */ false); } else { paramsList.AddParameter(order.OutsideRth); } } if (serverVersion >= 7) { paramsList.AddParameter(order.Hidden); } // paramsList.AddParameter combo legs for BAG requests bool isBag = StringsAreEqual(Constants.BagSecType, contract.SecType); if (serverVersion >= 8 && isBag) { if (contract.ComboLegs == null) { paramsList.AddParameter(0); } else { paramsList.AddParameter(contract.ComboLegs.Count); ComboLeg comboLeg; for (int i = 0; i < contract.ComboLegs.Count; i++) { comboLeg = (ComboLeg)contract.ComboLegs[i]; paramsList.AddParameter(comboLeg.ConId); paramsList.AddParameter(comboLeg.Ratio); paramsList.AddParameter(comboLeg.Action); paramsList.AddParameter(comboLeg.Exchange); paramsList.AddParameter(comboLeg.OpenClose); if (serverVersion >= MinServerVer.SSHORT_COMBO_LEGS) { paramsList.AddParameter(comboLeg.ShortSaleSlot); paramsList.AddParameter(comboLeg.DesignatedLocation); } if (serverVersion >= MinServerVer.SSHORTX_OLD) { paramsList.AddParameter(comboLeg.ExemptCode); } } } } // add order combo legs for BAG requests if (serverVersion >= MinServerVer.ORDER_COMBO_LEGS_PRICE && isBag) { if (order.OrderComboLegs == null) { paramsList.AddParameter(0); } else { paramsList.AddParameter(order.OrderComboLegs.Count); for (int i = 0; i < order.OrderComboLegs.Count; i++) { OrderComboLeg orderComboLeg = order.OrderComboLegs[i]; paramsList.AddParameterMax(orderComboLeg.price); } } } if (serverVersion >= MinServerVer.SMART_COMBO_ROUTING_PARAMS && isBag) { List<TagValue> smartComboRoutingParams = order.SmartComboRoutingParams; int smartComboRoutingParamsCount = smartComboRoutingParams == null ? 0 : smartComboRoutingParams.Count; paramsList.AddParameter(smartComboRoutingParamsCount); if (smartComboRoutingParamsCount > 0) { for (int i = 0; i < smartComboRoutingParamsCount; ++i) { TagValue tagValue = smartComboRoutingParams[i]; paramsList.AddParameter(tagValue.Tag); paramsList.AddParameter(tagValue.Value); } } } if (serverVersion >= 9) { // paramsList.AddParameter deprecated sharesAllocation field paramsList.AddParameter(""); } if (serverVersion >= 10) { paramsList.AddParameter(order.DiscretionaryAmt); } if (serverVersion >= 11) { paramsList.AddParameter(order.GoodAfterTime); } if (serverVersion >= 12) { paramsList.AddParameter(order.GoodTillDate); } if (serverVersion >= 13) { paramsList.AddParameter(order.FaGroup); paramsList.AddParameter(order.FaMethod); paramsList.AddParameter(order.FaPercentage); paramsList.AddParameter(order.FaProfile); } if (serverVersion >= 18) { // institutional short sale slot fields. paramsList.AddParameter(order.ShortSaleSlot); // 0 only for retail, 1 or 2 only for institution. paramsList.AddParameter(order.DesignatedLocation); // only populate when order.shortSaleSlot = 2. } if (serverVersion >= MinServerVer.SSHORTX_OLD) { paramsList.AddParameter(order.ExemptCode); } if (serverVersion >= 19) { paramsList.AddParameter(order.OcaType); if (serverVersion < 38) { // will never happen paramsList.AddParameter( /* order.rthOnly */ false); } paramsList.AddParameter(order.Rule80A); paramsList.AddParameter(order.SettlingFirm); paramsList.AddParameter(order.AllOrNone); paramsList.AddParameterMax(order.MinQty); paramsList.AddParameterMax(order.PercentOffset); paramsList.AddParameter(order.ETradeOnly); paramsList.AddParameter(order.FirmQuoteOnly); paramsList.AddParameterMax(order.NbboPriceCap); paramsList.AddParameterMax(order.AuctionStrategy); paramsList.AddParameterMax(order.StartingPrice); paramsList.AddParameterMax(order.StockRefPrice); paramsList.AddParameterMax(order.Delta); // Volatility orders had specific watermark price attribs in server version 26 double lower = (serverVersion == 26 && order.OrderType.Equals("VOL")) ? Double.MaxValue : order.StockRangeLower; double upper = (serverVersion == 26 && order.OrderType.Equals("VOL")) ? Double.MaxValue : order.StockRangeUpper; paramsList.AddParameterMax(lower); paramsList.AddParameterMax(upper); } if (serverVersion >= 22) { paramsList.AddParameter(order.OverridePercentageConstraints); } if (serverVersion >= 26) { // Volatility orders paramsList.AddParameterMax(order.Volatility); paramsList.AddParameterMax(order.VolatilityType); if (serverVersion < 28) { bool isDeltaNeutralTypeMKT = (String.Compare("MKT", order.DeltaNeutralOrderType, true) == 0); paramsList.AddParameter(isDeltaNeutralTypeMKT); } else { paramsList.AddParameter(order.DeltaNeutralOrderType); paramsList.AddParameterMax(order.DeltaNeutralAuxPrice); if (serverVersion >= MinServerVer.DELTA_NEUTRAL_CONID && !IsEmpty(order.DeltaNeutralOrderType)) { paramsList.AddParameter(order.DeltaNeutralConId); paramsList.AddParameter(order.DeltaNeutralSettlingFirm); paramsList.AddParameter(order.DeltaNeutralClearingAccount); paramsList.AddParameter(order.DeltaNeutralClearingIntent); } if (serverVersion >= MinServerVer.DELTA_NEUTRAL_OPEN_CLOSE && !IsEmpty(order.DeltaNeutralOrderType)) { paramsList.AddParameter(order.DeltaNeutralOpenClose); paramsList.AddParameter(order.DeltaNeutralShortSale); paramsList.AddParameter(order.DeltaNeutralShortSaleSlot); paramsList.AddParameter(order.DeltaNeutralDesignatedLocation); } } paramsList.AddParameter(order.ContinuousUpdate); if (serverVersion == 26) { // Volatility orders had specific watermark price attribs in server version 26 double lower = order.OrderType.Equals("VOL") ? order.StockRangeLower : Double.MaxValue; double upper = order.OrderType.Equals("VOL") ? order.StockRangeUpper : Double.MaxValue; paramsList.AddParameterMax(lower); paramsList.AddParameterMax(upper); } paramsList.AddParameterMax(order.ReferencePriceType); } if (serverVersion >= 30) { // TRAIL_STOP_LIMIT stop price paramsList.AddParameterMax(order.TrailStopPrice); } if (serverVersion >= MinServerVer.TRAILING_PERCENT) { paramsList.AddParameterMax(order.TrailingPercent); } if (serverVersion >= MinServerVer.SCALE_ORDERS) { if (serverVersion >= MinServerVer.SCALE_ORDERS2) { paramsList.AddParameterMax(order.ScaleInitLevelSize); paramsList.AddParameterMax(order.ScaleSubsLevelSize); } else { paramsList.AddParameter(""); paramsList.AddParameterMax(order.ScaleInitLevelSize); } paramsList.AddParameterMax(order.ScalePriceIncrement); } if (serverVersion >= MinServerVer.SCALE_ORDERS3 && order.ScalePriceIncrement > 0.0 && order.ScalePriceIncrement != Double.MaxValue) { paramsList.AddParameterMax(order.ScalePriceAdjustValue); paramsList.AddParameterMax(order.ScalePriceAdjustInterval); paramsList.AddParameterMax(order.ScaleProfitOffset); paramsList.AddParameter(order.ScaleAutoReset); paramsList.AddParameterMax(order.ScaleInitPosition); paramsList.AddParameterMax(order.ScaleInitFillQty); paramsList.AddParameter(order.ScaleRandomPercent); } if (serverVersion >= MinServerVer.SCALE_TABLE) { paramsList.AddParameter(order.ScaleTable); paramsList.AddParameter(order.ActiveStartTime); paramsList.AddParameter(order.ActiveStopTime); } if (serverVersion >= MinServerVer.HEDGE_ORDERS) { paramsList.AddParameter(order.HedgeType); if (!IsEmpty(order.HedgeType)) { paramsList.AddParameter(order.HedgeParam); } } if (serverVersion >= MinServerVer.OPT_OUT_SMART_ROUTING) { paramsList.AddParameter(order.OptOutSmartRouting); } if (serverVersion >= MinServerVer.PTA_ORDERS) { paramsList.AddParameter(order.ClearingAccount); paramsList.AddParameter(order.ClearingIntent); } if (serverVersion >= MinServerVer.NOT_HELD) { paramsList.AddParameter(order.NotHeld); } if (serverVersion >= MinServerVer.UNDER_COMP) { if (contract.UnderComp != null) { UnderComp underComp = contract.UnderComp; paramsList.AddParameter(true); paramsList.AddParameter(underComp.ConId); paramsList.AddParameter(underComp.Delta); paramsList.AddParameter(underComp.Price); } else { paramsList.AddParameter(false); } } if (serverVersion >= MinServerVer.ALGO_ORDERS) { paramsList.AddParameter(order.AlgoStrategy); if (!IsEmpty(order.AlgoStrategy)) { List<TagValue> algoParams = order.AlgoParams; int algoParamsCount = algoParams == null ? 0 : algoParams.Count; paramsList.AddParameter(algoParamsCount); if (algoParamsCount > 0) { for (int i = 0; i < algoParamsCount; ++i) { TagValue tagValue = (TagValue)algoParams[i]; paramsList.AddParameter(tagValue.Tag); paramsList.AddParameter(tagValue.Value); } } } } if (serverVersion >= MinServerVer.WHAT_IF_ORDERS) { paramsList.AddParameter(order.WhatIf); } Send(id, paramsList, EClientErrors.FAIL_SEND_ORDER); }
/// <summary> /// Starts a subscription to market scan results based on the provided parameters. /// </summary> /// <param name="reqId">The request's identifier.</param> /// <param name="subscription">Summary of the scanner subscription including its filters.</param> /// <param name="scannerSubscriptionOptions"></param> public void ReqScannerSubscription(int reqId, ScannerSubscription subscription, List<TagValue> scannerSubscriptionOptions) { CheckConnection(); const int VERSION = 4; List<byte> paramsList = new List<byte>(); paramsList.AddParameter(OutgoingMessages.RequestScannerSubscription); paramsList.AddParameter(VERSION); paramsList.AddParameter(reqId); paramsList.AddParameterMax(subscription.NumberOfRows); paramsList.AddParameter(subscription.Instrument); paramsList.AddParameter(subscription.LocationCode); paramsList.AddParameter(subscription.ScanCode); paramsList.AddParameterMax(subscription.AbovePrice); paramsList.AddParameterMax(subscription.BelowPrice); paramsList.AddParameterMax(subscription.AboveVolume); paramsList.AddParameterMax(subscription.MarketCapAbove); paramsList.AddParameterMax(subscription.MarketCapBelow); paramsList.AddParameter(subscription.MoodyRatingAbove); paramsList.AddParameter(subscription.MoodyRatingBelow); paramsList.AddParameter(subscription.SpRatingAbove); paramsList.AddParameter(subscription.SpRatingBelow); paramsList.AddParameter(subscription.MaturityDateAbove); paramsList.AddParameter(subscription.MaturityDateBelow); paramsList.AddParameterMax(subscription.CouponRateAbove); paramsList.AddParameterMax(subscription.CouponRateBelow); paramsList.AddParameter(subscription.ExcludeConvertible); if (ibClientConnection.ServerVersion >= 25) { paramsList.AddParameterMax(subscription.AverageOptionVolumeAbove); paramsList.AddParameter(subscription.ScannerSettingPairs); } if (ibClientConnection.ServerVersion >= 27) { paramsList.AddParameter(subscription.StockTypeFilter); } if (ibClientConnection.ServerVersion >= MinServerVer.LINKING) { //int tagValuesCount = scannerSubscriptionOptions == null ? 0 : scannerSubscriptionOptions.Count; //paramsList.AddParameter(tagValuesCount); paramsList.AddParameter(TagValueListToString(scannerSubscriptionOptions)); } ibClientConnection.IbWriter.Send(paramsList, EClientErrors.FAIL_SEND_REQSCANNER); }