Java源码示例:com.paritytrading.foundation.ASCII
示例1
public Open(OrderEntry orderEntry, long instrument, long bidPrice, long bidSize,
long askPrice, long askSize) {
super(orderEntry);
this.enterBuyOrder = new POE.EnterOrder();
ASCII.putLeft(this.enterBuyOrder.orderId, orderId.next());
this.enterBuyOrder.side = POE.BUY;
this.enterBuyOrder.instrument = instrument;
this.enterBuyOrder.quantity = bidSize;
this.enterBuyOrder.price = bidPrice;
this.enterSellOrder = new POE.EnterOrder();
ASCII.putLeft(this.enterSellOrder.orderId, orderId.next());
this.enterSellOrder.side = POE.SELL;
this.enterSellOrder.instrument = instrument;
this.enterSellOrder.quantity = askSize;
this.enterSellOrder.price = askPrice;
}
示例2
public void reset() {
ASCII.putLongRight(lengthOfMessage, 0);
ASCII.putLongRight(numberOfItems, 0);
lengthOfMessagePosition = -1;
numberOfCurrencyPairsPosition = -1;
numberOfPricesPosition = -1;
numberOfOrdersPosition = -1;
currencyPairs = 0;
prices = 0;
orders = 0;
ASCII.putLeft(currencyPair, " ");
buyOrSellIndicator = ' ';
ASCII.putLeft(price, " ");
}
示例3
@Test
public void loginRequest() throws Exception {
ASCII.putLeft(loginRequest.loginName, "foo");
ASCII.putLeft(loginRequest.password, "bar");
loginRequest.marketDataUnsubscribe = ITCH.TRUE;
ASCII.putLongRight(loginRequest.reserved, 0);
client.login(loginRequest);
while (serverEvents.collect().size() != 1)
server.receive();
assertEquals(asList(new LoginRequest(
"foo ",
"bar ",
ITCH.TRUE, 0)),
serverEvents.collect());
}
示例4
static TerminalClient open(InetSocketAddress address, String username,
String password, Instruments instruments) throws IOException {
Events events = new Events();
OrderEntry orderEntry = OrderEntry.open(address, events);
SoupBinTCP.LoginRequest loginRequest = new SoupBinTCP.LoginRequest();
ASCII.putLeft(loginRequest.username, username);
ASCII.putLeft(loginRequest.password, password);
ASCII.putRight(loginRequest.requestedSession, "");
ASCII.putLongRight(loginRequest.requestedSequenceNumber, 0);
orderEntry.getTransport().login(loginRequest);
return new TerminalClient(events, orderEntry, instruments);
}
示例5
@Override
public void execute(TerminalClient client, Scanner arguments) throws IOException {
try {
double quantity = arguments.nextDouble();
long instrument = ASCII.packLong(arguments.next());
double price = arguments.nextDouble();
if (arguments.hasNext())
throw new IllegalArgumentException();
Instrument config = client.getInstruments().get(instrument);
if (config == null)
throw new IllegalArgumentException();
execute(client, Math.round(quantity * config.getSizeFactor()), instrument, Math.round(price * config.getPriceFactor()));
} catch (NoSuchElementException e) {
throw new IllegalArgumentException();
}
}
示例6
@Override
public void logon(FIXConnection connection, FIXMessage message) throws IOException {
FIXValue username = message.valueOf(Username);
FIXValue password = message.valueOf(Password);
if (requiredTagMissing(message, username, "Username(553)"))
return;
if (requiredTagMissing(message, password, "Password(554)"))
return;
fix.updateCompID(message);
ASCII.putLeft(loginRequest.username, username.asString());
ASCII.putLeft(loginRequest.password, password.asString());
ASCII.putRight(loginRequest.requestedSession, "");
ASCII.putLongRight(loginRequest.requestedSequenceNumber, 0);
orderEntry.login(loginRequest);
}
示例7
@Override
public void orderRejected(POE.OrderRejected message) throws IOException {
long orderEntryId = ASCII.getLong(message.orderId);
Order order = orders.findByOrderEntryID(orderEntryId);
if (order == null)
return;
switch (message.reason) {
case POE.ORDER_REJECT_REASON_UNKNOWN_INSTRUMENT:
sendOrderRejected(order, OrdRejReasonValues.UnknownSymbol);
break;
case POE.ORDER_REJECT_REASON_INVALID_PRICE:
sendOrderRejected(order, OrdRejReasonValues.Other);
break;
case POE.ORDER_REJECT_REASON_INVALID_QUANTITY:
sendOrderRejected(order, OrdRejReasonValues.IncorrectQuantity);
break;
default:
sendOrderRejected(order, OrdRejReasonValues.Other);
break;
}
orders.removeByOrderEntryID(orderEntryId);
}
示例8
@Override
public void orderExecuted(POE.OrderExecuted message) throws IOException {
long orderEntryId = ASCII.getLong(message.orderId);
Order order = orders.findByOrderEntryID(orderEntryId);
if (order == null)
return;
Instrument config = instruments.get(order.getSymbol());
double lastQty = message.quantity / config.getSizeFactor();
double lastPx = message.price / config.getPriceFactor();
order.orderExecuted(lastQty, lastPx);
sendOrderExecuted(order, lastQty, lastPx, config);
if (order.getLeavesQty() == 0) {
orders.removeByOrderEntryID(orderEntryId);
if (order.isInPendingStatus())
sendOrderCancelReject(order);
}
}
示例9
@Override
public void orderCanceled(POE.OrderCanceled message) throws IOException {
long orderEntryId = ASCII.getLong(message.orderId);
Order order = orders.findByOrderEntryID(orderEntryId);
if (order == null)
return;
Instrument config = instruments.get(order.getSymbol());
order.orderCanceled(message.canceledQuantity / config.getSizeFactor());
sendOrderCanceled(order, config);
if (order.getLeavesQty() == 0)
orders.removeByOrderEntryID(orderEntryId);
}
示例10
@Override
public void stockDirectory(ITCH50.StockDirectory itchMsg) {
// log.debug("{}", itchMsg);
symbolDescr.put(itchMsg.stockLocate, new StockDescr(ASCII.unpackLong(itchMsg.stock), itchMsg.etpFlag, itchMsg.etpLeverageFactor));
// CoreSymbolSpecification symbolSpecification = CoreSymbolSpecification.builder()
// .symbolId(itchMsg.stockLocate)
// .type(SymbolType.FUTURES_CONTRACT) // allow margin trade TODO calculate based on ETP
// .baseCurrency(itchMsg.stockLocate + 10_000)
// .quoteCurrency(TestConstants.CURRENECY_USD)
// .takerFee(3)
// .makerFee(1)
// .quoteScaleK(2)
// .baseScaleK(itchMsg.roundLotSize)
// .marginBuy(itchMsg.etpLeverageFactor + 100L) // TODO price
// .marginSell(itchMsg.etpLeverageFactor + 100L) // TODO price
// .build();
//
// final CompletableFuture<OrderCommand> response = api.submitBinaryCommandAsync(new BatchAddSymbolsCommand(symbolSpecification), itchMsg.stockLocate, Function.identity());
//
// response.thenAccept(cmdRes -> {
// if (cmdRes.resultCode != CommandResultCode.SUCCESS) {
// log.error("symbol add failed: {}", response);
// }
// if (ASCII.unpackLong(itchMsg.stock).trim().equals("INTL")) {
// log.debug("{} {} ls={} mc={} etpF={} etpL={} rlo={}",
// ASCII.unpackLong(itchMsg.stock),
// itchMsg.stockLocate,
// itchMsg.roundLotSize,
// (char) itchMsg.marketCategory,
// (char) itchMsg.etpFlag,
// itchMsg.etpLeverageFactor,
// (char) itchMsg.roundLotsOnly);
// }
// });
}
示例11
private static MarketData marketData(Config config) throws IOException {
NetworkInterface multicastInterface = Configs.getNetworkInterface(config, "market-data.multicast-interface");
InetAddress multicastGroup = Configs.getInetAddress(config, "market-data.multicast-group");
int multicastPort = Configs.getPort(config, "market-data.multicast-port");
InetAddress requestAddress = Configs.getInetAddress(config, "market-data.request-address");
int requestPort = Configs.getPort(config, "market-data.request-port");
String instrument = config.getString("instrument");
return MarketData.open(multicastInterface,
new InetSocketAddress(multicastGroup, multicastPort),
new InetSocketAddress(requestAddress, requestPort),
ASCII.packLong(instrument));
}
示例12
private static Open open(Config config) throws IOException {
double bidPrice = config.getDouble("open.bid.price");
long bidSize = config.getLong("open.bid.size");
double askPrice = config.getDouble("open.ask.price");
long askSize = config.getLong("open.ask.size");
String instrument = config.getString("instrument");
return new Open(orderEntry(config), ASCII.packLong(instrument),
(long)(bidPrice * PRICE_FACTOR), bidSize,
(long)(askPrice * PRICE_FACTOR), askSize);
}
示例13
private void enter(byte side, double price) throws IOException {
ASCII.putLeft(enterOrder.orderId, orderId.next());
enterOrder.side = side;
enterOrder.price = (long)Math.round(price * 100.0) * 100;
getOrderEntry().send(enterOrder);
}
示例14
public void login(String username, String password) throws IOException {
SoupBinTCP.LoginRequest request = new SoupBinTCP.LoginRequest();
ASCII.putLeft(request.username, username);
ASCII.putLeft(request.password, password);
ASCII.putRight(request.requestedSession, "");
ASCII.putLongRight(request.requestedSequenceNumber, 0);
transport.login(request);
}
示例15
/**
* Start a Market Snapshot message.
*
* @param buffer a buffer
*/
public void marketSnapshotStart(ByteBuffer buffer) {
state.reset();
// Message Type
buffer.put(MESSAGE_TYPE_MARKET_SNAPSHOT);
state.lengthOfMessagePosition = buffer.position();
// Length of Message
ASCII.putLongRight(state.lengthOfMessage, 0);
buffer.put(state.lengthOfMessage);
state.numberOfCurrencyPairsPosition = buffer.position();
}
示例16
/**
* End a Market Snapshot message.
*
* @param buffer a buffer
*/
public void marketSnapshotEnd(ByteBuffer buffer) {
if (state.currencyPairs > 0) {
// Number of Currency Pairs
ASCII.putLongRight(state.numberOfItems, state.currencyPairs);
put(buffer, state.numberOfItems, state.numberOfCurrencyPairsPosition);
}
if (state.buyOrSellIndicator == BUY) {
// Number Of Offer Prices
ASCII.putLongRight(state.numberOfItems, 0);
buffer.put(state.numberOfItems);
}
if (state.prices > 0) {
// Number of Bid/Offer Prices
ASCII.putLongRight(state.numberOfItems, state.prices);
put(buffer, state.numberOfItems, state.numberOfPricesPosition);
}
if (state.orders > 0) {
// Number of Bid/Offer Orders
ASCII.putLongRight(state.numberOfItems, state.orders);
put(buffer, state.numberOfItems, state.numberOfOrdersPosition);
}
int endPosition = buffer.position();
int lengthOfMessage = endPosition - state.numberOfCurrencyPairsPosition;
// Length of Message
ASCII.putLongRight(state.lengthOfMessage, lengthOfMessage);
put(buffer, state.lengthOfMessage, state.lengthOfMessagePosition);
}
示例17
@Override
public void sequencedData(ITCHClient session, ITCH.SequencedData header, ByteBuffer payload) {
String time = ASCII.get(header.time);
byte[] bytes = new byte[payload.remaining()];
payload.get(bytes);
events.add(new SequencedData(time, bytes));
}
示例18
@Override
public void instrumentDirectory(ITCHClient session, ITCH.InstrumentDirectory packet) {
long numberOfCurrencyPairs = ASCII.getLong(packet.numberOfCurrencyPairs);
List<String> currencyPairs = new ArrayList<>();
for (int i = 0; i < numberOfCurrencyPairs; i++)
currencyPairs.add(ASCII.get(packet.currencyPair[i]));
events.add(new InstrumentDirectory(currencyPairs));
}
示例19
@Override
public void newOrder(CboeFXBook.NewOrder message) {
byte buyOrSellIndicator = message.buyOrSellIndicator;
String currencyPair = ASCII.get(message.currencyPair);
String orderId = ASCII.get(message.orderId);
long price = ASCII.getFixed(message.price, PRICE_DECIMALS);
long amount = ASCII.getLong(message.amount);
long minqty = ASCII.getLong(message.minqty);
long lotsize = ASCII.getLong(message.lotsize);
events.add(new NewOrder(buyOrSellIndicator, currencyPair, orderId,
price, amount, minqty, lotsize));
}
示例20
@Override
public void modifyOrder(CboeFXBook.ModifyOrder message) {
String currencyPair = ASCII.get(message.currencyPair);
String orderId = ASCII.get(message.orderId);
long amount = ASCII.getLong(message.amount);
long minqty = ASCII.getLong(message.minqty);
long lotsize = ASCII.getLong(message.lotsize);
events.add(new ModifyOrder(currencyPair, orderId, amount,
minqty, lotsize));
}
示例21
@Override
public void cancelOrder(CboeFXBook.CancelOrder message) {
String currencyPair = ASCII.get(message.currencyPair);
String orderId = ASCII.get(message.orderId);
events.add(new CancelOrder(currencyPair, orderId));
}
示例22
@Override
public void marketSnapshotEntry(CboeFXBook.MarketSnapshotEntry entry) {
String currencyPair = ASCII.get(entry.currencyPair);
byte buyOrSellIndicator = entry.buyOrSellIndicator;
long price = ASCII.getFixed(entry.price, PRICE_DECIMALS);
long amount = ASCII.getLong(entry.amount);
long minqty = ASCII.getLong(entry.minqty);
long lotsize = ASCII.getLong(entry.lotsize);
String orderId = ASCII.get(entry.orderId);
events.add(new MarketSnapshotEntry(currencyPair, buyOrSellIndicator,
price, amount, minqty, lotsize, orderId));
}
示例23
@Override
public void ticker(CboeFXBook.Ticker message) {
byte aggressorBuyOrSellIndicator = message.aggressorBuyOrSellIndicator;
String currencyPair = ASCII.get(message.currencyPair);
long price = ASCII.getFixed(message.price, PRICE_DECIMALS);
long transactionDate = ASCII.getLong(message.transactionDate);
long transactionTime = ASCII.getLong(message.transactionTime);
events.add(new Ticker(aggressorBuyOrSellIndicator, currencyPair,
price, transactionDate, transactionTime));
}
示例24
@Test
public void loginAccepted() throws Exception {
ASCII.putLongRight(loginAccepted.sequenceNumber, 1);
server.accept(loginAccepted);
while (clientEvents.collect().size() != 1)
client.receive();
assertEquals(asList(new LoginAccepted(1)), clientEvents.collect());
}
示例25
@Test
public void loginRejected() throws Exception {
ASCII.putLeft(loginRejected.reason, "foo");
server.reject(loginRejected);
while (clientEvents.collect().size() != 1)
client.receive();
assertEquals(asList(new LoginRejected("foo ")),
clientEvents.collect());
}
示例26
@Test
public void sequencedData() throws Exception {
ASCII.putLeft(sequencedData.time, "093000250");
byte[] payload = new byte[] { 'f', 'o', 'o' };
server.send(sequencedData, ByteBuffer.wrap(payload));
while (clientEvents.collect().size() != 1)
client.receive();
assertEquals(asList(new SequencedData("093000250", payload)),
clientEvents.collect());
}
示例27
@Test
public void fullBuffer() throws Exception {
ASCII.putLeft(sequencedData.time, "093000250");
byte[] payload = repeat((byte)'A', RX_BUFFER_CAPACITY - 11);
server.send(sequencedData, ByteBuffer.wrap(payload));
while (clientEvents.collect().size() != 1)
client.receive();
assertEquals(asList(new SequencedData("093000250", payload)),
clientEvents.collect());
}
示例28
@Test(expected=ITCHException.class)
public void packetLengthExceedsBufferCapacity() throws Exception {
ASCII.putLeft(sequencedData.time, "093000250");
byte[] payload = repeat((byte)'A', RX_BUFFER_CAPACITY - 10);
server.send(sequencedData, ByteBuffer.wrap(payload));
while (true)
client.receive();
}
示例29
@Test
public void errorNotification() throws Exception {
ASCII.putLeft(errorNotification.errorExplanation, "foo");
server.notifyError(errorNotification);
while (clientEvents.collect().size() != 1)
client.receive();
assertEquals(asList(new ErrorNotification(
"foo " +
" ")),
clientEvents.collect());
}
示例30
@Test
public void instrumentDirectory() throws Exception {
ASCII.putLongRight(instrumentDirectory.numberOfCurrencyPairs, 3);
ASCII.putLeft(instrumentDirectory.currencyPair[0], "FOO/BAR");
ASCII.putLeft(instrumentDirectory.currencyPair[1], "BAR/BAZ");
ASCII.putLeft(instrumentDirectory.currencyPair[2], "BAZ/FOO");
server.instrumentDirectory(instrumentDirectory);
while (clientEvents.collect().size() != 1)
client.receive();
assertEquals(asList(new InstrumentDirectory(asList("FOO/BAR", "BAR/BAZ", "BAZ/FOO"))),
clientEvents.collect());
}