MBO visualization

Custom indicators, trading strategies, data export and recording and more...
Blue Brazilian
Posts: 1
Joined: Tue Jul 14, 2020 10:25 pm

MBO visualization

Post by Blue Brazilian » Tue Jul 14, 2020 11:07 pm

Newbie question here.  I'm trying to generate individual MBO order data that I can eventually export to a CSV file for analysis.  The first step is to visualize the orders, and I located the code below that seems to do the job.  My questions is: how do I create an api plug-in for this so that I can run it in Bookmap?  I've been through the step-by-step import instructions, but that didn't work. If anyone can explain step by step what's required, I'd appreciate it.  Thanks.

Code: Select all

 
package velox.api.layer1.simplified.demo;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map.Entry;
import java.util.concurrent.atomic.AtomicBoolean;

import javax.swing.JLabel;
import javax.swing.SwingUtilities;

import velox.api.layer1.annotations.Layer1ApiVersion;
import velox.api.layer1.annotations.Layer1ApiVersionValue;
import velox.api.layer1.annotations.Layer1SimpleAttachable;
import velox.api.layer1.annotations.Layer1StrategyName;
import velox.api.layer1.data.InstrumentInfo;
import velox.api.layer1.layers.utils.OrderBook;
import velox.api.layer1.layers.utils.mbo.Order;
import velox.api.layer1.layers.utils.mbo.OrderBookMbo;
import velox.api.layer1.simplified.Api;
import velox.api.layer1.simplified.CustomModule;
import velox.api.layer1.simplified.CustomSettingsPanelProvider;
import velox.api.layer1.simplified.InitialState;
import velox.api.layer1.simplified.MarketByOrderDepthDataListener;
import velox.gui.StrategyPanel;

/**
 * Visualizes MBO data
 */
@Layer1SimpleAttachable
@Layer1StrategyName("Mbo visualizer: no history")
@Layer1ApiVersion(Layer1ApiVersionValue.VERSION2)
public class MboVisualizerNoHistory
        implements CustomModule, CustomSettingsPanelProvider, MarketByOrderDepthDataListener {

    private OrderBookMbo orderBookMbo = new OrderBookMbo();
    private OrderBook orderBook = new OrderBook();

    private JLabel displayLabel = new JLabel();

    private AtomicBoolean updateIsScheduled = new AtomicBoolean();

    @Override
    public void initialize(String alias, InstrumentInfo info, Api api, InitialState initialState) {
    }

    @Override
    public void stop() {
    }

    @Override
    public void send(String orderId, boolean isBid, int price, int size) {
        orderBookMbo.send(orderId, isBid, price, size);

        synchronized (orderBook) {
            long levelSize = orderBook.getSizeFor(isBid, price, 0);
            levelSize += size;
            orderBook.onUpdate(isBid, price, levelSize);
        }

        scheduleUpdateIfNecessary();
    }

    @Override
    public void replace(String orderId, int price, int size) {
        Order oldOrder = orderBookMbo.getOrder(orderId);
        boolean isBid = oldOrder.isBid();
        int oldPrice = oldOrder.getPrice();
        int oldSize = oldOrder.getSize();

        orderBookMbo.replace(orderId, price, size);

        synchronized (orderBook) {
            long oldLevelSize = orderBook.getSizeFor(isBid, oldPrice, 0);
            oldLevelSize -= oldSize;

            orderBook.onUpdate(isBid, oldPrice, oldLevelSize);

            long newLevelSize = orderBook.getSizeFor(isBid, price, 0);
            newLevelSize += size;
            orderBook.onUpdate(isBid, price, newLevelSize);
        }
        scheduleUpdateIfNecessary();
    }

    @Override
    public void cancel(String orderId) {
        Order oldOrder = orderBookMbo.getOrder(orderId);
        boolean isBid = oldOrder.isBid();
        int price = oldOrder.getPrice();
        int size = oldOrder.getSize();

        orderBookMbo.cancel(orderId);

        synchronized (orderBook) {
            long levelSize = orderBook.getSizeFor(isBid, price, 0);
            levelSize -= size;
            orderBook.onUpdate(isBid, price, levelSize);
        }
        scheduleUpdateIfNecessary();
    }

    private void scheduleUpdateIfNecessary() {
        boolean shouldSchedule = !updateIsScheduled.getAndSet(true);

        if (shouldSchedule) {
            SwingUtilities.invokeLater(() -> {
                updateIsScheduled.set(false);

                StringBuilder builder = new StringBuilder();
                builder.append("<html>");

                synchronized (orderBook) {
                    Iterator<Entry<Integer, Long>> askItterator = orderBook.getAskMap().entrySet().iterator();
                    Iterator<Entry<Integer, Long>> bidItterator = orderBook.getBidMap().entrySet().iterator();
                    
                    List<String> askRows = new ArrayList<>();
                    for (int i = 0; i < 10 && askItterator.hasNext(); ++i) {
                        Entry<Integer, Long> nextAskEntry = askItterator.next();
                        askRows.add("ASK Distance: " + i + " Price(int): " + nextAskEntry.getKey() + " Size: "
                                + nextAskEntry.getValue() + "<br/>");
                    }
                    Collections.reverse(askRows);
                    askRows.forEach(builder::append);
                    
                    for (int i = 0; i < 10 && bidItterator.hasNext(); ++i) {
                        Entry<Integer, Long> nextBidEntry = bidItterator.next();
                        builder.append("BID Distance: " + i + " Price(int): " + nextBidEntry.getKey() + " Size: "
                                + nextBidEntry.getValue() + "<br/>");
                    }
                }

                builder.append("</html>");
                displayLabel.setText(builder.toString());
            });
        }
    }

    @Override
    public StrategyPanel[] getCustomSettingsPanels() {

        displayLabel = new JLabel();
        scheduleUpdateIfNecessary();

        StrategyPanel ordersPanel = new StrategyPanel("Order book");
        ordersPanel.add(displayLabel);
        return new StrategyPanel[] { ordersPanel };
    }
}

Andry API support
Posts: 548
Joined: Mon Jul 09, 2018 11:18 am
Has thanked: 25 times
Been thanked: 85 times

Re: MBO visualization

Post by Andry API support » Wed Jul 15, 2020 9:30 am

Hi Blue Brazilian!
Did you use
https://github.com/BookmapAPI/DemoStrat ... /README.md
as a guide? Pls clarify the guide you used and the step you stopped at.

Mat_teo
Posts: 2
Joined: Tue Aug 04, 2020 10:10 pm

Re: MBO visualization

Post by Mat_teo » Tue Aug 04, 2020 10:19 pm

Hi Blue Brazilian,

Do you have an update on this, did you manage to create the plug-in? I am interested as well in exporting the MBO data into a CSV file. Thanks.

Post Reply