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
20 changes: 20 additions & 0 deletions .idea/compiler.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

25 changes: 25 additions & 0 deletions .idea/encodings.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

20 changes: 20 additions & 0 deletions .idea/jarRepositories.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 12 additions & 0 deletions .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions .idea/vcs.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

19 changes: 10 additions & 9 deletions algo-exercise/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,22 @@ The objective of this challenge is to write a simple trading algo that creates a

**Stretch objective:** write an algo that can make money buy buying shares when the order book is cheaper, and selling them when the order book is more expensive.

Note: make sure you think about how the market data could change over time, add scenarios into your test to show how you've tested those scenarios.
##### Note
Make sure you think about how the market data could change over time, add scenarios into your test to show how you've tested those scenarios.

### How to Get Started

#### Pre-requisites

1. The project requires Java version 17 or higher

##### Note
This project is configured for Java 17. If you have a later version installed, it will compile and run successfully, but you may see warnings in the log like this, which you can safely ignore:

```sh
[WARNING] system modules path not set in conjunction with -source 17
```

#### Opening the project

1. Fork this repo in GitHub and clone it to your local machine
Expand All @@ -24,7 +32,7 @@ Note: make sure you think about how the market data could change over time, add
4. Navigate to the [MyAlgoTest.java](https://github.com/cbfacademy/trading-algorithm-assessment/blob/main/algo-exercise/getting-started/src/test/java/codingblackfemales/gettingstarted/MyAlgoTest.java) and [MyAlgoLogic.java](https://github.com/cbfacademy/trading-algorithm-assessment/blob/main/algo-exercise/getting-started/src/main/java/codingblackfemales/gettingstarted/MyAlgoLogic.java)
5. You're ready to go!

#### Note
##### Note
You will first need to run the Maven `install` task to make sure the binary encoders and decoders are installed and available for use. You can use the provided Maven wrapper or an installed instance of Maven, either in the command line or from the IDE integration.

To get started, run the following command from the project root: `./mvnw clean install`. Once you've done this, you can compile or test specific projects using the `--projects` flag, e.g.:
Expand Down Expand Up @@ -94,10 +102,3 @@ Please see, if you're unsure how to run maven in your setup:
* (https://maven.apache.org/guides/getting-started/maven-in-five-minutes.html)
* (https://www.jetbrains.com/help/idea/maven-support.html)
* (https://code.visualstudio.com/docs/java/java-build#_execute-maven-commands-and-goals)







Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ public Action evaluate(SimpleAlgoState state) {
final BidLevel nearTouch = state.getBidAt(0);

long quantity = 75;
long price = nearTouch.price;
long price = nearTouch.price - 1L;

//until we have three child orders....
if(state.getChildOrders().size() < 3){
Expand Down
Original file line number Diff line number Diff line change
@@ -1,71 +1,19 @@
package codingblackfemales.orderbook;

import codingblackfemales.orderbook.visitor.FilteringOrderBookVisitor;
import codingblackfemales.orderbook.visitor.MutatingAddOrderVisitor;
import codingblackfemales.orderbook.visitor.OrderBookVisitor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Comparator;

public class AskBookSide extends OrderBookSide {

private static final Logger logger = LoggerFactory.getLogger(AskBookSide.class);

private final MutatingAddOrderVisitor addOrderVisitor = new MutatingAddOrderVisitor();

// public void onBookUpdate(BookUpdateDecoder bookUpdate){
// removeMarketDataOrders();
// addAskMarketDataOrders(bookUpdate);
// }
//
// public void onAskBook(AskBookUpdateDecoder askBook){
// removeMarketDataOrders();
// addAskMarketDataOrders(askBook);
// }

@Override
MutatingAddOrderVisitor getAddOrderVisitor() {
return addOrderVisitor;
}

boolean isBetweenLevels(OrderBookLevel previous, OrderBookLevel next, long price){
return previous != null && next != null && previous.getPrice() < price && next.getPrice() > price;
public AskBookSide() {
super(Comparator.naturalOrder());
}

boolean isNewDeepestLevel(OrderBookLevel previous, OrderBookLevel next, long price){
return previous != null && next == null && previous.getPrice() < price;
}
//
// public void addAskMarketDataOrders(AskBookUpdateDecoder askDecoder){
// for(AskBookUpdateDecoder.AskBookDecoder decoder : askDecoder.askBook()) {
// final long price = decoder.price();
// final long quantity = decoder.size();
// var marketOrder = new MarketDataOrderFlyweight(Side.SELL, price, quantity);
// logger.debug("[ORDERBOOK] ASK: Adding order" + marketOrder);
//
// //if(canMatch(marketOrder)
//
// addMarketDataOrder(marketOrder);
// }
// }
//
// public void addAskMarketDataOrders(BookUpdateDecoder bookUpdateDecoder){
// for(BookUpdateDecoder.AskBookDecoder decoder : bookUpdateDecoder.askBook()) {
// final long price = decoder.price();
// final long quantity = decoder.size();
// var marketOrder = new MarketDataOrderFlyweight(Side.SELL, price, quantity);
// logger.debug("[ORDERBOOK] ASK: Adding order" + marketOrder);
// addMarketDataOrder(marketOrder);
// }
// }
//
// public void createMarketDataOrders(BookUpdateDecoder bookUpdateDecoder){
// for(BookUpdateDecoder.AskBookDecoder decoder : bookUpdateDecoder.askBook()) {
// final long price = decoder.price();
// final long quantity = decoder.size();
// var marketOrder = new MarketDataOrderFlyweight(Side.SELL, price, quantity);
// logger.debug("[ORDERBOOK] ASK: Adding order" + marketOrder);
// addMarketDataOrder(marketOrder);
// }
// }



}
Original file line number Diff line number Diff line change
@@ -1,57 +1,19 @@
package codingblackfemales.orderbook;

import codingblackfemales.orderbook.visitor.FilteringOrderBookVisitor;
import codingblackfemales.orderbook.visitor.MutatingAddOrderVisitor;
import codingblackfemales.orderbook.visitor.OrderBookVisitor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Comparator;

public class BidBookSide extends OrderBookSide{

private static final Logger logger = LoggerFactory.getLogger(BidBookSide.class);

private final MutatingAddOrderVisitor addOrderVisitor = new MutatingAddOrderVisitor();

// public void onBidBook(BidBookUpdateDecoder bidBook) {
// removeMarketDataOrders();
// AddBidMarketDataOrders(bidBook);
// }
//
// public void onBookUpdate(BookUpdateDecoder bookUpdate) {
// removeMarketDataOrders();
// addBidkMarketDataOrders(bookUpdate);
// }

@Override
MutatingAddOrderVisitor getAddOrderVisitor() {
return addOrderVisitor;
}

boolean isBetweenLevels(OrderBookLevel previous, OrderBookLevel next, long price){
return previous != null && next != null && previous.getPrice() > price && next.getPrice() < price;
protected BidBookSide() {
super(Comparator.reverseOrder());
}

boolean isNewDeepestLevel(OrderBookLevel previous, OrderBookLevel next, long price){
return previous != null && next == null && previous.getPrice() > price;
}
//
// void AddBidMarketDataOrders(BidBookUpdateDecoder bidDecoder){
// for(BidBookUpdateDecoder.BidBookDecoder decoder : bidDecoder.bidBook()) {
// final long price = decoder.price();
// final long quantity = decoder.size();
// var marketOrder = new MarketDataOrderFlyweight(Side.BUY, price, quantity);
// logger.debug("[ORDERBOOK] BID: Adding order " + marketOrder);
// addMarketDataOrder(marketOrder);
// }
// }
//
// private void addBidkMarketDataOrders(BookUpdateDecoder bookUpdateDecoder){
// for(BookUpdateDecoder.AskBookDecoder decoder : bookUpdateDecoder.askBook()) {
// final long price = decoder.price();
// final long quantity = decoder.size();
// var marketOrder = new MarketDataOrderFlyweight(Side.BUY, price, quantity);
// logger.debug("[ORDERBOOK] BID: Adding order " + marketOrder);
// addMarketDataOrder(marketOrder);
// }
// }


}

Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ private void addOrMatchAskMarketDataOrders(AskBookUpdateDecoder askBookUpdateDec
for(AskBookUpdateDecoder.AskBookDecoder decoder : askBookUpdateDecoder.askBook()) {
final long price = decoder.price();
final long quantity = decoder.size();
var marketOrder = new MarketDataOrderFlyweight(Side.SELL, price, quantity);
var marketOrder = new MarketDataOrderFlyweight(Side.BUY, price, quantity);
logger.debug("[ORDERBOOK] ASK: Adding order" + marketOrder);
if(canMatch(Side.SELL, price)){
matchMarketDataOrder(marketOrder);
Expand All @@ -96,8 +96,8 @@ private void addOrMatchAskMarketDataOrders(AskBookUpdateDecoder askBookUpdateDec
}
}

private void addOrMatchBidMarketDataOrders(BidBookUpdateDecoder askBookUpdateDecoder){
for(BidBookUpdateDecoder.BidBookDecoder decoder : askBookUpdateDecoder.bidBook()) {
private void addOrMatchBidMarketDataOrders(BidBookUpdateDecoder bidBookUpdateDecoder){
for(BidBookUpdateDecoder.BidBookDecoder decoder : bidBookUpdateDecoder.bidBook()) {
final long price = decoder.price();
final long quantity = decoder.size();
var marketOrder = new MarketDataOrderFlyweight(Side.SELL, price, quantity);
Expand Down
Loading