1 package org.oxerr.okcoin.examples.fix;
2
3 import java.io.IOException;
4 import java.io.InputStream;
5 import java.text.DecimalFormat;
6 import java.text.NumberFormat;
7
8 import org.apache.commons.lang3.StringUtils;
9 import org.knowm.xchange.dto.marketdata.OrderBook;
10 import org.oxerr.okcoin.fix.fix44.OKCoinMessageFactory;
11 import org.oxerr.okcoin.xchange.service.fix.OKCoinXChangeApplication;
12 import org.slf4j.Logger;
13 import org.slf4j.LoggerFactory;
14
15 import quickfix.ConfigError;
16 import quickfix.FileLogFactory;
17 import quickfix.FileStoreFactory;
18 import quickfix.Initiator;
19 import quickfix.LogFactory;
20 import quickfix.MessageFactory;
21 import quickfix.MessageStoreFactory;
22 import quickfix.RuntimeError;
23 import quickfix.SessionID;
24 import quickfix.SessionSettings;
25 import quickfix.SocketInitiator;
26
27 public class DepthDemo {
28
29 private final Logger log = LoggerFactory.getLogger(DepthDemo.class);
30 private final OKCoinXChangeApplication app;
31 private final Initiator initiator;
32
33 public DepthDemo(String apiKey, String secretKey) throws IOException,
34 ConfigError {
35 app = new OKCoinXChangeApplication(apiKey, secretKey) {
36
37 private final NumberFormat mFmt = new DecimalFormat("#,###");
38 private final NumberFormat qFmt = new DecimalFormat("#,##0.0000");
39 private final NumberFormat pFmt = new DecimalFormat("#,##0.00");
40
41 @Override
42 public void onLogon(SessionID sessionId) {
43 String symbol = "BTC/CNY";
44 app.subscribeOrderBook(symbol, sessionId);
45 }
46
47 @Override
48 public void onOrderBook(OrderBook orderBook, SessionID sessionId) {
49 long now = System.currentTimeMillis();
50 log.info("order book time: {}, lagging: {} ms. bids size: {}, asks size: {}. best bid: {}@{}, best ask: {}@{}.",
51 orderBook.getTimeStamp().toInstant(),
52 mFmt.format(now - orderBook.getTimeStamp().getTime()),
53 StringUtils.leftPad(String.valueOf(orderBook.getBids().size()), 3),
54 StringUtils.leftPad(String.valueOf(orderBook.getAsks().size()), 3),
55 StringUtils.leftPad(qFmt.format(orderBook.getBids().get(0).getTradableAmount()), 7),
56 pFmt.format(orderBook.getBids().get(0).getLimitPrice()),
57 StringUtils.leftPad(qFmt.format(orderBook.getAsks().get(0).getTradableAmount()), 7),
58 pFmt.format(orderBook.getAsks().get(0).getLimitPrice())
59 );
60 }
61
62 };
63 SessionSettings settings;
64 try (InputStream inputStream = getClass().getResourceAsStream(
65 "client.cfg")) {
66 settings = new SessionSettings(inputStream);
67 }
68
69 MessageStoreFactory storeFactory = new FileStoreFactory(settings);
70 LogFactory logFactory = new FileLogFactory(settings);
71 MessageFactory messageFactory = new OKCoinMessageFactory();
72 initiator = new SocketInitiator(app, storeFactory, settings,
73 logFactory, messageFactory);
74 }
75
76 public static void main(String[] args) throws IOException, RuntimeError,
77 ConfigError {
78 String apiKey = args[0], secretKey = args[1];
79
80 DepthDemo depthDemo = new DepthDemo(apiKey, secretKey);
81 depthDemo.initiator.block();
82 }
83
84 }