I have not used the Java API but I would find it weird if it would not allow the submission and reporting of custom tags, such as your own OrderID. FIX allows for that as part of the standard protocol definition and it works. Can you maybe talk again with the tech guys at LMAX? I am willing to bet that you can submit a custom tag as I have not seen any API so far that would not allow for such.
Here is a high level summary of development so far, as I am migrating
a complex multi-threaded, multi-order scalping platform from Dukascopy
to LMAX. The goal here is to preserve the core logic but, in order to do
that, we had significant challenges in emulating the Dukascopy API and
Order management concepts on top of LMAX orders.
Here we are using the Java API, which presents lower level concepts and
is missing many of the higher level facilities we relied upon in the Dukascopy
API, such as the Order IEngine, and the simple ability, for example, to
change the Price of a Live order. With Dukascopy, it's simple to change
the price of a live order, but this high level concept is absent in the LMAX
Java API and thus we will have multiple Cancel/Place cycles underlying
the filling of a single high level Order.
1) Mapping a high level "Dukascopy style" order to underlying LMAX orders.
I've had to emulate the Dukascopy IEngine interface, which handles all of
order state, as well as IOrder states and operations such as IOrder.setPrice.
Within this emulation, we may use dozens of underlying LMAX orders to
achieve a single high level order fill objective, given that we will need to
change price during execution, which requires us to Cancel/Place a new
LMAX Limit order.
2) Emulating Dukascopy's IEngine was a challenge, as we had to "host"
Dukascopy IStrategy code, create a SingleThreadedExecutor, and subclass
"public class MyThreadPoolExecutor extends ThreadPoolExecutor ..."
to give us access to "afterExecute" so that we could "batch" together
multiple IOrder emulated operations, such as change price, lot size, add
StopLoss, add StopProfit, etc. And then at the end of the Thread task, on the
same Thread, the afterExecute Java thread pool would "batch invoke" the code
which performs all of the required operations on the underlying LMAX Order(s),
including Cancel/Place sequences, when price changes... Also, because multiple
LMAX orders are needed to support our high level objective, we are not able
to use LMAX Order StopLoss and StopProfit operations, as they represent
only a portion of our high level IOrder's objective...
3) Dukascopy allows us to differentiate facilities by a user-supplied "Order Label"
so we can differentiate activity by parsing the Order Label, thus ignoring orders
which are not related to the current client's orders. LMAX does not appear
to allow us to assign a meaningful Order ID in this way, so we are likely to
have to implement 1) a database which preserves Dukascopy style order
Labels mappings to LMAX Orders, or 2) much easier, just use multiple
LMAX accounts, each for a specific trading BOT or client trading platform.
4) Differentiating between actions of our Client, and actions of the LMAX
platform or another client. By assigning "instructionIDs" in our client
which are always AlphaNumeric, then when we receive instructions IDs
which are purely Numeric, we know the activity did not originate from
this client this is not a comprehensive solution, and it looks like we'll
have to implement a database.
However, without going into further detail, their Java API (and, by extension,
I suppose, their .NET API which is very similar in its semantics) is quite
powerful in permitting the multi-threaded management of multiple orders,
on both sides of the market simultaneously, with very good response times.
But it makes me appreciate the high level facilities offered by the Dukascopy
API which we have to emulate here at LMAX.... We're still a couple of days
away from a minimally working platform and, by substantially emulating
the basic Dukascopy API, we will then be able to adapt many of our existing
BOTs also, but many other high level constructions such as Indicators
are areas which I am hoping not to have to emulate at all, and we can just
grab that information from another streaming source such as Dukascopy.
And all of this work is to get "wholesale, or better than retail" pricing liquidity,
which we haven't been able to validate yet. Lots of work, hoping for results...
HyperScalper