View Javadoc
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  }