Bloomberg

Bloomberg EMSX

Provider ID74

Bloomberg EMSX order execution on Obermind Stream. Route equities and ETFs, futures and options to EMSX brokers through the Bloomberg Server API or a logged-on Terminal, with a broker and account per asset class, broker algorithms read from Bloomberg, and prices from another provider in the deployment.

  • Equities
  • Equity Derivatives
  • ETF
  • Futures
  • Integrations
  • OMS / EMS
  • Options
  • Order Execution

Overview

Obermind Stream connects to Bloomberg EMSX as an execution venue. Orders are created and routed with CreateOrderAndRouteEx and cancelled with CancelRoute. Fills, broker rejects and cancels arrive on the EMSX order and route subscriptions. Three EMSX asset classes are supported: equities (EQTY, including ETFs), futures (FUT) and options (OPT). Each class has its own broker, account and hand instruction, and the provider reads the brokers and broker strategies Bloomberg enabled for each class, so traders and administrators can only pick what the broker actually offers.

Two connection modes

Terminal mode (ServerAPI false, the default) connects to a Bloomberg Terminal logged on to the same machine at localhost:8194. It has market data, intraday history and EMSX, and orders show on that user's blotter. Server API mode (ServerAPI true) connects to a Bloomberg Server API instance and authorizes every request with a non-BPS UUID and the IP address Bloomberg registered for the Obermind Stream host. Server API mode has no market data entitlement: it carries orders, fills and the strategy catalogue only. Orders from a non-BPS UUID do not appear on a trader blotter unless Bloomberg adds the UUID to the desk's Teamview.

  • Terminal (Desktop API)
  • Server API (SAPI)

Supported asset classes

The instrument type in the Obermind catalogue decides the EMSX asset class. Any other instrument type (FX, crypto, CFDs, bonds) is rejected with "Instrument type … is not supported for this venue". The sections below cover each class: ticker, side, quantity, broker and what to configure.

  • Equities (EQTY): instrument types Stock, ETF and Index
  • Futures (FUT): instrument type Future
  • Options (OPT): instrument type Option, equity, index and options on futures
  • One broker, account and hand instruction per class

Equities and ETFs (EQTY)

Stock, ETF and Index instruments are sent as EQTY. The ticker is the instrument's alternative id on the Bloomberg provider, written exactly as the Terminal shows it, with the market code and the yellow key: AAPL US Equity, VOD LN Equity, SPY US Equity for an ETF. The side is BUY or SELL. Quantity is a whole number of shares. Set EQTY in BrokersStr to a broker Bloomberg enabled for equities and give that broker its account in AccountsStr. Broker strategies offered on an equity order are that broker's EQTY strategies, for example VWAP or DMA.

<property name="BrokersStr" null="false">{"EQTY":"BRKA","FUT":"","OPT":""}</property>
<property name="AccountsStr" null="false">{"BRKA":"ACC-0001"}</property>

Futures (FUT)

Instruments of type Future are sent as FUT. Use the ticker of the specific contract month with its yellow key, as the Terminal shows it: ESZ6 Index for the December 2026 E-mini S&P 500, CLF7 Comdty for January 2027 WTI crude oil, TYH7 Comdty for the March 2027 10-year Treasury note, ECZ6 Curncy for the December 2026 euro FX future. Generic tickers such as ES1 Index roll on their own and are not order tickers. At each roll, add the next contract as an instrument (or change the alternative id) before trading it. Quantity is a whole number of contracts. Futures need their own broker: set FUT in BrokersStr to a broker Bloomberg enabled for futures, often not the equity broker, with its account in AccountsStr. Leave FUT empty until Bloomberg enables a futures broker on the connection. The side is buy or sell to open or to close, worked out from the account's position (see Open and close side).

<property name="BrokersStr" null="false">{"EQTY":"BRKA","FUT":"BRKF","OPT":""}</property>
<property name="AccountsStr" null="false">{"BRKA":"ACC-0001","BRKF":"ACC-0002"}</property>

Options (OPT)

Instruments of type Option are sent as OPT. The type is set when the instrument is created, so create options as Option from the start. The ticker is the full Bloomberg option ticker with underlying, expiry, put or call, strike and yellow key, copied from the Terminal security lookup: AAPL US 12/18/26 C200 Equity for an equity option, SPX US 12/18/26 P5000 Index for an index option, ESZ6C 5000 Index for an option on a future. Quantity is a whole number of contracts. Set OPT in BrokersStr to a broker Bloomberg enabled for options, with its account in AccountsStr, and OPT in HandInstructionsStr if the broker asks for something other than ANY. The side is buy or sell to open or to close, from the account's position. Broker strategies offered on an option order are the broker's OPT strategies only. In Server API mode each option also needs an alternative id on the price provider, or it has no price.

<property name="BrokersStr" null="false">{"EQTY":"BRKA","FUT":"BRKF","OPT":"BRKO"}</property>
<property name="AccountsStr" null="false">{"BRKA":"ACC-0001","BRKF":"ACC-0002","BRKO":"ACC-0003"}</property>
<property name="HandInstructionsStr" null="false">{"EQTY":"ANY","FUT":"ANY","OPT":"ANY"}</property>

Open and close side (futures and options)

EMSX takes an opening or closing side on futures and options. The platform order is a plain buy or sell, so the provider decides from the account's current position on that instrument when the order is sent. Equities always send BUY or SELL.

  • Buy with a short position: B/C (buy to close)
  • Buy with no short position: B/O (buy to open)
  • Sell with a long position: S/C (sell to close)
  • Sell with no long position: S/O (sell to open)

Adding instruments

EMSX has no instrument download and no order status request, so the instruments come from your price provider. Create or import them there (Obermind Dash, Data Manager, Import Instruments) with the right instrument type: Stock or ETF, Future, or Option. Then open each instrument in Obermind Dash, Instruments, Update and add an alternative id on the Bloomberg provider with the Bloomberg ticker. In Server API mode keep the price provider's alternative id as well: prices come from it and orders go to Bloomberg.

What to request from Bloomberg

Bloomberg provisions the Server API instances, the identities and the broker setup. Request all of these before installing.

  • Server API: up to two instances, usually one UAT and one PROD. Both are production grade
  • Two non-BPS UUIDs (UAT and PROD), each tied to the IP address Bloomberg sees for the Obermind Stream host
  • EMSX broker code setup per asset class (EQTY, FUT, OPT) with the exchanges you need, an administrator UUID and an order owner UUID
  • Algo setup for each broker, or the strategy lists come back empty
  • The broker account (FIX tag 1) for each broker, agreed with that broker
  • Optional: the non-BPS UUIDs added to the trading desk's Teamview

Install the Bloomberg Server API

1. Sign in to the Bloomberg developer portal (or run BDEV <GO> on a Terminal: Products, Trading API Products, EMSX API Developer's Guide, Trading API Server) and download the current API deployed installer and the SDK. 2. Install on the server that will host the instance: Windows, or Linux with kernel 3.10 or later (Red Hat 8 or later). Place it close to Bloomberg's data centre for your region, on the network path Bloomberg specifies (for example leased lines). 3. Run the installer and follow the prompts. It ends with a registration key. 4. Send the key to Bloomberg. They configure the instance on their side. Repeat for the second instance. 5. Start the Server API. It can run in a console window for testing or as a service. 6. Allow the Obermind Stream host to reach the Server API port, 8194 by default. When Obermind Stream runs on the same machine, ServerHost is localhost.

Order types

Market (EMSX_ORDER_TYPE MKT) and Limit (LMT). Quantity is a whole number. Stop and Stop Limit are held on the platform and released as market orders through the Aggregator's synthetic order types. Modify is not supported: cancel and send a new order.

  • Market
  • Limit

Time in force

Day only. Set the Aggregator's VenueTimeInForce so any other value is rewritten to Day before the order is sent.

  • Day

How a broker is chosen

Each order goes to one EMSX broker, the first of the three below. Once Bloomberg has listed the brokers for the order's asset class, the broker must be one of them; otherwise the order is rejected with "Broker … is not enabled for … orders on this connection". A class with no broker set and no broker on the order is rejected with "No broker is configured for … orders".

  • The algorithm's broker, when the order uses a broker strategy
  • The broker chosen on the order ticket in Obermind Flow
  • BrokersStr for the instrument's asset class

Brokers and accounts

BrokersStr is a JSON object with the keys EQTY, FUT and OPT, each set to an EMSX broker code or left empty. Only select a broker that Bloomberg enabled for that class; leave a class empty until it is enabled. AccountsStr maps each broker code to its account, sent as EMSX_ACCOUNT (FIX tag 1), up to 29 characters; DefaultAccount is used for a broker with no entry. The broker's default account in FNAB <GO> only fills the Terminal drop-down and is not applied to API orders, so a missing account is often rejected by the broker as an unknown client. With RequireAccount on (the default), Server API orders with no account are rejected by Obermind before they are sent.

<property name="BrokersStr" null="false">{"EQTY":"BRKA","FUT":"BRKF","OPT":"BRKO"}</property>
<property name="AccountsStr" null="false">{"BRKA":"ACC-0001","BRKF":"ACC-0002","BRKO":"ACC-0003"}</property>
<property name="DefaultAccount" null="false">ACC-0001</property>
<property name="RequireAccount" null="false">True</property>

Hand instructions

HandInstructionsStr sets EMSX_HAND_INSTRUCTION per asset class: ANY, AUTO, DOT or MAN. ANY leaves the choice to the broker and is the default for every class. Use the value each broker asked for. A class with no value is rejected with "No hand instruction is configured for … orders".

<property name="HandInstructionsStr" null="false">{"EQTY":"ANY","FUT":"ANY","OPT":"MAN"}</property>

Broker algorithms

When EMSX opens, the provider calls GetBrokersWithAssetClass, GetBrokerStrategiesWithAssetClass and GetBrokerStrategyInfoWithAssetClass for EQTY, FUT and OPT, and keeps each broker's strategies with their parameters in Bloomberg's order. A strategy belongs to one class and one broker, so an option order only sees the brokers' OPT strategies. Parameters are positional: every order sends one strategy field and one indicator per parameter, with the value when it is set and the broker default otherwise. Bloomberg returns parameter names only, so the broker validates the values. An order with no strategy is sent with strategy NONE. In the Obermind web and mobile apps the picker appears on the trade ticket when the platform switch Provider algos enabled is on, the account's configuration group has Provider Algos Enabled set to true, and the account routes to a venue that offers algorithms. Administrators can pick an algorithm on the Dash order ticket. Algorithm orders accept Market and Limit, Day only, go only to the algorithm's venue and cannot be modified.

Fills, rejects and cancels

A broker can reject a route after EMSX accepted the order. The route subscription reports EMSX_STATUS REJECTED, and the reject reason is EMSX_BROKER_NOTES, the broker's FIX tag 58 text. Obermind rejects the order with that text. EMSX_NOTES is the instruction sent to the broker, not the reason. A cancel made on the Terminal or by the broker cancels the order on the platform. After a reconnect the initial paint reconciles working orders without repeating fills.

Prices from another provider

Server API mode publishes no prices, for any asset class. Give each instrument two alternative ids, one on the price provider and one on the Bloomberg provider, and set the Aggregator properties below on ObermindStream.ObermindSTREAMSettings. VenuePriceSources takes the price provider's quotes (88 here) and tags them as provider 74, so best price routes to Bloomberg. Futures and options need a price provider that carries them too. The price provider must not also be in LiquidityProviders. Internaliser must be false, or orders execute on the platform's own book. SyntheticOrderProviders keeps Stop and Stop Limit on the platform and releases them as market orders. VenueTimeInForce replaces the built-in rules for every venue once set, so list your other venues in it too, for example 74:Day:Day;88:GTC,IOC,GTD.

<Property name="Internaliser">False</Property>
<Property name="LiquidityProviders">74</Property>
<Property name="VenuePriceSources">74:88</Property>
<Property name="SyntheticOrderProviders">74:Market,Limit</Property>
<Property name="VenueTimeInForce">74:Day:Day</Property>

Assembly registration

Register the provider in Obermind Stream Configuration (OberMind.Configurations.Configuration), then restart Obermind Stream. Id 0 uses the id from the class, which is 74. Only include this provider's assembly block. The Bloomberg API libraries ship with Obermind Stream.

<Provider>
  <TypeName>OberMind.BBG.API.Bloomberg, OberMind.BBG</TypeName>
  <Id>0</Id>
  <X64>true</X64>
</Provider>

Stream provider XML

Paste this provider element into OberMind.XmlProviderManagerSettings. After the type is loaded, Obermind Dash, Providers, Configuration edits the same element, and the info icon next to the provider lists every setting with its current value. The sample is Server API against the PROD service, with a broker and account for each of equities, futures and options. Replace the host, the UUIDs, the IP addresses, the brokers and the accounts with the values Bloomberg and your brokers issued, and leave FUT or OPT empty in BrokersStr until Bloomberg enables a broker for that class. UsersStr lists the identities; the first enabled one is used. LogPath must be a folder the Obermind Stream service can write. Keep SUBSCRIPTION_DATA logging off in production.

<provider>
  <id>74</id>
  <instance>1</instance>
  <properties>
    <property name="IsServerAPI" null="false">True</property>
    <property name="ServerHost" null="false">198.51.100.20</property>
    <property name="ServerPort" null="false">8194</property>
    <property name="IsUAT" null="false">False</property>
    <property name="UsersStr" null="false">[{"Enabled":true,"UUID":"10000001","Description":"PROD","IPAddress":"203.0.113.10"},{"Enabled":false,"UUID":"10000002","Description":"UAT","IPAddress":"127.0.0.1"}]</property>
    <property name="DefaultAccount" null="false">ACC-0001</property>
    <property name="AccountsStr" null="false">{"BRKA":"ACC-0001","BRKF":"ACC-0002","BRKO":"ACC-0003"}</property>
    <property name="RequireAccount" null="false">True</property>
    <property name="BrokersStr" null="false">{"EQTY":"BRKA","FUT":"BRKF","OPT":"BRKO"}</property>
    <property name="HandInstructionsStr" null="false">{"EQTY":"ANY","FUT":"ANY","OPT":"ANY"}</property>
    <property name="LoggingEnabled" null="false">True</property>
    <property name="LogPath" null="false">C:\ObermindPlatform\logs\bloomberg\</property>
    <property name="LogEventsStr" null="false">{"SUBSCRIPTION_DATA":false}</property>
    <property name="Enabled" null="false">True</property>
    <property name="AutoReconnect" null="false">True</property>
    <property name="AutoReconnectInterval" null="false">10</property>
  </properties>
</provider>

Switching UAT and PROD

Three edits: ServerHost (localhost when the UAT Server API runs on the same machine, the PROD host otherwise), IsUAT (true uses //blp/emapisvc_beta, false uses //blp/emapisvc), and which UsersStr identity is enabled. Disconnect provider 74 in Obermind Dash before editing and connect it again afterwards. Terminal mode needs only ServerAPI false and a logged-on Terminal on the same machine.

Settings

Property names are case-sensitive and written exactly as below in the provider XML. Values are text: True or False for switches, JSON on one line where noted. A value that cannot be read is ignored and the provider keeps its previous value.

  • IsServerAPI (ServerAPI): False for a Terminal (default), True for a Server API
  • ServerHost, ServerPort: host and port, localhost and 8194 by default
  • UsersStr (Users): JSON list of Server API identities with UUID, IPAddress, Description and Enabled
  • IsUAT (UAT): True for the EMSX test service (default), False for production
  • DefaultAccount (Account): FIX tag 1 when the broker has no entry in AccountsStr
  • AccountsStr (Broker accounts): JSON broker code to account, up to 29 characters
  • RequireAccount (Require account): Server API, reject an order with no account before sending (default True)
  • BrokersStr (Brokers): JSON broker per asset class, keys EQTY, FUT and OPT
  • HandInstructionsStr (Hand instructions): JSON per asset class, ANY, AUTO, DOT or MAN (default ANY)
  • LoggingEnabled, LogPath: Bloomberg message log, one file per day
  • LogEventsStr, LogMessagesStr: JSON event or message type to true or false; only listed types change
  • Enabled, AutoReconnect, AutoReconnectInterval: shared by every provider

Dash tools

Obermind Dash, Providers, Bloomberg shows the connection status (mode, environment, open services, whether the catalogue loaded for each asset class, authorized identity), the brokers per asset class with their accounts and hand instructions, every strategy with its parameters (filter by asset class), and the working routes with Bloomberg sequence and route ids. Refresh catalogue re-reads brokers and strategies after Bloomberg changes a broker setup. Re-authorize users renews the Server API identity. The info icon next to the provider on the Providers list opens the settings reference with a guide for each asset class and a sample configuration.

Troubleshooting

  • Unknown client from the broker: send the right account in AccountsStr or DefaultAccount
  • No account is configured for broker: add the broker to AccountsStr, or turn RequireAccount off
  • No broker is configured for FUT or OPT orders: set that class in BrokersStr
  • Broker not enabled for FUT or OPT orders on this connection: ask Bloomberg to enable it, or use a broker from the Dash Brokers list
  • Strategy not available for broker: refresh the catalogue; the strategy is not set up for that broker and asset class
  • Instrument type not supported: only Stock, ETF, Index, Future and Option are sent to EMSX
  • Quantity must be a whole number: shares and contracts only, no fractions
  • Option or future rejected as an unknown security: check the ticker is the specific contract with its yellow key
  • Realtime data is not available: expected on the Server API; use VenuePriceSources
  • Orders reach the simulator: set Internaliser to false
  • Prices but no Bloomberg orders: the price provider is in LiquidityProviders; remove it and use VenuePriceSources
  • Authorization failure: the UUID and IP address pair must match what Bloomberg registered
  • Empty strategy list: ask Bloomberg for the broker's algo setup
Alipay
Stripe
Eurex
AWS
Azure
Google Cloud
Currenex
Velocity Trade
Bitcoin
CME
Interactive Brokers
Kraken
FIX API
XTX
Bloomberg
Binance

أطلق منصتك.