Code covered by the BSD License  

Highlights from
Algorithmic Trading with Bloomberg EMSX and MATLAB

image thumbnail

Algorithmic Trading with Bloomberg EMSX and MATLAB

by

 

Files used in the webinar which can be viewed at http://www.optinum.co.za/webinars/contact_main.php

Bloomberg EMSX API: Simple Examples

Bloomberg EMSX API: Simple Examples

This script will demonstrate some simple examples related to creating, routing and managing orders from MATLAB via Bloomberg EMSX.

Contents

Preliminary Tasks

Before creating, managing or routing orders via Bloomberg EMSX, the following preliminary tasks must be completed.

Add BLPAPI3.jar to java class path The set up for the Bloomberg API is very simple. All it requires is that a cerain JAR file is added to the Java path. This only needs to be done once per MATLAB session. Alternatively, the JAR file can be added to the static Java path, which only needs to be done once.

javaaddpath('C:\blp\API\blpapi3.jar')

Connect to the EMSX API Production Server c = emsx('//blp/emapisvc');

Connect to EMSX API Test Server This creates a Bloomberg EMSX connection object.

c = emsx('//blp/emapisvc_beta');

1. Create a Buy Order

To create an order, you must first create a structure with the required fields (the field requirements change depending on the broker, as well as certain field values that prompt for additional information). Following the creation of the order structure, you can use the function "createOrder" with this structure as an input argument.

Create a structure to hold order information

longStruct.EMSX_SIDE = 'BUY';
longStruct.EMSX_AMOUNT = int32(500); % faster to enter these as "int32" data types
longStruct.EMSX_TICKER = char('BGA'); % faster to enter these as "char" data types
longStruct.EMSX_ORDER_TYPE = 'MKT';
longStruct.EMSX_BROKER = 'BB'; % BB is the Bloomberg test broker
longStruct.EMSX_TIF = 'GTD'; % Good til Date
longStruct.EMSX_GTD_DATE = int32(20130902);% NB. Dates entered in this format (yyyymmdd)
longStruct.EMSX_HAND_INSTRUCTION = 'ANY';

Create order rlongOrder is a structure containing an EMSX Sequence number and a message telling you whether the order creation has been successful or not.

rlongOrder = createOrder(c,longStruct);

3. Create a Sell Order

This process is the same as before, except this time, we are creating the order on the sell side. We will send the order to a different test broker, the broker "API".

Create a structure to hold order information

shortStruct.EMSX_SIDE = 'SELL';
shortStruct.EMSX_AMOUNT = int32(300);
shortStruct.EMSX_TICKER = char('NED');
shortStruct.EMSX_ORDER_TYPE = 'MKT';
shortStruct.EMSX_BROKER = 'API'; % API is one of Bloomberg's test brokers
shortStruct.EMSX_TIF = 'DAY'; % Order will persist until the end of the day
shortStruct.EMSX_HAND_INSTRUCTION = 'ANY';

Create order

rshortOrder = createOrder(c,shortStruct)
rshortOrder = 

    EMSX_SEQUENCE: 824362
          MESSAGE: 'Order created'

4. Get Order Information

% Long order
longOrderInfo = getOrderInfo(c,rlongOrder.EMSX_SEQUENCE);

% Short order
shortOrderInfo = getOrderInfo(c,rshortOrder.EMSX_SEQUENCE);

5. Modify an Order

To make changes to an existing order, you need to know the EMSX sequence number for the order you wish to modify.

Create a new structure with the details of the modified order There are certain things you can modify and certain things you cannot. For instance, you can change the amount, but not the ticker, the broker or the strategy.

modStruct.EMSX_SEQUENCE = int32(rshortOrder.EMSX_SEQUENCE); % EMSX sequency number of order you want to change
modStruct.EMSX_TICKER = char('NED'); % Ticker of short order
modStruct.EMSX_AMOUNT = int32(200); % Change amount to 200
rmodifiedOrder = modifyOrder(c,modStruct)

% Modified order
modifiedOrderInfo = getOrderInfo(c,rmodifiedOrder.EMSX_SEQUENCE)
rmodifiedOrder = 

    EMSX_SEQUENCE: 824362
          MESSAGE: 'Order Modified'


modifiedOrderInfo = 

               EMSX_TICKER: 'NED'
             EMSX_EXCHANGE: 'SJ'
                 EMSX_SIDE: 'SELL'
             EMSX_POSITION: 'SELL'
             EMSX_PORT_MGR: 'NWILSON46'
               EMSX_TRADER: 'NWILSON46'
                EMSX_NOTES: ''
               EMSX_AMOUNT: 200
          EMSX_IDLE_AMOUNT: 200
              EMSX_WORKING: 0
               EMSX_FILLED: 0
            EMSX_TS_ORDNUM: 0
          EMSX_LIMIT_PRICE: 0
            EMSX_AVG_PRICE: 0
                 EMSX_FLAG: 2
             EMSX_SUB_FLAG: 0
           EMSX_YELLOW_KEY: 'Equity'
          EMSX_BASKET_NAME: ''
    EMSX_ORDER_CREATE_DATE: '09/02/13'
    EMSX_ORDER_CREATE_TIME: '13:44:25'
           EMSX_ORDER_TYPE: 'MKT'
                  EMSX_TIF: 'DAY'
               EMSX_BROKER: 'API'
          EMSX_TRADER_UUID: '10715126'
      EMSX_STEP_OUT_BROKER: ''

6. Delete an Order

To delete an order, you need to know the EMSX sequence number of the order.

% Create a new structure with the details of the order to delete
delStruct.EMSX_SEQUENCE = rmodifiedOrder.EMSX_SEQUENCE;
rdeletedOrder = deleteOrder(c,delStruct)
rdeletedOrder = 

     STATUS: '0'
    MESSAGE: 'Order deleted'

7. Route an Order

Use existing order structure to create a new structure to route to the broker. The creation of an order and routing can be done in one step, using the function createOrderAndRoute

routeStructLong.EMSX_AMOUNT = longStruct.EMSX_AMOUNT;
routeStructLong.EMSX_SEQUENCE = rlongOrder.EMSX_SEQUENCE;
routeStructLong.EMSX_TICKER = longStruct.EMSX_TICKER;
routeStructLong.EMSX_ORDER_TYPE = longStruct.EMSX_ORDER_TYPE;
routeStructLong.EMSX_BROKER = longStruct.EMSX_BROKER;% BB broker
routeStructLong.EMSX_TIF = longStruct.EMSX_TIF;
routeStructLong.EMSX_GTD_DATE = longStruct.EMSX_GTD_DATE;
routeStructLong.EMSX_HAND_INSTRUCTION = longStruct.EMSX_HAND_INSTRUCTION;
rrouteOrderLong = routeOrder(c,routeStructLong);

9. Route an Order with a Strategy

As a variation on the above, you can create an order structure, and then route the order with a strategy. For each broker, there are a number of strategies to choose from. You can create the order and route it with a strategy in one step.

% clear old shortStruct
clear shortStruct

Create a structure to hold order information

shortStruct.EMSX_SIDE = 'SELL';
shortStruct.EMSX_AMOUNT = int32(300);
shortStruct.EMSX_TICKER = char('FSR');
shortStruct.EMSX_ORDER_TYPE = 'MKT';
shortStruct.EMSX_BROKER = 'API';
shortStruct.EMSX_TIF = 'DAY';
shortStruct.EMSX_HAND_INSTRUCTION = 'ANY';

Find out what strategies are available for this ticker

brokerStruct.EMSX_BROKER = 'API';
brokerStruct.EMSX_TICKER = char('FSR');

strategies = getBrokerInfo(c,brokerStruct);
strategies.EMSX_STRATEGIES
ans = 

    'CASH'
    'OPLX'
    'OPL'
    'TWAP'
    'QMOC'
    'BLOCKSKR'
    'MLXN'
    'SMARTDMA'
    'Reversion'
    'Momentum'
    'TESTDNB'
    'NONE'
    'POV'
    'SSP'
    'TEST'
    'TEST ORD'
    'STOPLOSS'
    'TWAP_1'
    'ATCLOSE'

Choose the TWAP strategy and have a look at what fields are required executes an order in equally-sized slices over a specified time interval to achieve a time-weighted average execution price

brokerStruct.EMSX_STRATEGY = 'TWAP';

Information about required fields

fields = getBrokerInfo(c,brokerStruct)
fields.FieldName % FIELDS: StartTime, EndTime, Max%Volume, MinCrossQty, MaxCrossQty, CrossLmtPx, AgencyOnly

stratStruct.EMSX_STRATEGY_NAME = 'TWAP';
stratStruct.EMSX_STRATEGY_FIELD_INDICATORS = int32([0 0 0 0 0 0 0]);
stratStruct.EMSX_STRATEGY_FIELDS = {'09:30:00','09:35:00',50,10,50,10,'Yes'}
fields = 

      FieldName: {7x1 cell}
        Disable: {7x1 cell}
    StringValue: {7x1 cell}


ans = 

    'Start Time'
    'End Time'
    'Max % Volume'
    'MinCrossQty'
    'MaxCrossQty'
    'CrossLmtPx'
    'Agency Only'


stratStruct = 

                EMSX_STRATEGY_NAME: 'TWAP'
    EMSX_STRATEGY_FIELD_INDICATORS: [0 0 0 0 0 0 0]
              EMSX_STRATEGY_FIELDS: {1x7 cell}

create order and route with strategy

rshortOrderWithStrat = createOrderAndRouteWithStrat(c,shortStruct,stratStruct);

Similarly, you can modify a route, modify a route with a strategy, and delete a route, if it has not already been filled.

Post-trade Tasks

Close the Bloomberg EMSX Connection

close(c)

Contact us