aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/java/edu/brown/cs/student/term/profit/ProfitCalculation.java31
-rw-r--r--src/main/java/edu/brown/cs/student/term/profit/StockHolding.java26
-rw-r--r--src/test/java/edu/brown/cs/student/ProfitCalculationTest.java75
3 files changed, 114 insertions, 18 deletions
diff --git a/src/main/java/edu/brown/cs/student/term/profit/ProfitCalculation.java b/src/main/java/edu/brown/cs/student/term/profit/ProfitCalculation.java
index 77c1c3a..18b79be 100644
--- a/src/main/java/edu/brown/cs/student/term/profit/ProfitCalculation.java
+++ b/src/main/java/edu/brown/cs/student/term/profit/ProfitCalculation.java
@@ -19,6 +19,7 @@ import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
+import java.text.SimpleDateFormat;
import java.util.LinkedList;
import java.util.HashMap;
import java.util.List;
@@ -228,11 +229,12 @@ public class ProfitCalculation {
if (currentStockPrices.containsKey(ticker)) {
return currentStockPrices.get(ticker);
} else {
+ SimpleDateFormat localDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
String url = "https://data.alpaca.markets/v1/bars/"
+ "day?"
+ "symbols=" + ticker
- + "&start=" + startTime
- + "&end=" + endTime;
+ + "&start=" + localDateFormat.format(startTime)
+ + "&end=" + localDateFormat.format(endTime);
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
@@ -278,6 +280,11 @@ public class ProfitCalculation {
}
public List<StockHolding> getHoldingsList() {
+ if (conn == null) {
+ System.out.println("ERROR: No database connection");
+ return new LinkedList<>();
+ }
+
if (!tablesFilled) {
organizeOrders();
getRealizedGains();
@@ -310,11 +317,12 @@ public class ProfitCalculation {
* return percent change in SPY (SP 500) over the time period.
*/
public double compareToSP500() {
+ SimpleDateFormat localDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
String url = "https://data.alpaca.markets/v1/bars/"
+ "day?"
+ "symbols=SPY"
- + "&start=" + startTime.toString() + "T09:30:00-04:00"
- + "&end=" + endTime.toString() + "T09:30:00-04:00";
+ + "&start=" + localDateFormat.format(startTime)
+ + "&end=" + localDateFormat.format(endTime);
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
@@ -350,6 +358,10 @@ public class ProfitCalculation {
*/
public Map<Integer, Double> getProfitMap() {
Map<Integer, Double> profitMap = new HashMap<>();
+ if (conn == null) {
+ System.out.println("ERROR: no database connection");
+ return profitMap;
+ }
try {
PreparedStatement prep;
prep =
@@ -387,15 +399,4 @@ public class ProfitCalculation {
tablesFilled = false;
}
- public void setConnection(String filename) throws SQLException, ClassNotFoundException {
-
- // Initialize the database connection, turn foreign keys on
- Class.forName("org.sqlite.JDBC");
- String urlToDB = "jdbc:sqlite:" + filename;
- conn = DriverManager.getConnection(urlToDB);
-
- Statement stat = conn.createStatement();
- stat.executeUpdate("PRAGMA foreign_keys=ON;");
- }
-
}
diff --git a/src/main/java/edu/brown/cs/student/term/profit/StockHolding.java b/src/main/java/edu/brown/cs/student/term/profit/StockHolding.java
index f7924f2..5edb5f7 100644
--- a/src/main/java/edu/brown/cs/student/term/profit/StockHolding.java
+++ b/src/main/java/edu/brown/cs/student/term/profit/StockHolding.java
@@ -1,11 +1,21 @@
package edu.brown.cs.student.term.profit;
+/**
+ * class to map holding info for JSON.
+ */
public class StockHolding {
private String ticker;
private Double realizedGain;
private Double unrealizedGain;
private int shares;
+ /**
+ * constructor.
+ * @param ticker - stock.
+ * @param realizedGain realized gain.
+ * @param unrealizedGain unrealized gain.
+ * @param shares - number of shares
+ */
public StockHolding(String ticker, Double realizedGain, Double unrealizedGain, int shares) {
this.ticker = ticker;
this.realizedGain = realizedGain;
@@ -13,11 +23,27 @@ public class StockHolding {
this.shares = shares;
}
+ /**
+ * getter method.
+ * @return realized gain.
+ */
public Double getRealizedGain() {
return realizedGain;
}
+ /**
+ * getter method.
+ * @return unrealized gain.
+ */
public Double getUnrealizedGain() {
return unrealizedGain;
}
+
+ /**
+ * getter method for testing.
+ * @return shares.
+ */
+ public int getShares() {
+ return shares;
+ }
} \ No newline at end of file
diff --git a/src/test/java/edu/brown/cs/student/ProfitCalculationTest.java b/src/test/java/edu/brown/cs/student/ProfitCalculationTest.java
index a4baa53..1291245 100644
--- a/src/test/java/edu/brown/cs/student/ProfitCalculationTest.java
+++ b/src/test/java/edu/brown/cs/student/ProfitCalculationTest.java
@@ -13,6 +13,8 @@ import org.junit.Before;
import org.junit.Test;
import java.time.LocalDate;
+import java.util.HashMap;
+import java.util.LinkedList;
import java.util.List;
import java.sql.Date;
import java.time.Instant;
@@ -36,7 +38,7 @@ public class ProfitCalculationTest {
@Before
public void setUp() {
try {
- db = new DatabaseQuerier("data/lil_mock.sqlite3");
+ db = new DatabaseQuerier("data/profit_testing.sqlite3");
} catch (Exception e) {
System.out.println("DBQuerier Test, couldn't connect to db???");
}
@@ -59,16 +61,83 @@ public class ProfitCalculationTest {
assertEquals(trade.get(0).getUnrealizedGain(), 3842.25, .25);
assertEquals(trade.get(0).getRealizedGain(), 0, .01);
+ //just sell
+ profitCalculation =
+ new ProfitCalculation(DatabaseQuerier.getConn(), "SELL", new Date(1518010558000l),
+ new Date(1618698807000l));
+ trade = profitCalculation.getHoldingsList();
+ assertTrue(trade.isEmpty());
+ assertEquals(profitCalculation.calculateGains(), 0, 0.001);
+
+ tearDown();
}
- public void checkAPICalls() {
+ @Test
+ public void otherBuySellCases() {
+ setUp();
+ //buy and sell at same timestamp
+ ProfitCalculation profitCalculation =
+ new ProfitCalculation(DatabaseQuerier.getConn(), "concurrentBS", new Date(1518010558000l),
+ new Date(1715629591000l));
+
+ assertEquals(profitCalculation.getProfitMap().get(100), 1, .01);
+
+ //buys at multiple prices
+ profitCalculation =
+ new ProfitCalculation(DatabaseQuerier.getConn(), "mulitpleBuyPrices",
+ new Date(1518010558000l),
+ new Date(1715629591000l));
+ assertEquals(profitCalculation.getProfitMap().get(101), 1, .01);
+ assertEquals(profitCalculation.getMoneyInput(), 3750, .01);
+ assertEquals(profitCalculation.getHoldingsList().get(0).getRealizedGain(), 3750, 0.01);
+
+ //left over holdings
+ profitCalculation =
+ new ProfitCalculation(DatabaseQuerier.getConn(), "dontSellAll",
+ new Date(1518010558000l),
+ new Date(1715629591000l));
+
+ assertEquals(profitCalculation.getHoldingsList().get(0).getShares(), 25, .01);
+ tearDown();
+ }
+
+ @Test
+ public void testAPICalls() {
ProfitCalculation profitCalculation =
new ProfitCalculation(DatabaseQuerier.getConn(), "Don", new Date(1618234200000l),
- new Date(1618814264000l));
+ new Date(1618703800000l));
//check sp500 calculation. 411.28 to 417.30
assertEquals(profitCalculation.compareToSP500(), .01464, .001);
+ tearDown();
+
+ }
+
+ @Test
+ public void databaseAndConnectionIssues() {
+ //no database connection
+ ProfitCalculation profitCalculation =
+ new ProfitCalculation(null, "Don", new Date(1518010558000l),
+ new Date(1618698807000l));
+ assertEquals(profitCalculation.getProfitMap(), new HashMap<>());
+
+ assertEquals(profitCalculation.getHoldingsList(), new LinkedList<>());
+
+ setUp();
+ //invalid person
+ profitCalculation =
+ new ProfitCalculation(DatabaseQuerier.getConn(), "1234", new Date(1518010558000l),
+ new Date(1618698807000l));
+ assertEquals(profitCalculation.getHoldingsList(), new LinkedList<>());
+
+
+ //invalid stock ticker
+ profitCalculation =
+ new ProfitCalculation(DatabaseQuerier.getConn(), "invalidTicker", new Date(1518010558000l),
+ new Date(1618698807000l));
+ assertEquals(profitCalculation.getHoldingsList().get(0).getRealizedGain(), 0, .01);
+ assertEquals(profitCalculation.getHoldingsList().get(0).getUnrealizedGain(), 0, .01);
}