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 }