Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 0 additions & 10 deletions .idea/runConfigurations.xml

This file was deleted.

24 changes: 12 additions & 12 deletions Data-Integration.iml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/test" isTestSource="true" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="jdk" jdkName="11 (2)" jdkType="JavaSDK" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="module-library">
<library>
Expand All @@ -20,24 +20,24 @@
<orderEntry type="module-library">
<library name="JUnit4">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/junit/junit/4.13.1/junit-4.13.1.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar!/" />
<root url="jar://$MODULE_DIR$/lib/junit-4.13.1.jar!/" />
<root url="jar://$MODULE_DIR$/lib/hamcrest-core-1.3.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="JUnit5.7.0">
<library name="JUnit5.8.1">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/junit/jupiter/junit-jupiter/5.7.0/junit-jupiter-5.7.0.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/junit/jupiter/junit-jupiter-api/5.7.0/junit-jupiter-api-5.7.0.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/apiguardian/apiguardian-api/1.1.0/apiguardian-api-1.1.0.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/junit/platform/junit-platform-commons/1.7.0/junit-platform-commons-1.7.0.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/junit/jupiter/junit-jupiter-params/5.7.0/junit-jupiter-params-5.7.0.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/junit/jupiter/junit-jupiter-engine/5.7.0/junit-jupiter-engine-5.7.0.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/junit/platform/junit-platform-engine/1.7.0/junit-platform-engine-1.7.0.jar!/" />
<root url="jar://$MODULE_DIR$/lib/junit-jupiter-5.7.0.jar!/" />
<root url="jar://$MODULE_DIR$/lib/junit-jupiter-api-5.7.0.jar!/" />
<root url="jar://$MODULE_DIR$/lib/apiguardian-api-1.1.0.jar!/" />
<root url="jar://$MODULE_DIR$/lib/opentest4j-1.2.0.jar!/" />
<root url="jar://$MODULE_DIR$/lib/junit-platform-commons-1.7.0.jar!/" />
<root url="jar://$MODULE_DIR$/lib/junit-jupiter-params-5.7.0.jar!/" />
<root url="jar://$MODULE_DIR$/lib/junit-jupiter-engine-5.7.0.jar!/" />
<root url="jar://$MODULE_DIR$/lib/junit-platform-engine-1.7.0.jar!/" />
</CLASSES>
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure whether this will work on other people's computers. Your unique set-up might make this not work on anyone elses. Also try to use Junit 5.7.0, not Junit 5.8.1

<JAVADOC />
<SOURCES />
Expand Down
10 changes: 8 additions & 2 deletions src/OrderBook/OrderBook.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ private void sortedPlace(Order order){
return;
}
else if (sideOfBook.get(i).price < order.price && !isAsk ||
sideOfBook.get(i).price > order.price && isAsk){
sideOfBook.get(i).price > order.price && isAsk) {
if (order.side == Side.ASK)
asks.add(i,order);
else
Expand Down Expand Up @@ -84,8 +84,14 @@ public void placeOrder(Order order){
sittingVolume += order.size;
adjustBBO();
placedOrders.put(order.orderID, order.orderID);

if (bestBidPrice > bestAskPrice && bestBidPrice != -1 && bestAskPrice != -1) {
// NEW ASSERTION, check for crossed orderbook condition where best bid over best ask
throw new RuntimeException("Crossed orderbook condition!");
}
}


/**
* Registers fill event on the order book
* WARNING: Will throw if fill event doesn't fill any sitting order
Expand All @@ -100,4 +106,4 @@ public void fillEvent(Fill fill){
adjustBBO();
recordedFills.put(fill.orderID, fill.orderID);
}
}
}
150 changes: 149 additions & 1 deletion src/test/testOrderBook.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
import OrderBook.Order;
import OrderBook.Fill;
import OrderBook.OrderBook;
import OrderBook.Side;

import static OrderBook.OrderType.MARKET_ORDER;
import static OrderBook.OrderType.LIMIT_ORDER;
import static OrderBook.OrderType.STOP_LIMIT_ORDER;

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.*;
Expand Down Expand Up @@ -168,4 +174,146 @@ void placeTwoAsk() {
assertEquals(-1f, testSubject.bestBidPrice);
assertEquals(1.8f, testSubject.sittingVolume);
}
}

@Test
void placeOneBidSTOPLIMIT() {
// Init and checking start conditions
OrderBook testSubject = new OrderBook();
assertEquals(0, testSubject.asks.size());
assertEquals(0, testSubject.bids.size());
assertEquals(-1f, testSubject.bestAskPrice);
assertEquals(-1f, testSubject.bestBidPrice);
assertEquals(0f, testSubject.sittingVolume);
// Operation
Order newSTOPLIMIT = new Order("helloUUID!", "helloproductID!", 2.2f, 99.99f,
STOP_LIMIT_ORDER, false, Side.BID, 1677598183L);
testSubject.placeOrder(newSTOPLIMIT);
// Checking Operation
assertEquals(0, testSubject.asks.size());
assertEquals(1, testSubject.bids.size());
assertEquals(99.99f, testSubject.bids.getFirst().price);
assertEquals(2.2f, testSubject.bids.getFirst().size);
assertEquals(1677598183L, testSubject.bids.getFirst().createdTs);
assertEquals(-1f, testSubject.bestAskPrice);
assertEquals(99.99f, testSubject.bestBidPrice);
assertEquals(2.2f, testSubject.sittingVolume);
}

@Test
void placeOneAskLIMITORDER() {
// Init and checking start conditions
OrderBook testSubject = new OrderBook();
assertEquals(0, testSubject.asks.size());
assertEquals(0, testSubject.bids.size());
assertEquals(-1f, testSubject.bestAskPrice);
assertEquals(-1f, testSubject.bestBidPrice);
assertEquals(0f, testSubject.sittingVolume);
// Operation
Order newLIMIT = new Order("helloUUID!", "helloproductID!", 6.9f, 69.69f,
LIMIT_ORDER, false, Side.ASK, 69L);
testSubject.placeOrder(newLIMIT);
// Checking Operation
assertEquals(1, testSubject.asks.size());
assertEquals(0, testSubject.bids.size());
assertEquals(69.69f, testSubject.asks.getFirst().price);
assertEquals(6.9f, testSubject.asks.getFirst().size);
assertEquals(69L, testSubject.asks.getFirst().createdTs);
assertEquals(69.69f, testSubject.bestAskPrice);
assertEquals(-1f, testSubject.bestBidPrice);
assertEquals(6.9f, testSubject.sittingVolume);
}

@Test
void placeTwoAskMARKETORDERandOneBidLIMITORDERthrowCROSSED_ORDERBOOK() {
// Init and checking start conditions
OrderBook testSubject = new OrderBook();
assertEquals(0, testSubject.asks.size());
assertEquals(0, testSubject.bids.size());
assertEquals(-1f, testSubject.bestAskPrice);
assertEquals(-1f, testSubject.bestBidPrice);
assertEquals(0f, testSubject.sittingVolume);
// Operation
Order newMARKETORDER = new Order("helloUUID!", "helloproductID_1!", 106.0f,
99.99f, MARKET_ORDER, false, Side.ASK, 1677598097L);
testSubject.placeOrder(newMARKETORDER);
// Checking Operation
assertEquals(1, testSubject.asks.size());
assertEquals(0, testSubject.bids.size());
assertEquals(99.99f, testSubject.asks.getFirst().price); // No orders have been filled yet
assertEquals(106.0f, testSubject.asks.getFirst().size); // No orders have been filled yet
assertEquals(1677598097L, testSubject.asks.getFirst().createdTs);
assertEquals(99.99f, testSubject.bestAskPrice);
assertEquals(-1f, testSubject.bestBidPrice);
assertEquals(106.0f, testSubject.sittingVolume);
// Operation
newMARKETORDER = new Order("helloUUID!", "helloproductID_2!", 3.7f,
0.01f, MARKET_ORDER, false, Side.ASK, 1677598150L);
testSubject.placeOrder(newMARKETORDER);
// Checking Operation
assertEquals(2, testSubject.asks.size());
assertEquals(0, testSubject.bids.size());
assertEquals(0.01f, testSubject.asks.getFirst().price);
assertEquals(3.7f, testSubject.asks.getFirst().size);
assertEquals(1677598150L, testSubject.asks.getFirst().createdTs);
assertEquals(0.01f, testSubject.bestAskPrice);
assertEquals(-1f, testSubject.bestBidPrice);
assertEquals(109.7f, testSubject.sittingVolume);
/* // Operation
Order newLIMITORDER = new Order("helloUUID!", "helloproductID_3!", 100.0f,
49.97f, LIMIT_ORDER, false, Side.BID, 1677598167L);
testSubject.placeOrder(newLIMITORDER);
// Checking Operation, note CROSSED ORDERBOOK */
}

@Test
void placeOneBidandOneAskLIMITORDERfillEvent() {
// Init and checking start conditions
OrderBook testSubject = new OrderBook();
assertEquals(0, testSubject.asks.size());
assertEquals(0, testSubject.bids.size());
assertEquals(-1f, testSubject.bestAskPrice);
assertEquals(-1f, testSubject.bestBidPrice);
assertEquals(0f, testSubject.sittingVolume);
// Operation
Order newLIMITORDER = new Order("helloUUID!", "helloproductID_1!", 100.0f,
27.37f, LIMIT_ORDER, false, Side.BID, 100L);
testSubject.placeOrder(newLIMITORDER);
assertEquals(0, testSubject.asks.size());
assertEquals(1, testSubject.bids.size());
assertEquals(27.37f, testSubject.bids.getFirst().price);
assertEquals(100.0f, testSubject.bids.getFirst().size);
assertEquals(100L, testSubject.bids.getFirst().createdTs);
assertEquals(-1f, testSubject.bestAskPrice);
assertEquals(27.37f, testSubject.bestBidPrice);
assertEquals(100.0f, testSubject.sittingVolume);
// Operation
newLIMITORDER = new Order("helloUUID!", "helloproductID_2!", 50.0f,
34.31f, LIMIT_ORDER, false, Side.ASK, 200L);
testSubject.placeOrder(newLIMITORDER);
assertEquals(1, testSubject.asks.size());
assertEquals(1, testSubject.bids.size());
assertEquals(34.31f, testSubject.asks.getFirst().price);
assertEquals(50.0f, testSubject.asks.getFirst().size);
assertEquals(27.37f, testSubject.bids.getFirst().price);
assertEquals(100.0f, testSubject.bids.getFirst().size);
assertEquals(200L, testSubject.asks.getFirst().createdTs);
assertEquals(100L, testSubject.bids.getFirst().createdTs);
assertEquals(34.31f, testSubject.bestAskPrice);
assertEquals(27.37f, testSubject.bestBidPrice);
assertEquals(150.0f, testSubject.sittingVolume);
// Operation
Fill newFill = new Fill("helloproductID_2!", "helloclientID!", 35.5f,
34.31f, 1.5f, LIMIT_ORDER, Side.ASK, 330L);
testSubject.fillEvent(newFill);
assertEquals(1, testSubject.asks.size());
assertEquals(1, testSubject.bids.size());
assertEquals(34.31f, testSubject.asks.getFirst().price);
assertEquals(14.5f, testSubject.asks.getFirst().size);
assertEquals(27.37f, testSubject.bids.getFirst().price);
assertEquals(100.0f, testSubject.bids.getFirst().size);
assertEquals(100L, testSubject.bids.getFirst().createdTs);
assertEquals(34.31f, testSubject.bestAskPrice);
assertEquals(27.37f, testSubject.bestBidPrice);
assertEquals(114.5f, testSubject.sittingVolume);
}
}