From baeb5799f14dff70ed8e2adade6fec7b7d40a67d Mon Sep 17 00:00:00 2001
From: Jacob Peterson
Date: Mon, 2 Aug 2021 17:18:03 -0600
Subject: [PATCH 01/84] Fix parseAPIErrorResponse so response code and message
are included
---
.../alpaca/rest/AlpacaClientException.java | 34 +++++++++----------
1 file changed, 16 insertions(+), 18 deletions(-)
diff --git a/src/main/java/net/jacobpeterson/alpaca/rest/AlpacaClientException.java b/src/main/java/net/jacobpeterson/alpaca/rest/AlpacaClientException.java
index 40ef1d6c..bcf89c2b 100644
--- a/src/main/java/net/jacobpeterson/alpaca/rest/AlpacaClientException.java
+++ b/src/main/java/net/jacobpeterson/alpaca/rest/AlpacaClientException.java
@@ -66,11 +66,7 @@ public String getMessage() {
if (responseBody == null) {
return super.getMessage();
} else {
- try {
- return parseAPIErrorResponse();
- } catch (Exception ignored) {
- return super.getMessage();
- }
+ return parseAPIErrorResponse();
}
}
@@ -87,24 +83,26 @@ public String getMessage() {
* @return a formatted message of the error response
*/
private String parseAPIErrorResponse() {
- JsonElement responseJsonElement = JsonParser.parseString(responseBody);
+ try {
+ JsonElement responseJsonElement = JsonParser.parseString(responseBody);
- if (responseJsonElement instanceof JsonObject) {
- JsonObject responseJsonObject = responseJsonElement.getAsJsonObject();
+ if (responseJsonElement instanceof JsonObject) {
+ JsonObject responseJsonObject = responseJsonElement.getAsJsonObject();
- if (responseJsonObject.has(CODE_KEY)) {
- apiResponseCode = responseJsonObject.get(CODE_KEY).getAsInt();
- }
+ if (responseJsonObject.has(CODE_KEY)) {
+ apiResponseCode = responseJsonObject.get(CODE_KEY).getAsInt();
+ }
- if (responseJsonObject.has(MESSAGE_KEY)) {
- apiResponseMessage = responseJsonObject.get(MESSAGE_KEY).getAsString();
+ if (responseJsonObject.has(MESSAGE_KEY)) {
+ apiResponseMessage = responseJsonObject.get(MESSAGE_KEY).getAsString();
+ }
}
- }
- // Just use the response JSON if the message could not be parsed.
- if (apiResponseMessage == null) {
- apiResponseMessage = responseJsonElement.toString();
- }
+ // Just use the response JSON if the message could not be parsed.
+ if (apiResponseMessage == null) {
+ apiResponseMessage = responseJsonElement.toString();
+ }
+ } catch (Exception ignored) {}
// Build message
StringBuilder messageBuilder = new StringBuilder();
From 997ec27ba85a9cf8b6dd4c7740ffc274bda17b8f Mon Sep 17 00:00:00 2001
From: Jacob Peterson
Date: Tue, 3 Aug 2021 16:44:58 -0600
Subject: [PATCH 02/84] Fix NPE if no listener is set in AlpacaWebsocket
---
.../alpaca/websocket/AlpacaWebsocket.java | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/src/main/java/net/jacobpeterson/alpaca/websocket/AlpacaWebsocket.java b/src/main/java/net/jacobpeterson/alpaca/websocket/AlpacaWebsocket.java
index 19dee225..331d89da 100644
--- a/src/main/java/net/jacobpeterson/alpaca/websocket/AlpacaWebsocket.java
+++ b/src/main/java/net/jacobpeterson/alpaca/websocket/AlpacaWebsocket.java
@@ -259,10 +259,12 @@ public Future getAuthorizationFuture() {
* @param message the message
*/
protected void callListener(T messageType, M message) {
- try {
- listener.onMessage(messageType, message);
- } catch (Exception exception) {
- LOGGER.error("{} listener threw exception!", websocketName, exception);
+ if (listener != null) {
+ try {
+ listener.onMessage(messageType, message);
+ } catch (Exception exception) {
+ LOGGER.error("{} listener threw exception!", websocketName, exception);
+ }
}
}
From fe54b204c965aa5372f6bf1e52687a79c823a4eb Mon Sep 17 00:00:00 2001
From: cloudygeek
Date: Wed, 4 Aug 2021 23:13:46 +0100
Subject: [PATCH 03/84] Update FormatUtil.java
TimeZone Bug
---
.../net/jacobpeterson/alpaca/util/format/FormatUtil.java | 9 ++++-----
1 file changed, 4 insertions(+), 5 deletions(-)
diff --git a/src/main/java/net/jacobpeterson/alpaca/util/format/FormatUtil.java b/src/main/java/net/jacobpeterson/alpaca/util/format/FormatUtil.java
index 0b76f3b5..d2bf5b82 100644
--- a/src/main/java/net/jacobpeterson/alpaca/util/format/FormatUtil.java
+++ b/src/main/java/net/jacobpeterson/alpaca/util/format/FormatUtil.java
@@ -22,9 +22,6 @@ public class FormatUtil {
// the 3rd and 4th least significant decimal digits.
private static final NumberFormat CURRENCY_FORMATTER = new DecimalFormat("#0.00##",
DecimalFormatSymbols.getInstance(Locale.US));
- private static final DateTimeFormatter RFC_3339_FORMATTER =
- DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss'Z'").withZone(NEW_YORK_ZONED_ID);
-
/**
* Formats an arbitrary number to a currency format. e.g. $123.45
*
@@ -37,13 +34,15 @@ public static String toCurrencyFormat(Number numberToFormat) {
}
/**
- * Formats a {@link TemporalAccessor} using {@link #RFC_3339_FORMATTER} {@link DateTimeFormatter}.
+ * Formats a {@link TemporalAccessor} using {@link DateTimeFormatter#ISO_OFFSET_DATE_TIME}.
*
* @param zonedDateTime the {@link ZonedDateTime}
*
* @return the formatted string
*/
public static String toRFC3339Format(ZonedDateTime zonedDateTime) {
- return RFC_3339_FORMATTER.format(zonedDateTime);
+ //Alpaca requires RFC 3339 (https://www.ietf.org/rfc/rfc3339.txt) date time to be provided which includes time zone.
+ // ISO 8601 is compatible with RFC 3339.
+ return DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(zonedDateTime);
}
}
From 206774fe8b3878081801e455b108b187f4722411 Mon Sep 17 00:00:00 2001
From: Jacob Peterson
Date: Thu, 5 Aug 2021 11:04:58 -0600
Subject: [PATCH 04/84] Add 'n' and 'vw' fields to Bar
---
schema_json/endpoint/market_data/historical/bar/bar.json | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/schema_json/endpoint/market_data/historical/bar/bar.json b/schema_json/endpoint/market_data/historical/bar/bar.json
index b39bff53..6be1fe66 100644
--- a/schema_json/endpoint/market_data/historical/bar/bar.json
+++ b/schema_json/endpoint/market_data/historical/bar/bar.json
@@ -25,6 +25,14 @@
"v": {
"existingJavaType": "java.lang.Long",
"title": "Volume."
+ },
+ "n": {
+ "existingJavaType": "java.lang.Long",
+ "title": "Trade count."
+ },
+ "vw": {
+ "existingJavaType": "java.lang.Double",
+ "title": "VWAP (Volume Weighted Average Price)."
}
}
}
From 23f126f257daff669f82ff9076d52e277c4d97b6 Mon Sep 17 00:00:00 2001
From: Jacob Peterson
Date: Thu, 5 Aug 2021 11:17:30 -0600
Subject: [PATCH 05/84] Fix Javadoc and formatting in FormatUtil
---
.../net/jacobpeterson/alpaca/util/format/FormatUtil.java | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/src/main/java/net/jacobpeterson/alpaca/util/format/FormatUtil.java b/src/main/java/net/jacobpeterson/alpaca/util/format/FormatUtil.java
index d2bf5b82..b5a53a27 100644
--- a/src/main/java/net/jacobpeterson/alpaca/util/format/FormatUtil.java
+++ b/src/main/java/net/jacobpeterson/alpaca/util/format/FormatUtil.java
@@ -22,6 +22,7 @@ public class FormatUtil {
// the 3rd and 4th least significant decimal digits.
private static final NumberFormat CURRENCY_FORMATTER = new DecimalFormat("#0.00##",
DecimalFormatSymbols.getInstance(Locale.US));
+
/**
* Formats an arbitrary number to a currency format. e.g. $123.45
*
@@ -35,14 +36,16 @@ public static String toCurrencyFormat(Number numberToFormat) {
/**
* Formats a {@link TemporalAccessor} using {@link DateTimeFormatter#ISO_OFFSET_DATE_TIME}.
+ *
+ * Alpaca requires RFC 3339 formatted timestamps to be provided which includes the timezone. ISO
+ * 8601 is compatible with RFC 3339 which is what {@link DateTimeFormatter#ISO_OFFSET_DATE_TIME}
+ * uses.
*
* @param zonedDateTime the {@link ZonedDateTime}
*
* @return the formatted string
*/
public static String toRFC3339Format(ZonedDateTime zonedDateTime) {
- //Alpaca requires RFC 3339 (https://www.ietf.org/rfc/rfc3339.txt) date time to be provided which includes time zone.
- // ISO 8601 is compatible with RFC 3339.
return DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(zonedDateTime);
}
}
From 945bed160093150dfce957905f5e573188fdb689 Mon Sep 17 00:00:00 2001
From: Jacob Peterson
Date: Thu, 5 Aug 2021 11:56:38 -0600
Subject: [PATCH 06/84] Modify websocket Javadocs
---
.../websocket/AlpacaWebsocketInterface.java | 7 +++++--
.../MarketDataWebsocketInterface.java | 18 +++++++++---------
.../streaming/StreamingWebsocketInterface.java | 4 ++--
3 files changed, 16 insertions(+), 13 deletions(-)
diff --git a/src/main/java/net/jacobpeterson/alpaca/websocket/AlpacaWebsocketInterface.java b/src/main/java/net/jacobpeterson/alpaca/websocket/AlpacaWebsocketInterface.java
index c508e799..272774f6 100644
--- a/src/main/java/net/jacobpeterson/alpaca/websocket/AlpacaWebsocketInterface.java
+++ b/src/main/java/net/jacobpeterson/alpaca/websocket/AlpacaWebsocketInterface.java
@@ -39,14 +39,17 @@ public interface AlpacaWebsocketInterface
+ * Note that if this {@link AlpacaWebsocketInterface} is already authorized, the returned {@link Future} will likely
+ * never complete.
*
* @return a {@link Boolean} {@link Future}
*/
Future getAuthorizationFuture();
/**
- * Waits for {@link #getAuthorizationFuture()} to complete and returns its value. This will timeout after 10 seconds
- * and then return false.
+ * Waits for {@link #getAuthorizationFuture()} to complete and returns its value. After 10 seconds of waiting, this
+ * will timeout then return false.
*
* @return a boolean
*/
diff --git a/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/MarketDataWebsocketInterface.java b/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/MarketDataWebsocketInterface.java
index 7c7d4d90..2170e898 100644
--- a/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/MarketDataWebsocketInterface.java
+++ b/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/MarketDataWebsocketInterface.java
@@ -15,11 +15,11 @@
public interface MarketDataWebsocketInterface extends AlpacaWebsocketInterface {
/**
- * Subscribe to a specific control {@link MarketDataMessage}. That is, {@link ErrorMessage}, {@link
- * SubscriptionsMessage}, or {@link SuccessMessage}.
+ * Subscribe to a specific control {@link MarketDataMessage} which contain information about the stream's current
+ * state. That is, an {@link ErrorMessage}, {@link SubscriptionsMessage}, or {@link SuccessMessage}.
*
- * @param marketDataMessageTypes array of any of: {@link MarketDataMessageType#SUCCESS}, {@link
- * MarketDataMessageType#ERROR}, or {@link MarketDataMessageType#SUBSCRIPTION}
+ * @param marketDataMessageTypes array containing any of the following: {@link MarketDataMessageType#SUCCESS},
+ * {@link MarketDataMessageType#ERROR}, or {@link MarketDataMessageType#SUBSCRIPTION}
*/
void subscribeToControl(MarketDataMessageType... marketDataMessageTypes);
@@ -44,7 +44,7 @@ public interface MarketDataWebsocketInterface extends AlpacaWebsocketInterface
- * Note that any one of the given {@link Collection}s can contain the wildcard character e.g. "*" to unsubscribe
+ * Note that any one of the given {@link Collection}s can contain the wildcard character (e.g. "*") to unsubscribe
* from a previously subscribed wildcard.
*
* @param tradeSymbols a {@link Collection} of symbols to unsubscribe from trades or null for no
@@ -58,28 +58,28 @@ public interface MarketDataWebsocketInterface extends AlpacaWebsocketInterface tradeSymbols, Collection quoteSymbols, Collection barSymbols);
/**
- * Gets all of the currently subscribed control {@link MarketDataMessageType}s.
+ * Gets all the currently subscribed control {@link MarketDataMessageType}s.
*
* @return a {@link Collection} of {@link MarketDataMessageType}s
*/
Collection subscribedControls();
/**
- * Gets all of the currently subscribed symbols for trade updates.
+ * Gets all the currently subscribed symbols for trade updates.
*
* @return a {@link Collection} of {@link String}s
*/
Collection subscribedTrades();
/**
- * Gets all of the currently subscribed symbols for quote updates.
+ * Gets all the currently subscribed symbols for quote updates.
*
* @return a {@link Collection} of {@link String}s
*/
Collection subscribedQuotes();
/**
- * Gets all of the currently subscribed symbols for bar updates.
+ * Gets all the currently subscribed symbols for bar updates.
*
* @return a {@link Collection} of {@link String}s
*/
diff --git a/src/main/java/net/jacobpeterson/alpaca/websocket/streaming/StreamingWebsocketInterface.java b/src/main/java/net/jacobpeterson/alpaca/websocket/streaming/StreamingWebsocketInterface.java
index 9b2dc5ca..07112a68 100644
--- a/src/main/java/net/jacobpeterson/alpaca/websocket/streaming/StreamingWebsocketInterface.java
+++ b/src/main/java/net/jacobpeterson/alpaca/websocket/streaming/StreamingWebsocketInterface.java
@@ -11,7 +11,7 @@
public interface StreamingWebsocketInterface extends AlpacaWebsocketInterface {
/**
- * Sets the {@link StreamingMessageType}s to streamingMessageTypes.
+ * Sets the {@link StreamingMessageType}s for this stream to the given streamingMessageTypes.
*
* Note that this will call {@link StreamingWebsocketInterface#connect()} and {@link
* StreamingWebsocketInterface#waitForAuthorization()} if {@link StreamingWebsocketInterface#isConnected()} returns
@@ -22,7 +22,7 @@ public interface StreamingWebsocketInterface extends AlpacaWebsocketInterface
Date: Thu, 5 Aug 2021 12:04:42 -0600
Subject: [PATCH 07/84] Add websocket clarifications to README
---
README.md | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/README.md b/README.md
index dad90b54..f144c7d6 100644
--- a/README.md
+++ b/README.md
@@ -384,9 +384,13 @@ alpacaAPI.streaming().streams(
The following methods show how you can control the state of the [`StreamingWebsocket`](src/main/java/net/jacobpeterson/alpaca/websocket/streaming/StreamingWebsocket.java) directly.
```java
+// Note that you usually won't need to call connect() and waitForAuthorization()
+// directly, as they are automatically called when subscribing to streams.
alpacaAPI.streaming().connect();
alpacaAPI.streaming().waitForAuthorization();
System.out.println(alpacaAPI.streaming().isValid());
+
+// You can manually disconnect the websocket as needed
alpacaAPI.streaming().disconnect();
```
@@ -417,9 +421,13 @@ alpacaAPI.marketDataStreaming().subscribe(
The following methods show how you can control the state of the [`MarketDataWebsocket`](src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/MarketDataWebsocket.java) directly.
```java
+// Note that you usually won't need to call connect() and waitForAuthorization()
+// directly, as they are automatically called when subscribing to streams.
alpacaAPI.marketDataStreaming().connect();
alpacaAPI.marketDataStreaming().waitForAuthorization();
System.out.println(alpacaAPI.marketDataStreaming().isValid());
+
+// You can manually disconnect the websocket as needed
alpacaAPI.marketDataStreaming().disconnect();
```
From 7986444a31b5f3f6cb2664e679392140457b9fe0 Mon Sep 17 00:00:00 2001
From: Jacob Peterson
Date: Thu, 5 Aug 2021 13:35:06 -0600
Subject: [PATCH 08/84] Remove auto-connect feature from websockets
---
README.md | 56 ++++++++++---------
.../websocket/AlpacaWebsocketInterface.java | 11 ++--
.../marketdata/MarketDataWebsocket.java | 10 +---
.../MarketDataWebsocketInterface.java | 4 --
.../streaming/StreamingWebsocket.java | 14 ++---
.../StreamingWebsocketInterface.java | 4 --
6 files changed, 44 insertions(+), 55 deletions(-)
diff --git a/README.md b/README.md
index f144c7d6..b0c47a8d 100644
--- a/README.md
+++ b/README.md
@@ -374,28 +374,31 @@ StreamingListener streamingListener = (messageType, message) ->
System.out.printf("%s: %s\n", messageType.name(), message);
alpacaAPI.streaming().setListener(streamingListener);
-// Listen to the 'authorization' and 'trade update' streams.
-// Note this will connect the websocket and wait for authorization
-// if it isn't already connected.
-alpacaAPI.streaming().streams(
- StreamingMessageType.AUTHORIZATION,
- StreamingMessageType.TRADE_UPDATES);
-```
+// Listen 'AuthorizationMessage' and 'ListeningMessage' messages that contain
+// information about the stream's current state.
+alpacaAPI.streaming().streams(StreamingMessageType.AUTHORIZATION,
+ StreamingMessageType.LISTENING);
-The following methods show how you can control the state of the [`StreamingWebsocket`](src/main/java/net/jacobpeterson/alpaca/websocket/streaming/StreamingWebsocket.java) directly.
-```java
-// Note that you usually won't need to call connect() and waitForAuthorization()
-// directly, as they are automatically called when subscribing to streams.
+// Connect the websocket and confirm authentication
alpacaAPI.streaming().connect();
-alpacaAPI.streaming().waitForAuthorization();
-System.out.println(alpacaAPI.streaming().isValid());
+alpacaAPI.streaming().waitForAuthorization(5, TimeUnit.SECONDS);
+if (!alpacaAPI.streaming().isValid()) {
+ System.out.println("Websocket not valid!");
+ return;
+}
-// You can manually disconnect the websocket as needed
+// Listen to the 'trade update' streams.
+alpacaAPI.streaming().streams(StreamingMessageType.TRADE_UPDATES);
+
+// Wait a few seconds
+Thread.sleep(5000);
+
+// Manually disconnect the websocket
alpacaAPI.streaming().disconnect();
```
## [`MarketDataWebsocket`](src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/MarketDataWebsocket.java)
-Alpaca's Data API v2 provides websocket streaming for trades, quotes, and minute bars. This helps receive the most up to date market information that could help your trading strategy to act upon certain market movement.
+Alpaca's Data API v2 provides websocket streaming for trades, quotes, and minute bars. This helps receive the most up-to-date market information that could help your trading strategy to act upon certain market movement.
Example usage:
```java
@@ -410,24 +413,25 @@ alpacaAPI.marketDataStreaming().subscribeToControl(
MarketDataMessageType.SUCCESS,
MarketDataMessageType.SUBSCRIPTION,
MarketDataMessageType.ERROR);
+
+// Connect the websocket and confirm authentication
+alpacaAPI.marketDataStreaming().connect();
+alpacaAPI.marketDataStreaming().waitForAuthorization(5, TimeUnit.SECONDS);
+if (!alpacaAPI.marketDataStreaming().isValid()) {
+ System.out.println("Websocket not valid!");
+ return;
+}
+
// Listen to the AAPL and TSLA trades and all ('*') bars.
-// Note this will connect the websocket and wait for authorization
-// if it isn't already connected.
alpacaAPI.marketDataStreaming().subscribe(
Arrays.asList("AAPL", "TSLA"),
null,
Arrays.asList("*"));
-```
-The following methods show how you can control the state of the [`MarketDataWebsocket`](src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/MarketDataWebsocket.java) directly.
-```java
-// Note that you usually won't need to call connect() and waitForAuthorization()
-// directly, as they are automatically called when subscribing to streams.
-alpacaAPI.marketDataStreaming().connect();
-alpacaAPI.marketDataStreaming().waitForAuthorization();
-System.out.println(alpacaAPI.marketDataStreaming().isValid());
+// Wait a few seconds
+Thread.sleep(5000);
-// You can manually disconnect the websocket as needed
+// Manually disconnect the websocket
alpacaAPI.marketDataStreaming().disconnect();
```
diff --git a/src/main/java/net/jacobpeterson/alpaca/websocket/AlpacaWebsocketInterface.java b/src/main/java/net/jacobpeterson/alpaca/websocket/AlpacaWebsocketInterface.java
index 272774f6..e7d8b60c 100644
--- a/src/main/java/net/jacobpeterson/alpaca/websocket/AlpacaWebsocketInterface.java
+++ b/src/main/java/net/jacobpeterson/alpaca/websocket/AlpacaWebsocketInterface.java
@@ -48,14 +48,17 @@ public interface AlpacaWebsocketInterface getAuthorizationFuture();
/**
- * Waits for {@link #getAuthorizationFuture()} to complete and returns its value. After 10 seconds of waiting, this
- * will timeout then return false.
+ * Waits for {@link #getAuthorizationFuture()} to complete and returns its value, except when timeout
+ * time has elapsed, then this will return false.
+ *
+ * @param timeout the timeout time
+ * @param unit the timeout {@link TimeUnit}
*
* @return a boolean
*/
- default boolean waitForAuthorization() {
+ default boolean waitForAuthorization(long timeout, TimeUnit unit) {
try {
- return getAuthorizationFuture().get(10, TimeUnit.SECONDS);
+ return getAuthorizationFuture().get(timeout, unit);
} catch (InterruptedException | ExecutionException | TimeoutException ignored) {}
return false;
}
diff --git a/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/MarketDataWebsocket.java b/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/MarketDataWebsocket.java
index ad189169..48953560 100644
--- a/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/MarketDataWebsocket.java
+++ b/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/MarketDataWebsocket.java
@@ -27,6 +27,7 @@
import java.util.HashSet;
import java.util.List;
import java.util.Set;
+import java.util.concurrent.TimeUnit;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Preconditions.checkState;
@@ -107,7 +108,7 @@ protected void onConnection() {
@Override
protected void onReconnection() {
sendAuthenticationMessage();
- if (waitForAuthorization()) {
+ if (waitForAuthorization(5, TimeUnit.SECONDS)) {
subscribeToControl(Iterables.toArray(listenedMarketDataMessageTypes, MarketDataMessageType.class));
subscribe(subscribedTrades, subscribedQuotes, subscribedBars);
}
@@ -292,12 +293,7 @@ public void unsubscribe(Collection tradeSymbols, Collection quot
private void sendSubscriptionUpdate(Collection tradeSymbols, Collection quoteSymbols,
Collection barSymbols, boolean subscribe) {
if (!isConnected()) {
- connect();
-
- if (!waitForAuthorization()) {
- LOGGER.error("Not subscribing to streams due to unauthorized {} websocket.", websocketName);
- return;
- }
+ throw new IllegalStateException("This websocket must be connected before sending subscription updates!");
}
/* Format of message is:
diff --git a/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/MarketDataWebsocketInterface.java b/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/MarketDataWebsocketInterface.java
index 2170e898..9ac90112 100644
--- a/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/MarketDataWebsocketInterface.java
+++ b/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/MarketDataWebsocketInterface.java
@@ -28,10 +28,6 @@ public interface MarketDataWebsocketInterface extends AlpacaWebsocketInterface
* Note that any one of the given {@link Collection}s can contain the wildcard character e.g. "*" to subscribe to
* ALL available symbols.
- *
- * Note that this will call {@link MarketDataWebsocketInterface#connect()} and {@link
- * MarketDataWebsocketInterface#waitForAuthorization()} if {@link MarketDataWebsocketInterface#isConnected()}
- * returns false.
*
* @param tradeSymbols a {@link Collection} of symbols to subscribe to trades or null for no change
* @param quoteSymbols a {@link Collection} of symbols to subscribe to quotes or null for no change
diff --git a/src/main/java/net/jacobpeterson/alpaca/websocket/streaming/StreamingWebsocket.java b/src/main/java/net/jacobpeterson/alpaca/websocket/streaming/StreamingWebsocket.java
index 8c52b078..57ede8a4 100644
--- a/src/main/java/net/jacobpeterson/alpaca/websocket/streaming/StreamingWebsocket.java
+++ b/src/main/java/net/jacobpeterson/alpaca/websocket/streaming/StreamingWebsocket.java
@@ -27,6 +27,7 @@
import java.util.HashSet;
import java.util.List;
import java.util.Set;
+import java.util.concurrent.TimeUnit;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Preconditions.checkState;
@@ -94,7 +95,7 @@ protected void onConnection() {
@Override
protected void onReconnection() {
sendAuthenticationMessage();
- if (waitForAuthorization()) {
+ if (waitForAuthorization(5, TimeUnit.SECONDS)) {
streams(Iterables.toArray(listenedStreamMessageTypes, StreamingMessageType.class));
}
}
@@ -214,15 +215,6 @@ public void streams(StreamingMessageType... streamingMessageTypes) {
.filter(not(SUBSCRIBABLE_STREAMING_MESSAGE_TYPES::contains))
.forEach(listenedStreamMessageTypes::add);
- if (!isConnected()) {
- connect();
-
- if (!waitForAuthorization()) {
- LOGGER.error("Not subscribing to streams due to unauthorized {} websocket.", websocketName);
- return;
- }
- }
-
// Stream request format:
// {
// "action": "listen",
@@ -241,6 +233,8 @@ public void streams(StreamingMessageType... streamingMessageTypes) {
if (streamsArray.isEmpty()) {
return;
+ } else if (!isConnected()) {
+ throw new IllegalStateException("This websocket must be connected before subscribing to streams!");
}
JsonObject dataObject = new JsonObject();
diff --git a/src/main/java/net/jacobpeterson/alpaca/websocket/streaming/StreamingWebsocketInterface.java b/src/main/java/net/jacobpeterson/alpaca/websocket/streaming/StreamingWebsocketInterface.java
index 07112a68..44f0042e 100644
--- a/src/main/java/net/jacobpeterson/alpaca/websocket/streaming/StreamingWebsocketInterface.java
+++ b/src/main/java/net/jacobpeterson/alpaca/websocket/streaming/StreamingWebsocketInterface.java
@@ -12,10 +12,6 @@ public interface StreamingWebsocketInterface extends AlpacaWebsocketInterfacestreamingMessageTypes.
- *
- * Note that this will call {@link StreamingWebsocketInterface#connect()} and {@link
- * StreamingWebsocketInterface#waitForAuthorization()} if {@link StreamingWebsocketInterface#isConnected()} returns
- * false.
*
* @param streamingMessageTypes the {@link StreamingMessageType}s
*/
From 2a95a4911f3a0eedd3a8c9b67a07d79f9b059b3f Mon Sep 17 00:00:00 2001
From: Jacob Peterson
Date: Thu, 5 Aug 2021 14:17:24 -0600
Subject: [PATCH 09/84] Add websocket clarification to README
---
README.md | 8 ++++++--
.../websocket/AlpacaWebsocketInterface.java | 18 +++++++++---------
2 files changed, 15 insertions(+), 11 deletions(-)
diff --git a/README.md b/README.md
index b0c47a8d..cca3aa50 100644
--- a/README.md
+++ b/README.md
@@ -375,7 +375,9 @@ StreamingListener streamingListener = (messageType, message) ->
alpacaAPI.streaming().setListener(streamingListener);
// Listen 'AuthorizationMessage' and 'ListeningMessage' messages that contain
-// information about the stream's current state.
+// information about the stream's current state. Note that these are subscribed
+// to before the websocket is connected since these messages usually are sent
+// upon websocket connection.
alpacaAPI.streaming().streams(StreamingMessageType.AUTHORIZATION,
StreamingMessageType.LISTENING);
@@ -408,7 +410,9 @@ MarketDataListener marketDataListener = (messageType, message) ->
alpacaAPI.marketDataStreaming().setListener(marketDataListener);
// Listen to 'SubscriptionsMessage', 'SuccessMessage', and 'ErrorMessage' control messages
-// that contain information about the stream's current state.
+// that contain information about the stream's current state. Note that these are subscribed
+// to before the websocket is connected since these messages usually are sent
+// upon websocket connection.
alpacaAPI.marketDataStreaming().subscribeToControl(
MarketDataMessageType.SUCCESS,
MarketDataMessageType.SUBSCRIPTION,
diff --git a/src/main/java/net/jacobpeterson/alpaca/websocket/AlpacaWebsocketInterface.java b/src/main/java/net/jacobpeterson/alpaca/websocket/AlpacaWebsocketInterface.java
index e7d8b60c..f524e1df 100644
--- a/src/main/java/net/jacobpeterson/alpaca/websocket/AlpacaWebsocketInterface.java
+++ b/src/main/java/net/jacobpeterson/alpaca/websocket/AlpacaWebsocketInterface.java
@@ -36,6 +36,15 @@ public interface AlpacaWebsocketInterface
Date: Thu, 5 Aug 2021 14:31:58 -0600
Subject: [PATCH 10/84] Update to 8.2
---
README.md | 4 ++--
build.gradle | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/README.md b/README.md
index cca3aa50..e56eab73 100644
--- a/README.md
+++ b/README.md
@@ -17,7 +17,7 @@ If you are using Gradle as your build tool, add the following dependency to your
```
dependencies {
- implementation group: 'net.jacobpeterson', name: 'alpaca-java', version: '8.1'
+ implementation group: 'net.jacobpeterson', name: 'alpaca-java', version: '8.2'
}
```
@@ -27,7 +27,7 @@ If you are using Maven as your build tool, add the following dependency to your
net.jacobpeterson
alpaca-java
- 8.1
+ 8.2
compile
```
diff --git a/build.gradle b/build.gradle
index 6e25af5e..cbace30e 100644
--- a/build.gradle
+++ b/build.gradle
@@ -30,7 +30,7 @@ tasks.getByName("generateJsonSchema2Pojo").enabled(false) // Disable default 'js
archivesBaseName = 'alpaca-java'
group = 'net.jacobpeterson'
-version = '8.1-SNAPSHOT'
+version = '8.2-SNAPSHOT'
repositories {
mavenCentral()
From 9f6a5493a27381fd76512bec5b48bc7ad9ec3ab4 Mon Sep 17 00:00:00 2001
From: Jacob Peterson
Date: Mon, 13 Sep 2021 15:24:52 -0600
Subject: [PATCH 11/84] Add BarAdjustment and BarTimePeriod enums to getBars()
---
README.md | 6 ++-
.../historical/bar/enums/bar_adjustment.json | 24 ++++++++++++
...s_time_frame.json => bar_time_period.json} | 12 +++---
.../rest/endpoint/MarketDataEndpoint.java | 39 ++++++++++++-------
.../rest/endpoint/PositionsEndpoint.java | 7 +++-
5 files changed, 65 insertions(+), 23 deletions(-)
create mode 100644 schema_json/endpoint/market_data/historical/bar/enums/bar_adjustment.json
rename schema_json/endpoint/market_data/historical/bar/enums/{bars_time_frame.json => bar_time_period.json} (68%)
diff --git a/README.md b/README.md
index e56eab73..7886cd50 100644
--- a/README.md
+++ b/README.md
@@ -101,7 +101,7 @@ The Data API v2 provides market data through an easy-to-use API for historical d
Example usage:
```java
try {
- // Get AAPL one hour bars from 7/6/2021 market open
+ // Get AAPL one hour, split-adjusted bars from 7/6/2021 market open
// to 7/8/2021 market close and print them out
BarsResponse aaplBarsResponse = alpacaAPI.marketData().getBars(
"AAPL",
@@ -109,7 +109,9 @@ try {
ZonedDateTime.of(2021, 7, 8, 12 + 4, 0, 0, 0, ZoneId.of("America/New_York")),
null,
null,
- BarsTimeFrame.ONE_HOUR);
+ 1,
+ BarTimePeriod.HOUR,
+ BarAdjustment.SPLIT);
aaplBarsResponse.getBars().forEach(System.out::println);
// Get AAPL first 10 trades on 7/8/2021 at market open and print them out
diff --git a/schema_json/endpoint/market_data/historical/bar/enums/bar_adjustment.json b/schema_json/endpoint/market_data/historical/bar/enums/bar_adjustment.json
new file mode 100644
index 00000000..4f28b6ed
--- /dev/null
+++ b/schema_json/endpoint/market_data/historical/bar/enums/bar_adjustment.json
@@ -0,0 +1,24 @@
+{
+ "type": "string",
+ "title": "See Historical Data.",
+ "enum": [
+ "raw",
+ "split",
+ "dividend",
+ "all"
+ ],
+ "javaEnums": [
+ {
+ "name": "RAW"
+ },
+ {
+ "name": "SPLIT"
+ },
+ {
+ "name": "DIVIDEND"
+ },
+ {
+ "name": "ALL"
+ }
+ ]
+}
diff --git a/schema_json/endpoint/market_data/historical/bar/enums/bars_time_frame.json b/schema_json/endpoint/market_data/historical/bar/enums/bar_time_period.json
similarity index 68%
rename from schema_json/endpoint/market_data/historical/bar/enums/bars_time_frame.json
rename to schema_json/endpoint/market_data/historical/bar/enums/bar_time_period.json
index 89eb394f..627d9413 100644
--- a/schema_json/endpoint/market_data/historical/bar/enums/bars_time_frame.json
+++ b/schema_json/endpoint/market_data/historical/bar/enums/bar_time_period.json
@@ -2,19 +2,19 @@
"type": "string",
"title": "See Historical Data.",
"enum": [
- "1Min",
- "1Hour",
- "1Day"
+ "Min",
+ "Hour",
+ "Day"
],
"javaEnums": [
{
- "name": "ONE_MINUTE"
+ "name": "MINUTE"
},
{
- "name": "ONE_HOUR"
+ "name": "HOUR"
},
{
- "name": "ONE_DAY"
+ "name": "DAY"
}
]
}
diff --git a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/MarketDataEndpoint.java b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/MarketDataEndpoint.java
index 9a270e21..a1b4c425 100644
--- a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/MarketDataEndpoint.java
+++ b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/MarketDataEndpoint.java
@@ -3,7 +3,8 @@
import com.google.gson.reflect.TypeToken;
import net.jacobpeterson.alpaca.model.endpoint.marketdata.historical.bar.Bar;
import net.jacobpeterson.alpaca.model.endpoint.marketdata.historical.bar.BarsResponse;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.historical.bar.enums.BarsTimeFrame;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.historical.bar.enums.BarAdjustment;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.historical.bar.enums.BarTimePeriod;
import net.jacobpeterson.alpaca.model.endpoint.marketdata.historical.quote.LatestQuoteResponse;
import net.jacobpeterson.alpaca.model.endpoint.marketdata.historical.quote.Quote;
import net.jacobpeterson.alpaca.model.endpoint.marketdata.historical.quote.QuotesResponse;
@@ -180,26 +181,34 @@ public LatestQuoteResponse getLatestQuote(String symbol) throws AlpacaClientExce
/**
* Gets {@link Bar} aggregate historical data for the requested security.
*
- * @param symbol the symbol to query for
- * @param start filter data equal to or after this {@link ZonedDateTime}. Fractions of a second are not
- * accepted.
- * @param end filter data equal to or before this {@link ZonedDateTime}. Fractions of a second are not
- * accepted.
- * @param limit number of data points to return. Must be in range 1-10000, defaults to 1000 if null
- * is given
- * @param pageToken pagination token to continue from
- * @param timeFrame the {@link BarsTimeFrame} for the aggregation
+ * @param symbol the symbol to query for
+ * @param start filter data equal to or after this {@link ZonedDateTime}. Fractions of a second are
+ * not accepted.
+ * @param end filter data equal to or before this {@link ZonedDateTime}. Fractions of a second are
+ * not accepted.
+ * @param limit number of data points to return. Must be in range 1-10000, defaults to 1000 if
+ * null is given
+ * @param pageToken pagination token to continue from
+ * @param barTimePeriodDuration the duration for the given barTimePeriod parameter. e.g. for
+ * 15Min bars, you would supply 15 for this parameter and
+ * {@link BarTimePeriod#MINUTE} for the barTimePeriod parameter.
+ * @param barTimePeriod the {@link BarTimePeriod} e.g. for 15Min bars, you would supply {@link
+ * BarTimePeriod#MINUTE} for this parameter and 15 for the
+ * barTimePeriodDuration parameter.
+ * @param barAdjustment specifies the corporate action adjustment for the stocks. Default value is {@link
+ * BarAdjustment#RAW}.
*
* @return the {@link BarsResponse}
*
* @throws AlpacaClientException thrown for {@link AlpacaClientException}s
*/
public BarsResponse getBars(String symbol, ZonedDateTime start, ZonedDateTime end, Integer limit,
- String pageToken, BarsTimeFrame timeFrame) throws AlpacaClientException {
+ String pageToken, int barTimePeriodDuration, BarTimePeriod barTimePeriod, BarAdjustment barAdjustment)
+ throws AlpacaClientException {
checkNotNull(symbol);
checkNotNull(start);
checkNotNull(end);
- checkNotNull(timeFrame);
+ checkNotNull(barTimePeriod);
HttpUrl.Builder urlBuilder = alpacaClient.urlBuilder()
.addPathSegment(endpointPathSegment)
@@ -208,7 +217,7 @@ public BarsResponse getBars(String symbol, ZonedDateTime start, ZonedDateTime en
urlBuilder.addQueryParameter("start", FormatUtil.toRFC3339Format(start));
urlBuilder.addQueryParameter("end", FormatUtil.toRFC3339Format(end));
- urlBuilder.addQueryParameter("timeframe", timeFrame.toString());
+ urlBuilder.addQueryParameter("timeframe", barTimePeriodDuration + barTimePeriod.toString());
if (limit != null) {
urlBuilder.addQueryParameter("limit", limit.toString());
@@ -218,6 +227,10 @@ public BarsResponse getBars(String symbol, ZonedDateTime start, ZonedDateTime en
urlBuilder.addQueryParameter("page_token", pageToken);
}
+ if (barAdjustment != null) {
+ urlBuilder.addQueryParameter("adjustment", barAdjustment.toString());
+ }
+
Request request = alpacaClient.requestBuilder(urlBuilder.build())
.get()
.build();
diff --git a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/PositionsEndpoint.java b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/PositionsEndpoint.java
index 676537ba..26d72861 100644
--- a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/PositionsEndpoint.java
+++ b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/PositionsEndpoint.java
@@ -13,7 +13,6 @@
import java.util.ArrayList;
import java.util.List;
-import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
/**
@@ -98,6 +97,11 @@ public List closeAll(Boolean cancelOrders) throws AlpacaClie
* positions.
*
* @param symbolOrAssetID the symbol or {@link Asset#getId()}
+ * @param quantity the number of shares to liquidate. Can accept up to 9 decimal points. Cannot
+ * work with percentage.
+ * @param percentage the percentage of the position to liquidate. Must be between 0 and
+ * 100. Would only sell fractional if position is originally fractional. Can
+ * accept up to 9 decimal points. Cannot work with quantity.
*
* @return a closing {@link Position} {@link Order}
*
@@ -105,7 +109,6 @@ public List closeAll(Boolean cancelOrders) throws AlpacaClie
*/
public Order close(String symbolOrAssetID, Integer quantity, Double percentage) throws AlpacaClientException {
checkNotNull(symbolOrAssetID);
- checkArgument(quantity != null ^ percentage != null, "Either 'quantity' or 'percentage' are required.");
HttpUrl.Builder urlBuilder = alpacaClient.urlBuilder()
.addPathSegment(endpointPathSegment)
From 1d7609275498816d2e97a7310b3ff853600196e3 Mon Sep 17 00:00:00 2001
From: Jacob Peterson
Date: Mon, 13 Sep 2021 15:26:13 -0600
Subject: [PATCH 12/84] Update to 8.3
---
README.md | 4 ++--
build.gradle | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/README.md b/README.md
index 7886cd50..946e09d6 100644
--- a/README.md
+++ b/README.md
@@ -17,7 +17,7 @@ If you are using Gradle as your build tool, add the following dependency to your
```
dependencies {
- implementation group: 'net.jacobpeterson', name: 'alpaca-java', version: '8.2'
+ implementation group: 'net.jacobpeterson', name: 'alpaca-java', version: '8.3'
}
```
@@ -27,7 +27,7 @@ If you are using Maven as your build tool, add the following dependency to your
net.jacobpeterson
alpaca-java
- 8.2
+ 8.3
compile
```
diff --git a/build.gradle b/build.gradle
index cbace30e..1eb30114 100644
--- a/build.gradle
+++ b/build.gradle
@@ -30,7 +30,7 @@ tasks.getByName("generateJsonSchema2Pojo").enabled(false) // Disable default 'js
archivesBaseName = 'alpaca-java'
group = 'net.jacobpeterson'
-version = '8.2-SNAPSHOT'
+version = '8.3-SNAPSHOT'
repositories {
mavenCentral()
From 3064fa3d51298f355c966aadb7fe88c390dc0f0e Mon Sep 17 00:00:00 2001
From: Jacob Peterson
Date: Mon, 20 Sep 2021 08:11:41 -0600
Subject: [PATCH 13/84] Fix getSnapshot path segment typo
---
.../jacobpeterson/alpaca/rest/endpoint/MarketDataEndpoint.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/MarketDataEndpoint.java b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/MarketDataEndpoint.java
index a1b4c425..45fc4a08 100644
--- a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/MarketDataEndpoint.java
+++ b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/MarketDataEndpoint.java
@@ -279,7 +279,7 @@ public Snapshot getSnapshot(String symbol) throws AlpacaClientException {
HttpUrl.Builder urlBuilder = alpacaClient.urlBuilder()
.addPathSegment(endpointPathSegment)
.addPathSegment(symbol)
- .addPathSegment("shapshot");
+ .addPathSegment("snapshot");
Request request = alpacaClient.requestBuilder(urlBuilder.build())
.get()
From 9bceea3171eee8078549d02f30138b18ef729dc0 Mon Sep 17 00:00:00 2001
From: Jacob Peterson
Date: Mon, 20 Sep 2021 08:12:54 -0600
Subject: [PATCH 14/84] Update to 8.3.1
---
README.md | 4 ++--
build.gradle | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/README.md b/README.md
index 946e09d6..b8ac95e1 100644
--- a/README.md
+++ b/README.md
@@ -17,7 +17,7 @@ If you are using Gradle as your build tool, add the following dependency to your
```
dependencies {
- implementation group: 'net.jacobpeterson', name: 'alpaca-java', version: '8.3'
+ implementation group: 'net.jacobpeterson', name: 'alpaca-java', version: '8.3.1'
}
```
@@ -27,7 +27,7 @@ If you are using Maven as your build tool, add the following dependency to your
net.jacobpeterson
alpaca-java
- 8.3
+ 8.3.1
compile
```
diff --git a/build.gradle b/build.gradle
index 1eb30114..d5566da8 100644
--- a/build.gradle
+++ b/build.gradle
@@ -30,7 +30,7 @@ tasks.getByName("generateJsonSchema2Pojo").enabled(false) // Disable default 'js
archivesBaseName = 'alpaca-java'
group = 'net.jacobpeterson'
-version = '8.3-SNAPSHOT'
+version = '8.3.1-SNAPSHOT'
repositories {
mavenCentral()
From 5df5e105706f7135df28255f1019137d8db93e52 Mon Sep 17 00:00:00 2001
From: Jacob Peterson <14127217+Petersoj@users.noreply.github.com>
Date: Tue, 12 Oct 2021 17:20:56 -0600
Subject: [PATCH 15/84] Update README, cleanup AlpacaAPITest
---
README.md | 3 +-
.../alpaca/test/live/AlpacaAPITest.java | 41 +++++++++++--------
2 files changed, 26 insertions(+), 18 deletions(-)
diff --git a/README.md b/README.md
index b8ac95e1..f571e41e 100644
--- a/README.md
+++ b/README.md
@@ -45,7 +45,7 @@ data_api_type =
The default values for `alpaca.properties` can be found [here](src/main/resources/alpaca.default.properties).
# Logger
-For logging, this library uses [SLF4j](http://www.slf4j.org/) which serves as an interface for various logging frameworks. This enables you to use whatever logging framework you would like. However, if you do not add a logging framework as a dependency in your project, the console will output a message stating that SLF4j is defaulting to a no-operation (NOP) logger implementation. To enable logging, add a logging framework of your choice as a dependency to your project such as [Log4j 2](http://logging.apache.org/log4j/2.x/index.html), [SLF4j-simple](http://www.slf4j.org/manual.html), or [Apache Commons Logging](https://commons.apache.org/proper/commons-logging/).
+For logging, this library uses [SLF4j](http://www.slf4j.org/) which serves as an interface for various logging frameworks. This enables you to use whatever logging framework you would like. However, if you do not add a logging framework as a dependency in your project, the console will output a message stating that SLF4j is defaulting to a no-operation (NOP) logger implementation. To enable logging, add a logging framework of your choice as a dependency to your project such as [Logback](http://logback.qos.ch/), [Log4j 2](http://logging.apache.org/log4j/2.x/index.html), [SLF4j-simple](http://www.slf4j.org/manual.html), or [Apache Commons Logging](https://commons.apache.org/proper/commons-logging/).
# Examples
Note that the examples below are not exhaustive. Refer to the [Javadoc](https://javadoc.io/doc/net.jacobpeterson/alpaca-java) for all classes and method signatures.
@@ -471,6 +471,7 @@ Note that the live tests will modify your account minimally. It's meant to test
- Use [TA4j](https://github.com/ta4j/ta4j) `Num` interface instead of `Double` for number variables so that users can use either `Double` or `BigDecimal` for performance or precision in price data.
- Add [TimeSeriesDataStore](https://github.com/Petersoj/TimeSeriesDataStore) using Alpaca Data API
+# Contributing
Contributions are welcome!
If you are creating a Pull Request, be sure to create a new branch in your forked repository for your feature or bug fix instead of committing directly to the `master` branch in your fork.
diff --git a/src/test/java/net/jacobpeterson/alpaca/test/live/AlpacaAPITest.java b/src/test/java/net/jacobpeterson/alpaca/test/live/AlpacaAPITest.java
index 00fe9e96..326a6aaf 100644
--- a/src/test/java/net/jacobpeterson/alpaca/test/live/AlpacaAPITest.java
+++ b/src/test/java/net/jacobpeterson/alpaca/test/live/AlpacaAPITest.java
@@ -1,5 +1,6 @@
package net.jacobpeterson.alpaca.test.live;
+import net.jacobpeterson.alpaca.AlpacaAPI;
import net.jacobpeterson.alpaca.model.endpoint.account.Account;
import net.jacobpeterson.alpaca.model.endpoint.accountactivities.AccountActivity;
import net.jacobpeterson.alpaca.model.endpoint.accountactivities.NonTradeActivity;
@@ -12,21 +13,28 @@
import net.jacobpeterson.alpaca.model.endpoint.common.enums.SortDirection;
import net.jacobpeterson.alpaca.model.endpoint.order.Order;
import net.jacobpeterson.alpaca.model.endpoint.order.enums.CurrentOrderStatus;
-import net.jacobpeterson.alpaca.AlpacaAPI;
import net.jacobpeterson.alpaca.rest.AlpacaClientException;
+import net.jacobpeterson.alpaca.rest.endpoint.AccountActivitiesEndpoint;
import net.jacobpeterson.alpaca.rest.endpoint.AccountConfigurationEndpoint;
import net.jacobpeterson.alpaca.rest.endpoint.AccountEndpoint;
import net.jacobpeterson.alpaca.rest.endpoint.ClockEndpoint;
-import net.jacobpeterson.alpaca.rest.endpoint.AccountActivitiesEndpoint;
import net.jacobpeterson.alpaca.rest.endpoint.OrdersEndpoint;
-import org.junit.jupiter.api.*;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.MethodOrderer;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestMethodOrder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.time.ZonedDateTime;
+import java.util.Collection;
import java.util.List;
-import static org.junit.jupiter.api.Assertions.*;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.fail;
/**
* {@link AlpacaAPITest} tests live endpoints using Alpaca Paper credentials given in the
@@ -35,14 +43,14 @@
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class AlpacaAPITest {
- private static final Logger LOGGER = LoggerFactory.getLogger(AlpacaAPITest.class);
- private static final int RATE_LIMIT_MILLIS = 200; // Wait 200ms between every test to prevent rate-limiting
-
static {
// Log trace-level
System.setProperty("org.slf4j.simpleLogger.log.net.jacobpeterson", "trace");
}
+ private static final Logger LOGGER = LoggerFactory.getLogger(AlpacaAPITest.class);
+ private static final int RATE_LIMIT_MILLIS = 200; // Wait 200ms between every test to prevent rate-limiting
+
private static AlpacaAPI alpacaAPI;
private static boolean marketOpen;
private static AccountConfiguration accountConfiguration;
@@ -83,7 +91,7 @@ public void afterEach() {
*/
@Test
@org.junit.jupiter.api.Order(1)
- public void test_ClockEndpoint_get() throws AlpacaClientException {
+ public void testClockEndpointGet() throws AlpacaClientException {
Clock clock = alpacaAPI.clock().get();
assertNotNull(clock);
@@ -110,7 +118,7 @@ public void test_ClockEndpoint_get() throws AlpacaClientException {
*/
@Test
@SuppressWarnings("ResultOfMethodCallIgnored")
- public void test_AccountEndpoint_get() throws AlpacaClientException, NumberFormatException {
+ public void testAccountEndpointGet() throws AlpacaClientException, NumberFormatException {
Account account = alpacaAPI.account().get();
assertNotNull(account);
@@ -148,14 +156,13 @@ public void test_AccountEndpoint_get() throws AlpacaClientException, NumberForma
}
/**
- * Tests @{@link AccountActivitiesEndpoint#get(ZonedDateTime,
- * ZonedDateTime, ZonedDateTime, SortDirection, Integer, String, ActivityType...)} one {@link AccountActivity}
- * exists until now.
+ * Tests @{@link AccountActivitiesEndpoint#get(ZonedDateTime, ZonedDateTime, ZonedDateTime, SortDirection, Integer,
+ * String, ActivityType...)} one {@link AccountActivity} exists until now.
*
* @throws AlpacaClientException thrown for {@link AlpacaClientException}s
*/
@Test
- public void test_AccountActivitiesEndpoint_get_One_Activity_Exists_Until_Now() throws AlpacaClientException {
+ public void testAccountActivitiesEndpointGetOneActivityExistsUntilNow() throws AlpacaClientException {
List accountActivities = alpacaAPI.accountActivities().get(
null,
ZonedDateTime.now(),
@@ -203,7 +210,7 @@ public void test_AccountActivitiesEndpoint_get_One_Activity_Exists_Until_Now() t
*/
@Test
@org.junit.jupiter.api.Order(1)
- public void test_AccountConfigurationEndpoint_get() throws AlpacaClientException {
+ public void testAccountConfigurationEndpointGet() throws AlpacaClientException {
AccountConfiguration accountConfiguration = alpacaAPI.accountConfiguration().get();
assertNotNull(accountConfiguration);
@@ -224,7 +231,7 @@ public void test_AccountConfigurationEndpoint_get() throws AlpacaClientException
*/
@Test
@org.junit.jupiter.api.Order(2)
- public void test_AccountConfigurationEndpoint_set() throws AlpacaClientException {
+ public void testAccountConfigurationEndpointSet() throws AlpacaClientException {
if (accountConfiguration == null) {
AccountConfiguration newAccountConfiguration = new AccountConfiguration(
DTBPCheck.BOTH,
@@ -240,12 +247,12 @@ public void test_AccountConfigurationEndpoint_set() throws AlpacaClientException
/**
* Test {@link OrdersEndpoint#get(CurrentOrderStatus, Integer, ZonedDateTime, ZonedDateTime, SortDirection, Boolean,
- * List)} one {@link Order} exists until now.
+ * Collection)} one {@link Order} exists until now.
*
* @throws AlpacaClientException thrown for {@link AlpacaClientException}s
*/
@Test
- public void test_OrdersEndpoint_get_One_Order_Exists_Until_now() throws AlpacaClientException {
+ public void testOrdersEndpointGetOneOrderExistsUntilNow() throws AlpacaClientException {
List orders = alpacaAPI.orders().get(
CurrentOrderStatus.ALL,
1,
From 95cc9352c032cdbc089c151da43557fa1bcabfca Mon Sep 17 00:00:00 2001
From: Jacob Peterson <14127217+Petersoj@users.noreply.github.com>
Date: Thu, 11 Nov 2021 00:08:48 -0700
Subject: [PATCH 16/84] Add more notes about AlpacaAPI constructors in README,
fix javadocs
---
README.md | 9 ++++--
.../net/jacobpeterson/alpaca/AlpacaAPI.java | 32 +++++++++----------
2 files changed, 23 insertions(+), 18 deletions(-)
diff --git a/README.md b/README.md
index f571e41e..a0dce667 100644
--- a/README.md
+++ b/README.md
@@ -60,10 +60,15 @@ Example usage:
// This constructor uses the 'alpaca.properties' file on the classpath for configuration
AlpacaAPI alpacaAPI = new AlpacaAPI();
-// This constructor passes in a 'keyID' and 'secret' String
+// This constructor passes in a 'keyID' and 'secretKey' and uses the endpoint API type and data API
+// type defined in the 'alpaca.properties' file (which default to 'paper' and 'iex' respectively)
String keyID = "";
String secretKey = "";
-AlpacaAPI alpacaAPI = new AlpacaAPI(keyID, secret);
+AlpacaAPI alpacaAPI = new AlpacaAPI(keyID, secretKey);
+
+// This constructor passes in a 'keyID' and 'secretKey' and uses the passed in endpoint API type
+// and data API type (which are 'LIVE' and 'SIP' respectively in this example)
+AlpacaAPI alpacaAPI = new AlpacaAPI(keyID, secretKey, EndpointAPIType.LIVE, DataAPIType.SIP);
// This constructor is for OAuth tokens
String oAuthToken = "";
diff --git a/src/main/java/net/jacobpeterson/alpaca/AlpacaAPI.java b/src/main/java/net/jacobpeterson/alpaca/AlpacaAPI.java
index 616e53e4..b874d794 100644
--- a/src/main/java/net/jacobpeterson/alpaca/AlpacaAPI.java
+++ b/src/main/java/net/jacobpeterson/alpaca/AlpacaAPI.java
@@ -75,11 +75,11 @@ public AlpacaAPI() {
/**
* Instantiates a new {@link AlpacaAPI}.
*
- * @param keyID the key ID
- * @param secret the secret
+ * @param keyID the key ID
+ * @param secretKey the secret key
*/
- public AlpacaAPI(String keyID, String secret) {
- this(null, keyID, secret, null,
+ public AlpacaAPI(String keyID, String secretKey) {
+ this(null, keyID, secretKey, null,
AlpacaProperties.ENDPOINT_API_TYPE,
AlpacaProperties.DATA_API_TYPE);
}
@@ -88,12 +88,12 @@ public AlpacaAPI(String keyID, String secret) {
* Instantiates a new {@link AlpacaAPI}.
*
* @param keyID the key ID
- * @param secret the secret
+ * @param secretKey the secret key
* @param endpointAPIType the {@link EndpointAPIType}
* @param dataAPIType the {@link DataAPIType}
*/
- public AlpacaAPI(String keyID, String secret, EndpointAPIType endpointAPIType, DataAPIType dataAPIType) {
- this(null, keyID, secret, null, endpointAPIType, dataAPIType);
+ public AlpacaAPI(String keyID, String secretKey, EndpointAPIType endpointAPIType, DataAPIType dataAPIType) {
+ this(null, keyID, secretKey, null, endpointAPIType, dataAPIType);
}
/**
@@ -155,11 +155,9 @@ public AlpacaAPI(OkHttpClient okHttpClient, String keyID, String secretKey, Stri
brokerClient = new AlpacaClient(okHttpClient, keyID, secretKey,
brokerHostSubdomain, VERSION_2_PATH_SEGMENT);
dataClient = new AlpacaClient(okHttpClient, keyID, secretKey, "data", VERSION_2_PATH_SEGMENT);
- marketDataWebsocket = new MarketDataWebsocket(okHttpClient, dataAPIType, keyID, secretKey);
} else {
brokerClient = new AlpacaClient(okHttpClient, oAuthToken, brokerHostSubdomain, VERSION_2_PATH_SEGMENT);
dataClient = null;
- marketDataWebsocket = null;
}
accountEndpoint = new AccountEndpoint(brokerClient);
@@ -174,10 +172,12 @@ public AlpacaAPI(OkHttpClient okHttpClient, String keyID, String secretKey, Stri
accountActivitiesEndpoint = new AccountActivitiesEndpoint(brokerClient);
portfolioHistoryEndpoint = new PortfolioHistoryEndpoint(brokerClient);
streamingWebsocket = new StreamingWebsocket(okHttpClient, brokerHostSubdomain, keyID, secretKey, oAuthToken);
+ marketDataWebsocket = dataClient == null ? null :
+ new MarketDataWebsocket(okHttpClient, dataAPIType, keyID, secretKey);
}
/**
- * @return {@link AccountEndpoint}
+ * @return the {@link AccountEndpoint}
*/
public AccountEndpoint account() {
return accountEndpoint;
@@ -191,42 +191,42 @@ public MarketDataEndpoint marketData() {
}
/**
- * @return {@link OrdersEndpoint}
+ * @return the {@link OrdersEndpoint}
*/
public OrdersEndpoint orders() {
return ordersEndpoint;
}
/**
- * @return {@link PositionsEndpoint}
+ * @return the {@link PositionsEndpoint}
*/
public PositionsEndpoint positions() {
return positionsEndpoint;
}
/**
- * @return {@link AssetsEndpoint}
+ * @return the {@link AssetsEndpoint}
*/
public AssetsEndpoint assets() {
return assetsEndpoint;
}
/**
- * @return {@link WatchlistEndpoint}
+ * @return the {@link WatchlistEndpoint}
*/
public WatchlistEndpoint watchlist() {
return watchlistEndpoint;
}
/**
- * @return {@link CalendarEndpoint}
+ * @return the {@link CalendarEndpoint}
*/
public CalendarEndpoint calendar() {
return calendarEndpoint;
}
/**
- * @return {@link ClockEndpoint}
+ * @return the {@link ClockEndpoint}
*/
public ClockEndpoint clock() {
return clockEndpoint;
From a55256c88fda84cdec0fd22f275d2bfaac2d17ca Mon Sep 17 00:00:00 2001
From: Jacob Peterson <14127217+Petersoj@users.noreply.github.com>
Date: Fri, 19 Nov 2021 09:19:34 -0700
Subject: [PATCH 17/84] Add SSP and SPLIT ActivityType
---
.../account_activities/enums/activity_type.json | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/schema_json/endpoint/account_activities/enums/activity_type.json b/schema_json/endpoint/account_activities/enums/activity_type.json
index 03c44af1..9fae432b 100644
--- a/schema_json/endpoint/account_activities/enums/activity_type.json
+++ b/schema_json/endpoint/account_activities/enums/activity_type.json
@@ -35,7 +35,9 @@
"FEE",
"REORG",
"SC",
- "SSO"
+ "SSO",
+ "SSP",
+ "SPLIT"
],
"javaEnums": [
{
@@ -139,6 +141,12 @@
},
{
"description": "Stock spinoff."
+ },
+ {
+ "description": "Stock split."
+ },
+ {
+ "description": "Stock split."
}
]
}
From 1bde139826f8dc4efcddd0f1d7f2b758ad53b284 Mon Sep 17 00:00:00 2001
From: Jacob Peterson <14127217+Petersoj@users.noreply.github.com>
Date: Fri, 19 Nov 2021 09:20:48 -0700
Subject: [PATCH 18/84] Update to 8.3.2
---
README.md | 4 ++--
build.gradle | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/README.md b/README.md
index a0dce667..d1443c3d 100644
--- a/README.md
+++ b/README.md
@@ -17,7 +17,7 @@ If you are using Gradle as your build tool, add the following dependency to your
```
dependencies {
- implementation group: 'net.jacobpeterson', name: 'alpaca-java', version: '8.3.1'
+ implementation group: 'net.jacobpeterson', name: 'alpaca-java', version: '8.3.2'
}
```
@@ -27,7 +27,7 @@ If you are using Maven as your build tool, add the following dependency to your
net.jacobpeterson
alpaca-java
- 8.3.1
+ 8.3.2
compile
```
diff --git a/build.gradle b/build.gradle
index d5566da8..da880edf 100644
--- a/build.gradle
+++ b/build.gradle
@@ -30,7 +30,7 @@ tasks.getByName("generateJsonSchema2Pojo").enabled(false) // Disable default 'js
archivesBaseName = 'alpaca-java'
group = 'net.jacobpeterson'
-version = '8.3.1-SNAPSHOT'
+version = '8.3.2-SNAPSHOT'
repositories {
mavenCentral()
From 6a45b2bcd2fbdba6c04135a905cf2559152b5e95 Mon Sep 17 00:00:00 2001
From: kurru
Date: Sat, 4 Dec 2021 16:11:11 -0800
Subject: [PATCH 19/84] define new account status enum
---
schema_json/endpoint/account/enums/account_status.json | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/schema_json/endpoint/account/enums/account_status.json b/schema_json/endpoint/account/enums/account_status.json
index 65963f0d..61f7a081 100644
--- a/schema_json/endpoint/account/enums/account_status.json
+++ b/schema_json/endpoint/account/enums/account_status.json
@@ -9,7 +9,8 @@
"APPROVAL_PENDING",
"ACTIVE",
"REJECTED",
- "DISABLED"
+ "DISABLED",
+ "ACTION_REQUIRED"
],
"javaEnums": [
{
@@ -35,6 +36,9 @@
},
{
"description": "The account has been disabled."
+ },
+ {
+ "description": "The account requires manual attention."
}
]
}
From 6ea0ff40050666fc15348717f020047c94a346ce Mon Sep 17 00:00:00 2001
From: Jacob Peterson <14127217+Petersoj@users.noreply.github.com>
Date: Sun, 5 Dec 2021 17:01:03 -0700
Subject: [PATCH 20/84] Update to 8.3.3
---
README.md | 4 ++--
build.gradle | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/README.md b/README.md
index d1443c3d..2be165a6 100644
--- a/README.md
+++ b/README.md
@@ -17,7 +17,7 @@ If you are using Gradle as your build tool, add the following dependency to your
```
dependencies {
- implementation group: 'net.jacobpeterson', name: 'alpaca-java', version: '8.3.2'
+ implementation group: 'net.jacobpeterson', name: 'alpaca-java', version: '8.3.3'
}
```
@@ -27,7 +27,7 @@ If you are using Maven as your build tool, add the following dependency to your
net.jacobpeterson
alpaca-java
- 8.3.2
+ 8.3.3
compile
```
diff --git a/build.gradle b/build.gradle
index da880edf..88519ffb 100644
--- a/build.gradle
+++ b/build.gradle
@@ -30,7 +30,7 @@ tasks.getByName("generateJsonSchema2Pojo").enabled(false) // Disable default 'js
archivesBaseName = 'alpaca-java'
group = 'net.jacobpeterson'
-version = '8.3.2-SNAPSHOT'
+version = '8.3.3-SNAPSHOT'
repositories {
mavenCentral()
From 6f8f037a349ba47638a4a2672e9d946b73df45fd Mon Sep 17 00:00:00 2001
From: Jacob Peterson <14127217+Petersoj@users.noreply.github.com>
Date: Sun, 19 Dec 2021 21:49:15 -0700
Subject: [PATCH 21/84] Add more descriptive field names in JSON schemas, fix
javadoc formatting
---
README.md | 2 +-
.../non_trade_activity.json | 1 +
.../account_activities/trade_activity.json | 3 +++
.../market_data/historical/bar/bar.json | 8 ++++++++
.../market_data/historical/quote/quote.json | 8 ++++++++
.../market_data/historical/trade/trade.json | 7 +++++++
.../realtime/quote/quote_message.json | 4 ++--
schema_json/endpoint/order/order.json | 8 ++++----
.../portfolio_history_response.json | 1 +
schema_json/endpoint/position/position.json | 6 ++++++
.../streaming/trade/trade_update.json | 1 +
.../alpaca/properties/AlpacaProperties.java | 20 ++++++++++++++-----
.../endpoint/PortfolioHistoryEndpoint.java | 4 ++--
.../util/doc/Documentation2JSONSchema.java | 3 ++-
.../alpaca/util/format/FormatUtil.java | 4 +++-
.../alpaca/util/gson/GsonUtil.java | 7 ++++++-
.../gson/{ => adapters}/LocalDateAdapter.java | 2 +-
.../gson/{ => adapters}/LocalTimeAdapter.java | 2 +-
.../{ => adapters}/ZonedDateTimeAdapter.java | 2 +-
.../alpaca/util/okhttp/JSONBodyBuilder.java | 4 +++-
.../alpaca/websocket/AlpacaWebsocket.java | 4 +++-
.../alpaca/test/live/AlpacaAPITest.java | 12 +++++------
22 files changed, 85 insertions(+), 28 deletions(-)
rename src/main/java/net/jacobpeterson/alpaca/util/gson/{ => adapters}/LocalDateAdapter.java (95%)
rename src/main/java/net/jacobpeterson/alpaca/util/gson/{ => adapters}/LocalTimeAdapter.java (95%)
rename src/main/java/net/jacobpeterson/alpaca/util/gson/{ => adapters}/ZonedDateTimeAdapter.java (95%)
diff --git a/README.md b/README.md
index 2be165a6..de6fdc01 100644
--- a/README.md
+++ b/README.md
@@ -35,7 +35,7 @@ If you are using Maven as your build tool, add the following dependency to your
Note that you don't have to use the Maven Central artifacts and instead can just install a clone of this project to your local Maven repository as shown in the [Building](#building) section.
# Configuration
-Creating an `alpaca.properties` file on the classpath with the following format allows you to easily load properties using the `AlpacaAPI` default constructor:
+Creating an `alpaca.properties` file on the classpath (e.g. in `src/main/resources/alpaca.properties`) with the following format allows you to easily load properties using the `AlpacaAPI` default constructor:
```
key_id =
secret_key =
diff --git a/schema_json/endpoint/account_activities/non_trade_activity.json b/schema_json/endpoint/account_activities/non_trade_activity.json
index c66a15af..81d8c0fa 100644
--- a/schema_json/endpoint/account_activities/non_trade_activity.json
+++ b/schema_json/endpoint/account_activities/non_trade_activity.json
@@ -19,6 +19,7 @@
},
"qty": {
"existingJavaType": "java.lang.String",
+ "javaName": "quantity",
"title": "For dividend activities, the number of shares that contributed to the payment. Not present for other activity types."
},
"per_share_amount": {
diff --git a/schema_json/endpoint/account_activities/trade_activity.json b/schema_json/endpoint/account_activities/trade_activity.json
index 0c6dd5f4..1697ad1c 100644
--- a/schema_json/endpoint/account_activities/trade_activity.json
+++ b/schema_json/endpoint/account_activities/trade_activity.json
@@ -7,10 +7,12 @@
"properties": {
"cum_qty": {
"existingJavaType": "java.lang.String",
+ "javaName": "cumulativeQuantity",
"title": "The cumulative quantity of shares involved in the execution."
},
"leaves_qty": {
"existingJavaType": "java.lang.String",
+ "javaName": "remainingQuantity",
"title": "For partially_filled orders, the quantity of shares that are left to be filled."
},
"price": {
@@ -19,6 +21,7 @@
},
"qty": {
"existingJavaType": "java.lang.String",
+ "javaName": "quantity",
"title": "The number of shares involved in the trade execution."
},
"side": {
diff --git a/schema_json/endpoint/market_data/historical/bar/bar.json b/schema_json/endpoint/market_data/historical/bar/bar.json
index 6be1fe66..55423fde 100644
--- a/schema_json/endpoint/market_data/historical/bar/bar.json
+++ b/schema_json/endpoint/market_data/historical/bar/bar.json
@@ -4,34 +4,42 @@
"properties": {
"t": {
"existingJavaType": "java.time.ZonedDateTime",
+ "javaName": "timestamp",
"title": "Timestamp with nanosecond precision."
},
"o": {
"existingJavaType": "java.lang.Double",
+ "javaName": "open",
"title": "Open price."
},
"h": {
"existingJavaType": "java.lang.Double",
+ "javaName": "high",
"title": "High price."
},
"l": {
"existingJavaType": "java.lang.Double",
+ "javaName": "low",
"title": "Low price."
},
"c": {
"existingJavaType": "java.lang.Double",
+ "javaName": "close",
"title": "Close price."
},
"v": {
"existingJavaType": "java.lang.Long",
+ "javaName": "volume",
"title": "Volume."
},
"n": {
"existingJavaType": "java.lang.Long",
+ "javaName": "tradeCount",
"title": "Trade count."
},
"vw": {
"existingJavaType": "java.lang.Double",
+ "javaName": "vwap",
"title": "VWAP (Volume Weighted Average Price)."
}
}
diff --git a/schema_json/endpoint/market_data/historical/quote/quote.json b/schema_json/endpoint/market_data/historical/quote/quote.json
index 7a238f6e..059c9746 100644
--- a/schema_json/endpoint/market_data/historical/quote/quote.json
+++ b/schema_json/endpoint/market_data/historical/quote/quote.json
@@ -4,34 +4,42 @@
"properties": {
"t": {
"existingJavaType": "java.time.ZonedDateTime",
+ "javaName": "timestamp",
"title": "Timestamp with nanosecond precision."
},
"ax": {
"existingJavaType": "java.lang.String",
+ "javaName": "askExchange",
"title": "Ask exchange."
},
"ap": {
"existingJavaType": "java.lang.Double",
+ "javaName": "askPrice",
"title": "Ask price."
},
"as": {
"existingJavaType": "java.lang.Integer",
+ "javaName": "askSize",
"title": "Ask size."
},
"bx": {
"existingJavaType": "java.lang.String",
+ "javaName": "bidExchange",
"title": "Bid exchange."
},
"bp": {
"existingJavaType": "java.lang.Double",
+ "javaName": "bidPrice",
"title": "Bid price."
},
"bs": {
"existingJavaType": "java.lang.Integer",
+ "javaName": "bidSize",
"title": "Bid size."
},
"c": {
"existingJavaType": "java.util.ArrayList",
+ "javaName": "conditions",
"title": "The {@link java.util.ArrayList} of quote conditions."
}
}
diff --git a/schema_json/endpoint/market_data/historical/trade/trade.json b/schema_json/endpoint/market_data/historical/trade/trade.json
index c9303e7b..f7ef48ca 100644
--- a/schema_json/endpoint/market_data/historical/trade/trade.json
+++ b/schema_json/endpoint/market_data/historical/trade/trade.json
@@ -4,30 +4,37 @@
"properties": {
"t": {
"existingJavaType": "java.time.ZonedDateTime",
+ "javaName": "timestamp",
"title": "Timestamp with nanosecond precision."
},
"x": {
"existingJavaType": "java.lang.String",
+ "javaName": "exchange",
"title": "Exchange where the trade happened."
},
"p": {
"existingJavaType": "java.lang.Double",
+ "javaName": "price",
"title": "Trade price."
},
"s": {
"existingJavaType": "java.lang.Integer",
+ "javaName": "size",
"title": "Trade size."
},
"c": {
"existingJavaType": "java.util.ArrayList",
+ "javaName": "conditions",
"title": "The {@link java.util.ArrayList} of trade conditions."
},
"i": {
"existingJavaType": "java.lang.Long",
+ "javaName": "tradeID",
"title": "Trade ID."
},
"z": {
"existingJavaType": "java.lang.String",
+ "javaName": "tape",
"title": "Tape."
}
}
diff --git a/schema_json/endpoint/market_data/realtime/quote/quote_message.json b/schema_json/endpoint/market_data/realtime/quote/quote_message.json
index a8ff47b3..f1f9606d 100644
--- a/schema_json/endpoint/market_data/realtime/quote/quote_message.json
+++ b/schema_json/endpoint/market_data/realtime/quote/quote_message.json
@@ -7,7 +7,7 @@
"properties": {
"ax": {
"existingJavaType": "java.lang.String",
- "javaName": "askExchangeCode",
+ "javaName": "askExchange",
"title": "Ask exchange code."
},
"ap": {
@@ -22,7 +22,7 @@
},
"bx": {
"existingJavaType": "java.lang.String",
- "javaName": "bidExchangeCode",
+ "javaName": "bidExchange",
"title": "Bid exchange code."
},
"bp": {
diff --git a/schema_json/endpoint/order/order.json b/schema_json/endpoint/order/order.json
index 4af8dde8..c0af5330 100644
--- a/schema_json/endpoint/order/order.json
+++ b/schema_json/endpoint/order/order.json
@@ -68,24 +68,23 @@
},
"qty": {
"existingJavaType": "java.lang.String",
+ "javaName": "quantity",
"title": "Ordered quantity. If entered, notional will be null. Can take up to 9 decimal points."
},
"filled_qty": {
"existingJavaType": "java.lang.String",
+ "javaName": "filledQuantity",
"title": "Filled quantity."
},
"filled_avg_price": {
"existingJavaType": "java.lang.String",
+ "javaName": "averageFillPrice",
"title": "Filled average price."
},
"order_class": {
"existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.order.enums.OrderClass",
"title": "The {@link net.jacobpeterson.alpaca.model.endpoint.order.enums.OrderClass}. For details of non-simple order classes, please see Bracket Order Overview."
},
- "order_type": {
- "existingJavaType": "java.lang.String",
- "title": "(Deprecated with just type field below.)."
- },
"type": {
"existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.order.enums.OrderType",
"title": "The {@link net.jacobpeterson.alpaca.model.endpoint.order.enums.OrderType}."
@@ -128,6 +127,7 @@
},
"hwm": {
"existingJavaType": "java.lang.String",
+ "javaName": "highWaterMark",
"title": "High Water Mark - The highest (lowest) market price seen since the trailing stop order was submitted."
}
}
diff --git a/schema_json/endpoint/portfolio_history/portfolio_history_response.json b/schema_json/endpoint/portfolio_history/portfolio_history_response.json
index d43235f7..d3ca8177 100644
--- a/schema_json/endpoint/portfolio_history/portfolio_history_response.json
+++ b/schema_json/endpoint/portfolio_history/portfolio_history_response.json
@@ -16,6 +16,7 @@
},
"profit_loss_pct": {
"existingJavaType": "java.util.ArrayList",
+ "javaName": "profitLossPercent",
"title": "Profit/loss in percentage from the base value."
},
"base_value": {
diff --git a/schema_json/endpoint/position/position.json b/schema_json/endpoint/position/position.json
index bee7e824..2f1eb603 100644
--- a/schema_json/endpoint/position/position.json
+++ b/schema_json/endpoint/position/position.json
@@ -20,10 +20,12 @@
},
"avg_entry_price": {
"existingJavaType": "java.lang.String",
+ "javaName": "averageEntryPrice",
"title": "Average entry price of the position."
},
"qty": {
"existingJavaType": "java.lang.String",
+ "javaName": "quantity",
"title": "The number of shares."
},
"side": {
@@ -40,18 +42,22 @@
},
"unrealized_pl": {
"existingJavaType": "java.lang.String",
+ "javaName": "unrealizedProfitLoss",
"title": "Unrealized profit/loss in dollars."
},
"unrealized_plpc": {
"existingJavaType": "java.lang.String",
+ "javaName": "unrealizedProfitLossPercent",
"title": "Unrealized profit/loss percent (by a factor of 1)."
},
"unrealized_intraday_pl": {
"existingJavaType": "java.lang.String",
+ "javaName": "unrealizedIntradayProfitLoss",
"title": "Unrealized profit/loss in dollars for the day."
},
"unrealized_intraday_plpc": {
"existingJavaType": "java.lang.String",
+ "javaName": "unrealizedIntradayProfitLossPercent",
"title": "Unrealized profit/loss percent (by a factor of 1)."
},
"current_price": {
diff --git a/schema_json/endpoint/streaming/trade/trade_update.json b/schema_json/endpoint/streaming/trade/trade_update.json
index 46188863..339ea01c 100644
--- a/schema_json/endpoint/streaming/trade/trade_update.json
+++ b/schema_json/endpoint/streaming/trade/trade_update.json
@@ -16,6 +16,7 @@
},
"position_qty": {
"existingJavaType": "java.lang.String",
+ "javaName": "positionQuantity",
"title": "The position quantity."
},
"order": {
diff --git a/src/main/java/net/jacobpeterson/alpaca/properties/AlpacaProperties.java b/src/main/java/net/jacobpeterson/alpaca/properties/AlpacaProperties.java
index 2b8d0b79..0c121157 100644
--- a/src/main/java/net/jacobpeterson/alpaca/properties/AlpacaProperties.java
+++ b/src/main/java/net/jacobpeterson/alpaca/properties/AlpacaProperties.java
@@ -15,31 +15,41 @@ public class AlpacaProperties {
private static final String ALPACA_DEFAULT_PROPERTIES_FILE = "alpaca.default.properties";
private static final String KEY_ID_KEY = "key_id";
- /** The value of {@link #KEY_ID_KEY} in {@link #ALPACA_PROPERTIES_FILE}. */
+ /**
+ * The value of {@link #KEY_ID_KEY} in {@link #ALPACA_PROPERTIES_FILE}.
+ */
public static final String KEY_ID = getProperty(
ALPACA_PROPERTIES_FILE, ALPACA_DEFAULT_PROPERTIES_FILE,
KEY_ID_KEY);
private static final String SECRET_KEY_KEY = "secret_key";
- /** The value of {@link #SECRET_KEY_KEY} in {@link #ALPACA_PROPERTIES_FILE}. */
+ /**
+ * The value of {@link #SECRET_KEY_KEY} in {@link #ALPACA_PROPERTIES_FILE}.
+ */
public static final String SECRET_KEY = getProperty(
ALPACA_PROPERTIES_FILE, ALPACA_DEFAULT_PROPERTIES_FILE,
SECRET_KEY_KEY);
private static final String ENDPOINT_API_TYPE_KEY = "endpoint_api_type";
- /** The value of {@link #ENDPOINT_API_TYPE_KEY} in {@link #ALPACA_PROPERTIES_FILE}. */
+ /**
+ * The value of {@link #ENDPOINT_API_TYPE_KEY} in {@link #ALPACA_PROPERTIES_FILE}.
+ */
public static final EndpointAPIType ENDPOINT_API_TYPE = EndpointAPIType.fromValue(getProperty(
ALPACA_PROPERTIES_FILE, ALPACA_DEFAULT_PROPERTIES_FILE,
ENDPOINT_API_TYPE_KEY));
private static final String DATA_API_TYPE_KEY = "data_api_type";
- /** The value of {@link #DATA_API_TYPE_KEY} in {@link #ALPACA_PROPERTIES_FILE}. */
+ /**
+ * The value of {@link #DATA_API_TYPE_KEY} in {@link #ALPACA_PROPERTIES_FILE}.
+ */
public static final DataAPIType DATA_API_TYPE = DataAPIType.fromValue(getProperty(
ALPACA_PROPERTIES_FILE, ALPACA_DEFAULT_PROPERTIES_FILE,
DATA_API_TYPE_KEY));
private static final String USER_AGENT_KEY = "user_agent";
- /** The value of {@link #USER_AGENT_KEY} in {@link #ALPACA_PROPERTIES_FILE}. */
+ /**
+ * The value of {@link #USER_AGENT_KEY} in {@link #ALPACA_PROPERTIES_FILE}.
+ */
public static final String USER_AGENT = getProperty(
ALPACA_PROPERTIES_FILE, ALPACA_DEFAULT_PROPERTIES_FILE,
USER_AGENT_KEY);
diff --git a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/PortfolioHistoryEndpoint.java b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/PortfolioHistoryEndpoint.java
index 9bab136d..1d01c19d 100644
--- a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/PortfolioHistoryEndpoint.java
+++ b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/PortfolioHistoryEndpoint.java
@@ -81,7 +81,7 @@ public PortfolioHistory get(Integer periodLength, PortfolioPeriodUnit periodUnit
// Check if any response arrays differ in size
checkState(response.getTimestamp().size() == response.getEquity().size() &&
response.getEquity().size() == response.getProfitLoss().size() &&
- response.getProfitLoss().size() == response.getProfitLossPct().size(),
+ response.getProfitLoss().size() == response.getProfitLossPercent().size(),
"Response arrays should not differ in size!");
// Add all data points into one POJO
@@ -91,7 +91,7 @@ public PortfolioHistory get(Integer periodLength, PortfolioPeriodUnit periodUnit
Instant.ofEpochSecond(response.getTimestamp().get(index)).atZone(FormatUtil.NEW_YORK_ZONED_ID),
response.getEquity().get(index),
response.getProfitLoss().get(index),
- response.getProfitLossPct().get(index)));
+ response.getProfitLossPercent().get(index)));
}
return new PortfolioHistory(
diff --git a/src/main/java/net/jacobpeterson/alpaca/util/doc/Documentation2JSONSchema.java b/src/main/java/net/jacobpeterson/alpaca/util/doc/Documentation2JSONSchema.java
index 29fbf597..ba0e2208 100644
--- a/src/main/java/net/jacobpeterson/alpaca/util/doc/Documentation2JSONSchema.java
+++ b/src/main/java/net/jacobpeterson/alpaca/util/doc/Documentation2JSONSchema.java
@@ -16,7 +16,8 @@
import java.io.IOException;
/**
- * The type {@link Documentation2JSONSchema}.
+ * The {@link Documentation2JSONSchema} is used strictly to expedite the process of creating JSON schemas for POJO
+ * generation in this library using Alpaca's website documentation.
*/
public class Documentation2JSONSchema {
diff --git a/src/main/java/net/jacobpeterson/alpaca/util/format/FormatUtil.java b/src/main/java/net/jacobpeterson/alpaca/util/format/FormatUtil.java
index b5a53a27..e797c294 100644
--- a/src/main/java/net/jacobpeterson/alpaca/util/format/FormatUtil.java
+++ b/src/main/java/net/jacobpeterson/alpaca/util/format/FormatUtil.java
@@ -14,7 +14,9 @@
*/
public class FormatUtil {
- /** The {@link ZoneId} for America/New_York. */
+ /**
+ * The {@link ZoneId} for America/New_York.
+ */
public static final ZoneId NEW_YORK_ZONED_ID = ZoneId.of("America/New_York");
// Alpaca uses the following rounding mechanics with respect to buy orders: (1) rounded down to two decimal
diff --git a/src/main/java/net/jacobpeterson/alpaca/util/gson/GsonUtil.java b/src/main/java/net/jacobpeterson/alpaca/util/gson/GsonUtil.java
index 7b94a344..dc86e2c1 100644
--- a/src/main/java/net/jacobpeterson/alpaca/util/gson/GsonUtil.java
+++ b/src/main/java/net/jacobpeterson/alpaca/util/gson/GsonUtil.java
@@ -2,6 +2,9 @@
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
+import net.jacobpeterson.alpaca.util.gson.adapters.LocalDateAdapter;
+import net.jacobpeterson.alpaca.util.gson.adapters.LocalTimeAdapter;
+import net.jacobpeterson.alpaca.util.gson.adapters.ZonedDateTimeAdapter;
import java.time.LocalDate;
import java.time.LocalTime;
@@ -12,7 +15,9 @@
*/
public class GsonUtil {
- /** A {@link Gson} instance with registered date/time adapters. */
+ /**
+ * A {@link Gson} instance with registered date/time adapters.
+ */
public static final Gson GSON = new GsonBuilder()
.registerTypeAdapter(ZonedDateTime.class, new ZonedDateTimeAdapter())
.registerTypeAdapter(LocalDate.class, new LocalDateAdapter())
diff --git a/src/main/java/net/jacobpeterson/alpaca/util/gson/LocalDateAdapter.java b/src/main/java/net/jacobpeterson/alpaca/util/gson/adapters/LocalDateAdapter.java
similarity index 95%
rename from src/main/java/net/jacobpeterson/alpaca/util/gson/LocalDateAdapter.java
rename to src/main/java/net/jacobpeterson/alpaca/util/gson/adapters/LocalDateAdapter.java
index d1dc5956..a9475c17 100644
--- a/src/main/java/net/jacobpeterson/alpaca/util/gson/LocalDateAdapter.java
+++ b/src/main/java/net/jacobpeterson/alpaca/util/gson/adapters/LocalDateAdapter.java
@@ -1,4 +1,4 @@
-package net.jacobpeterson.alpaca.util.gson;
+package net.jacobpeterson.alpaca.util.gson.adapters;
import com.google.gson.Gson;
import com.google.gson.JsonDeserializationContext;
diff --git a/src/main/java/net/jacobpeterson/alpaca/util/gson/LocalTimeAdapter.java b/src/main/java/net/jacobpeterson/alpaca/util/gson/adapters/LocalTimeAdapter.java
similarity index 95%
rename from src/main/java/net/jacobpeterson/alpaca/util/gson/LocalTimeAdapter.java
rename to src/main/java/net/jacobpeterson/alpaca/util/gson/adapters/LocalTimeAdapter.java
index 960ccda2..9d6bb735 100644
--- a/src/main/java/net/jacobpeterson/alpaca/util/gson/LocalTimeAdapter.java
+++ b/src/main/java/net/jacobpeterson/alpaca/util/gson/adapters/LocalTimeAdapter.java
@@ -1,4 +1,4 @@
-package net.jacobpeterson.alpaca.util.gson;
+package net.jacobpeterson.alpaca.util.gson.adapters;
import com.google.gson.Gson;
import com.google.gson.JsonDeserializationContext;
diff --git a/src/main/java/net/jacobpeterson/alpaca/util/gson/ZonedDateTimeAdapter.java b/src/main/java/net/jacobpeterson/alpaca/util/gson/adapters/ZonedDateTimeAdapter.java
similarity index 95%
rename from src/main/java/net/jacobpeterson/alpaca/util/gson/ZonedDateTimeAdapter.java
rename to src/main/java/net/jacobpeterson/alpaca/util/gson/adapters/ZonedDateTimeAdapter.java
index 7f1cf2a7..e10f1be1 100644
--- a/src/main/java/net/jacobpeterson/alpaca/util/gson/ZonedDateTimeAdapter.java
+++ b/src/main/java/net/jacobpeterson/alpaca/util/gson/adapters/ZonedDateTimeAdapter.java
@@ -1,4 +1,4 @@
-package net.jacobpeterson.alpaca.util.gson;
+package net.jacobpeterson.alpaca.util.gson.adapters;
import com.google.gson.Gson;
import com.google.gson.JsonDeserializationContext;
diff --git a/src/main/java/net/jacobpeterson/alpaca/util/okhttp/JSONBodyBuilder.java b/src/main/java/net/jacobpeterson/alpaca/util/okhttp/JSONBodyBuilder.java
index c6f54498..11944345 100644
--- a/src/main/java/net/jacobpeterson/alpaca/util/okhttp/JSONBodyBuilder.java
+++ b/src/main/java/net/jacobpeterson/alpaca/util/okhttp/JSONBodyBuilder.java
@@ -10,7 +10,9 @@
*/
public class JSONBodyBuilder {
- /** The UTF-8 JSON {@link MediaType}. */
+ /**
+ * The UTF-8 JSON {@link MediaType}.
+ */
public static final MediaType JSON_MEDIA_TYPE = MediaType.get("application/json; charset=UTF-8");
private String bodyJSON;
diff --git a/src/main/java/net/jacobpeterson/alpaca/websocket/AlpacaWebsocket.java b/src/main/java/net/jacobpeterson/alpaca/websocket/AlpacaWebsocket.java
index 331d89da..232d23f2 100644
--- a/src/main/java/net/jacobpeterson/alpaca/websocket/AlpacaWebsocket.java
+++ b/src/main/java/net/jacobpeterson/alpaca/websocket/AlpacaWebsocket.java
@@ -42,7 +42,9 @@ public abstract class AlpacaWebsocket
Date: Mon, 20 Dec 2021 02:03:01 -0700
Subject: [PATCH 22/84] Refactor, add CryptoMarketDataEndpoint
---
README.md | 43 ++-
schema_json/endpoint/asset/asset.json | 5 +-
.../endpoint/asset/enums/asset_class.json | 8 +
.../bar => common}/enums/bar_time_period.json | 2 +-
.../crypto/historical/bar/bar.json | 51 +++
.../crypto/historical/bar/bars_response.json | 18 ++
.../crypto/historical/enums/exchange.json | 20 ++
.../quote/latest_quote_response.json | 14 +
.../crypto/historical/quote/quote.json | 36 +++
.../historical/quote/quotes_response.json | 18 ++
.../historical/trade/enums/taker_side.json | 16 +
.../trade/latest_trade_response.json | 14 +
.../crypto/historical/trade/trade.json | 36 +++
.../historical/trade/trades_response.json | 18 ++
.../crypto/historical/xbbo/xbbo.json | 41 +++
.../crypto/historical/xbbo/xbbo_response.json | 14 +
.../{ => stock}/historical/bar/bar.json | 0
.../historical/bar/bars_response.json | 4 +-
.../historical/bar/enums/bar_adjustment.json | 0
.../quote/latest_quote_response.json | 4 +-
.../{ => stock}/historical/quote/quote.json | 0
.../historical/quote/quotes_response.json | 4 +-
.../historical/snapshot/snapshot.json | 20 +-
.../trade/latest_trade_response.json | 4 +-
.../{ => stock}/historical/trade/trade.json | 0
.../historical/trade/trades_response.json | 4 +-
.../{ => stock}/realtime/bar/bar_message.json | 2 +-
.../realtime/control/error_message.json | 2 +-
.../control/subscriptions_message.json | 2 +-
.../realtime/control/success_message.json | 2 +-
.../enums/market_data_message_type.json | 0
.../realtime/market_data_message.json | 4 +-
.../realtime/quote/quote_message.json | 2 +-
.../{ => stock}/realtime/symbol_message.json | 2 +-
.../realtime/trade/trade_message.json | 2 +-
schema_json/endpoint/position/position.json | 2 +-
.../net/jacobpeterson/alpaca/AlpacaAPI.java | 57 ++--
.../alpaca/rest/AlpacaClient.java | 10 -
.../alpaca/rest/AlpacaClientException.java | 20 --
.../endpoint/AccountActivitiesEndpoint.java | 2 +-
.../alpaca/rest/endpoint/AssetsEndpoint.java | 7 +-
.../alpaca/rest/endpoint/OrdersEndpoint.java | 4 +-
.../marketdata/CryptoMarketDataEndpoint.java | 296 ++++++++++++++++++
.../StockMarketDataEndpoint.java} | 44 +--
.../alpaca/websocket/AlpacaWebsocket.java | 20 --
.../marketdata/MarketDataListener.java | 4 +-
.../marketdata/MarketDataWebsocket.java | 16 +-
.../MarketDataWebsocketInterface.java | 10 +-
48 files changed, 744 insertions(+), 160 deletions(-)
create mode 100644 schema_json/endpoint/asset/enums/asset_class.json
rename schema_json/endpoint/market_data/{historical/bar => common}/enums/bar_time_period.json (75%)
create mode 100644 schema_json/endpoint/market_data/crypto/historical/bar/bar.json
create mode 100644 schema_json/endpoint/market_data/crypto/historical/bar/bars_response.json
create mode 100644 schema_json/endpoint/market_data/crypto/historical/enums/exchange.json
create mode 100644 schema_json/endpoint/market_data/crypto/historical/quote/latest_quote_response.json
create mode 100644 schema_json/endpoint/market_data/crypto/historical/quote/quote.json
create mode 100644 schema_json/endpoint/market_data/crypto/historical/quote/quotes_response.json
create mode 100644 schema_json/endpoint/market_data/crypto/historical/trade/enums/taker_side.json
create mode 100644 schema_json/endpoint/market_data/crypto/historical/trade/latest_trade_response.json
create mode 100644 schema_json/endpoint/market_data/crypto/historical/trade/trade.json
create mode 100644 schema_json/endpoint/market_data/crypto/historical/trade/trades_response.json
create mode 100644 schema_json/endpoint/market_data/crypto/historical/xbbo/xbbo.json
create mode 100644 schema_json/endpoint/market_data/crypto/historical/xbbo/xbbo_response.json
rename schema_json/endpoint/market_data/{ => stock}/historical/bar/bar.json (100%)
rename schema_json/endpoint/market_data/{ => stock}/historical/bar/bars_response.json (81%)
rename schema_json/endpoint/market_data/{ => stock}/historical/bar/enums/bar_adjustment.json (100%)
rename schema_json/endpoint/market_data/{ => stock}/historical/quote/latest_quote_response.json (82%)
rename schema_json/endpoint/market_data/{ => stock}/historical/quote/quote.json (100%)
rename schema_json/endpoint/market_data/{ => stock}/historical/quote/quotes_response.json (80%)
rename schema_json/endpoint/market_data/{ => stock}/historical/snapshot/snapshot.json (67%)
rename schema_json/endpoint/market_data/{ => stock}/historical/trade/latest_trade_response.json (82%)
rename schema_json/endpoint/market_data/{ => stock}/historical/trade/trade.json (100%)
rename schema_json/endpoint/market_data/{ => stock}/historical/trade/trades_response.json (80%)
rename schema_json/endpoint/market_data/{ => stock}/realtime/bar/bar_message.json (95%)
rename schema_json/endpoint/market_data/{ => stock}/realtime/control/error_message.json (91%)
rename schema_json/endpoint/market_data/{ => stock}/realtime/control/subscriptions_message.json (94%)
rename schema_json/endpoint/market_data/{ => stock}/realtime/control/success_message.json (89%)
rename schema_json/endpoint/market_data/{ => stock}/realtime/enums/market_data_message_type.json (100%)
rename schema_json/endpoint/market_data/{ => stock}/realtime/market_data_message.json (75%)
rename schema_json/endpoint/market_data/{ => stock}/realtime/quote/quote_message.json (97%)
rename schema_json/endpoint/market_data/{ => stock}/realtime/symbol_message.json (89%)
rename schema_json/endpoint/market_data/{ => stock}/realtime/trade/trade_message.json (96%)
create mode 100644 src/main/java/net/jacobpeterson/alpaca/rest/endpoint/marketdata/CryptoMarketDataEndpoint.java
rename src/main/java/net/jacobpeterson/alpaca/rest/endpoint/{MarketDataEndpoint.java => marketdata/StockMarketDataEndpoint.java} (86%)
diff --git a/README.md b/README.md
index de6fdc01..a0947ec0 100644
--- a/README.md
+++ b/README.md
@@ -100,15 +100,42 @@ try {
}
```
-## [`MarketDataEndpoint`](src/main/java/net/jacobpeterson/alpaca/rest/endpoint/MarketDataEndpoint.java)
-The Data API v2 provides market data through an easy-to-use API for historical data.
+## [`CryptoMarketDataEndpoint`](src/main/java/net/jacobpeterson/alpaca/rest/endpoint/marketdata/CryptoMarketDataEndpoint.java)
+Alpaca provides cryptocurrency data from multiple venues/exchanges, namely: Coinbase, ErisX, and FTX. Note that it does not route orders to all venues.
+
+Example usage:
+```java
+try {
+ // Get BTCUSD 50 one-hour bars starting on 12/18/2021 from Coinbase and print them out
+ BarsResponse btcBarsResponse = alpacaAPI.cryptoMarketData().getBars(
+ "BTCUSD",
+ Arrays.asList(Exchange.COINBASE),
+ ZonedDateTime.of(2021, 12, 18, 0, 0, 0, 0, ZoneId.of("America/New_York")),
+ 50,
+ null,
+ 1,
+ BarTimePeriod.HOUR);
+ btcBarsResponse.getBars().forEach(System.out::println);
+
+ // Get the Best Bid and Offer across multiple exchanges (XBBO) and print it out
+ XbboResponse etcXBBO = alpacaAPI.cryptoMarketData().getXBBO(
+ "ETHUSD",
+ null);
+ System.out.println(etcXBBO);
+} catch (AlpacaClientException exception) {
+ exception.printStackTrace();
+}
+```
+
+## [`StockMarketDataEndpoint`](src/main/java/net/jacobpeterson/alpaca/rest/endpoint/marketdata/StockMarketDataEndpoint.java)
+The Data API v2 provides market data through an easy-to-use API for historical stock market data.
Example usage:
```java
try {
// Get AAPL one hour, split-adjusted bars from 7/6/2021 market open
// to 7/8/2021 market close and print them out
- BarsResponse aaplBarsResponse = alpacaAPI.marketData().getBars(
+ BarsResponse aaplBarsResponse = alpacaAPI.stockMarketData().getBars(
"AAPL",
ZonedDateTime.of(2021, 7, 6, 9, 30, 0, 0, ZoneId.of("America/New_York")),
ZonedDateTime.of(2021, 7, 8, 12 + 4, 0, 0, 0, ZoneId.of("America/New_York")),
@@ -120,7 +147,7 @@ try {
aaplBarsResponse.getBars().forEach(System.out::println);
// Get AAPL first 10 trades on 7/8/2021 at market open and print them out
- TradesResponse aaplTradesResponse = alpacaAPI.marketData().getTrades(
+ TradesResponse aaplTradesResponse = alpacaAPI.stockMarketData().getTrades(
"AAPL",
ZonedDateTime.of(2021, 7, 8, 9, 30, 0, 0, ZoneId.of("America/New_York")),
ZonedDateTime.of(2021, 7, 8, 9, 31, 0, 0, ZoneId.of("America/New_York")),
@@ -129,11 +156,11 @@ try {
aaplTradesResponse.getTrades().forEach(System.out::println);
// Print out latest AAPL trade
- Trade latestAAPLTrade = alpacaAPI.marketData().getLatestTrade("AAPL").getTrade();
+ Trade latestAAPLTrade = alpacaAPI.stockMarketData().getLatestTrade("AAPL").getTrade();
System.out.printf("Latest AAPL Trade: %s\n", latestAAPLTrade);
// Print out snapshot of AAPL, GME, and TSLA
- Map snapshots = alpacaAPI.marketData()
+ Map snapshots = alpacaAPI.stockMarketData()
.getSnapshots(Arrays.asList("AAPL", "GME", "TSLA"));
snapshots.forEach((symbol, snapshot) ->
System.out.printf("Symbol: %s\nSnapshot: %s\n\n", symbol, snapshot));
@@ -229,8 +256,8 @@ The Assets API serves as the master list of assets available for trade and data
Example usage:
```java
try {
- // Print out a CSV of all active US equity 'Asset's
- List activeUSEquities = alpacaAPI.assets().get(AssetStatus.ACTIVE, null);
+ // Print out a CSV of all active US Equity 'Asset's
+ List activeUSEquities = alpacaAPI.assets().get(AssetStatus.ACTIVE, AssetClass.US_EQUITY);
System.out.println(activeUSEquities
.stream().map(Asset::getSymbol)
.collect(Collectors.joining(", ")));
diff --git a/schema_json/endpoint/asset/asset.json b/schema_json/endpoint/asset/asset.json
index b563bf4a..f5ab8b9c 100644
--- a/schema_json/endpoint/asset/asset.json
+++ b/schema_json/endpoint/asset/asset.json
@@ -7,8 +7,9 @@
"title": "Asset ID."
},
"class": {
- "existingJavaType": "java.lang.String",
- "title": "\"us_equity\""
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.asset.enums.AssetClass",
+ "javaName": "assetClass",
+ "title": "The {@link net.jacobpeterson.alpaca.model.endpoint.asset.enums.AssetClass}."
},
"exchange": {
"existingJavaType": "java.lang.String",
diff --git a/schema_json/endpoint/asset/enums/asset_class.json b/schema_json/endpoint/asset/enums/asset_class.json
new file mode 100644
index 00000000..ac36f8e7
--- /dev/null
+++ b/schema_json/endpoint/asset/enums/asset_class.json
@@ -0,0 +1,8 @@
+{
+ "type": "string",
+ "title": "See Assets.",
+ "enum": [
+ "us_equity",
+ "crypto"
+ ]
+}
diff --git a/schema_json/endpoint/market_data/historical/bar/enums/bar_time_period.json b/schema_json/endpoint/market_data/common/enums/bar_time_period.json
similarity index 75%
rename from schema_json/endpoint/market_data/historical/bar/enums/bar_time_period.json
rename to schema_json/endpoint/market_data/common/enums/bar_time_period.json
index 627d9413..cccf0508 100644
--- a/schema_json/endpoint/market_data/historical/bar/enums/bar_time_period.json
+++ b/schema_json/endpoint/market_data/common/enums/bar_time_period.json
@@ -1,6 +1,6 @@
{
"type": "string",
- "title": "See Historical Data.",
+ "title": "See Market Data.",
"enum": [
"Min",
"Hour",
diff --git a/schema_json/endpoint/market_data/crypto/historical/bar/bar.json b/schema_json/endpoint/market_data/crypto/historical/bar/bar.json
new file mode 100644
index 00000000..c677ba92
--- /dev/null
+++ b/schema_json/endpoint/market_data/crypto/historical/bar/bar.json
@@ -0,0 +1,51 @@
+{
+ "type": "object",
+ "title": "See Crypto Historical Data.",
+ "properties": {
+ "t": {
+ "existingJavaType": "java.time.ZonedDateTime",
+ "javaName": "timestamp",
+ "title": "Timestamp with nanosecond precision."
+ },
+ "x": {
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.enums.Exchange",
+ "javaName": "exchange",
+ "title": "Exchange."
+ },
+ "o": {
+ "existingJavaType": "java.lang.Double",
+ "javaName": "open",
+ "title": "Open price."
+ },
+ "h": {
+ "existingJavaType": "java.lang.Double",
+ "javaName": "high",
+ "title": "High price."
+ },
+ "l": {
+ "existingJavaType": "java.lang.Double",
+ "javaName": "low",
+ "title": "Low price."
+ },
+ "c": {
+ "existingJavaType": "java.lang.Double",
+ "javaName": "close",
+ "title": "Close price."
+ },
+ "v": {
+ "existingJavaType": "java.lang.Double",
+ "javaName": "volume",
+ "title": "Volume."
+ },
+ "n": {
+ "existingJavaType": "java.lang.Long",
+ "javaName": "tradeCount",
+ "title": "Trade count."
+ },
+ "vw": {
+ "existingJavaType": "java.lang.Double",
+ "javaName": "vwap",
+ "title": "VWAP (Volume Weighted Average Price)."
+ }
+ }
+}
diff --git a/schema_json/endpoint/market_data/crypto/historical/bar/bars_response.json b/schema_json/endpoint/market_data/crypto/historical/bar/bars_response.json
new file mode 100644
index 00000000..21f5cddb
--- /dev/null
+++ b/schema_json/endpoint/market_data/crypto/historical/bar/bars_response.json
@@ -0,0 +1,18 @@
+{
+ "type": "object",
+ "title": "See Historical Data.",
+ "properties": {
+ "bars": {
+ "existingJavaType": "java.util.ArrayList",
+ "title": "The {@link java.util.ArrayList} of {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.bar.Bar}s."
+ },
+ "symbol": {
+ "existingJavaType": "java.lang.String",
+ "title": "Symbol that was queried."
+ },
+ "next_page_token": {
+ "existingJavaType": "java.lang.String",
+ "title": "Token that can be used to query the next page."
+ }
+ }
+}
diff --git a/schema_json/endpoint/market_data/crypto/historical/enums/exchange.json b/schema_json/endpoint/market_data/crypto/historical/enums/exchange.json
new file mode 100644
index 00000000..1ea41bd6
--- /dev/null
+++ b/schema_json/endpoint/market_data/crypto/historical/enums/exchange.json
@@ -0,0 +1,20 @@
+{
+ "type": "string",
+ "title": "See Crypto Historical Data.",
+ "enum": [
+ "ERSX",
+ "FTX",
+ "CBSE"
+ ],
+ "javaEnums": [
+ {
+ "name": "ERISX"
+ },
+ {
+ "name": "FTX"
+ },
+ {
+ "name": "COINBASE"
+ }
+ ]
+}
diff --git a/schema_json/endpoint/market_data/crypto/historical/quote/latest_quote_response.json b/schema_json/endpoint/market_data/crypto/historical/quote/latest_quote_response.json
new file mode 100644
index 00000000..044d252f
--- /dev/null
+++ b/schema_json/endpoint/market_data/crypto/historical/quote/latest_quote_response.json
@@ -0,0 +1,14 @@
+{
+ "type": "object",
+ "title": "See Crypto Historical Data.",
+ "properties": {
+ "symbol": {
+ "existingJavaType": "java.lang.String",
+ "title": "Symbol that was queried."
+ },
+ "quote": {
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.quote.Quote",
+ "title": "The latest {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.quote.Quote}."
+ }
+ }
+}
diff --git a/schema_json/endpoint/market_data/crypto/historical/quote/quote.json b/schema_json/endpoint/market_data/crypto/historical/quote/quote.json
new file mode 100644
index 00000000..ecca5a55
--- /dev/null
+++ b/schema_json/endpoint/market_data/crypto/historical/quote/quote.json
@@ -0,0 +1,36 @@
+{
+ "type": "object",
+ "title": "See Crypto Historical Data.",
+ "properties": {
+ "t": {
+ "existingJavaType": "java.time.ZonedDateTime",
+ "javaName": "timestamp",
+ "title": "Timestamp with nanosecond precision."
+ },
+ "x": {
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.enums.Exchange",
+ "javaName": "exchange",
+ "title": "Exchange."
+ },
+ "ap": {
+ "existingJavaType": "java.lang.Double",
+ "javaName": "askPrice",
+ "title": "Ask price."
+ },
+ "as": {
+ "existingJavaType": "java.lang.Double",
+ "javaName": "askSize",
+ "title": "Ask size."
+ },
+ "bp": {
+ "existingJavaType": "java.lang.Double",
+ "javaName": "bidPrice",
+ "title": "Bid price."
+ },
+ "bs": {
+ "existingJavaType": "java.lang.Double",
+ "javaName": "bidSize",
+ "title": "Bid size."
+ }
+ }
+}
diff --git a/schema_json/endpoint/market_data/crypto/historical/quote/quotes_response.json b/schema_json/endpoint/market_data/crypto/historical/quote/quotes_response.json
new file mode 100644
index 00000000..212635c3
--- /dev/null
+++ b/schema_json/endpoint/market_data/crypto/historical/quote/quotes_response.json
@@ -0,0 +1,18 @@
+{
+ "type": "object",
+ "title": "See Crypto Historical Data.",
+ "properties": {
+ "quotes": {
+ "existingJavaType": "java.util.ArrayList",
+ "title": "The {@link java.util.ArrayList} of {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.quote.Quote}s."
+ },
+ "symbol": {
+ "existingJavaType": "java.lang.String",
+ "title": "Symbol that was queried."
+ },
+ "next_page_token": {
+ "existingJavaType": "java.lang.String",
+ "title": "Token that can be used to query the next page."
+ }
+ }
+}
diff --git a/schema_json/endpoint/market_data/crypto/historical/trade/enums/taker_side.json b/schema_json/endpoint/market_data/crypto/historical/trade/enums/taker_side.json
new file mode 100644
index 00000000..9604bc54
--- /dev/null
+++ b/schema_json/endpoint/market_data/crypto/historical/trade/enums/taker_side.json
@@ -0,0 +1,16 @@
+{
+ "type": "string",
+ "title": "See Crypto Historical Data.",
+ "enum": [
+ "B",
+ "S"
+ ],
+ "javaEnums": [
+ {
+ "name": "BUY"
+ },
+ {
+ "name": "SELL"
+ }
+ ]
+}
diff --git a/schema_json/endpoint/market_data/crypto/historical/trade/latest_trade_response.json b/schema_json/endpoint/market_data/crypto/historical/trade/latest_trade_response.json
new file mode 100644
index 00000000..089f9528
--- /dev/null
+++ b/schema_json/endpoint/market_data/crypto/historical/trade/latest_trade_response.json
@@ -0,0 +1,14 @@
+{
+ "type": "object",
+ "title": "See Crypto Historical Data.",
+ "properties": {
+ "symbol": {
+ "existingJavaType": "java.lang.String",
+ "title": "Symbol that was queried."
+ },
+ "trade": {
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.trade.Trade",
+ "title": "The latest {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.trade.Trade}."
+ }
+ }
+}
diff --git a/schema_json/endpoint/market_data/crypto/historical/trade/trade.json b/schema_json/endpoint/market_data/crypto/historical/trade/trade.json
new file mode 100644
index 00000000..56fef69b
--- /dev/null
+++ b/schema_json/endpoint/market_data/crypto/historical/trade/trade.json
@@ -0,0 +1,36 @@
+{
+ "type": "object",
+ "title": "See Crypto Historical Data.",
+ "properties": {
+ "t": {
+ "existingJavaType": "java.time.ZonedDateTime",
+ "javaName": "timestamp",
+ "title": "Timestamp with nanosecond precision."
+ },
+ "x": {
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.enums.Exchange",
+ "javaName": "exchange",
+ "title": "Exchange where the trade happened."
+ },
+ "p": {
+ "existingJavaType": "java.lang.Double",
+ "javaName": "price",
+ "title": "Trade price."
+ },
+ "s": {
+ "existingJavaType": "java.lang.Double",
+ "javaName": "size",
+ "title": "Trade size."
+ },
+ "tks": {
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.trade.enums.TakerSide",
+ "javaName": "takerSide",
+ "title": "The {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.trade.enums.TakerSide} of the trade."
+ },
+ "i": {
+ "existingJavaType": "java.lang.Long",
+ "javaName": "tradeID",
+ "title": "Trade ID."
+ }
+ }
+}
diff --git a/schema_json/endpoint/market_data/crypto/historical/trade/trades_response.json b/schema_json/endpoint/market_data/crypto/historical/trade/trades_response.json
new file mode 100644
index 00000000..68a770a5
--- /dev/null
+++ b/schema_json/endpoint/market_data/crypto/historical/trade/trades_response.json
@@ -0,0 +1,18 @@
+{
+ "type": "object",
+ "title": "See Crypto Historical Data.",
+ "properties": {
+ "trades": {
+ "existingJavaType": "java.util.ArrayList",
+ "title": "The {@link java.util.ArrayList} of {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.trade.Trade}s."
+ },
+ "symbol": {
+ "existingJavaType": "java.lang.String",
+ "title": "Symbol that was queried."
+ },
+ "next_page_token": {
+ "existingJavaType": "java.lang.String",
+ "title": "Token that can be used to query the next page."
+ }
+ }
+}
diff --git a/schema_json/endpoint/market_data/crypto/historical/xbbo/xbbo.json b/schema_json/endpoint/market_data/crypto/historical/xbbo/xbbo.json
new file mode 100644
index 00000000..9646a1ee
--- /dev/null
+++ b/schema_json/endpoint/market_data/crypto/historical/xbbo/xbbo.json
@@ -0,0 +1,41 @@
+{
+ "type": "object",
+ "title": "See Crypto Historical Data.",
+ "properties": {
+ "t": {
+ "existingJavaType": "java.time.ZonedDateTime",
+ "javaName": "timestamp",
+ "title": "Timestamp with nanosecond precision."
+ },
+ "ax": {
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.enums.Exchange",
+ "javaName": "askExchange",
+ "title": "Ask Exchange."
+ },
+ "ap": {
+ "existingJavaType": "java.lang.Double",
+ "javaName": "askPrice",
+ "title": "Ask price."
+ },
+ "as": {
+ "existingJavaType": "java.lang.Double",
+ "javaName": "askSize",
+ "title": "Ask size."
+ },
+ "bx": {
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.enums.Exchange",
+ "javaName": "bidExchange",
+ "title": "Bid Exchange."
+ },
+ "bp": {
+ "existingJavaType": "java.lang.Double",
+ "javaName": "bidPrice",
+ "title": "Bid price."
+ },
+ "bs": {
+ "existingJavaType": "java.lang.Double",
+ "javaName": "bidSize",
+ "title": "Bid size."
+ }
+ }
+}
diff --git a/schema_json/endpoint/market_data/crypto/historical/xbbo/xbbo_response.json b/schema_json/endpoint/market_data/crypto/historical/xbbo/xbbo_response.json
new file mode 100644
index 00000000..b3bbe427
--- /dev/null
+++ b/schema_json/endpoint/market_data/crypto/historical/xbbo/xbbo_response.json
@@ -0,0 +1,14 @@
+{
+ "type": "object",
+ "title": "See Crypto Historical Data.",
+ "properties": {
+ "symbol": {
+ "existingJavaType": "java.lang.String",
+ "title": "Symbol that was queried."
+ },
+ "xbbo": {
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.xbbo.Xbbo",
+ "title": "The latest {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.xbbo.Xbbo}."
+ }
+ }
+}
diff --git a/schema_json/endpoint/market_data/historical/bar/bar.json b/schema_json/endpoint/market_data/stock/historical/bar/bar.json
similarity index 100%
rename from schema_json/endpoint/market_data/historical/bar/bar.json
rename to schema_json/endpoint/market_data/stock/historical/bar/bar.json
diff --git a/schema_json/endpoint/market_data/historical/bar/bars_response.json b/schema_json/endpoint/market_data/stock/historical/bar/bars_response.json
similarity index 81%
rename from schema_json/endpoint/market_data/historical/bar/bars_response.json
rename to schema_json/endpoint/market_data/stock/historical/bar/bars_response.json
index a876dcf8..ebd21e82 100644
--- a/schema_json/endpoint/market_data/historical/bar/bars_response.json
+++ b/schema_json/endpoint/market_data/stock/historical/bar/bars_response.json
@@ -3,8 +3,8 @@
"title": "See Historical Data.",
"properties": {
"bars": {
- "existingJavaType": "java.util.ArrayList",
- "title": "The {@link java.util.ArrayList} of {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.historical.bar.Bar}s."
+ "existingJavaType": "java.util.ArrayList",
+ "title": "The {@link java.util.ArrayList} of {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.bar.Bar}s."
},
"symbol": {
"existingJavaType": "java.lang.String",
diff --git a/schema_json/endpoint/market_data/historical/bar/enums/bar_adjustment.json b/schema_json/endpoint/market_data/stock/historical/bar/enums/bar_adjustment.json
similarity index 100%
rename from schema_json/endpoint/market_data/historical/bar/enums/bar_adjustment.json
rename to schema_json/endpoint/market_data/stock/historical/bar/enums/bar_adjustment.json
diff --git a/schema_json/endpoint/market_data/historical/quote/latest_quote_response.json b/schema_json/endpoint/market_data/stock/historical/quote/latest_quote_response.json
similarity index 82%
rename from schema_json/endpoint/market_data/historical/quote/latest_quote_response.json
rename to schema_json/endpoint/market_data/stock/historical/quote/latest_quote_response.json
index 54477417..1250c5f8 100644
--- a/schema_json/endpoint/market_data/historical/quote/latest_quote_response.json
+++ b/schema_json/endpoint/market_data/stock/historical/quote/latest_quote_response.json
@@ -7,8 +7,8 @@
"title": "Symbol that was queried."
},
"quote": {
- "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.historical.quote.Quote",
- "title": "The latest {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.historical.quote.Quote}."
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.quote.Quote",
+ "title": "The latest {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.quote.Quote}."
}
}
}
diff --git a/schema_json/endpoint/market_data/historical/quote/quote.json b/schema_json/endpoint/market_data/stock/historical/quote/quote.json
similarity index 100%
rename from schema_json/endpoint/market_data/historical/quote/quote.json
rename to schema_json/endpoint/market_data/stock/historical/quote/quote.json
diff --git a/schema_json/endpoint/market_data/historical/quote/quotes_response.json b/schema_json/endpoint/market_data/stock/historical/quote/quotes_response.json
similarity index 80%
rename from schema_json/endpoint/market_data/historical/quote/quotes_response.json
rename to schema_json/endpoint/market_data/stock/historical/quote/quotes_response.json
index 88c1286e..6ba96682 100644
--- a/schema_json/endpoint/market_data/historical/quote/quotes_response.json
+++ b/schema_json/endpoint/market_data/stock/historical/quote/quotes_response.json
@@ -3,8 +3,8 @@
"title": "See Historical Data.",
"properties": {
"quotes": {
- "existingJavaType": "java.util.ArrayList",
- "title": "The {@link java.util.ArrayList} of {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.historical.quote.Quote}s."
+ "existingJavaType": "java.util.ArrayList",
+ "title": "The {@link java.util.ArrayList} of {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.quote.Quote}s."
},
"symbol": {
"existingJavaType": "java.lang.String",
diff --git a/schema_json/endpoint/market_data/historical/snapshot/snapshot.json b/schema_json/endpoint/market_data/stock/historical/snapshot/snapshot.json
similarity index 67%
rename from schema_json/endpoint/market_data/historical/snapshot/snapshot.json
rename to schema_json/endpoint/market_data/stock/historical/snapshot/snapshot.json
index c2a0acf0..f42b18af 100644
--- a/schema_json/endpoint/market_data/historical/snapshot/snapshot.json
+++ b/schema_json/endpoint/market_data/stock/historical/snapshot/snapshot.json
@@ -3,24 +3,24 @@
"title": "See Historical Data.",
"properties": {
"latestTrade": {
- "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.historical.trade.Trade",
- "title": "The latest {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.historical.trade.Trade}."
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.trade.Trade",
+ "title": "The latest {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.trade.Trade}."
},
"latestQuote": {
- "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.historical.quote.Quote",
- "title": "The latest {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.historical.quote.Quote}."
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.quote.Quote",
+ "title": "The latest {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.quote.Quote}."
},
"minuteBar": {
- "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.historical.bar.Bar",
- "title": "The minute {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.historical.bar.Bar}."
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.bar.Bar",
+ "title": "The minute {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.bar.Bar}."
},
"dailyBar": {
- "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.historical.bar.Bar",
- "title": "The daily {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.historical.bar.Bar}."
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.bar.Bar",
+ "title": "The daily {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.bar.Bar}."
},
"prevDailyBar": {
- "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.historical.bar.Bar",
- "title": "The previous daily {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.historical.bar.Bar}."
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.bar.Bar",
+ "title": "The previous daily {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.bar.Bar}."
}
}
}
diff --git a/schema_json/endpoint/market_data/historical/trade/latest_trade_response.json b/schema_json/endpoint/market_data/stock/historical/trade/latest_trade_response.json
similarity index 82%
rename from schema_json/endpoint/market_data/historical/trade/latest_trade_response.json
rename to schema_json/endpoint/market_data/stock/historical/trade/latest_trade_response.json
index 3025a719..f5be1b9d 100644
--- a/schema_json/endpoint/market_data/historical/trade/latest_trade_response.json
+++ b/schema_json/endpoint/market_data/stock/historical/trade/latest_trade_response.json
@@ -7,8 +7,8 @@
"title": "Symbol that was queried."
},
"trade": {
- "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.historical.trade.Trade",
- "title": "The latest {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.historical.trade.Trade}."
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.trade.Trade",
+ "title": "The latest {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.trade.Trade}."
}
}
}
diff --git a/schema_json/endpoint/market_data/historical/trade/trade.json b/schema_json/endpoint/market_data/stock/historical/trade/trade.json
similarity index 100%
rename from schema_json/endpoint/market_data/historical/trade/trade.json
rename to schema_json/endpoint/market_data/stock/historical/trade/trade.json
diff --git a/schema_json/endpoint/market_data/historical/trade/trades_response.json b/schema_json/endpoint/market_data/stock/historical/trade/trades_response.json
similarity index 80%
rename from schema_json/endpoint/market_data/historical/trade/trades_response.json
rename to schema_json/endpoint/market_data/stock/historical/trade/trades_response.json
index 928f6f24..503b6d9f 100644
--- a/schema_json/endpoint/market_data/historical/trade/trades_response.json
+++ b/schema_json/endpoint/market_data/stock/historical/trade/trades_response.json
@@ -3,8 +3,8 @@
"title": "See Historical Data.",
"properties": {
"trades": {
- "existingJavaType": "java.util.ArrayList",
- "title": "The {@link java.util.ArrayList} of {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.historical.trade.Trade}s."
+ "existingJavaType": "java.util.ArrayList",
+ "title": "The {@link java.util.ArrayList} of {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.trade.Trade}s."
},
"symbol": {
"existingJavaType": "java.lang.String",
diff --git a/schema_json/endpoint/market_data/realtime/bar/bar_message.json b/schema_json/endpoint/market_data/stock/realtime/bar/bar_message.json
similarity index 95%
rename from schema_json/endpoint/market_data/realtime/bar/bar_message.json
rename to schema_json/endpoint/market_data/stock/realtime/bar/bar_message.json
index cc6aa003..7abf464d 100644
--- a/schema_json/endpoint/market_data/realtime/bar/bar_message.json
+++ b/schema_json/endpoint/market_data/stock/realtime/bar/bar_message.json
@@ -1,7 +1,7 @@
{
"type": "object",
"extends": {
- "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.realtime.SymbolMessage"
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.realtime.SymbolMessage"
},
"title": "See Real-time Data.",
"properties": {
diff --git a/schema_json/endpoint/market_data/realtime/control/error_message.json b/schema_json/endpoint/market_data/stock/realtime/control/error_message.json
similarity index 91%
rename from schema_json/endpoint/market_data/realtime/control/error_message.json
rename to schema_json/endpoint/market_data/stock/realtime/control/error_message.json
index 6dca33c4..1ef275ab 100644
--- a/schema_json/endpoint/market_data/realtime/control/error_message.json
+++ b/schema_json/endpoint/market_data/stock/realtime/control/error_message.json
@@ -1,7 +1,7 @@
{
"type": "object",
"extends": {
- "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.realtime.MarketDataMessage"
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.realtime.MarketDataMessage"
},
"title": "See Real-time Data.",
"properties": {
diff --git a/schema_json/endpoint/market_data/realtime/control/subscriptions_message.json b/schema_json/endpoint/market_data/stock/realtime/control/subscriptions_message.json
similarity index 94%
rename from schema_json/endpoint/market_data/realtime/control/subscriptions_message.json
rename to schema_json/endpoint/market_data/stock/realtime/control/subscriptions_message.json
index 6602ed55..76bfc479 100644
--- a/schema_json/endpoint/market_data/realtime/control/subscriptions_message.json
+++ b/schema_json/endpoint/market_data/stock/realtime/control/subscriptions_message.json
@@ -1,7 +1,7 @@
{
"type": "object",
"extends": {
- "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.realtime.MarketDataMessage"
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.realtime.MarketDataMessage"
},
"title": "See Real-time Data.",
"properties": {
diff --git a/schema_json/endpoint/market_data/realtime/control/success_message.json b/schema_json/endpoint/market_data/stock/realtime/control/success_message.json
similarity index 89%
rename from schema_json/endpoint/market_data/realtime/control/success_message.json
rename to schema_json/endpoint/market_data/stock/realtime/control/success_message.json
index 76ba8a8c..d7225e02 100644
--- a/schema_json/endpoint/market_data/realtime/control/success_message.json
+++ b/schema_json/endpoint/market_data/stock/realtime/control/success_message.json
@@ -1,7 +1,7 @@
{
"type": "object",
"extends": {
- "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.realtime.MarketDataMessage"
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.realtime.MarketDataMessage"
},
"title": "See Real-time Data.",
"properties": {
diff --git a/schema_json/endpoint/market_data/realtime/enums/market_data_message_type.json b/schema_json/endpoint/market_data/stock/realtime/enums/market_data_message_type.json
similarity index 100%
rename from schema_json/endpoint/market_data/realtime/enums/market_data_message_type.json
rename to schema_json/endpoint/market_data/stock/realtime/enums/market_data_message_type.json
diff --git a/schema_json/endpoint/market_data/realtime/market_data_message.json b/schema_json/endpoint/market_data/stock/realtime/market_data_message.json
similarity index 75%
rename from schema_json/endpoint/market_data/realtime/market_data_message.json
rename to schema_json/endpoint/market_data/stock/realtime/market_data_message.json
index 3e43d789..5ee64bef 100644
--- a/schema_json/endpoint/market_data/realtime/market_data_message.json
+++ b/schema_json/endpoint/market_data/stock/realtime/market_data_message.json
@@ -3,9 +3,9 @@
"title": "See Real-time Data.",
"properties": {
"T": {
- "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.realtime.enums.MarketDataMessageType",
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.realtime.enums.MarketDataMessageType",
"javaName": "messageType",
- "title": "The {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.realtime.enums.MarketDataMessageType}."
+ "title": "The {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.realtime.enums.MarketDataMessageType}."
}
}
}
diff --git a/schema_json/endpoint/market_data/realtime/quote/quote_message.json b/schema_json/endpoint/market_data/stock/realtime/quote/quote_message.json
similarity index 97%
rename from schema_json/endpoint/market_data/realtime/quote/quote_message.json
rename to schema_json/endpoint/market_data/stock/realtime/quote/quote_message.json
index f1f9606d..3c7c650c 100644
--- a/schema_json/endpoint/market_data/realtime/quote/quote_message.json
+++ b/schema_json/endpoint/market_data/stock/realtime/quote/quote_message.json
@@ -1,7 +1,7 @@
{
"type": "object",
"extends": {
- "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.realtime.SymbolMessage"
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.realtime.SymbolMessage"
},
"title": "See Real-time Data.",
"properties": {
diff --git a/schema_json/endpoint/market_data/realtime/symbol_message.json b/schema_json/endpoint/market_data/stock/realtime/symbol_message.json
similarity index 89%
rename from schema_json/endpoint/market_data/realtime/symbol_message.json
rename to schema_json/endpoint/market_data/stock/realtime/symbol_message.json
index 961d15c0..acc6327c 100644
--- a/schema_json/endpoint/market_data/realtime/symbol_message.json
+++ b/schema_json/endpoint/market_data/stock/realtime/symbol_message.json
@@ -1,7 +1,7 @@
{
"type": "object",
"extends": {
- "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.realtime.MarketDataMessage"
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.realtime.MarketDataMessage"
},
"title": "See Real-time Data.",
"properties": {
diff --git a/schema_json/endpoint/market_data/realtime/trade/trade_message.json b/schema_json/endpoint/market_data/stock/realtime/trade/trade_message.json
similarity index 96%
rename from schema_json/endpoint/market_data/realtime/trade/trade_message.json
rename to schema_json/endpoint/market_data/stock/realtime/trade/trade_message.json
index 7d01e2b8..e72f5859 100644
--- a/schema_json/endpoint/market_data/realtime/trade/trade_message.json
+++ b/schema_json/endpoint/market_data/stock/realtime/trade/trade_message.json
@@ -1,7 +1,7 @@
{
"type": "object",
"extends": {
- "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.realtime.SymbolMessage"
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.realtime.SymbolMessage"
},
"title": "See Real-time Data.",
"properties": {
diff --git a/schema_json/endpoint/position/position.json b/schema_json/endpoint/position/position.json
index 2f1eb603..7ebb619f 100644
--- a/schema_json/endpoint/position/position.json
+++ b/schema_json/endpoint/position/position.json
@@ -12,7 +12,7 @@
},
"exchange": {
"existingJavaType": "java.lang.String",
- "title": "Exchange name of the asset."
+ "title": "Exchange name of the asset (\"ErisX\" for crypto)."
},
"asset_class": {
"existingJavaType": "java.lang.String",
diff --git a/src/main/java/net/jacobpeterson/alpaca/AlpacaAPI.java b/src/main/java/net/jacobpeterson/alpaca/AlpacaAPI.java
index b874d794..67813131 100644
--- a/src/main/java/net/jacobpeterson/alpaca/AlpacaAPI.java
+++ b/src/main/java/net/jacobpeterson/alpaca/AlpacaAPI.java
@@ -12,11 +12,12 @@
import net.jacobpeterson.alpaca.rest.endpoint.AssetsEndpoint;
import net.jacobpeterson.alpaca.rest.endpoint.CalendarEndpoint;
import net.jacobpeterson.alpaca.rest.endpoint.ClockEndpoint;
-import net.jacobpeterson.alpaca.rest.endpoint.MarketDataEndpoint;
import net.jacobpeterson.alpaca.rest.endpoint.OrdersEndpoint;
import net.jacobpeterson.alpaca.rest.endpoint.PortfolioHistoryEndpoint;
import net.jacobpeterson.alpaca.rest.endpoint.PositionsEndpoint;
import net.jacobpeterson.alpaca.rest.endpoint.WatchlistEndpoint;
+import net.jacobpeterson.alpaca.rest.endpoint.marketdata.CryptoMarketDataEndpoint;
+import net.jacobpeterson.alpaca.rest.endpoint.marketdata.StockMarketDataEndpoint;
import net.jacobpeterson.alpaca.websocket.AlpacaWebsocket;
import net.jacobpeterson.alpaca.websocket.marketdata.MarketDataWebsocket;
import net.jacobpeterson.alpaca.websocket.marketdata.MarketDataWebsocketInterface;
@@ -42,13 +43,16 @@ public class AlpacaAPI {
private static final Logger LOGGER = LoggerFactory.getLogger(AlpacaAPI.class);
private static final String VERSION_2_PATH_SEGMENT = "v2";
+ private static final String VERSION_1_BETA_1_PATH_SEGMENT = "v1beta1";
private final OkHttpClient okHttpClient;
private final AlpacaClient brokerClient;
- private final AlpacaClient dataClient;
+ private final AlpacaClient cryptoDataClient;
+ private final AlpacaClient stockDataClient;
// Ordering of fields/methods below are analogous to the ordering in the Alpaca documentation
private final AccountEndpoint accountEndpoint;
- private final MarketDataEndpoint marketDataEndpoint;
+ private final CryptoMarketDataEndpoint cryptoMarketDataEndpoint;
+ private final StockMarketDataEndpoint stockMarketDataEndpoint;
private final OrdersEndpoint ordersEndpoint;
private final PositionsEndpoint positionsEndpoint;
private final AssetsEndpoint assetsEndpoint;
@@ -154,14 +158,17 @@ public AlpacaAPI(OkHttpClient okHttpClient, String keyID, String secretKey, Stri
if (oAuthToken == null) {
brokerClient = new AlpacaClient(okHttpClient, keyID, secretKey,
brokerHostSubdomain, VERSION_2_PATH_SEGMENT);
- dataClient = new AlpacaClient(okHttpClient, keyID, secretKey, "data", VERSION_2_PATH_SEGMENT);
+ cryptoDataClient = new AlpacaClient(okHttpClient, keyID, secretKey, "data", VERSION_1_BETA_1_PATH_SEGMENT);
+ stockDataClient = new AlpacaClient(okHttpClient, keyID, secretKey, "data", VERSION_2_PATH_SEGMENT);
} else {
brokerClient = new AlpacaClient(okHttpClient, oAuthToken, brokerHostSubdomain, VERSION_2_PATH_SEGMENT);
- dataClient = null;
+ cryptoDataClient = null;
+ stockDataClient = null;
}
accountEndpoint = new AccountEndpoint(brokerClient);
- marketDataEndpoint = dataClient == null ? null : new MarketDataEndpoint(dataClient);
+ cryptoMarketDataEndpoint = cryptoDataClient == null ? null : new CryptoMarketDataEndpoint(cryptoDataClient);
+ stockMarketDataEndpoint = stockDataClient == null ? null : new StockMarketDataEndpoint(stockDataClient);
ordersEndpoint = new OrdersEndpoint(brokerClient);
positionsEndpoint = new PositionsEndpoint(brokerClient);
assetsEndpoint = new AssetsEndpoint(brokerClient);
@@ -172,7 +179,7 @@ public AlpacaAPI(OkHttpClient okHttpClient, String keyID, String secretKey, Stri
accountActivitiesEndpoint = new AccountActivitiesEndpoint(brokerClient);
portfolioHistoryEndpoint = new PortfolioHistoryEndpoint(brokerClient);
streamingWebsocket = new StreamingWebsocket(okHttpClient, brokerHostSubdomain, keyID, secretKey, oAuthToken);
- marketDataWebsocket = dataClient == null ? null :
+ marketDataWebsocket = stockDataClient == null ? null :
new MarketDataWebsocket(okHttpClient, dataAPIType, keyID, secretKey);
}
@@ -184,10 +191,17 @@ public AccountEndpoint account() {
}
/**
- * @return the {@link MarketDataEndpoint}
+ * @return the {@link CryptoMarketDataEndpoint}
*/
- public MarketDataEndpoint marketData() {
- return marketDataEndpoint;
+ public CryptoMarketDataEndpoint cryptoMarketData() {
+ return cryptoMarketDataEndpoint;
+ }
+
+ /**
+ * @return the {@link StockMarketDataEndpoint}
+ */
+ public StockMarketDataEndpoint stockMarketData() {
+ return stockMarketDataEndpoint;
}
/**
@@ -267,30 +281,19 @@ public MarketDataWebsocketInterface marketDataStreaming() {
return marketDataWebsocket;
}
- /**
- * Gets {@link #okHttpClient}.
- *
- * @return the {@link OkHttpClient}
- */
public OkHttpClient getOkHttpClient() {
return okHttpClient;
}
- /**
- * Gets {@link #brokerClient}.
- *
- * @return the broker {@link AlpacaClient}
- */
public AlpacaClient getBrokerClient() {
return brokerClient;
}
- /**
- * Gets {@link #dataClient}.
- *
- * @return the data {@link AlpacaClient}
- */
- public AlpacaClient getDataClient() {
- return dataClient;
+ public AlpacaClient getCryptoDataClient() {
+ return cryptoDataClient;
+ }
+
+ public AlpacaClient getStockDataClient() {
+ return stockDataClient;
}
}
diff --git a/src/main/java/net/jacobpeterson/alpaca/rest/AlpacaClient.java b/src/main/java/net/jacobpeterson/alpaca/rest/AlpacaClient.java
index 90e7265a..12cb6a6f 100644
--- a/src/main/java/net/jacobpeterson/alpaca/rest/AlpacaClient.java
+++ b/src/main/java/net/jacobpeterson/alpaca/rest/AlpacaClient.java
@@ -222,20 +222,10 @@ public Response executeRequest(Request request) throws IOException {
return okHttpClient.newCall(request).execute();
}
- /**
- * Gets {@link #baseURL}.
- *
- * @return the base {@link HttpUrl}
- */
public HttpUrl getBaseURL() {
return baseURL;
}
- /**
- * Gets {@link #requestHeaders}.
- *
- * @return the request {@link Headers}
- */
public Headers getRequestHeaders() {
return requestHeaders;
}
diff --git a/src/main/java/net/jacobpeterson/alpaca/rest/AlpacaClientException.java b/src/main/java/net/jacobpeterson/alpaca/rest/AlpacaClientException.java
index bcf89c2b..2114b1e8 100644
--- a/src/main/java/net/jacobpeterson/alpaca/rest/AlpacaClientException.java
+++ b/src/main/java/net/jacobpeterson/alpaca/rest/AlpacaClientException.java
@@ -120,38 +120,18 @@ private String parseAPIErrorResponse() {
return messageBuilder.toString();
}
- /**
- * Gets the {@link #responseStatusCode}.
- *
- * @return an {@link Integer}
- */
public Integer getResponseStatusCode() {
return responseStatusCode;
}
- /**
- * Gets the {@link #responseStatusMessage}.
- *
- * @return a {@link String}
- */
public String getResponseStatusMessage() {
return responseStatusMessage;
}
- /**
- * Gets the {@link #apiResponseCode}.
- *
- * @return an {@link Integer}
- */
public Integer getAPIResponseCode() {
return apiResponseCode;
}
- /**
- * Gets the {@link #apiResponseMessage}.
- *
- * @return a {@link String}
- */
public String getAPIResponseMessage() {
return apiResponseMessage;
}
diff --git a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/AccountActivitiesEndpoint.java b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/AccountActivitiesEndpoint.java
index d1e5b88b..adbe8414 100644
--- a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/AccountActivitiesEndpoint.java
+++ b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/AccountActivitiesEndpoint.java
@@ -56,7 +56,7 @@ public AccountActivitiesEndpoint(AlpacaClient alpacaClient) {
* @param sortDirection the {@link SortDirection} (defaults to {@link SortDirection#DESCENDING} if unspecified.)
* @param pageSize the maximum number of entries to return in the response. (See the section on paging.)
* @param pageToken the ID of the end of your current page of results. (See the section on paging.)
- * @param activityTypes the {@link ActivityType}s (null for all {@link ActivityType}s)
+ * @param activityTypes the {@link ActivityType}s (null for all {@link ActivityType}s)
*
* @return a {@link List} of {@link AccountActivity}s
*
diff --git a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/AssetsEndpoint.java b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/AssetsEndpoint.java
index c0642115..6cbf3298 100644
--- a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/AssetsEndpoint.java
+++ b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/AssetsEndpoint.java
@@ -2,6 +2,7 @@
import com.google.gson.reflect.TypeToken;
import net.jacobpeterson.alpaca.model.endpoint.asset.Asset;
+import net.jacobpeterson.alpaca.model.endpoint.asset.enums.AssetClass;
import net.jacobpeterson.alpaca.model.endpoint.asset.enums.AssetStatus;
import net.jacobpeterson.alpaca.rest.AlpacaClient;
import net.jacobpeterson.alpaca.rest.AlpacaClientException;
@@ -31,13 +32,13 @@ public AssetsEndpoint(AlpacaClient alpacaClient) {
* Get a list of {@link Asset}s.
*
* @param assetStatus the {@link AssetStatus}. By default, all {@link AssetStatus}es are included.
- * @param assetClass the asset class. Defaults to "us_equity".
+ * @param assetClass the {@link AssetClass} (null for {@link AssetClass#US_EQUITY})
*
* @return a {@link List} of {@link Asset}s
*
* @throws AlpacaClientException thrown for {@link AlpacaClientException}s
*/
- public List get(AssetStatus assetStatus, String assetClass) throws AlpacaClientException {
+ public List get(AssetStatus assetStatus, AssetClass assetClass) throws AlpacaClientException {
HttpUrl.Builder urlBuilder = alpacaClient.urlBuilder()
.addPathSegment(endpointPathSegment);
@@ -46,7 +47,7 @@ public List get(AssetStatus assetStatus, String assetClass) throws Alpaca
}
if (assetClass != null) {
- urlBuilder.addQueryParameter("asset_class", assetClass);
+ urlBuilder.addQueryParameter("asset_class", assetClass.toString());
}
Request request = alpacaClient.requestBuilder(urlBuilder.build())
diff --git a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/OrdersEndpoint.java b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/OrdersEndpoint.java
index a542d12d..8715d1fc 100644
--- a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/OrdersEndpoint.java
+++ b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/OrdersEndpoint.java
@@ -52,7 +52,9 @@ public OrdersEndpoint(AlpacaClient alpacaClient) {
* @param direction the chronological order of response based on the submission time. Defaults to {@link
* SortDirection#DESCENDING}.
* @param nested if true, the result will roll up multi-leg orders under the legs field of primary order.
- * @param symbols a {@link Collection} of symbols to filter the result by (null for no filter).
+ * @param symbols a {@link Collection} of symbols to filter by (e.g. "AAPL,TSLA,MSFT"). A currency pair is
+ * required for crypto orders (e.g. "BTCUSD,BCHUSD,LTCUSD,ETCUSD"). null for no
+ * filter.
*
* @return a {@link List} of {@link Order}s
*
diff --git a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/marketdata/CryptoMarketDataEndpoint.java b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/marketdata/CryptoMarketDataEndpoint.java
new file mode 100644
index 00000000..c044d1f8
--- /dev/null
+++ b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/marketdata/CryptoMarketDataEndpoint.java
@@ -0,0 +1,296 @@
+package net.jacobpeterson.alpaca.rest.endpoint.marketdata;
+
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.common.enums.BarTimePeriod;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.bar.Bar;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.bar.BarsResponse;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.enums.Exchange;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.quote.LatestQuoteResponse;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.quote.Quote;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.quote.QuotesResponse;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.trade.LatestTradeResponse;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.trade.Trade;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.trade.TradesResponse;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.xbbo.XbboResponse;
+import net.jacobpeterson.alpaca.rest.AlpacaClient;
+import net.jacobpeterson.alpaca.rest.AlpacaClientException;
+import net.jacobpeterson.alpaca.rest.endpoint.AlpacaEndpoint;
+import net.jacobpeterson.alpaca.util.format.FormatUtil;
+import okhttp3.HttpUrl;
+import okhttp3.Request;
+
+import java.time.ZonedDateTime;
+import java.util.Collection;
+import java.util.stream.Collectors;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * {@link AlpacaEndpoint} for
+ * Historical
+ * Crypto Market Data API.
+ */
+public class CryptoMarketDataEndpoint extends AlpacaEndpoint {
+
+ /**
+ * Instantiates a new {@link CryptoMarketDataEndpoint}.
+ *
+ * @param alpacaClient the {@link AlpacaClient}
+ */
+ public CryptoMarketDataEndpoint(AlpacaClient alpacaClient) {
+ super(alpacaClient, "crypto");
+ }
+
+ /**
+ * Gets {@link Trade} historical data for the requested crypto symbol.
+ *
+ * @param symbol the symbol to query for
+ * @param exchanges a {@link Collection} of {@link Exchange}s to filter by. null for all exchanges.
+ * @param start filter data equal to or after this {@link ZonedDateTime}. Fractions of a second are not
+ * accepted. null for the current day in Central Time.
+ * @param end filter data equal to or before this {@link ZonedDateTime}. Fractions of a second are not
+ * accepted. null for now.
+ * @param limit number of data points to return. Must be in range 1-10000, defaults to 1000 if null
+ * is given
+ * @param pageToken pagination token to continue from
+ *
+ * @return the {@link TradesResponse}
+ *
+ * @throws AlpacaClientException thrown for {@link AlpacaClientException}s
+ */
+ public TradesResponse getTrades(String symbol, Collection exchanges, ZonedDateTime start,
+ ZonedDateTime end, Integer limit, String pageToken) throws AlpacaClientException {
+ checkNotNull(symbol);
+
+ HttpUrl.Builder urlBuilder = alpacaClient.urlBuilder()
+ .addPathSegment(endpointPathSegment)
+ .addPathSegment(symbol)
+ .addPathSegment("trades");
+
+ if (exchanges != null) {
+ urlBuilder.addQueryParameter("exchanges", exchanges.stream()
+ .map(Exchange::value)
+ .collect(Collectors.joining(",")));
+ }
+
+ if (start != null) {
+ urlBuilder.addQueryParameter("start", FormatUtil.toRFC3339Format(start));
+ }
+
+ if (end != null) {
+ urlBuilder.addQueryParameter("end", FormatUtil.toRFC3339Format(end));
+ }
+
+ if (limit != null) {
+ urlBuilder.addQueryParameter("limit", limit.toString());
+ }
+
+ if (pageToken != null) {
+ urlBuilder.addQueryParameter("page_token", pageToken);
+ }
+
+ Request request = alpacaClient.requestBuilder(urlBuilder.build())
+ .get()
+ .build();
+ return alpacaClient.requestObject(request, TradesResponse.class);
+ }
+
+ /**
+ * Gets the latest {@link Trade} for the requested security.
+ *
+ * @param symbol the symbol to query for
+ * @param exchange the {@link Exchange} to filter the latest {@link Trade} by.
+ *
+ * @return the {@link LatestTradeResponse}
+ *
+ * @throws AlpacaClientException thrown for {@link AlpacaClientException}s
+ */
+ public LatestTradeResponse getLatestTrade(String symbol, Exchange exchange) throws AlpacaClientException {
+ checkNotNull(symbol);
+ checkNotNull(exchange);
+
+ HttpUrl.Builder urlBuilder = alpacaClient.urlBuilder()
+ .addPathSegment(endpointPathSegment)
+ .addPathSegment(symbol)
+ .addPathSegment("trades")
+ .addPathSegment("latest");
+
+ urlBuilder.addQueryParameter("exchange", exchange.toString());
+
+ Request request = alpacaClient.requestBuilder(urlBuilder.build())
+ .get()
+ .build();
+ return alpacaClient.requestObject(request, LatestTradeResponse.class);
+ }
+
+ /**
+ * Gets {@link Quote} historical data for the requested crypto symbol.
+ *
+ * @param symbol the symbol to query for
+ * @param exchanges a {@link Collection} of {@link Exchange}s to filter by. null for all exchanges.
+ * @param start filter data equal to or after this {@link ZonedDateTime}. Fractions of a second are not
+ * accepted. null for the current day in Central Time.
+ * @param end filter data equal to or before this {@link ZonedDateTime}. Fractions of a second are not
+ * accepted. null for now.
+ * @param limit number of data points to return. Must be in range 1-10000, defaults to 1000 if null
+ * is given
+ * @param pageToken pagination token to continue from
+ *
+ * @return the {@link QuotesResponse}
+ *
+ * @throws AlpacaClientException thrown for {@link AlpacaClientException}s
+ */
+ public QuotesResponse getQuotes(String symbol, Collection exchanges, ZonedDateTime start,
+ ZonedDateTime end, Integer limit, String pageToken) throws AlpacaClientException {
+ checkNotNull(symbol);
+
+ HttpUrl.Builder urlBuilder = alpacaClient.urlBuilder()
+ .addPathSegment(endpointPathSegment)
+ .addPathSegment(symbol)
+ .addPathSegment("quotes");
+
+ if (exchanges != null) {
+ urlBuilder.addQueryParameter("exchanges", exchanges.stream()
+ .map(Exchange::value)
+ .collect(Collectors.joining(",")));
+ }
+
+ if (start != null) {
+ urlBuilder.addQueryParameter("start", FormatUtil.toRFC3339Format(start));
+ }
+
+ if (end != null) {
+ urlBuilder.addQueryParameter("end", FormatUtil.toRFC3339Format(end));
+ }
+
+ if (limit != null) {
+ urlBuilder.addQueryParameter("limit", limit.toString());
+ }
+
+ if (pageToken != null) {
+ urlBuilder.addQueryParameter("page_token", pageToken);
+ }
+
+ Request request = alpacaClient.requestBuilder(urlBuilder.build())
+ .get()
+ .build();
+ return alpacaClient.requestObject(request, QuotesResponse.class);
+ }
+
+ /**
+ * Gets the latest {@link Quote} for the requested security.
+ *
+ * @param symbol the symbol to query for
+ * @param exchange the {@link Exchange} to filter the latest {@link Quote} by.
+ *
+ * @return the {@link LatestQuoteResponse}
+ *
+ * @throws AlpacaClientException thrown for {@link AlpacaClientException}s
+ */
+ public LatestQuoteResponse getLatestQuote(String symbol, Exchange exchange) throws AlpacaClientException {
+ checkNotNull(symbol);
+ checkNotNull(exchange);
+
+ HttpUrl.Builder urlBuilder = alpacaClient.urlBuilder()
+ .addPathSegment(endpointPathSegment)
+ .addPathSegment(symbol)
+ .addPathSegment("quotes")
+ .addPathSegment("latest");
+
+ urlBuilder.addQueryParameter("exchange", exchange.toString());
+
+ Request request = alpacaClient.requestBuilder(urlBuilder.build())
+ .get()
+ .build();
+ return alpacaClient.requestObject(request, LatestQuoteResponse.class);
+ }
+
+ /**
+ * Gets {@link Bar} aggregate historical data for the requested crypto.
+ *
+ * @param symbol the symbol to query for
+ * @param exchanges a {@link Collection} of {@link Exchange}s to filter by. null for all
+ * exchanges.
+ * @param start filter data equal to or after this {@link ZonedDateTime}. Fractions of a second are
+ * not accepted. null for now.
+ * @param limit number of data points to return. Must be in range 1-10000, defaults to 1000 if
+ * null is given
+ * @param pageToken pagination token to continue from
+ * @param barTimePeriodDuration the duration for the given barTimePeriod parameter. e.g. for
+ * 15Min bars, you would supply 15 for this parameter and
+ * {@link BarTimePeriod#MINUTE} for the barTimePeriod parameter.
+ * @param barTimePeriod the {@link BarTimePeriod} e.g. for 15Min bars, you would supply {@link
+ * BarTimePeriod#MINUTE} for this parameter and 15 for the
+ * barTimePeriodDuration parameter.
+ *
+ * @return the {@link BarsResponse}
+ *
+ * @throws AlpacaClientException thrown for {@link AlpacaClientException}s
+ */
+ public BarsResponse getBars(String symbol, Collection exchanges, ZonedDateTime start, Integer limit,
+ String pageToken, int barTimePeriodDuration, BarTimePeriod barTimePeriod) throws AlpacaClientException {
+ checkNotNull(symbol);
+ checkNotNull(barTimePeriod);
+
+ HttpUrl.Builder urlBuilder = alpacaClient.urlBuilder()
+ .addPathSegment(endpointPathSegment)
+ .addPathSegment(symbol)
+ .addPathSegment("bars");
+
+ if (exchanges != null) {
+ urlBuilder.addQueryParameter("exchanges", exchanges.stream()
+ .map(Exchange::value)
+ .collect(Collectors.joining(",")));
+ }
+
+ if (start != null) {
+ urlBuilder.addQueryParameter("start", FormatUtil.toRFC3339Format(start));
+ }
+
+ if (limit != null) {
+ urlBuilder.addQueryParameter("limit", limit.toString());
+ }
+
+ if (pageToken != null) {
+ urlBuilder.addQueryParameter("page_token", pageToken);
+ }
+
+ urlBuilder.addQueryParameter("timeframe", barTimePeriodDuration + barTimePeriod.toString());
+
+ Request request = alpacaClient.requestBuilder(urlBuilder.build())
+ .get()
+ .build();
+ return alpacaClient.requestObject(request, BarsResponse.class);
+ }
+
+ /**
+ * Returns the XBBO for a crypto symbol that calculates the Best Bid and Offer across multiple exchanges.
+ *
+ * @param symbol the symbol to query for
+ * @param exchanges a {@link Collection} of {@link Exchange}s to filter by. If null, then only the
+ * exchanges that can be traded on Alpaca are included in the calculation.
+ *
+ * @return the {@link LatestQuoteResponse}
+ *
+ * @throws AlpacaClientException thrown for {@link AlpacaClientException}s
+ */
+ public XbboResponse getXBBO(String symbol, Collection exchanges) throws AlpacaClientException {
+ checkNotNull(symbol);
+
+ HttpUrl.Builder urlBuilder = alpacaClient.urlBuilder()
+ .addPathSegment(endpointPathSegment)
+ .addPathSegment(symbol)
+ .addPathSegment("xbbo")
+ .addPathSegment("latest");
+
+ if (exchanges != null) {
+ urlBuilder.addQueryParameter("exchanges", exchanges.stream()
+ .map(Exchange::value)
+ .collect(Collectors.joining(",")));
+ }
+
+ Request request = alpacaClient.requestBuilder(urlBuilder.build())
+ .get()
+ .build();
+ return alpacaClient.requestObject(request, XbboResponse.class);
+ }
+}
diff --git a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/MarketDataEndpoint.java b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/marketdata/StockMarketDataEndpoint.java
similarity index 86%
rename from src/main/java/net/jacobpeterson/alpaca/rest/endpoint/MarketDataEndpoint.java
rename to src/main/java/net/jacobpeterson/alpaca/rest/endpoint/marketdata/StockMarketDataEndpoint.java
index 45fc4a08..f203a5d2 100644
--- a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/MarketDataEndpoint.java
+++ b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/marketdata/StockMarketDataEndpoint.java
@@ -1,19 +1,20 @@
-package net.jacobpeterson.alpaca.rest.endpoint;
+package net.jacobpeterson.alpaca.rest.endpoint.marketdata;
import com.google.gson.reflect.TypeToken;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.historical.bar.Bar;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.historical.bar.BarsResponse;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.historical.bar.enums.BarAdjustment;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.historical.bar.enums.BarTimePeriod;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.historical.quote.LatestQuoteResponse;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.historical.quote.Quote;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.historical.quote.QuotesResponse;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.historical.snapshot.Snapshot;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.historical.trade.LatestTradeResponse;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.historical.trade.Trade;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.historical.trade.TradesResponse;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.common.enums.BarTimePeriod;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.bar.Bar;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.bar.BarsResponse;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.bar.enums.BarAdjustment;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.quote.LatestQuoteResponse;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.quote.Quote;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.quote.QuotesResponse;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.snapshot.Snapshot;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.trade.LatestTradeResponse;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.trade.Trade;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.trade.TradesResponse;
import net.jacobpeterson.alpaca.rest.AlpacaClient;
import net.jacobpeterson.alpaca.rest.AlpacaClientException;
+import net.jacobpeterson.alpaca.rest.endpoint.AlpacaEndpoint;
import net.jacobpeterson.alpaca.util.format.FormatUtil;
import okhttp3.HttpUrl;
import okhttp3.Request;
@@ -31,14 +32,14 @@
* Historical
* Market Data API v2.
*/
-public class MarketDataEndpoint extends AlpacaEndpoint {
+public class StockMarketDataEndpoint extends AlpacaEndpoint {
/**
- * Instantiates a new {@link MarketDataEndpoint}.
+ * Instantiates a new {@link StockMarketDataEndpoint}.
*
* @param alpacaClient the {@link AlpacaClient}
*/
- public MarketDataEndpoint(AlpacaClient alpacaClient) {
+ public StockMarketDataEndpoint(AlpacaClient alpacaClient) {
super(alpacaClient, "stocks");
}
@@ -87,7 +88,7 @@ public TradesResponse getTrades(String symbol, ZonedDateTime start, ZonedDateTim
}
/**
- * The Latest Trade API provides the latest {@link Trade} data for a given ticker symbol.
+ * Gets the latest {@link Trade} for the requested security.
*
* @param symbol the symbol to query for
*
@@ -155,7 +156,7 @@ public QuotesResponse getQuotes(String symbol, ZonedDateTime start, ZonedDateTim
}
/**
- * The Latest Quote API provides the latest quote data for a given ticker symbol.
+ * Gets the latest {@link Quote} for the requested security.
*
* @param symbol the symbol to query for
*
@@ -217,7 +218,6 @@ public BarsResponse getBars(String symbol, ZonedDateTime start, ZonedDateTime en
urlBuilder.addQueryParameter("start", FormatUtil.toRFC3339Format(start));
urlBuilder.addQueryParameter("end", FormatUtil.toRFC3339Format(end));
- urlBuilder.addQueryParameter("timeframe", barTimePeriodDuration + barTimePeriod.toString());
if (limit != null) {
urlBuilder.addQueryParameter("limit", limit.toString());
@@ -227,6 +227,8 @@ public BarsResponse getBars(String symbol, ZonedDateTime start, ZonedDateTime en
urlBuilder.addQueryParameter("page_token", pageToken);
}
+ urlBuilder.addQueryParameter("timeframe", barTimePeriodDuration + barTimePeriod.toString());
+
if (barAdjustment != null) {
urlBuilder.addQueryParameter("adjustment", barAdjustment.toString());
}
@@ -238,8 +240,7 @@ public BarsResponse getBars(String symbol, ZonedDateTime start, ZonedDateTime en
}
/**
- * The Snapshot API for one ticker provides the latest trade, latest quote, minute bar daily bar, and previous daily
- * bar data for a given ticker symbol
+ * Gets {@link Snapshot}s of the requested securities.
*
* @param symbols a {@link Collection} of symbols to query for
*
@@ -264,8 +265,7 @@ public Map getSnapshots(Collection symbols) throws Alp
}
/**
- * The Snapshot API for one ticker provides the latest trade, latest quote, minute bar daily bar and previous daily
- * bar data for a given ticker symbol
+ * Gets a {@link Snapshot} of the requested security.
*
* @param symbol the symbol to query for
*
diff --git a/src/main/java/net/jacobpeterson/alpaca/websocket/AlpacaWebsocket.java b/src/main/java/net/jacobpeterson/alpaca/websocket/AlpacaWebsocket.java
index 232d23f2..18387bcd 100644
--- a/src/main/java/net/jacobpeterson/alpaca/websocket/AlpacaWebsocket.java
+++ b/src/main/java/net/jacobpeterson/alpaca/websocket/AlpacaWebsocket.java
@@ -275,38 +275,18 @@ public void setListener(L listener) {
this.listener = listener;
}
- /**
- * Gets {@link #websocketStateListener}.
- *
- * @return the {@link WebsocketStateListener}
- */
public WebsocketStateListener getWebsocketStateListener() {
return websocketStateListener;
}
- /**
- * Sets {@link #websocketStateListener}.
- *
- * @param websocketStateListener an {@link WebsocketStateListener}
- */
public void setWebsocketStateListener(WebsocketStateListener websocketStateListener) {
this.websocketStateListener = websocketStateListener;
}
- /**
- * Gets {@link #automaticallyReconnect}.
- *
- * @return a boolean
- */
public boolean doesAutomaticallyReconnect() {
return automaticallyReconnect;
}
- /**
- * Sets {@link #automaticallyReconnect}.
- *
- * @param automaticallyReconnect the boolean
- */
public void setAutomaticallyReconnect(boolean automaticallyReconnect) {
this.automaticallyReconnect = automaticallyReconnect;
}
diff --git a/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/MarketDataListener.java b/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/MarketDataListener.java
index c1138209..09bf4266 100644
--- a/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/MarketDataListener.java
+++ b/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/MarketDataListener.java
@@ -1,7 +1,7 @@
package net.jacobpeterson.alpaca.websocket.marketdata;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.realtime.MarketDataMessage;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.realtime.enums.MarketDataMessageType;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.realtime.MarketDataMessage;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.realtime.enums.MarketDataMessageType;
import net.jacobpeterson.alpaca.websocket.AlpacaWebsocketMessageListener;
/**
diff --git a/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/MarketDataWebsocket.java b/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/MarketDataWebsocket.java
index 48953560..28cce551 100644
--- a/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/MarketDataWebsocket.java
+++ b/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/MarketDataWebsocket.java
@@ -5,14 +5,14 @@
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.realtime.MarketDataMessage;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.realtime.bar.BarMessage;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.realtime.control.ErrorMessage;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.realtime.control.SubscriptionsMessage;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.realtime.control.SuccessMessage;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.realtime.enums.MarketDataMessageType;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.realtime.quote.QuoteMessage;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.realtime.trade.TradeMessage;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.realtime.MarketDataMessage;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.realtime.bar.BarMessage;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.realtime.control.ErrorMessage;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.realtime.control.SubscriptionsMessage;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.realtime.control.SuccessMessage;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.realtime.enums.MarketDataMessageType;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.realtime.quote.QuoteMessage;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.realtime.trade.TradeMessage;
import net.jacobpeterson.alpaca.model.properties.DataAPIType;
import net.jacobpeterson.alpaca.websocket.AlpacaWebsocket;
import okhttp3.HttpUrl;
diff --git a/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/MarketDataWebsocketInterface.java b/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/MarketDataWebsocketInterface.java
index 9ac90112..2eb52e63 100644
--- a/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/MarketDataWebsocketInterface.java
+++ b/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/MarketDataWebsocketInterface.java
@@ -1,10 +1,10 @@
package net.jacobpeterson.alpaca.websocket.marketdata;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.realtime.MarketDataMessage;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.realtime.control.ErrorMessage;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.realtime.control.SubscriptionsMessage;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.realtime.control.SuccessMessage;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.realtime.enums.MarketDataMessageType;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.realtime.MarketDataMessage;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.realtime.control.ErrorMessage;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.realtime.control.SubscriptionsMessage;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.realtime.control.SuccessMessage;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.realtime.enums.MarketDataMessageType;
import net.jacobpeterson.alpaca.websocket.AlpacaWebsocketInterface;
import java.util.Collection;
From 95b36855c9a95e783f37196984da04d7b56880a9 Mon Sep 17 00:00:00 2001
From: Jacob Peterson <14127217+Petersoj@users.noreply.github.com>
Date: Tue, 21 Dec 2021 18:21:33 -0700
Subject: [PATCH 23/84] Refactor, abstract models and endpoints, implement
realtime crypto
---
README.md | 2 +-
schema_json/endpoint/account/account.json | 4 +-
.../endpoint/{asset => assets}/asset.json | 8 +--
.../{asset => assets}/enums/asset_class.json | 0
.../{asset => assets}/enums/asset_status.json | 0
.../{stock => common}/historical/bar/bar.json | 10 ++-
.../bar}/enums/bar_time_period.json | 0
.../common/historical/quote/quote.json | 21 ++++++
.../common/historical/trade/trade.json | 21 ++++++
.../realtime/bar/bar_message.json | 9 +--
.../realtime/control/error_message.json | 4 +-
.../control/subscriptions_message.json | 4 +-
.../realtime/control/success_message.json | 4 +-
.../enums/market_data_message_type.json | 2 +-
.../realtime/market_data_message.json | 6 +-
.../common/realtime/quote/quote_message.json | 24 +++++++
.../realtime/symbol_message.json | 4 +-
.../common/realtime/trade/trade_message.json | 24 +++++++
.../enums/exchange.json | 2 +-
.../trade => common}/enums/taker_side.json | 2 +-
.../crypto/historical/bar/bar.json | 51 --------------
.../crypto/historical/bar/crypto_bar.json | 19 +++++
...esponse.json => crypto_bars_response.json} | 6 +-
.../crypto/historical/quote/crypto_quote.json | 24 +++++++
...ponse.json => crypto_quotes_response.json} | 6 +-
...json => latest_crypto_quote_response.json} | 6 +-
.../crypto/historical/quote/quote.json | 36 ----------
.../crypto/historical/trade/crypto_trade.json | 24 +++++++
...ponse.json => crypto_trades_response.json} | 6 +-
...json => latest_crypto_trade_response.json} | 6 +-
.../crypto/historical/trade/trade.json | 36 ----------
.../crypto/historical/xbbo/xbbo.json | 6 +-
.../crypto/historical/xbbo/xbbo_response.json | 2 +-
.../realtime/bar/crypto_bar_message.json | 29 ++++++++
.../realtime/quote/crypto_quote_message.json | 24 +++++++
.../realtime/trade/crypto_trade_message.json | 24 +++++++
.../historical/bar/enums/bar_adjustment.json | 2 +-
.../stock/historical/bar/stock_bar.json | 14 ++++
...response.json => stock_bars_response.json} | 6 +-
....json => latest_stock_quote_response.json} | 6 +-
.../quote/{quote.json => stock_quote.json} | 20 ++----
...sponse.json => stock_quotes_response.json} | 6 +-
.../stock/historical/snapshot/snapshot.json | 22 +++---
....json => latest_stock_trade_response.json} | 6 +-
.../trade/{trade.json => stock_trade.json} | 20 ++----
...sponse.json => stock_trades_response.json} | 6 +-
.../stock/realtime/bar/stock_bar_message.json | 14 ++++
..._message.json => stock_quote_message.json} | 19 +----
..._message.json => stock_trade_message.json} | 19 +----
.../{order => orders}/cancelled_order.json | 4 +-
.../enums/current_order_status.json | 0
.../{order => orders}/enums/order_class.json | 0
.../{order => orders}/enums/order_side.json | 0
.../{order => orders}/enums/order_status.json | 0
.../enums/order_time_in_force.json | 0
.../{order => orders}/enums/order_type.json | 0
.../endpoint/{order => orders}/order.json | 24 +++----
.../close_position_order.json | 4 +-
.../{position => positions}/position.json | 0
.../streaming/trade/trade_update.json | 4 +-
schema_json/endpoint/watchlist/watchlist.json | 2 +-
.../net/jacobpeterson/alpaca/AlpacaAPI.java | 50 ++++++++-----
.../{ => account}/AccountEndpoint.java | 3 +-
.../AccountActivitiesEndpoint.java | 3 +-
.../AccountConfigurationEndpoint.java | 3 +-
.../endpoint/{ => assets}/AssetsEndpoint.java | 9 +--
.../{ => calendar}/CalendarEndpoint.java | 3 +-
.../endpoint/{ => clock}/ClockEndpoint.java | 3 +-
.../CryptoMarketDataEndpoint.java | 70 +++++++++----------
.../{ => stock}/StockMarketDataEndpoint.java | 60 ++++++++--------
.../endpoint/{ => orders}/OrdersEndpoint.java | 19 ++---
.../PortfolioHistoryEndpoint.java | 3 +-
.../{ => positions}/PositionsEndpoint.java | 11 +--
.../{ => watchlist}/WatchlistEndpoint.java | 5 +-
.../marketdata/MarketDataListener.java | 4 +-
.../marketdata/MarketDataWebsocket.java | 70 ++++++++++++-------
.../MarketDataWebsocketInterface.java | 10 +--
.../crypto/CryptoMarketDataWebsocket.java | 27 +++++++
.../stock/StockMarketDataWebsocket.java | 30 ++++++++
.../alpaca/test/live/AlpacaAPITest.java | 14 ++--
80 files changed, 612 insertions(+), 439 deletions(-)
rename schema_json/endpoint/{asset => assets}/asset.json (93%)
rename schema_json/endpoint/{asset => assets}/enums/asset_class.json (100%)
rename schema_json/endpoint/{asset => assets}/enums/asset_status.json (100%)
rename schema_json/endpoint/market_data/{stock => common}/historical/bar/bar.json (83%)
rename schema_json/endpoint/market_data/common/{ => historical/bar}/enums/bar_time_period.json (100%)
create mode 100644 schema_json/endpoint/market_data/common/historical/quote/quote.json
create mode 100644 schema_json/endpoint/market_data/common/historical/trade/trade.json
rename schema_json/endpoint/market_data/{stock => common}/realtime/bar/bar_message.json (77%)
rename schema_json/endpoint/market_data/{stock => common}/realtime/control/error_message.json (76%)
rename schema_json/endpoint/market_data/{stock => common}/realtime/control/subscriptions_message.json (84%)
rename schema_json/endpoint/market_data/{stock => common}/realtime/control/success_message.json (71%)
rename schema_json/endpoint/market_data/{stock => common}/realtime/enums/market_data_message_type.json (83%)
rename schema_json/endpoint/market_data/{stock => common}/realtime/market_data_message.json (59%)
create mode 100644 schema_json/endpoint/market_data/common/realtime/quote/quote_message.json
rename schema_json/endpoint/market_data/{stock => common}/realtime/symbol_message.json (71%)
create mode 100644 schema_json/endpoint/market_data/common/realtime/trade/trade_message.json
rename schema_json/endpoint/market_data/crypto/{historical => common}/enums/exchange.json (74%)
rename schema_json/endpoint/market_data/crypto/{historical/trade => common}/enums/taker_side.json (69%)
delete mode 100644 schema_json/endpoint/market_data/crypto/historical/bar/bar.json
create mode 100644 schema_json/endpoint/market_data/crypto/historical/bar/crypto_bar.json
rename schema_json/endpoint/market_data/crypto/historical/bar/{bars_response.json => crypto_bars_response.json} (76%)
create mode 100644 schema_json/endpoint/market_data/crypto/historical/quote/crypto_quote.json
rename schema_json/endpoint/market_data/crypto/historical/quote/{quotes_response.json => crypto_quotes_response.json} (75%)
rename schema_json/endpoint/market_data/crypto/historical/quote/{latest_quote_response.json => latest_crypto_quote_response.json} (64%)
delete mode 100644 schema_json/endpoint/market_data/crypto/historical/quote/quote.json
create mode 100644 schema_json/endpoint/market_data/crypto/historical/trade/crypto_trade.json
rename schema_json/endpoint/market_data/crypto/historical/trade/{trades_response.json => crypto_trades_response.json} (75%)
rename schema_json/endpoint/market_data/crypto/historical/trade/{latest_trade_response.json => latest_crypto_trade_response.json} (64%)
delete mode 100644 schema_json/endpoint/market_data/crypto/historical/trade/trade.json
create mode 100644 schema_json/endpoint/market_data/crypto/realtime/bar/crypto_bar_message.json
create mode 100644 schema_json/endpoint/market_data/crypto/realtime/quote/crypto_quote_message.json
create mode 100644 schema_json/endpoint/market_data/crypto/realtime/trade/crypto_trade_message.json
create mode 100644 schema_json/endpoint/market_data/stock/historical/bar/stock_bar.json
rename schema_json/endpoint/market_data/stock/historical/bar/{bars_response.json => stock_bars_response.json} (85%)
rename schema_json/endpoint/market_data/stock/historical/quote/{latest_quote_response.json => latest_stock_quote_response.json} (76%)
rename schema_json/endpoint/market_data/stock/historical/quote/{quote.json => stock_quote.json} (66%)
rename schema_json/endpoint/market_data/stock/historical/quote/{quotes_response.json => stock_quotes_response.json} (84%)
rename schema_json/endpoint/market_data/stock/historical/trade/{latest_trade_response.json => latest_stock_trade_response.json} (76%)
rename schema_json/endpoint/market_data/stock/historical/trade/{trade.json => stock_trade.json} (63%)
rename schema_json/endpoint/market_data/stock/historical/trade/{trades_response.json => stock_trades_response.json} (84%)
create mode 100644 schema_json/endpoint/market_data/stock/realtime/bar/stock_bar_message.json
rename schema_json/endpoint/market_data/stock/realtime/quote/{quote_message.json => stock_quote_message.json} (65%)
rename schema_json/endpoint/market_data/stock/realtime/trade/{trade_message.json => stock_trade_message.json} (59%)
rename schema_json/endpoint/{order => orders}/cancelled_order.json (92%)
rename schema_json/endpoint/{order => orders}/enums/current_order_status.json (100%)
rename schema_json/endpoint/{order => orders}/enums/order_class.json (100%)
rename schema_json/endpoint/{order => orders}/enums/order_side.json (100%)
rename schema_json/endpoint/{order => orders}/enums/order_status.json (100%)
rename schema_json/endpoint/{order => orders}/enums/order_time_in_force.json (100%)
rename schema_json/endpoint/{order => orders}/enums/order_type.json (100%)
rename schema_json/endpoint/{order => orders}/order.json (89%)
rename schema_json/endpoint/{position => positions}/close_position_order.json (91%)
rename schema_json/endpoint/{position => positions}/position.json (100%)
rename src/main/java/net/jacobpeterson/alpaca/rest/endpoint/{ => account}/AccountEndpoint.java (90%)
rename src/main/java/net/jacobpeterson/alpaca/rest/endpoint/{ => accountactivities}/AccountActivitiesEndpoint.java (97%)
rename src/main/java/net/jacobpeterson/alpaca/rest/endpoint/{ => accountconfiguration}/AccountConfigurationEndpoint.java (94%)
rename src/main/java/net/jacobpeterson/alpaca/rest/endpoint/{ => assets}/AssetsEndpoint.java (88%)
rename src/main/java/net/jacobpeterson/alpaca/rest/endpoint/{ => calendar}/CalendarEndpoint.java (94%)
rename src/main/java/net/jacobpeterson/alpaca/rest/endpoint/{ => clock}/ClockEndpoint.java (91%)
rename src/main/java/net/jacobpeterson/alpaca/rest/endpoint/marketdata/{ => crypto}/CryptoMarketDataEndpoint.java (83%)
rename src/main/java/net/jacobpeterson/alpaca/rest/endpoint/marketdata/{ => stock}/StockMarketDataEndpoint.java (84%)
rename src/main/java/net/jacobpeterson/alpaca/rest/endpoint/{ => orders}/OrdersEndpoint.java (98%)
rename src/main/java/net/jacobpeterson/alpaca/rest/endpoint/{ => portfoliohistory}/PortfolioHistoryEndpoint.java (97%)
rename src/main/java/net/jacobpeterson/alpaca/rest/endpoint/{ => positions}/PositionsEndpoint.java (92%)
rename src/main/java/net/jacobpeterson/alpaca/rest/endpoint/{ => watchlist}/WatchlistEndpoint.java (97%)
create mode 100644 src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/crypto/CryptoMarketDataWebsocket.java
create mode 100644 src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/stock/StockMarketDataWebsocket.java
diff --git a/README.md b/README.md
index a0947ec0..ffbea854 100644
--- a/README.md
+++ b/README.md
@@ -101,7 +101,7 @@ try {
```
## [`CryptoMarketDataEndpoint`](src/main/java/net/jacobpeterson/alpaca/rest/endpoint/marketdata/CryptoMarketDataEndpoint.java)
-Alpaca provides cryptocurrency data from multiple venues/exchanges, namely: Coinbase, ErisX, and FTX. Note that it does not route orders to all venues.
+Alpaca provides cryptocurrency data from multiple venues/exchanges, namely: Coinbase, ErisX, and FTX.
Example usage:
```java
diff --git a/schema_json/endpoint/account/account.json b/schema_json/endpoint/account/account.json
index a6e6d506..7e558fe2 100644
--- a/schema_json/endpoint/account/account.json
+++ b/schema_json/endpoint/account/account.json
@@ -56,11 +56,11 @@
},
"long_market_value": {
"existingJavaType": "java.lang.String",
- "title": "Real-time MtM value of all long positions held in the account."
+ "title": "Realtime MtM value of all long positions held in the account."
},
"short_market_value": {
"existingJavaType": "java.lang.String",
- "title": "Real-time MtM value of all short positions held in the account."
+ "title": "Realtime MtM value of all short positions held in the account."
},
"equity": {
"existingJavaType": "java.lang.String",
diff --git a/schema_json/endpoint/asset/asset.json b/schema_json/endpoint/assets/asset.json
similarity index 93%
rename from schema_json/endpoint/asset/asset.json
rename to schema_json/endpoint/assets/asset.json
index f5ab8b9c..fa65e096 100644
--- a/schema_json/endpoint/asset/asset.json
+++ b/schema_json/endpoint/assets/asset.json
@@ -7,9 +7,9 @@
"title": "Asset ID."
},
"class": {
- "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.asset.enums.AssetClass",
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.assets.enums.AssetClass",
"javaName": "assetClass",
- "title": "The {@link net.jacobpeterson.alpaca.model.endpoint.asset.enums.AssetClass}."
+ "title": "The {@link net.jacobpeterson.alpaca.model.endpoint.assets.enums.AssetClass}."
},
"exchange": {
"existingJavaType": "java.lang.String",
@@ -24,8 +24,8 @@
"title": "The official name of the asset."
},
"status": {
- "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.asset.enums.AssetStatus",
- "title": "The {@link net.jacobpeterson.alpaca.model.endpoint.asset.enums.AssetStatus}."
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.assets.enums.AssetStatus",
+ "title": "The {@link net.jacobpeterson.alpaca.model.endpoint.assets.enums.AssetStatus}."
},
"tradable": {
"existingJavaType": "java.lang.Boolean",
diff --git a/schema_json/endpoint/asset/enums/asset_class.json b/schema_json/endpoint/assets/enums/asset_class.json
similarity index 100%
rename from schema_json/endpoint/asset/enums/asset_class.json
rename to schema_json/endpoint/assets/enums/asset_class.json
diff --git a/schema_json/endpoint/asset/enums/asset_status.json b/schema_json/endpoint/assets/enums/asset_status.json
similarity index 100%
rename from schema_json/endpoint/asset/enums/asset_status.json
rename to schema_json/endpoint/assets/enums/asset_status.json
diff --git a/schema_json/endpoint/market_data/stock/historical/bar/bar.json b/schema_json/endpoint/market_data/common/historical/bar/bar.json
similarity index 83%
rename from schema_json/endpoint/market_data/stock/historical/bar/bar.json
rename to schema_json/endpoint/market_data/common/historical/bar/bar.json
index 55423fde..b0284b57 100644
--- a/schema_json/endpoint/market_data/stock/historical/bar/bar.json
+++ b/schema_json/endpoint/market_data/common/historical/bar/bar.json
@@ -1,6 +1,9 @@
{
"type": "object",
- "title": "See Historical Data.",
+ "extends": {
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.common.realtime.quote.QuoteMessage"
+ },
+ "title": "See Market Data.",
"properties": {
"t": {
"existingJavaType": "java.time.ZonedDateTime",
@@ -27,11 +30,6 @@
"javaName": "close",
"title": "Close price."
},
- "v": {
- "existingJavaType": "java.lang.Long",
- "javaName": "volume",
- "title": "Volume."
- },
"n": {
"existingJavaType": "java.lang.Long",
"javaName": "tradeCount",
diff --git a/schema_json/endpoint/market_data/common/enums/bar_time_period.json b/schema_json/endpoint/market_data/common/historical/bar/enums/bar_time_period.json
similarity index 100%
rename from schema_json/endpoint/market_data/common/enums/bar_time_period.json
rename to schema_json/endpoint/market_data/common/historical/bar/enums/bar_time_period.json
diff --git a/schema_json/endpoint/market_data/common/historical/quote/quote.json b/schema_json/endpoint/market_data/common/historical/quote/quote.json
new file mode 100644
index 00000000..ed75e88f
--- /dev/null
+++ b/schema_json/endpoint/market_data/common/historical/quote/quote.json
@@ -0,0 +1,21 @@
+{
+ "type": "object",
+ "title": "See Market Data.",
+ "properties": {
+ "t": {
+ "existingJavaType": "java.time.ZonedDateTime",
+ "javaName": "timestamp",
+ "title": "Timestamp with nanosecond precision."
+ },
+ "ap": {
+ "existingJavaType": "java.lang.Double",
+ "javaName": "askPrice",
+ "title": "Ask price."
+ },
+ "bp": {
+ "existingJavaType": "java.lang.Double",
+ "javaName": "bidPrice",
+ "title": "Bid price."
+ }
+ }
+}
diff --git a/schema_json/endpoint/market_data/common/historical/trade/trade.json b/schema_json/endpoint/market_data/common/historical/trade/trade.json
new file mode 100644
index 00000000..1cacafa5
--- /dev/null
+++ b/schema_json/endpoint/market_data/common/historical/trade/trade.json
@@ -0,0 +1,21 @@
+{
+ "type": "object",
+ "title": "See Market Data.",
+ "properties": {
+ "t": {
+ "existingJavaType": "java.time.ZonedDateTime",
+ "javaName": "timestamp",
+ "title": "Timestamp with nanosecond precision."
+ },
+ "p": {
+ "existingJavaType": "java.lang.Double",
+ "javaName": "price",
+ "title": "Trade price."
+ },
+ "i": {
+ "existingJavaType": "java.lang.Long",
+ "javaName": "tradeID",
+ "title": "Trade ID."
+ }
+ }
+}
diff --git a/schema_json/endpoint/market_data/stock/realtime/bar/bar_message.json b/schema_json/endpoint/market_data/common/realtime/bar/bar_message.json
similarity index 77%
rename from schema_json/endpoint/market_data/stock/realtime/bar/bar_message.json
rename to schema_json/endpoint/market_data/common/realtime/bar/bar_message.json
index 7abf464d..fcf5f6c6 100644
--- a/schema_json/endpoint/market_data/stock/realtime/bar/bar_message.json
+++ b/schema_json/endpoint/market_data/common/realtime/bar/bar_message.json
@@ -1,9 +1,9 @@
{
"type": "object",
"extends": {
- "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.realtime.SymbolMessage"
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.common.realtime.SymbolMessage"
},
- "title": "See Real-time Data.",
+ "title": "See Market Data.",
"properties": {
"o": {
"existingJavaType": "java.lang.Double",
@@ -25,11 +25,6 @@
"javaName": "close",
"title": "Close price."
},
- "v": {
- "existingJavaType": "java.lang.Long",
- "javaName": "volume",
- "title": "Volume."
- },
"t": {
"existingJavaType": "java.time.ZonedDateTime",
"javaName": "timestamp",
diff --git a/schema_json/endpoint/market_data/stock/realtime/control/error_message.json b/schema_json/endpoint/market_data/common/realtime/control/error_message.json
similarity index 76%
rename from schema_json/endpoint/market_data/stock/realtime/control/error_message.json
rename to schema_json/endpoint/market_data/common/realtime/control/error_message.json
index 1ef275ab..39b9e7f2 100644
--- a/schema_json/endpoint/market_data/stock/realtime/control/error_message.json
+++ b/schema_json/endpoint/market_data/common/realtime/control/error_message.json
@@ -1,9 +1,9 @@
{
"type": "object",
"extends": {
- "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.realtime.MarketDataMessage"
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.common.realtime.MarketDataMessage"
},
- "title": "See Real-time Data.",
+ "title": "See Market Data.",
"properties": {
"code": {
"existingJavaType": "java.lang.Integer",
diff --git a/schema_json/endpoint/market_data/stock/realtime/control/subscriptions_message.json b/schema_json/endpoint/market_data/common/realtime/control/subscriptions_message.json
similarity index 84%
rename from schema_json/endpoint/market_data/stock/realtime/control/subscriptions_message.json
rename to schema_json/endpoint/market_data/common/realtime/control/subscriptions_message.json
index 76bfc479..c302083a 100644
--- a/schema_json/endpoint/market_data/stock/realtime/control/subscriptions_message.json
+++ b/schema_json/endpoint/market_data/common/realtime/control/subscriptions_message.json
@@ -1,9 +1,9 @@
{
"type": "object",
"extends": {
- "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.realtime.MarketDataMessage"
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.common.realtime.MarketDataMessage"
},
- "title": "See Real-time Data.",
+ "title": "See Market Data.",
"properties": {
"trades": {
"existingJavaType": "java.util.ArrayList",
diff --git a/schema_json/endpoint/market_data/stock/realtime/control/success_message.json b/schema_json/endpoint/market_data/common/realtime/control/success_message.json
similarity index 71%
rename from schema_json/endpoint/market_data/stock/realtime/control/success_message.json
rename to schema_json/endpoint/market_data/common/realtime/control/success_message.json
index d7225e02..2edd335b 100644
--- a/schema_json/endpoint/market_data/stock/realtime/control/success_message.json
+++ b/schema_json/endpoint/market_data/common/realtime/control/success_message.json
@@ -1,9 +1,9 @@
{
"type": "object",
"extends": {
- "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.realtime.MarketDataMessage"
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.common.realtime.MarketDataMessage"
},
- "title": "See Real-time Data.",
+ "title": "See Market Data.",
"properties": {
"msg": {
"existingJavaType": "java.lang.String",
diff --git a/schema_json/endpoint/market_data/stock/realtime/enums/market_data_message_type.json b/schema_json/endpoint/market_data/common/realtime/enums/market_data_message_type.json
similarity index 83%
rename from schema_json/endpoint/market_data/stock/realtime/enums/market_data_message_type.json
rename to schema_json/endpoint/market_data/common/realtime/enums/market_data_message_type.json
index 40368ec9..f55a5190 100644
--- a/schema_json/endpoint/market_data/stock/realtime/enums/market_data_message_type.json
+++ b/schema_json/endpoint/market_data/common/realtime/enums/market_data_message_type.json
@@ -1,6 +1,6 @@
{
"type": "string",
- "title": "See Real-time Data.",
+ "title": "See Market Data.",
"enum": [
"success",
"error",
diff --git a/schema_json/endpoint/market_data/stock/realtime/market_data_message.json b/schema_json/endpoint/market_data/common/realtime/market_data_message.json
similarity index 59%
rename from schema_json/endpoint/market_data/stock/realtime/market_data_message.json
rename to schema_json/endpoint/market_data/common/realtime/market_data_message.json
index 5ee64bef..d41cd481 100644
--- a/schema_json/endpoint/market_data/stock/realtime/market_data_message.json
+++ b/schema_json/endpoint/market_data/common/realtime/market_data_message.json
@@ -1,11 +1,11 @@
{
"type": "object",
- "title": "See Real-time Data.",
+ "title": "See Market Data.",
"properties": {
"T": {
- "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.realtime.enums.MarketDataMessageType",
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.common.realtime.enums.MarketDataMessageType",
"javaName": "messageType",
- "title": "The {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.realtime.enums.MarketDataMessageType}."
+ "title": "The {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.common.realtime.enums.MarketDataMessageType}."
}
}
}
diff --git a/schema_json/endpoint/market_data/common/realtime/quote/quote_message.json b/schema_json/endpoint/market_data/common/realtime/quote/quote_message.json
new file mode 100644
index 00000000..d6bdaabc
--- /dev/null
+++ b/schema_json/endpoint/market_data/common/realtime/quote/quote_message.json
@@ -0,0 +1,24 @@
+{
+ "type": "object",
+ "extends": {
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.common.realtime.SymbolMessage"
+ },
+ "title": "See Market Data.",
+ "properties": {
+ "ap": {
+ "existingJavaType": "java.lang.Double",
+ "javaName": "askPrice",
+ "title": "Ask price."
+ },
+ "bp": {
+ "existingJavaType": "java.lang.Double",
+ "javaName": "bidPrice",
+ "title": "Bid price."
+ },
+ "t": {
+ "existingJavaType": "java.time.ZonedDateTime",
+ "javaName": "timestamp",
+ "title": "Timestamp with nanosecond precision."
+ }
+ }
+}
diff --git a/schema_json/endpoint/market_data/stock/realtime/symbol_message.json b/schema_json/endpoint/market_data/common/realtime/symbol_message.json
similarity index 71%
rename from schema_json/endpoint/market_data/stock/realtime/symbol_message.json
rename to schema_json/endpoint/market_data/common/realtime/symbol_message.json
index acc6327c..a6f40f69 100644
--- a/schema_json/endpoint/market_data/stock/realtime/symbol_message.json
+++ b/schema_json/endpoint/market_data/common/realtime/symbol_message.json
@@ -1,9 +1,9 @@
{
"type": "object",
"extends": {
- "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.realtime.MarketDataMessage"
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.common.realtime.MarketDataMessage"
},
- "title": "See Real-time Data.",
+ "title": "See Market Data.",
"properties": {
"S": {
"existingJavaType": "java.lang.String",
diff --git a/schema_json/endpoint/market_data/common/realtime/trade/trade_message.json b/schema_json/endpoint/market_data/common/realtime/trade/trade_message.json
new file mode 100644
index 00000000..ca01450f
--- /dev/null
+++ b/schema_json/endpoint/market_data/common/realtime/trade/trade_message.json
@@ -0,0 +1,24 @@
+{
+ "type": "object",
+ "extends": {
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.common.realtime.SymbolMessage"
+ },
+ "title": "See Market Data.",
+ "properties": {
+ "i": {
+ "existingJavaType": "java.lang.Integer",
+ "javaName": "tradeID",
+ "title": "Trade ID."
+ },
+ "p": {
+ "existingJavaType": "java.lang.Double",
+ "javaName": "price",
+ "title": "Trade price."
+ },
+ "t": {
+ "existingJavaType": "java.time.ZonedDateTime",
+ "javaName": "timestamp",
+ "title": "Timestamp with nanosecond precision."
+ }
+ }
+}
diff --git a/schema_json/endpoint/market_data/crypto/historical/enums/exchange.json b/schema_json/endpoint/market_data/crypto/common/enums/exchange.json
similarity index 74%
rename from schema_json/endpoint/market_data/crypto/historical/enums/exchange.json
rename to schema_json/endpoint/market_data/crypto/common/enums/exchange.json
index 1ea41bd6..ff9d94e5 100644
--- a/schema_json/endpoint/market_data/crypto/historical/enums/exchange.json
+++ b/schema_json/endpoint/market_data/crypto/common/enums/exchange.json
@@ -1,6 +1,6 @@
{
"type": "string",
- "title": "See Crypto Historical Data.",
+ "title": "See Crypto Data.",
"enum": [
"ERSX",
"FTX",
diff --git a/schema_json/endpoint/market_data/crypto/historical/trade/enums/taker_side.json b/schema_json/endpoint/market_data/crypto/common/enums/taker_side.json
similarity index 69%
rename from schema_json/endpoint/market_data/crypto/historical/trade/enums/taker_side.json
rename to schema_json/endpoint/market_data/crypto/common/enums/taker_side.json
index 9604bc54..8c8e4adf 100644
--- a/schema_json/endpoint/market_data/crypto/historical/trade/enums/taker_side.json
+++ b/schema_json/endpoint/market_data/crypto/common/enums/taker_side.json
@@ -1,6 +1,6 @@
{
"type": "string",
- "title": "See Crypto Historical Data.",
+ "title": "See Crypto Data.",
"enum": [
"B",
"S"
diff --git a/schema_json/endpoint/market_data/crypto/historical/bar/bar.json b/schema_json/endpoint/market_data/crypto/historical/bar/bar.json
deleted file mode 100644
index c677ba92..00000000
--- a/schema_json/endpoint/market_data/crypto/historical/bar/bar.json
+++ /dev/null
@@ -1,51 +0,0 @@
-{
- "type": "object",
- "title": "See Crypto Historical Data.",
- "properties": {
- "t": {
- "existingJavaType": "java.time.ZonedDateTime",
- "javaName": "timestamp",
- "title": "Timestamp with nanosecond precision."
- },
- "x": {
- "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.enums.Exchange",
- "javaName": "exchange",
- "title": "Exchange."
- },
- "o": {
- "existingJavaType": "java.lang.Double",
- "javaName": "open",
- "title": "Open price."
- },
- "h": {
- "existingJavaType": "java.lang.Double",
- "javaName": "high",
- "title": "High price."
- },
- "l": {
- "existingJavaType": "java.lang.Double",
- "javaName": "low",
- "title": "Low price."
- },
- "c": {
- "existingJavaType": "java.lang.Double",
- "javaName": "close",
- "title": "Close price."
- },
- "v": {
- "existingJavaType": "java.lang.Double",
- "javaName": "volume",
- "title": "Volume."
- },
- "n": {
- "existingJavaType": "java.lang.Long",
- "javaName": "tradeCount",
- "title": "Trade count."
- },
- "vw": {
- "existingJavaType": "java.lang.Double",
- "javaName": "vwap",
- "title": "VWAP (Volume Weighted Average Price)."
- }
- }
-}
diff --git a/schema_json/endpoint/market_data/crypto/historical/bar/crypto_bar.json b/schema_json/endpoint/market_data/crypto/historical/bar/crypto_bar.json
new file mode 100644
index 00000000..e23c3ec6
--- /dev/null
+++ b/schema_json/endpoint/market_data/crypto/historical/bar/crypto_bar.json
@@ -0,0 +1,19 @@
+{
+ "type": "object",
+ "extends": {
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.common.historical.bar.Bar"
+ },
+ "title": "See Historical Crypto Data.",
+ "properties": {
+ "x": {
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.common.enums.Exchange",
+ "javaName": "exchange",
+ "title": "Exchange."
+ },
+ "v": {
+ "existingJavaType": "java.lang.Double",
+ "javaName": "volume",
+ "title": "Volume."
+ }
+ }
+}
diff --git a/schema_json/endpoint/market_data/crypto/historical/bar/bars_response.json b/schema_json/endpoint/market_data/crypto/historical/bar/crypto_bars_response.json
similarity index 76%
rename from schema_json/endpoint/market_data/crypto/historical/bar/bars_response.json
rename to schema_json/endpoint/market_data/crypto/historical/bar/crypto_bars_response.json
index 21f5cddb..677e6633 100644
--- a/schema_json/endpoint/market_data/crypto/historical/bar/bars_response.json
+++ b/schema_json/endpoint/market_data/crypto/historical/bar/crypto_bars_response.json
@@ -1,10 +1,10 @@
{
"type": "object",
- "title": "See Historical Data.",
+ "title": "See Historical Crypto Data.",
"properties": {
"bars": {
- "existingJavaType": "java.util.ArrayList",
- "title": "The {@link java.util.ArrayList} of {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.bar.Bar}s."
+ "existingJavaType": "java.util.ArrayList",
+ "title": "The {@link java.util.ArrayList} of {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.bar.CryptoBar}s."
},
"symbol": {
"existingJavaType": "java.lang.String",
diff --git a/schema_json/endpoint/market_data/crypto/historical/quote/crypto_quote.json b/schema_json/endpoint/market_data/crypto/historical/quote/crypto_quote.json
new file mode 100644
index 00000000..099df001
--- /dev/null
+++ b/schema_json/endpoint/market_data/crypto/historical/quote/crypto_quote.json
@@ -0,0 +1,24 @@
+{
+ "type": "object",
+ "extends": {
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.common.historical.quote.Quote"
+ },
+ "title": "See Historical Crypto Data.",
+ "properties": {
+ "x": {
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.common.enums.Exchange",
+ "javaName": "exchange",
+ "title": "Exchange."
+ },
+ "as": {
+ "existingJavaType": "java.lang.Double",
+ "javaName": "askSize",
+ "title": "Ask size."
+ },
+ "bs": {
+ "existingJavaType": "java.lang.Double",
+ "javaName": "bidSize",
+ "title": "Bid size."
+ }
+ }
+}
diff --git a/schema_json/endpoint/market_data/crypto/historical/quote/quotes_response.json b/schema_json/endpoint/market_data/crypto/historical/quote/crypto_quotes_response.json
similarity index 75%
rename from schema_json/endpoint/market_data/crypto/historical/quote/quotes_response.json
rename to schema_json/endpoint/market_data/crypto/historical/quote/crypto_quotes_response.json
index 212635c3..e8a67bfd 100644
--- a/schema_json/endpoint/market_data/crypto/historical/quote/quotes_response.json
+++ b/schema_json/endpoint/market_data/crypto/historical/quote/crypto_quotes_response.json
@@ -1,10 +1,10 @@
{
"type": "object",
- "title": "See Crypto Historical Data.",
+ "title": "See Historical Crypto Data.",
"properties": {
"quotes": {
- "existingJavaType": "java.util.ArrayList",
- "title": "The {@link java.util.ArrayList} of {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.quote.Quote}s."
+ "existingJavaType": "java.util.ArrayList",
+ "title": "The {@link java.util.ArrayList} of {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.quote.CryptoQuote}s."
},
"symbol": {
"existingJavaType": "java.lang.String",
diff --git a/schema_json/endpoint/market_data/crypto/historical/quote/latest_quote_response.json b/schema_json/endpoint/market_data/crypto/historical/quote/latest_crypto_quote_response.json
similarity index 64%
rename from schema_json/endpoint/market_data/crypto/historical/quote/latest_quote_response.json
rename to schema_json/endpoint/market_data/crypto/historical/quote/latest_crypto_quote_response.json
index 044d252f..64bf1d75 100644
--- a/schema_json/endpoint/market_data/crypto/historical/quote/latest_quote_response.json
+++ b/schema_json/endpoint/market_data/crypto/historical/quote/latest_crypto_quote_response.json
@@ -1,14 +1,14 @@
{
"type": "object",
- "title": "See Crypto Historical Data.",
+ "title": "See Historical Crypto Data.",
"properties": {
"symbol": {
"existingJavaType": "java.lang.String",
"title": "Symbol that was queried."
},
"quote": {
- "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.quote.Quote",
- "title": "The latest {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.quote.Quote}."
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.quote.CryptoQuote",
+ "title": "The latest {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.quote.CryptoQuote}."
}
}
}
diff --git a/schema_json/endpoint/market_data/crypto/historical/quote/quote.json b/schema_json/endpoint/market_data/crypto/historical/quote/quote.json
deleted file mode 100644
index ecca5a55..00000000
--- a/schema_json/endpoint/market_data/crypto/historical/quote/quote.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
- "type": "object",
- "title": "See Crypto Historical Data.",
- "properties": {
- "t": {
- "existingJavaType": "java.time.ZonedDateTime",
- "javaName": "timestamp",
- "title": "Timestamp with nanosecond precision."
- },
- "x": {
- "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.enums.Exchange",
- "javaName": "exchange",
- "title": "Exchange."
- },
- "ap": {
- "existingJavaType": "java.lang.Double",
- "javaName": "askPrice",
- "title": "Ask price."
- },
- "as": {
- "existingJavaType": "java.lang.Double",
- "javaName": "askSize",
- "title": "Ask size."
- },
- "bp": {
- "existingJavaType": "java.lang.Double",
- "javaName": "bidPrice",
- "title": "Bid price."
- },
- "bs": {
- "existingJavaType": "java.lang.Double",
- "javaName": "bidSize",
- "title": "Bid size."
- }
- }
-}
diff --git a/schema_json/endpoint/market_data/crypto/historical/trade/crypto_trade.json b/schema_json/endpoint/market_data/crypto/historical/trade/crypto_trade.json
new file mode 100644
index 00000000..0b0c1b53
--- /dev/null
+++ b/schema_json/endpoint/market_data/crypto/historical/trade/crypto_trade.json
@@ -0,0 +1,24 @@
+{
+ "type": "object",
+ "extends": {
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.common.historical.trade.Trade"
+ },
+ "title": "See Historical Crypto Data.",
+ "properties": {
+ "x": {
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.common.enums.Exchange",
+ "javaName": "exchange",
+ "title": "Exchange where the trade happened."
+ },
+ "s": {
+ "existingJavaType": "java.lang.Double",
+ "javaName": "size",
+ "title": "Trade size."
+ },
+ "tks": {
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.common.enums.TakerSide",
+ "javaName": "takerSide",
+ "title": "The {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.common.enums.TakerSide} of the trade."
+ }
+ }
+}
diff --git a/schema_json/endpoint/market_data/crypto/historical/trade/trades_response.json b/schema_json/endpoint/market_data/crypto/historical/trade/crypto_trades_response.json
similarity index 75%
rename from schema_json/endpoint/market_data/crypto/historical/trade/trades_response.json
rename to schema_json/endpoint/market_data/crypto/historical/trade/crypto_trades_response.json
index 68a770a5..a512c775 100644
--- a/schema_json/endpoint/market_data/crypto/historical/trade/trades_response.json
+++ b/schema_json/endpoint/market_data/crypto/historical/trade/crypto_trades_response.json
@@ -1,10 +1,10 @@
{
"type": "object",
- "title": "See Crypto Historical Data.",
+ "title": "See Historical Crypto Data.",
"properties": {
"trades": {
- "existingJavaType": "java.util.ArrayList",
- "title": "The {@link java.util.ArrayList} of {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.trade.Trade}s."
+ "existingJavaType": "java.util.ArrayList",
+ "title": "The {@link java.util.ArrayList} of {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.trade.CryptoTrade}s."
},
"symbol": {
"existingJavaType": "java.lang.String",
diff --git a/schema_json/endpoint/market_data/crypto/historical/trade/latest_trade_response.json b/schema_json/endpoint/market_data/crypto/historical/trade/latest_crypto_trade_response.json
similarity index 64%
rename from schema_json/endpoint/market_data/crypto/historical/trade/latest_trade_response.json
rename to schema_json/endpoint/market_data/crypto/historical/trade/latest_crypto_trade_response.json
index 089f9528..512c6a18 100644
--- a/schema_json/endpoint/market_data/crypto/historical/trade/latest_trade_response.json
+++ b/schema_json/endpoint/market_data/crypto/historical/trade/latest_crypto_trade_response.json
@@ -1,14 +1,14 @@
{
"type": "object",
- "title": "See Crypto Historical Data.",
+ "title": "See Historical Crypto Data.",
"properties": {
"symbol": {
"existingJavaType": "java.lang.String",
"title": "Symbol that was queried."
},
"trade": {
- "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.trade.Trade",
- "title": "The latest {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.trade.Trade}."
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.trade.CryptoTrade",
+ "title": "The latest {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.trade.CryptoTrade}."
}
}
}
diff --git a/schema_json/endpoint/market_data/crypto/historical/trade/trade.json b/schema_json/endpoint/market_data/crypto/historical/trade/trade.json
deleted file mode 100644
index 56fef69b..00000000
--- a/schema_json/endpoint/market_data/crypto/historical/trade/trade.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
- "type": "object",
- "title": "See Crypto Historical Data.",
- "properties": {
- "t": {
- "existingJavaType": "java.time.ZonedDateTime",
- "javaName": "timestamp",
- "title": "Timestamp with nanosecond precision."
- },
- "x": {
- "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.enums.Exchange",
- "javaName": "exchange",
- "title": "Exchange where the trade happened."
- },
- "p": {
- "existingJavaType": "java.lang.Double",
- "javaName": "price",
- "title": "Trade price."
- },
- "s": {
- "existingJavaType": "java.lang.Double",
- "javaName": "size",
- "title": "Trade size."
- },
- "tks": {
- "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.trade.enums.TakerSide",
- "javaName": "takerSide",
- "title": "The {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.trade.enums.TakerSide} of the trade."
- },
- "i": {
- "existingJavaType": "java.lang.Long",
- "javaName": "tradeID",
- "title": "Trade ID."
- }
- }
-}
diff --git a/schema_json/endpoint/market_data/crypto/historical/xbbo/xbbo.json b/schema_json/endpoint/market_data/crypto/historical/xbbo/xbbo.json
index 9646a1ee..d279722f 100644
--- a/schema_json/endpoint/market_data/crypto/historical/xbbo/xbbo.json
+++ b/schema_json/endpoint/market_data/crypto/historical/xbbo/xbbo.json
@@ -1,6 +1,6 @@
{
"type": "object",
- "title": "See Crypto Historical Data.",
+ "title": "See Historical Crypto Data.",
"properties": {
"t": {
"existingJavaType": "java.time.ZonedDateTime",
@@ -8,7 +8,7 @@
"title": "Timestamp with nanosecond precision."
},
"ax": {
- "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.enums.Exchange",
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.common.enums.Exchange",
"javaName": "askExchange",
"title": "Ask Exchange."
},
@@ -23,7 +23,7 @@
"title": "Ask size."
},
"bx": {
- "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.enums.Exchange",
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.common.enums.Exchange",
"javaName": "bidExchange",
"title": "Bid Exchange."
},
diff --git a/schema_json/endpoint/market_data/crypto/historical/xbbo/xbbo_response.json b/schema_json/endpoint/market_data/crypto/historical/xbbo/xbbo_response.json
index b3bbe427..2fdc8f28 100644
--- a/schema_json/endpoint/market_data/crypto/historical/xbbo/xbbo_response.json
+++ b/schema_json/endpoint/market_data/crypto/historical/xbbo/xbbo_response.json
@@ -1,6 +1,6 @@
{
"type": "object",
- "title": "See Crypto Historical Data.",
+ "title": "See Historical Crypto Data.",
"properties": {
"symbol": {
"existingJavaType": "java.lang.String",
diff --git a/schema_json/endpoint/market_data/crypto/realtime/bar/crypto_bar_message.json b/schema_json/endpoint/market_data/crypto/realtime/bar/crypto_bar_message.json
new file mode 100644
index 00000000..3ef4ac16
--- /dev/null
+++ b/schema_json/endpoint/market_data/crypto/realtime/bar/crypto_bar_message.json
@@ -0,0 +1,29 @@
+{
+ "type": "object",
+ "extends": {
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.common.realtime.bar.BarMessage"
+ },
+ "title": "See Realtime Crypto Market Data.",
+ "properties": {
+ "x": {
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.common.enums.Exchange",
+ "javaName": "exchange",
+ "title": "Exchange."
+ },
+ "v": {
+ "existingJavaType": "java.lang.Double",
+ "javaName": "volume",
+ "title": "Volume."
+ },
+ "n": {
+ "existingJavaType": "java.lang.Long",
+ "javaName": "tradeCount",
+ "title": "Trade count."
+ },
+ "vw": {
+ "existingJavaType": "java.lang.Double",
+ "javaName": "vwap",
+ "title": "VWAP (Volume Weighted Average Price)."
+ }
+ }
+}
diff --git a/schema_json/endpoint/market_data/crypto/realtime/quote/crypto_quote_message.json b/schema_json/endpoint/market_data/crypto/realtime/quote/crypto_quote_message.json
new file mode 100644
index 00000000..9d9a2618
--- /dev/null
+++ b/schema_json/endpoint/market_data/crypto/realtime/quote/crypto_quote_message.json
@@ -0,0 +1,24 @@
+{
+ "type": "object",
+ "extends": {
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.common.realtime.quote.QuoteMessage"
+ },
+ "title": "See Realtime Crypto Market Data.",
+ "properties": {
+ "x": {
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.common.enums.Exchange",
+ "javaName": "exchange",
+ "title": "Exchange."
+ },
+ "as": {
+ "existingJavaType": "java.lang.Double",
+ "javaName": "askSize",
+ "title": "Ask size."
+ },
+ "bs": {
+ "existingJavaType": "java.lang.Double",
+ "javaName": "bidSize",
+ "title": "Bid size."
+ }
+ }
+}
diff --git a/schema_json/endpoint/market_data/crypto/realtime/trade/crypto_trade_message.json b/schema_json/endpoint/market_data/crypto/realtime/trade/crypto_trade_message.json
new file mode 100644
index 00000000..ec4f5227
--- /dev/null
+++ b/schema_json/endpoint/market_data/crypto/realtime/trade/crypto_trade_message.json
@@ -0,0 +1,24 @@
+{
+ "type": "object",
+ "extends": {
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.common.realtime.trade.TradeMessage"
+ },
+ "title": "See Realtime Crypto Market Data.",
+ "properties": {
+ "x": {
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.common.enums.Exchange",
+ "javaName": "exchange",
+ "title": "Exchange where the trade happened."
+ },
+ "s": {
+ "existingJavaType": "java.lang.Double",
+ "javaName": "size",
+ "title": "Trade size."
+ },
+ "tks": {
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.common.enums.TakerSide",
+ "javaName": "takerSide",
+ "title": "The {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.common.enums.TakerSide} of the trade."
+ }
+ }
+}
diff --git a/schema_json/endpoint/market_data/stock/historical/bar/enums/bar_adjustment.json b/schema_json/endpoint/market_data/stock/historical/bar/enums/bar_adjustment.json
index 4f28b6ed..d42b31b2 100644
--- a/schema_json/endpoint/market_data/stock/historical/bar/enums/bar_adjustment.json
+++ b/schema_json/endpoint/market_data/stock/historical/bar/enums/bar_adjustment.json
@@ -1,6 +1,6 @@
{
"type": "string",
- "title": "See Historical Data.",
+ "title": "See Historical Stock Data.",
"enum": [
"raw",
"split",
diff --git a/schema_json/endpoint/market_data/stock/historical/bar/stock_bar.json b/schema_json/endpoint/market_data/stock/historical/bar/stock_bar.json
new file mode 100644
index 00000000..ae851453
--- /dev/null
+++ b/schema_json/endpoint/market_data/stock/historical/bar/stock_bar.json
@@ -0,0 +1,14 @@
+{
+ "type": "object",
+ "extends": {
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.common.historical.bar.Bar"
+ },
+ "title": "See Historical Stock Data.",
+ "properties": {
+ "v": {
+ "existingJavaType": "java.lang.Long",
+ "javaName": "volume",
+ "title": "Volume."
+ }
+ }
+}
diff --git a/schema_json/endpoint/market_data/stock/historical/bar/bars_response.json b/schema_json/endpoint/market_data/stock/historical/bar/stock_bars_response.json
similarity index 85%
rename from schema_json/endpoint/market_data/stock/historical/bar/bars_response.json
rename to schema_json/endpoint/market_data/stock/historical/bar/stock_bars_response.json
index ebd21e82..b23db483 100644
--- a/schema_json/endpoint/market_data/stock/historical/bar/bars_response.json
+++ b/schema_json/endpoint/market_data/stock/historical/bar/stock_bars_response.json
@@ -1,10 +1,10 @@
{
"type": "object",
- "title": "See Historical Data.",
+ "title": "See Historical Stock Data.",
"properties": {
"bars": {
- "existingJavaType": "java.util.ArrayList",
- "title": "The {@link java.util.ArrayList} of {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.bar.Bar}s."
+ "existingJavaType": "java.util.ArrayList",
+ "title": "The {@link java.util.ArrayList} of {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.bar.StockBar}s."
},
"symbol": {
"existingJavaType": "java.lang.String",
diff --git a/schema_json/endpoint/market_data/stock/historical/quote/latest_quote_response.json b/schema_json/endpoint/market_data/stock/historical/quote/latest_stock_quote_response.json
similarity index 76%
rename from schema_json/endpoint/market_data/stock/historical/quote/latest_quote_response.json
rename to schema_json/endpoint/market_data/stock/historical/quote/latest_stock_quote_response.json
index 1250c5f8..4a9a3992 100644
--- a/schema_json/endpoint/market_data/stock/historical/quote/latest_quote_response.json
+++ b/schema_json/endpoint/market_data/stock/historical/quote/latest_stock_quote_response.json
@@ -1,14 +1,14 @@
{
"type": "object",
- "title": "See Historical Data.",
+ "title": "See Historical Stock Data.",
"properties": {
"symbol": {
"existingJavaType": "java.lang.String",
"title": "Symbol that was queried."
},
"quote": {
- "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.quote.Quote",
- "title": "The latest {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.quote.Quote}."
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.quote.StockQuote",
+ "title": "The latest {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.quote.StockQuote}."
}
}
}
diff --git a/schema_json/endpoint/market_data/stock/historical/quote/quote.json b/schema_json/endpoint/market_data/stock/historical/quote/stock_quote.json
similarity index 66%
rename from schema_json/endpoint/market_data/stock/historical/quote/quote.json
rename to schema_json/endpoint/market_data/stock/historical/quote/stock_quote.json
index 059c9746..164f093f 100644
--- a/schema_json/endpoint/market_data/stock/historical/quote/quote.json
+++ b/schema_json/endpoint/market_data/stock/historical/quote/stock_quote.json
@@ -1,22 +1,15 @@
{
"type": "object",
- "title": "See Historical Data.",
+ "extends": {
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.common.historical.quote.Quote"
+ },
+ "title": "See Historical Stock Data.",
"properties": {
- "t": {
- "existingJavaType": "java.time.ZonedDateTime",
- "javaName": "timestamp",
- "title": "Timestamp with nanosecond precision."
- },
"ax": {
"existingJavaType": "java.lang.String",
"javaName": "askExchange",
"title": "Ask exchange."
},
- "ap": {
- "existingJavaType": "java.lang.Double",
- "javaName": "askPrice",
- "title": "Ask price."
- },
"as": {
"existingJavaType": "java.lang.Integer",
"javaName": "askSize",
@@ -27,11 +20,6 @@
"javaName": "bidExchange",
"title": "Bid exchange."
},
- "bp": {
- "existingJavaType": "java.lang.Double",
- "javaName": "bidPrice",
- "title": "Bid price."
- },
"bs": {
"existingJavaType": "java.lang.Integer",
"javaName": "bidSize",
diff --git a/schema_json/endpoint/market_data/stock/historical/quote/quotes_response.json b/schema_json/endpoint/market_data/stock/historical/quote/stock_quotes_response.json
similarity index 84%
rename from schema_json/endpoint/market_data/stock/historical/quote/quotes_response.json
rename to schema_json/endpoint/market_data/stock/historical/quote/stock_quotes_response.json
index 6ba96682..418dcf6b 100644
--- a/schema_json/endpoint/market_data/stock/historical/quote/quotes_response.json
+++ b/schema_json/endpoint/market_data/stock/historical/quote/stock_quotes_response.json
@@ -1,10 +1,10 @@
{
"type": "object",
- "title": "See Historical Data.",
+ "title": "See Historical Stock Data.",
"properties": {
"quotes": {
- "existingJavaType": "java.util.ArrayList",
- "title": "The {@link java.util.ArrayList} of {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.quote.Quote}s."
+ "existingJavaType": "java.util.ArrayList",
+ "title": "The {@link java.util.ArrayList} of {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.quote.StockQuote}s."
},
"symbol": {
"existingJavaType": "java.lang.String",
diff --git a/schema_json/endpoint/market_data/stock/historical/snapshot/snapshot.json b/schema_json/endpoint/market_data/stock/historical/snapshot/snapshot.json
index f42b18af..9617b3de 100644
--- a/schema_json/endpoint/market_data/stock/historical/snapshot/snapshot.json
+++ b/schema_json/endpoint/market_data/stock/historical/snapshot/snapshot.json
@@ -1,26 +1,26 @@
{
"type": "object",
- "title": "See Historical Data.",
+ "title": "See Historical Stock Data.",
"properties": {
"latestTrade": {
- "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.trade.Trade",
- "title": "The latest {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.trade.Trade}."
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.trade.StockTrade",
+ "title": "The latest {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.trade.StockTrade}."
},
"latestQuote": {
- "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.quote.Quote",
- "title": "The latest {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.quote.Quote}."
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.quote.StockQuote",
+ "title": "The latest {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.quote.StockQuote}."
},
"minuteBar": {
- "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.bar.Bar",
- "title": "The minute {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.bar.Bar}."
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.bar.StockBar",
+ "title": "The minute {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.bar.StockBar}."
},
"dailyBar": {
- "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.bar.Bar",
- "title": "The daily {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.bar.Bar}."
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.bar.StockBar",
+ "title": "The daily {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.bar.StockBar}."
},
"prevDailyBar": {
- "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.bar.Bar",
- "title": "The previous daily {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.bar.Bar}."
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.bar.StockBar",
+ "title": "The previous daily {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.bar.StockBar}."
}
}
}
diff --git a/schema_json/endpoint/market_data/stock/historical/trade/latest_trade_response.json b/schema_json/endpoint/market_data/stock/historical/trade/latest_stock_trade_response.json
similarity index 76%
rename from schema_json/endpoint/market_data/stock/historical/trade/latest_trade_response.json
rename to schema_json/endpoint/market_data/stock/historical/trade/latest_stock_trade_response.json
index f5be1b9d..b4765b53 100644
--- a/schema_json/endpoint/market_data/stock/historical/trade/latest_trade_response.json
+++ b/schema_json/endpoint/market_data/stock/historical/trade/latest_stock_trade_response.json
@@ -1,14 +1,14 @@
{
"type": "object",
- "title": "See Historical Data.",
+ "title": "See Historical Stock Data.",
"properties": {
"symbol": {
"existingJavaType": "java.lang.String",
"title": "Symbol that was queried."
},
"trade": {
- "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.trade.Trade",
- "title": "The latest {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.trade.Trade}."
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.trade.StockTrade",
+ "title": "The latest {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.trade.StockTrade}."
}
}
}
diff --git a/schema_json/endpoint/market_data/stock/historical/trade/trade.json b/schema_json/endpoint/market_data/stock/historical/trade/stock_trade.json
similarity index 63%
rename from schema_json/endpoint/market_data/stock/historical/trade/trade.json
rename to schema_json/endpoint/market_data/stock/historical/trade/stock_trade.json
index f7ef48ca..ea3e96cf 100644
--- a/schema_json/endpoint/market_data/stock/historical/trade/trade.json
+++ b/schema_json/endpoint/market_data/stock/historical/trade/stock_trade.json
@@ -1,22 +1,15 @@
{
"type": "object",
- "title": "See Historical Data.",
+ "extends": {
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.common.historical.trade.Trade"
+ },
+ "title": "See Historical Stock Data.",
"properties": {
- "t": {
- "existingJavaType": "java.time.ZonedDateTime",
- "javaName": "timestamp",
- "title": "Timestamp with nanosecond precision."
- },
"x": {
"existingJavaType": "java.lang.String",
"javaName": "exchange",
"title": "Exchange where the trade happened."
},
- "p": {
- "existingJavaType": "java.lang.Double",
- "javaName": "price",
- "title": "Trade price."
- },
"s": {
"existingJavaType": "java.lang.Integer",
"javaName": "size",
@@ -27,11 +20,6 @@
"javaName": "conditions",
"title": "The {@link java.util.ArrayList} of trade conditions."
},
- "i": {
- "existingJavaType": "java.lang.Long",
- "javaName": "tradeID",
- "title": "Trade ID."
- },
"z": {
"existingJavaType": "java.lang.String",
"javaName": "tape",
diff --git a/schema_json/endpoint/market_data/stock/historical/trade/trades_response.json b/schema_json/endpoint/market_data/stock/historical/trade/stock_trades_response.json
similarity index 84%
rename from schema_json/endpoint/market_data/stock/historical/trade/trades_response.json
rename to schema_json/endpoint/market_data/stock/historical/trade/stock_trades_response.json
index 503b6d9f..9b08b1da 100644
--- a/schema_json/endpoint/market_data/stock/historical/trade/trades_response.json
+++ b/schema_json/endpoint/market_data/stock/historical/trade/stock_trades_response.json
@@ -1,10 +1,10 @@
{
"type": "object",
- "title": "See Historical Data.",
+ "title": "See Historical Stock Data.",
"properties": {
"trades": {
- "existingJavaType": "java.util.ArrayList",
- "title": "The {@link java.util.ArrayList} of {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.trade.Trade}s."
+ "existingJavaType": "java.util.ArrayList",
+ "title": "The {@link java.util.ArrayList} of {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.trade.StockTrade}s."
},
"symbol": {
"existingJavaType": "java.lang.String",
diff --git a/schema_json/endpoint/market_data/stock/realtime/bar/stock_bar_message.json b/schema_json/endpoint/market_data/stock/realtime/bar/stock_bar_message.json
new file mode 100644
index 00000000..6bfbf62a
--- /dev/null
+++ b/schema_json/endpoint/market_data/stock/realtime/bar/stock_bar_message.json
@@ -0,0 +1,14 @@
+{
+ "type": "object",
+ "extends": {
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.common.realtime.bar.BarMessage"
+ },
+ "title": "See Realtime Stock Market Data.",
+ "properties": {
+ "v": {
+ "existingJavaType": "java.lang.Long",
+ "javaName": "volume",
+ "title": "Volume."
+ }
+ }
+}
diff --git a/schema_json/endpoint/market_data/stock/realtime/quote/quote_message.json b/schema_json/endpoint/market_data/stock/realtime/quote/stock_quote_message.json
similarity index 65%
rename from schema_json/endpoint/market_data/stock/realtime/quote/quote_message.json
rename to schema_json/endpoint/market_data/stock/realtime/quote/stock_quote_message.json
index 3c7c650c..2633ccde 100644
--- a/schema_json/endpoint/market_data/stock/realtime/quote/quote_message.json
+++ b/schema_json/endpoint/market_data/stock/realtime/quote/stock_quote_message.json
@@ -1,20 +1,15 @@
{
"type": "object",
"extends": {
- "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.realtime.SymbolMessage"
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.common.realtime.quote.QuoteMessage"
},
- "title": "See Real-time Data.",
+ "title": "See Realtime Stock Market Data.",
"properties": {
"ax": {
"existingJavaType": "java.lang.String",
"javaName": "askExchange",
"title": "Ask exchange code."
},
- "ap": {
- "existingJavaType": "java.lang.Double",
- "javaName": "askPrice",
- "title": "Ask price."
- },
"as": {
"existingJavaType": "java.lang.Integer",
"javaName": "askSize",
@@ -25,21 +20,11 @@
"javaName": "bidExchange",
"title": "Bid exchange code."
},
- "bp": {
- "existingJavaType": "java.lang.Double",
- "javaName": "bidPrice",
- "title": "Bid price."
- },
"bs": {
"existingJavaType": "java.lang.Integer",
"javaName": "bidSize",
"title": "Bid size."
},
- "t": {
- "existingJavaType": "java.time.ZonedDateTime",
- "javaName": "timestamp",
- "title": "Timestamp with nanosecond precision."
- },
"c": {
"existingJavaType": "java.util.ArrayList",
"javaName": "conditions",
diff --git a/schema_json/endpoint/market_data/stock/realtime/trade/trade_message.json b/schema_json/endpoint/market_data/stock/realtime/trade/stock_trade_message.json
similarity index 59%
rename from schema_json/endpoint/market_data/stock/realtime/trade/trade_message.json
rename to schema_json/endpoint/market_data/stock/realtime/trade/stock_trade_message.json
index e72f5859..c3b0bc51 100644
--- a/schema_json/endpoint/market_data/stock/realtime/trade/trade_message.json
+++ b/schema_json/endpoint/market_data/stock/realtime/trade/stock_trade_message.json
@@ -1,35 +1,20 @@
{
"type": "object",
"extends": {
- "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.realtime.SymbolMessage"
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.common.realtime.trade.TradeMessage"
},
- "title": "See Real-time Data.",
+ "title": "See Realtime Stock Market Data.",
"properties": {
- "i": {
- "existingJavaType": "java.lang.Integer",
- "javaName": "tradeID",
- "title": "Trade ID."
- },
"x": {
"existingJavaType": "java.lang.String",
"javaName": "exchange",
"title": "Exchange code where the trade occurred."
},
- "p": {
- "existingJavaType": "java.lang.Double",
- "javaName": "price",
- "title": "Trade price."
- },
"s": {
"existingJavaType": "java.lang.Integer",
"javaName": "size",
"title": "Trade size."
},
- "t": {
- "existingJavaType": "java.time.ZonedDateTime",
- "javaName": "timestamp",
- "title": "Timestamp with nanosecond precision."
- },
"c": {
"existingJavaType": "java.util.ArrayList",
"javaName": "conditions",
diff --git a/schema_json/endpoint/order/cancelled_order.json b/schema_json/endpoint/orders/cancelled_order.json
similarity index 92%
rename from schema_json/endpoint/order/cancelled_order.json
rename to schema_json/endpoint/orders/cancelled_order.json
index be79774c..cd34b921 100644
--- a/schema_json/endpoint/order/cancelled_order.json
+++ b/schema_json/endpoint/orders/cancelled_order.json
@@ -11,9 +11,9 @@
"title": "The HTTP status code of the cancelled order."
},
"body": {
- "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.order.Order",
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.orders.Order",
"javaName": "order",
- "title": "The cancelled {@link net.jacobpeterson.alpaca.model.endpoint.order.Order}."
+ "title": "The cancelled {@link net.jacobpeterson.alpaca.model.endpoint.orders.Order}."
}
}
}
diff --git a/schema_json/endpoint/order/enums/current_order_status.json b/schema_json/endpoint/orders/enums/current_order_status.json
similarity index 100%
rename from schema_json/endpoint/order/enums/current_order_status.json
rename to schema_json/endpoint/orders/enums/current_order_status.json
diff --git a/schema_json/endpoint/order/enums/order_class.json b/schema_json/endpoint/orders/enums/order_class.json
similarity index 100%
rename from schema_json/endpoint/order/enums/order_class.json
rename to schema_json/endpoint/orders/enums/order_class.json
diff --git a/schema_json/endpoint/order/enums/order_side.json b/schema_json/endpoint/orders/enums/order_side.json
similarity index 100%
rename from schema_json/endpoint/order/enums/order_side.json
rename to schema_json/endpoint/orders/enums/order_side.json
diff --git a/schema_json/endpoint/order/enums/order_status.json b/schema_json/endpoint/orders/enums/order_status.json
similarity index 100%
rename from schema_json/endpoint/order/enums/order_status.json
rename to schema_json/endpoint/orders/enums/order_status.json
diff --git a/schema_json/endpoint/order/enums/order_time_in_force.json b/schema_json/endpoint/orders/enums/order_time_in_force.json
similarity index 100%
rename from schema_json/endpoint/order/enums/order_time_in_force.json
rename to schema_json/endpoint/orders/enums/order_time_in_force.json
diff --git a/schema_json/endpoint/order/enums/order_type.json b/schema_json/endpoint/orders/enums/order_type.json
similarity index 100%
rename from schema_json/endpoint/order/enums/order_type.json
rename to schema_json/endpoint/orders/enums/order_type.json
diff --git a/schema_json/endpoint/order/order.json b/schema_json/endpoint/orders/order.json
similarity index 89%
rename from schema_json/endpoint/order/order.json
rename to schema_json/endpoint/orders/order.json
index c0af5330..6a6f85fd 100644
--- a/schema_json/endpoint/order/order.json
+++ b/schema_json/endpoint/orders/order.json
@@ -82,20 +82,20 @@
"title": "Filled average price."
},
"order_class": {
- "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.order.enums.OrderClass",
- "title": "The {@link net.jacobpeterson.alpaca.model.endpoint.order.enums.OrderClass}. For details of non-simple order classes, please see Bracket Order Overview."
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.orders.enums.OrderClass",
+ "title": "The {@link net.jacobpeterson.alpaca.model.endpoint.orders.enums.OrderClass}. For details of non-simple order classes, please see Bracket Order Overview."
},
"type": {
- "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.order.enums.OrderType",
- "title": "The {@link net.jacobpeterson.alpaca.model.endpoint.order.enums.OrderType}."
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.orders.enums.OrderType",
+ "title": "The {@link net.jacobpeterson.alpaca.model.endpoint.orders.enums.OrderType}."
},
"side": {
- "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.order.enums.OrderSide",
- "title": "The {@link net.jacobpeterson.alpaca.model.endpoint.order.enums.OrderSide}."
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.orders.enums.OrderSide",
+ "title": "The {@link net.jacobpeterson.alpaca.model.endpoint.orders.enums.OrderSide}."
},
"time_in_force": {
- "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.order.enums.OrderTimeInForce",
- "title": "The {@link net.jacobpeterson.alpaca.model.endpoint.order.enums.OrderTimeInForce}."
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.orders.enums.OrderTimeInForce",
+ "title": "The {@link net.jacobpeterson.alpaca.model.endpoint.orders.enums.OrderTimeInForce}."
},
"limit_price": {
"existingJavaType": "java.lang.String",
@@ -106,16 +106,16 @@
"title": "Stop price."
},
"status": {
- "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.order.enums.OrderStatus",
- "title": "The {@link net.jacobpeterson.alpaca.model.endpoint.order.enums.OrderStatus}."
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.orders.enums.OrderStatus",
+ "title": "The {@link net.jacobpeterson.alpaca.model.endpoint.orders.enums.OrderStatus}."
},
"extended_hours": {
"existingJavaType": "java.lang.Boolean",
"title": "If true, eligible for execution outside regular trading hours."
},
"legs": {
- "existingJavaType": "java.util.ArrayList",
- "title": "When querying non-simple order_class orders in a nested style, an {@link java.util.ArrayList} of {@link net.jacobpeterson.alpaca.model.endpoint.order.Order} entities associated with this order. Otherwise, null."
+ "existingJavaType": "java.util.ArrayList",
+ "title": "When querying non-simple order_class orders in a nested style, an {@link java.util.ArrayList} of {@link net.jacobpeterson.alpaca.model.endpoint.orders.Order} entities associated with this order. Otherwise, null."
},
"trail_percent": {
"existingJavaType": "java.lang.String",
diff --git a/schema_json/endpoint/position/close_position_order.json b/schema_json/endpoint/positions/close_position_order.json
similarity index 91%
rename from schema_json/endpoint/position/close_position_order.json
rename to schema_json/endpoint/positions/close_position_order.json
index 5ce79575..3ffba883 100644
--- a/schema_json/endpoint/position/close_position_order.json
+++ b/schema_json/endpoint/positions/close_position_order.json
@@ -11,9 +11,9 @@
"title": "The HTTP status code of the position-closing order."
},
"body": {
- "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.order.Order",
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.orders.Order",
"javaName": "order",
- "title": "The position-closing {@link net.jacobpeterson.alpaca.model.endpoint.order.Order}."
+ "title": "The position-closing {@link net.jacobpeterson.alpaca.model.endpoint.orders.Order}."
}
}
}
diff --git a/schema_json/endpoint/position/position.json b/schema_json/endpoint/positions/position.json
similarity index 100%
rename from schema_json/endpoint/position/position.json
rename to schema_json/endpoint/positions/position.json
diff --git a/schema_json/endpoint/streaming/trade/trade_update.json b/schema_json/endpoint/streaming/trade/trade_update.json
index 339ea01c..32f6c324 100644
--- a/schema_json/endpoint/streaming/trade/trade_update.json
+++ b/schema_json/endpoint/streaming/trade/trade_update.json
@@ -20,8 +20,8 @@
"title": "The position quantity."
},
"order": {
- "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.order.Order",
- "title": "The {@link net.jacobpeterson.alpaca.model.endpoint.order.Order}."
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.orders.Order",
+ "title": "The {@link net.jacobpeterson.alpaca.model.endpoint.orders.Order}."
}
}
}
diff --git a/schema_json/endpoint/watchlist/watchlist.json b/schema_json/endpoint/watchlist/watchlist.json
index 0cfa52a0..7c7e8602 100644
--- a/schema_json/endpoint/watchlist/watchlist.json
+++ b/schema_json/endpoint/watchlist/watchlist.json
@@ -23,7 +23,7 @@
"title": "Account ID."
},
"assets": {
- "existingJavaType": "java.util.ArrayList",
+ "existingJavaType": "java.util.ArrayList",
"title": "The content of this watchlist, in the order as registered by the client."
}
}
diff --git a/src/main/java/net/jacobpeterson/alpaca/AlpacaAPI.java b/src/main/java/net/jacobpeterson/alpaca/AlpacaAPI.java
index 67813131..63980318 100644
--- a/src/main/java/net/jacobpeterson/alpaca/AlpacaAPI.java
+++ b/src/main/java/net/jacobpeterson/alpaca/AlpacaAPI.java
@@ -5,22 +5,23 @@
import net.jacobpeterson.alpaca.model.properties.EndpointAPIType;
import net.jacobpeterson.alpaca.properties.AlpacaProperties;
import net.jacobpeterson.alpaca.rest.AlpacaClient;
-import net.jacobpeterson.alpaca.rest.endpoint.AccountActivitiesEndpoint;
-import net.jacobpeterson.alpaca.rest.endpoint.AccountConfigurationEndpoint;
-import net.jacobpeterson.alpaca.rest.endpoint.AccountEndpoint;
+import net.jacobpeterson.alpaca.rest.endpoint.accountactivities.AccountActivitiesEndpoint;
+import net.jacobpeterson.alpaca.rest.endpoint.accountconfiguration.AccountConfigurationEndpoint;
+import net.jacobpeterson.alpaca.rest.endpoint.account.AccountEndpoint;
import net.jacobpeterson.alpaca.rest.endpoint.AlpacaEndpoint;
-import net.jacobpeterson.alpaca.rest.endpoint.AssetsEndpoint;
-import net.jacobpeterson.alpaca.rest.endpoint.CalendarEndpoint;
-import net.jacobpeterson.alpaca.rest.endpoint.ClockEndpoint;
-import net.jacobpeterson.alpaca.rest.endpoint.OrdersEndpoint;
-import net.jacobpeterson.alpaca.rest.endpoint.PortfolioHistoryEndpoint;
-import net.jacobpeterson.alpaca.rest.endpoint.PositionsEndpoint;
-import net.jacobpeterson.alpaca.rest.endpoint.WatchlistEndpoint;
-import net.jacobpeterson.alpaca.rest.endpoint.marketdata.CryptoMarketDataEndpoint;
-import net.jacobpeterson.alpaca.rest.endpoint.marketdata.StockMarketDataEndpoint;
+import net.jacobpeterson.alpaca.rest.endpoint.assets.AssetsEndpoint;
+import net.jacobpeterson.alpaca.rest.endpoint.calendar.CalendarEndpoint;
+import net.jacobpeterson.alpaca.rest.endpoint.clock.ClockEndpoint;
+import net.jacobpeterson.alpaca.rest.endpoint.orders.OrdersEndpoint;
+import net.jacobpeterson.alpaca.rest.endpoint.portfoliohistory.PortfolioHistoryEndpoint;
+import net.jacobpeterson.alpaca.rest.endpoint.positions.PositionsEndpoint;
+import net.jacobpeterson.alpaca.rest.endpoint.watchlist.WatchlistEndpoint;
+import net.jacobpeterson.alpaca.rest.endpoint.marketdata.crypto.CryptoMarketDataEndpoint;
+import net.jacobpeterson.alpaca.rest.endpoint.marketdata.stock.StockMarketDataEndpoint;
import net.jacobpeterson.alpaca.websocket.AlpacaWebsocket;
-import net.jacobpeterson.alpaca.websocket.marketdata.MarketDataWebsocket;
import net.jacobpeterson.alpaca.websocket.marketdata.MarketDataWebsocketInterface;
+import net.jacobpeterson.alpaca.websocket.marketdata.crypto.CryptoMarketDataWebsocket;
+import net.jacobpeterson.alpaca.websocket.marketdata.stock.StockMarketDataWebsocket;
import net.jacobpeterson.alpaca.websocket.streaming.StreamingWebsocket;
import net.jacobpeterson.alpaca.websocket.streaming.StreamingWebsocketInterface;
import okhttp3.OkHttpClient;
@@ -63,7 +64,8 @@ public class AlpacaAPI {
private final AccountActivitiesEndpoint accountActivitiesEndpoint;
private final PortfolioHistoryEndpoint portfolioHistoryEndpoint;
private final StreamingWebsocket streamingWebsocket;
- private final MarketDataWebsocket marketDataWebsocket;
+ private final CryptoMarketDataWebsocket cryptoMarketDataWebsocket;
+ private final StockMarketDataWebsocket stockMarketDataWebsocket;
/**
* Instantiates a new {@link AlpacaAPI} using properties specified in alpaca.properties file (or their
@@ -178,9 +180,12 @@ public AlpacaAPI(OkHttpClient okHttpClient, String keyID, String secretKey, Stri
accountConfigurationEndpoint = new AccountConfigurationEndpoint(brokerClient);
accountActivitiesEndpoint = new AccountActivitiesEndpoint(brokerClient);
portfolioHistoryEndpoint = new PortfolioHistoryEndpoint(brokerClient);
+
streamingWebsocket = new StreamingWebsocket(okHttpClient, brokerHostSubdomain, keyID, secretKey, oAuthToken);
- marketDataWebsocket = stockDataClient == null ? null :
- new MarketDataWebsocket(okHttpClient, dataAPIType, keyID, secretKey);
+ cryptoMarketDataWebsocket = cryptoDataClient == null ? null :
+ new CryptoMarketDataWebsocket(okHttpClient, keyID, secretKey);
+ stockMarketDataWebsocket = stockDataClient == null ? null :
+ new StockMarketDataWebsocket(okHttpClient, dataAPIType, keyID, secretKey);
}
/**
@@ -275,10 +280,17 @@ public StreamingWebsocketInterface streaming() {
}
/**
- * @return the {@link MarketDataWebsocketInterface}
+ * @return the Crypto {@link MarketDataWebsocketInterface}
+ */
+ public MarketDataWebsocketInterface cryptoMarketDataStreaming() {
+ return cryptoMarketDataWebsocket;
+ }
+
+ /**
+ * @return the Stock {@link MarketDataWebsocketInterface}
*/
- public MarketDataWebsocketInterface marketDataStreaming() {
- return marketDataWebsocket;
+ public MarketDataWebsocketInterface stockMarketDataStreaming() {
+ return stockMarketDataWebsocket;
}
public OkHttpClient getOkHttpClient() {
diff --git a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/AccountEndpoint.java b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/account/AccountEndpoint.java
similarity index 90%
rename from src/main/java/net/jacobpeterson/alpaca/rest/endpoint/AccountEndpoint.java
rename to src/main/java/net/jacobpeterson/alpaca/rest/endpoint/account/AccountEndpoint.java
index ff57ff67..8054ab4f 100644
--- a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/AccountEndpoint.java
+++ b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/account/AccountEndpoint.java
@@ -1,8 +1,9 @@
-package net.jacobpeterson.alpaca.rest.endpoint;
+package net.jacobpeterson.alpaca.rest.endpoint.account;
import net.jacobpeterson.alpaca.model.endpoint.account.Account;
import net.jacobpeterson.alpaca.rest.AlpacaClient;
import net.jacobpeterson.alpaca.rest.AlpacaClientException;
+import net.jacobpeterson.alpaca.rest.endpoint.AlpacaEndpoint;
import okhttp3.HttpUrl;
import okhttp3.Request;
diff --git a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/AccountActivitiesEndpoint.java b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/accountactivities/AccountActivitiesEndpoint.java
similarity index 97%
rename from src/main/java/net/jacobpeterson/alpaca/rest/endpoint/AccountActivitiesEndpoint.java
rename to src/main/java/net/jacobpeterson/alpaca/rest/endpoint/accountactivities/AccountActivitiesEndpoint.java
index adbe8414..c56375bf 100644
--- a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/AccountActivitiesEndpoint.java
+++ b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/accountactivities/AccountActivitiesEndpoint.java
@@ -1,4 +1,4 @@
-package net.jacobpeterson.alpaca.rest.endpoint;
+package net.jacobpeterson.alpaca.rest.endpoint.accountactivities;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
@@ -10,6 +10,7 @@
import net.jacobpeterson.alpaca.model.endpoint.common.enums.SortDirection;
import net.jacobpeterson.alpaca.rest.AlpacaClient;
import net.jacobpeterson.alpaca.rest.AlpacaClientException;
+import net.jacobpeterson.alpaca.rest.endpoint.AlpacaEndpoint;
import okhttp3.HttpUrl;
import okhttp3.Request;
import org.slf4j.Logger;
diff --git a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/AccountConfigurationEndpoint.java b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/accountconfiguration/AccountConfigurationEndpoint.java
similarity index 94%
rename from src/main/java/net/jacobpeterson/alpaca/rest/endpoint/AccountConfigurationEndpoint.java
rename to src/main/java/net/jacobpeterson/alpaca/rest/endpoint/accountconfiguration/AccountConfigurationEndpoint.java
index 2d7c5de0..a319e650 100644
--- a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/AccountConfigurationEndpoint.java
+++ b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/accountconfiguration/AccountConfigurationEndpoint.java
@@ -1,8 +1,9 @@
-package net.jacobpeterson.alpaca.rest.endpoint;
+package net.jacobpeterson.alpaca.rest.endpoint.accountconfiguration;
import net.jacobpeterson.alpaca.model.endpoint.accountconfiguration.AccountConfiguration;
import net.jacobpeterson.alpaca.rest.AlpacaClient;
import net.jacobpeterson.alpaca.rest.AlpacaClientException;
+import net.jacobpeterson.alpaca.rest.endpoint.AlpacaEndpoint;
import net.jacobpeterson.alpaca.util.okhttp.JSONBodyBuilder;
import okhttp3.HttpUrl;
import okhttp3.Request;
diff --git a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/AssetsEndpoint.java b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/assets/AssetsEndpoint.java
similarity index 88%
rename from src/main/java/net/jacobpeterson/alpaca/rest/endpoint/AssetsEndpoint.java
rename to src/main/java/net/jacobpeterson/alpaca/rest/endpoint/assets/AssetsEndpoint.java
index 6cbf3298..bfcfaffe 100644
--- a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/AssetsEndpoint.java
+++ b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/assets/AssetsEndpoint.java
@@ -1,11 +1,12 @@
-package net.jacobpeterson.alpaca.rest.endpoint;
+package net.jacobpeterson.alpaca.rest.endpoint.assets;
import com.google.gson.reflect.TypeToken;
-import net.jacobpeterson.alpaca.model.endpoint.asset.Asset;
-import net.jacobpeterson.alpaca.model.endpoint.asset.enums.AssetClass;
-import net.jacobpeterson.alpaca.model.endpoint.asset.enums.AssetStatus;
+import net.jacobpeterson.alpaca.model.endpoint.assets.Asset;
+import net.jacobpeterson.alpaca.model.endpoint.assets.enums.AssetClass;
+import net.jacobpeterson.alpaca.model.endpoint.assets.enums.AssetStatus;
import net.jacobpeterson.alpaca.rest.AlpacaClient;
import net.jacobpeterson.alpaca.rest.AlpacaClientException;
+import net.jacobpeterson.alpaca.rest.endpoint.AlpacaEndpoint;
import okhttp3.HttpUrl;
import okhttp3.Request;
diff --git a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/CalendarEndpoint.java b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/calendar/CalendarEndpoint.java
similarity index 94%
rename from src/main/java/net/jacobpeterson/alpaca/rest/endpoint/CalendarEndpoint.java
rename to src/main/java/net/jacobpeterson/alpaca/rest/endpoint/calendar/CalendarEndpoint.java
index 03bb2641..58ad41af 100644
--- a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/CalendarEndpoint.java
+++ b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/calendar/CalendarEndpoint.java
@@ -1,9 +1,10 @@
-package net.jacobpeterson.alpaca.rest.endpoint;
+package net.jacobpeterson.alpaca.rest.endpoint.calendar;
import com.google.gson.reflect.TypeToken;
import net.jacobpeterson.alpaca.model.endpoint.calendar.Calendar;
import net.jacobpeterson.alpaca.rest.AlpacaClient;
import net.jacobpeterson.alpaca.rest.AlpacaClientException;
+import net.jacobpeterson.alpaca.rest.endpoint.AlpacaEndpoint;
import okhttp3.HttpUrl;
import okhttp3.Request;
diff --git a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/ClockEndpoint.java b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/clock/ClockEndpoint.java
similarity index 91%
rename from src/main/java/net/jacobpeterson/alpaca/rest/endpoint/ClockEndpoint.java
rename to src/main/java/net/jacobpeterson/alpaca/rest/endpoint/clock/ClockEndpoint.java
index 6e5e9ae4..368edc13 100644
--- a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/ClockEndpoint.java
+++ b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/clock/ClockEndpoint.java
@@ -1,8 +1,9 @@
-package net.jacobpeterson.alpaca.rest.endpoint;
+package net.jacobpeterson.alpaca.rest.endpoint.clock;
import net.jacobpeterson.alpaca.model.endpoint.clock.Clock;
import net.jacobpeterson.alpaca.rest.AlpacaClient;
import net.jacobpeterson.alpaca.rest.AlpacaClientException;
+import net.jacobpeterson.alpaca.rest.endpoint.AlpacaEndpoint;
import okhttp3.HttpUrl;
import okhttp3.Request;
diff --git a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/marketdata/CryptoMarketDataEndpoint.java b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/marketdata/crypto/CryptoMarketDataEndpoint.java
similarity index 83%
rename from src/main/java/net/jacobpeterson/alpaca/rest/endpoint/marketdata/CryptoMarketDataEndpoint.java
rename to src/main/java/net/jacobpeterson/alpaca/rest/endpoint/marketdata/crypto/CryptoMarketDataEndpoint.java
index c044d1f8..b3136b17 100644
--- a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/marketdata/CryptoMarketDataEndpoint.java
+++ b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/marketdata/crypto/CryptoMarketDataEndpoint.java
@@ -1,15 +1,15 @@
-package net.jacobpeterson.alpaca.rest.endpoint.marketdata;
-
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.common.enums.BarTimePeriod;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.bar.Bar;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.bar.BarsResponse;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.enums.Exchange;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.quote.LatestQuoteResponse;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.quote.Quote;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.quote.QuotesResponse;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.trade.LatestTradeResponse;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.trade.Trade;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.trade.TradesResponse;
+package net.jacobpeterson.alpaca.rest.endpoint.marketdata.crypto;
+
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.common.historical.bar.enums.BarTimePeriod;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.common.enums.Exchange;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.bar.CryptoBar;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.bar.CryptoBarsResponse;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.quote.CryptoQuote;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.quote.CryptoQuotesResponse;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.quote.LatestCryptoQuoteResponse;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.trade.CryptoTrade;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.trade.CryptoTradesResponse;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.trade.LatestCryptoTradeResponse;
import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.xbbo.XbboResponse;
import net.jacobpeterson.alpaca.rest.AlpacaClient;
import net.jacobpeterson.alpaca.rest.AlpacaClientException;
@@ -41,7 +41,7 @@ public CryptoMarketDataEndpoint(AlpacaClient alpacaClient) {
}
/**
- * Gets {@link Trade} historical data for the requested crypto symbol.
+ * Gets {@link CryptoTrade} historical data for the requested crypto symbol.
*
* @param symbol the symbol to query for
* @param exchanges a {@link Collection} of {@link Exchange}s to filter by. null for all exchanges.
@@ -53,11 +53,11 @@ public CryptoMarketDataEndpoint(AlpacaClient alpacaClient) {
* is given
* @param pageToken pagination token to continue from
*
- * @return the {@link TradesResponse}
+ * @return the {@link CryptoTradesResponse}
*
* @throws AlpacaClientException thrown for {@link AlpacaClientException}s
*/
- public TradesResponse getTrades(String symbol, Collection exchanges, ZonedDateTime start,
+ public CryptoTradesResponse getTrades(String symbol, Collection exchanges, ZonedDateTime start,
ZonedDateTime end, Integer limit, String pageToken) throws AlpacaClientException {
checkNotNull(symbol);
@@ -91,20 +91,20 @@ public TradesResponse getTrades(String symbol, Collection exchanges, Z
Request request = alpacaClient.requestBuilder(urlBuilder.build())
.get()
.build();
- return alpacaClient.requestObject(request, TradesResponse.class);
+ return alpacaClient.requestObject(request, CryptoTradesResponse.class);
}
/**
- * Gets the latest {@link Trade} for the requested security.
+ * Gets the latest {@link CryptoTrade} for the requested security.
*
* @param symbol the symbol to query for
- * @param exchange the {@link Exchange} to filter the latest {@link Trade} by.
+ * @param exchange the {@link Exchange} to filter the latest {@link CryptoTrade} by.
*
- * @return the {@link LatestTradeResponse}
+ * @return the {@link LatestCryptoTradeResponse}
*
* @throws AlpacaClientException thrown for {@link AlpacaClientException}s
*/
- public LatestTradeResponse getLatestTrade(String symbol, Exchange exchange) throws AlpacaClientException {
+ public LatestCryptoTradeResponse getLatestTrade(String symbol, Exchange exchange) throws AlpacaClientException {
checkNotNull(symbol);
checkNotNull(exchange);
@@ -119,11 +119,11 @@ public LatestTradeResponse getLatestTrade(String symbol, Exchange exchange) thro
Request request = alpacaClient.requestBuilder(urlBuilder.build())
.get()
.build();
- return alpacaClient.requestObject(request, LatestTradeResponse.class);
+ return alpacaClient.requestObject(request, LatestCryptoTradeResponse.class);
}
/**
- * Gets {@link Quote} historical data for the requested crypto symbol.
+ * Gets {@link CryptoQuote} historical data for the requested crypto symbol.
*
* @param symbol the symbol to query for
* @param exchanges a {@link Collection} of {@link Exchange}s to filter by. null for all exchanges.
@@ -135,11 +135,11 @@ public LatestTradeResponse getLatestTrade(String symbol, Exchange exchange) thro
* is given
* @param pageToken pagination token to continue from
*
- * @return the {@link QuotesResponse}
+ * @return the {@link CryptoQuotesResponse}
*
* @throws AlpacaClientException thrown for {@link AlpacaClientException}s
*/
- public QuotesResponse getQuotes(String symbol, Collection exchanges, ZonedDateTime start,
+ public CryptoQuotesResponse getQuotes(String symbol, Collection exchanges, ZonedDateTime start,
ZonedDateTime end, Integer limit, String pageToken) throws AlpacaClientException {
checkNotNull(symbol);
@@ -173,20 +173,20 @@ public QuotesResponse getQuotes(String symbol, Collection exchanges, Z
Request request = alpacaClient.requestBuilder(urlBuilder.build())
.get()
.build();
- return alpacaClient.requestObject(request, QuotesResponse.class);
+ return alpacaClient.requestObject(request, CryptoQuotesResponse.class);
}
/**
- * Gets the latest {@link Quote} for the requested security.
+ * Gets the latest {@link CryptoQuote} for the requested security.
*
* @param symbol the symbol to query for
- * @param exchange the {@link Exchange} to filter the latest {@link Quote} by.
+ * @param exchange the {@link Exchange} to filter the latest {@link CryptoQuote} by.
*
- * @return the {@link LatestQuoteResponse}
+ * @return the {@link LatestCryptoQuoteResponse}
*
* @throws AlpacaClientException thrown for {@link AlpacaClientException}s
*/
- public LatestQuoteResponse getLatestQuote(String symbol, Exchange exchange) throws AlpacaClientException {
+ public LatestCryptoQuoteResponse getLatestQuote(String symbol, Exchange exchange) throws AlpacaClientException {
checkNotNull(symbol);
checkNotNull(exchange);
@@ -201,11 +201,11 @@ public LatestQuoteResponse getLatestQuote(String symbol, Exchange exchange) thro
Request request = alpacaClient.requestBuilder(urlBuilder.build())
.get()
.build();
- return alpacaClient.requestObject(request, LatestQuoteResponse.class);
+ return alpacaClient.requestObject(request, LatestCryptoQuoteResponse.class);
}
/**
- * Gets {@link Bar} aggregate historical data for the requested crypto.
+ * Gets {@link CryptoBar} aggregate historical data for the requested crypto.
*
* @param symbol the symbol to query for
* @param exchanges a {@link Collection} of {@link Exchange}s to filter by. null for all
@@ -222,11 +222,11 @@ public LatestQuoteResponse getLatestQuote(String symbol, Exchange exchange) thro
* BarTimePeriod#MINUTE} for this parameter and 15 for the
* barTimePeriodDuration parameter.
*
- * @return the {@link BarsResponse}
+ * @return the {@link CryptoBarsResponse}
*
* @throws AlpacaClientException thrown for {@link AlpacaClientException}s
*/
- public BarsResponse getBars(String symbol, Collection exchanges, ZonedDateTime start, Integer limit,
+ public CryptoBarsResponse getBars(String symbol, Collection exchanges, ZonedDateTime start, Integer limit,
String pageToken, int barTimePeriodDuration, BarTimePeriod barTimePeriod) throws AlpacaClientException {
checkNotNull(symbol);
checkNotNull(barTimePeriod);
@@ -259,7 +259,7 @@ public BarsResponse getBars(String symbol, Collection exchanges, Zoned
Request request = alpacaClient.requestBuilder(urlBuilder.build())
.get()
.build();
- return alpacaClient.requestObject(request, BarsResponse.class);
+ return alpacaClient.requestObject(request, CryptoBarsResponse.class);
}
/**
@@ -269,7 +269,7 @@ public BarsResponse getBars(String symbol, Collection exchanges, Zoned
* @param exchanges a {@link Collection} of {@link Exchange}s to filter by. If null, then only the
* exchanges that can be traded on Alpaca are included in the calculation.
*
- * @return the {@link LatestQuoteResponse}
+ * @return the {@link XbboResponse}
*
* @throws AlpacaClientException thrown for {@link AlpacaClientException}s
*/
diff --git a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/marketdata/StockMarketDataEndpoint.java b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/marketdata/stock/StockMarketDataEndpoint.java
similarity index 84%
rename from src/main/java/net/jacobpeterson/alpaca/rest/endpoint/marketdata/StockMarketDataEndpoint.java
rename to src/main/java/net/jacobpeterson/alpaca/rest/endpoint/marketdata/stock/StockMarketDataEndpoint.java
index f203a5d2..fe8a846e 100644
--- a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/marketdata/StockMarketDataEndpoint.java
+++ b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/marketdata/stock/StockMarketDataEndpoint.java
@@ -1,17 +1,17 @@
-package net.jacobpeterson.alpaca.rest.endpoint.marketdata;
+package net.jacobpeterson.alpaca.rest.endpoint.marketdata.stock;
import com.google.gson.reflect.TypeToken;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.common.enums.BarTimePeriod;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.bar.Bar;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.bar.BarsResponse;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.common.historical.bar.enums.BarTimePeriod;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.bar.StockBar;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.bar.StockBarsResponse;
import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.bar.enums.BarAdjustment;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.quote.LatestQuoteResponse;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.quote.Quote;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.quote.QuotesResponse;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.quote.LatestStockQuoteResponse;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.quote.StockQuote;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.quote.StockQuotesResponse;
import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.snapshot.Snapshot;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.trade.LatestTradeResponse;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.trade.Trade;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.trade.TradesResponse;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.trade.LatestStockTradeResponse;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.trade.StockTrade;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.trade.StockTradesResponse;
import net.jacobpeterson.alpaca.rest.AlpacaClient;
import net.jacobpeterson.alpaca.rest.AlpacaClientException;
import net.jacobpeterson.alpaca.rest.endpoint.AlpacaEndpoint;
@@ -44,7 +44,7 @@ public StockMarketDataEndpoint(AlpacaClient alpacaClient) {
}
/**
- * Gets {@link Trade} historical data for the requested security.
+ * Gets {@link StockTrade} historical data for the requested security.
*
* @param symbol the symbol to query for
* @param start filter data equal to or after this {@link ZonedDateTime}. Fractions of a second are not
@@ -55,11 +55,11 @@ public StockMarketDataEndpoint(AlpacaClient alpacaClient) {
* is given
* @param pageToken pagination token to continue from
*
- * @return the {@link TradesResponse}
+ * @return the {@link StockTradesResponse}
*
* @throws AlpacaClientException thrown for {@link AlpacaClientException}s
*/
- public TradesResponse getTrades(String symbol, ZonedDateTime start, ZonedDateTime end, Integer limit,
+ public StockTradesResponse getTrades(String symbol, ZonedDateTime start, ZonedDateTime end, Integer limit,
String pageToken) throws AlpacaClientException {
checkNotNull(symbol);
checkNotNull(start);
@@ -84,19 +84,19 @@ public TradesResponse getTrades(String symbol, ZonedDateTime start, ZonedDateTim
Request request = alpacaClient.requestBuilder(urlBuilder.build())
.get()
.build();
- return alpacaClient.requestObject(request, TradesResponse.class);
+ return alpacaClient.requestObject(request, StockTradesResponse.class);
}
/**
- * Gets the latest {@link Trade} for the requested security.
+ * Gets the latest {@link StockTrade} for the requested security.
*
* @param symbol the symbol to query for
*
- * @return the {@link LatestTradeResponse}
+ * @return the {@link LatestStockTradeResponse}
*
* @throws AlpacaClientException thrown for {@link AlpacaClientException}s
*/
- public LatestTradeResponse getLatestTrade(String symbol) throws AlpacaClientException {
+ public LatestStockTradeResponse getLatestTrade(String symbol) throws AlpacaClientException {
checkNotNull(symbol);
HttpUrl.Builder urlBuilder = alpacaClient.urlBuilder()
@@ -108,11 +108,11 @@ public LatestTradeResponse getLatestTrade(String symbol) throws AlpacaClientExce
Request request = alpacaClient.requestBuilder(urlBuilder.build())
.get()
.build();
- return alpacaClient.requestObject(request, LatestTradeResponse.class);
+ return alpacaClient.requestObject(request, LatestStockTradeResponse.class);
}
/**
- * Gets {@link Quote} (NBBO or National Best Bid and Offer) historical data for the requested security.
+ * Gets {@link StockQuote} (NBBO or National Best Bid and Offer) historical data for the requested security.
*
* @param symbol the symbol to query for
* @param start filter data equal to or after this {@link ZonedDateTime}. Fractions of a second are not
@@ -123,11 +123,11 @@ public LatestTradeResponse getLatestTrade(String symbol) throws AlpacaClientExce
* is given
* @param pageToken pagination token to continue from
*
- * @return the {@link QuotesResponse}
+ * @return the {@link StockQuotesResponse}
*
* @throws AlpacaClientException thrown for {@link AlpacaClientException}s
*/
- public QuotesResponse getQuotes(String symbol, ZonedDateTime start, ZonedDateTime end, Integer limit,
+ public StockQuotesResponse getQuotes(String symbol, ZonedDateTime start, ZonedDateTime end, Integer limit,
String pageToken) throws AlpacaClientException {
checkNotNull(symbol);
checkNotNull(start);
@@ -152,19 +152,19 @@ public QuotesResponse getQuotes(String symbol, ZonedDateTime start, ZonedDateTim
Request request = alpacaClient.requestBuilder(urlBuilder.build())
.get()
.build();
- return alpacaClient.requestObject(request, QuotesResponse.class);
+ return alpacaClient.requestObject(request, StockQuotesResponse.class);
}
/**
- * Gets the latest {@link Quote} for the requested security.
+ * Gets the latest {@link StockQuote} for the requested security.
*
* @param symbol the symbol to query for
*
- * @return the {@link LatestQuoteResponse}
+ * @return the {@link LatestStockQuoteResponse}
*
* @throws AlpacaClientException thrown for {@link AlpacaClientException}s
*/
- public LatestQuoteResponse getLatestQuote(String symbol) throws AlpacaClientException {
+ public LatestStockQuoteResponse getLatestQuote(String symbol) throws AlpacaClientException {
checkNotNull(symbol);
HttpUrl.Builder urlBuilder = alpacaClient.urlBuilder()
@@ -176,11 +176,11 @@ public LatestQuoteResponse getLatestQuote(String symbol) throws AlpacaClientExce
Request request = alpacaClient.requestBuilder(urlBuilder.build())
.get()
.build();
- return alpacaClient.requestObject(request, LatestQuoteResponse.class);
+ return alpacaClient.requestObject(request, LatestStockQuoteResponse.class);
}
/**
- * Gets {@link Bar} aggregate historical data for the requested security.
+ * Gets {@link StockBar} aggregate historical data for the requested security.
*
* @param symbol the symbol to query for
* @param start filter data equal to or after this {@link ZonedDateTime}. Fractions of a second are
@@ -199,11 +199,11 @@ public LatestQuoteResponse getLatestQuote(String symbol) throws AlpacaClientExce
* @param barAdjustment specifies the corporate action adjustment for the stocks. Default value is {@link
* BarAdjustment#RAW}.
*
- * @return the {@link BarsResponse}
+ * @return the {@link StockBarsResponse}
*
* @throws AlpacaClientException thrown for {@link AlpacaClientException}s
*/
- public BarsResponse getBars(String symbol, ZonedDateTime start, ZonedDateTime end, Integer limit,
+ public StockBarsResponse getBars(String symbol, ZonedDateTime start, ZonedDateTime end, Integer limit,
String pageToken, int barTimePeriodDuration, BarTimePeriod barTimePeriod, BarAdjustment barAdjustment)
throws AlpacaClientException {
checkNotNull(symbol);
@@ -236,7 +236,7 @@ public BarsResponse getBars(String symbol, ZonedDateTime start, ZonedDateTime en
Request request = alpacaClient.requestBuilder(urlBuilder.build())
.get()
.build();
- return alpacaClient.requestObject(request, BarsResponse.class);
+ return alpacaClient.requestObject(request, StockBarsResponse.class);
}
/**
diff --git a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/OrdersEndpoint.java b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/orders/OrdersEndpoint.java
similarity index 98%
rename from src/main/java/net/jacobpeterson/alpaca/rest/endpoint/OrdersEndpoint.java
rename to src/main/java/net/jacobpeterson/alpaca/rest/endpoint/orders/OrdersEndpoint.java
index 8715d1fc..90159bb4 100644
--- a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/OrdersEndpoint.java
+++ b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/orders/OrdersEndpoint.java
@@ -1,19 +1,20 @@
-package net.jacobpeterson.alpaca.rest.endpoint;
+package net.jacobpeterson.alpaca.rest.endpoint.orders;
import com.google.gson.JsonObject;
import com.google.gson.JsonPrimitive;
import com.google.gson.reflect.TypeToken;
import net.jacobpeterson.alpaca.model.endpoint.common.enums.SortDirection;
-import net.jacobpeterson.alpaca.model.endpoint.order.CancelledOrder;
-import net.jacobpeterson.alpaca.model.endpoint.order.Order;
-import net.jacobpeterson.alpaca.model.endpoint.order.enums.CurrentOrderStatus;
-import net.jacobpeterson.alpaca.model.endpoint.order.enums.OrderClass;
-import net.jacobpeterson.alpaca.model.endpoint.order.enums.OrderSide;
-import net.jacobpeterson.alpaca.model.endpoint.order.enums.OrderStatus;
-import net.jacobpeterson.alpaca.model.endpoint.order.enums.OrderTimeInForce;
-import net.jacobpeterson.alpaca.model.endpoint.order.enums.OrderType;
+import net.jacobpeterson.alpaca.model.endpoint.orders.CancelledOrder;
+import net.jacobpeterson.alpaca.model.endpoint.orders.Order;
+import net.jacobpeterson.alpaca.model.endpoint.orders.enums.CurrentOrderStatus;
+import net.jacobpeterson.alpaca.model.endpoint.orders.enums.OrderClass;
+import net.jacobpeterson.alpaca.model.endpoint.orders.enums.OrderSide;
+import net.jacobpeterson.alpaca.model.endpoint.orders.enums.OrderStatus;
+import net.jacobpeterson.alpaca.model.endpoint.orders.enums.OrderTimeInForce;
+import net.jacobpeterson.alpaca.model.endpoint.orders.enums.OrderType;
import net.jacobpeterson.alpaca.rest.AlpacaClient;
import net.jacobpeterson.alpaca.rest.AlpacaClientException;
+import net.jacobpeterson.alpaca.rest.endpoint.AlpacaEndpoint;
import net.jacobpeterson.alpaca.util.format.FormatUtil;
import net.jacobpeterson.alpaca.util.okhttp.JSONBodyBuilder;
import okhttp3.HttpUrl;
diff --git a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/PortfolioHistoryEndpoint.java b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/portfoliohistory/PortfolioHistoryEndpoint.java
similarity index 97%
rename from src/main/java/net/jacobpeterson/alpaca/rest/endpoint/PortfolioHistoryEndpoint.java
rename to src/main/java/net/jacobpeterson/alpaca/rest/endpoint/portfoliohistory/PortfolioHistoryEndpoint.java
index 1d01c19d..722299f0 100644
--- a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/PortfolioHistoryEndpoint.java
+++ b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/portfoliohistory/PortfolioHistoryEndpoint.java
@@ -1,4 +1,4 @@
-package net.jacobpeterson.alpaca.rest.endpoint;
+package net.jacobpeterson.alpaca.rest.endpoint.portfoliohistory;
import net.jacobpeterson.alpaca.model.endpoint.portfoliohistory.PortfolioHistory;
import net.jacobpeterson.alpaca.model.endpoint.portfoliohistory.PortfolioHistoryDataPoint;
@@ -7,6 +7,7 @@
import net.jacobpeterson.alpaca.model.endpoint.portfoliohistory.enums.PortfolioTimeFrame;
import net.jacobpeterson.alpaca.rest.AlpacaClient;
import net.jacobpeterson.alpaca.rest.AlpacaClientException;
+import net.jacobpeterson.alpaca.rest.endpoint.AlpacaEndpoint;
import net.jacobpeterson.alpaca.util.format.FormatUtil;
import okhttp3.HttpUrl;
import okhttp3.Request;
diff --git a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/PositionsEndpoint.java b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/positions/PositionsEndpoint.java
similarity index 92%
rename from src/main/java/net/jacobpeterson/alpaca/rest/endpoint/PositionsEndpoint.java
rename to src/main/java/net/jacobpeterson/alpaca/rest/endpoint/positions/PositionsEndpoint.java
index 26d72861..cccfdfb8 100644
--- a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/PositionsEndpoint.java
+++ b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/positions/PositionsEndpoint.java
@@ -1,12 +1,13 @@
-package net.jacobpeterson.alpaca.rest.endpoint;
+package net.jacobpeterson.alpaca.rest.endpoint.positions;
import com.google.gson.reflect.TypeToken;
-import net.jacobpeterson.alpaca.model.endpoint.asset.Asset;
-import net.jacobpeterson.alpaca.model.endpoint.order.Order;
-import net.jacobpeterson.alpaca.model.endpoint.position.ClosePositionOrder;
-import net.jacobpeterson.alpaca.model.endpoint.position.Position;
+import net.jacobpeterson.alpaca.model.endpoint.assets.Asset;
+import net.jacobpeterson.alpaca.model.endpoint.orders.Order;
+import net.jacobpeterson.alpaca.model.endpoint.positions.ClosePositionOrder;
+import net.jacobpeterson.alpaca.model.endpoint.positions.Position;
import net.jacobpeterson.alpaca.rest.AlpacaClient;
import net.jacobpeterson.alpaca.rest.AlpacaClientException;
+import net.jacobpeterson.alpaca.rest.endpoint.AlpacaEndpoint;
import okhttp3.HttpUrl;
import okhttp3.Request;
diff --git a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/WatchlistEndpoint.java b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/watchlist/WatchlistEndpoint.java
similarity index 97%
rename from src/main/java/net/jacobpeterson/alpaca/rest/endpoint/WatchlistEndpoint.java
rename to src/main/java/net/jacobpeterson/alpaca/rest/endpoint/watchlist/WatchlistEndpoint.java
index aeadb183..8f8762eb 100644
--- a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/WatchlistEndpoint.java
+++ b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/watchlist/WatchlistEndpoint.java
@@ -1,11 +1,12 @@
-package net.jacobpeterson.alpaca.rest.endpoint;
+package net.jacobpeterson.alpaca.rest.endpoint.watchlist;
import com.google.gson.JsonArray;
import com.google.gson.reflect.TypeToken;
-import net.jacobpeterson.alpaca.model.endpoint.asset.Asset;
+import net.jacobpeterson.alpaca.model.endpoint.assets.Asset;
import net.jacobpeterson.alpaca.model.endpoint.watchlist.Watchlist;
import net.jacobpeterson.alpaca.rest.AlpacaClient;
import net.jacobpeterson.alpaca.rest.AlpacaClientException;
+import net.jacobpeterson.alpaca.rest.endpoint.AlpacaEndpoint;
import net.jacobpeterson.alpaca.util.okhttp.JSONBodyBuilder;
import okhttp3.HttpUrl;
import okhttp3.Request;
diff --git a/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/MarketDataListener.java b/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/MarketDataListener.java
index 09bf4266..0f760d7e 100644
--- a/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/MarketDataListener.java
+++ b/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/MarketDataListener.java
@@ -1,7 +1,7 @@
package net.jacobpeterson.alpaca.websocket.marketdata;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.realtime.MarketDataMessage;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.realtime.enums.MarketDataMessageType;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.common.realtime.MarketDataMessage;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.common.realtime.enums.MarketDataMessageType;
import net.jacobpeterson.alpaca.websocket.AlpacaWebsocketMessageListener;
/**
diff --git a/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/MarketDataWebsocket.java b/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/MarketDataWebsocket.java
index 28cce551..836a452a 100644
--- a/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/MarketDataWebsocket.java
+++ b/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/MarketDataWebsocket.java
@@ -5,15 +5,14 @@
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.realtime.MarketDataMessage;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.realtime.bar.BarMessage;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.realtime.control.ErrorMessage;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.realtime.control.SubscriptionsMessage;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.realtime.control.SuccessMessage;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.realtime.enums.MarketDataMessageType;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.realtime.quote.QuoteMessage;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.realtime.trade.TradeMessage;
-import net.jacobpeterson.alpaca.model.properties.DataAPIType;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.common.realtime.MarketDataMessage;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.common.realtime.bar.BarMessage;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.common.realtime.control.ErrorMessage;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.common.realtime.control.SubscriptionsMessage;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.common.realtime.control.SuccessMessage;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.common.realtime.enums.MarketDataMessageType;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.common.realtime.quote.QuoteMessage;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.common.realtime.trade.TradeMessage;
import net.jacobpeterson.alpaca.websocket.AlpacaWebsocket;
import okhttp3.HttpUrl;
import okhttp3.OkHttpClient;
@@ -22,6 +21,7 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import java.lang.reflect.Type;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
@@ -37,10 +37,11 @@
/**
* {@link MarketDataWebsocket} is an {@link AlpacaWebsocket} implementation and provides the {@link
* MarketDataWebsocketInterface} interface for
- * Real-time
- * Market Data
+ * Realtime Market Data for both crypto
+ * and stocks.
*/
-public class MarketDataWebsocket extends AlpacaWebsocket
+public abstract class MarketDataWebsocket
+ extends AlpacaWebsocket
implements MarketDataWebsocketInterface {
private static final Logger LOGGER = LoggerFactory.getLogger(MarketDataWebsocket.class);
@@ -55,18 +56,17 @@ public class MarketDataWebsocket extends AlpacaWebsocketdataAPIType.
+ * Creates a {@link HttpUrl} for {@link MarketDataWebsocket} with the given websocketURLPathSegments.
*
- * @param dataAPIType the {@link DataAPIType}
+ * @param websocketURLPathSegments the websocket URL path segments
*
* @return a {@link HttpUrl}
*/
- private static HttpUrl createWebsocketURL(DataAPIType dataAPIType) {
+ private static HttpUrl createWebsocketURL(String websocketURLPathSegments) {
return new HttpUrl.Builder()
.scheme("https") // HttpUrl.Builder doesn't recognize "wss" scheme, but "https" works fine
.host("stream.data.alpaca.markets")
- .addPathSegment("v2")
- .addPathSegment(dataAPIType.toString())
+ .addPathSegments(websocketURLPathSegments)
.build();
}
@@ -74,23 +74,37 @@ private static HttpUrl createWebsocketURL(DataAPIType dataAPIType) {
private final Set subscribedTrades;
private final Set subscribedQuotes;
private final Set subscribedBars;
+ private final Type tradeClassType;
+ private final Type quoteClassType;
+ private final Type barClassType;
/**
* Instantiates a new {@link MarketDataWebsocket}.
*
- * @param okHttpClient the {@link OkHttpClient}
- * @param dataAPIType the {@link DataAPIType}
- * @param keyID the key ID
- * @param secretKey the secret key
+ * @param okHttpClient the {@link OkHttpClient}
+ * @param websocketURLPathSegments the websocket URL path segments
+ * @param websocketMarketDataTypeName the websocket market data type name {@link String}
+ * @param keyID the key ID
+ * @param secretKey the secret key
+ * @param tradeClass the {@link TradeMessage} {@link Class} to deserialize data into
+ * @param quoteClass the {@link QuoteMessage} {@link Class} to deserialize data into
+ * @param barClass the {@link BarMessage} {@link Class} to deserialize data into
*/
- public MarketDataWebsocket(OkHttpClient okHttpClient, DataAPIType dataAPIType,
- String keyID, String secretKey) {
- super(okHttpClient, createWebsocketURL(dataAPIType), "Market Data", keyID, secretKey, null);
+ public MarketDataWebsocket(OkHttpClient okHttpClient, String websocketURLPathSegments,
+ String websocketMarketDataTypeName, String keyID, String secretKey,
+ Class extends TradeMessage> tradeClass, Class extends QuoteMessage> quoteClass,
+ Class extends BarMessage> barClass) {
+ super(okHttpClient, createWebsocketURL(websocketURLPathSegments), websocketMarketDataTypeName + " Market Data",
+ keyID, secretKey, null);
listenedMarketDataMessageTypes = new HashSet<>();
subscribedTrades = new HashSet<>();
subscribedQuotes = new HashSet<>();
subscribedBars = new HashSet<>();
+
+ this.tradeClassType = tradeClass;
+ this.quoteClassType = quoteClass;
+ this.barClassType = barClass;
}
@Override
@@ -139,6 +153,8 @@ protected void sendAuthenticationMessage() {
// This websocket uses string frames and not binary frames.
@Override
public void onMessage(@NotNull WebSocket webSocket, @NotNull String message) {
+ LOGGER.trace("{}", message);
+
JsonElement messageElement = JsonParser.parseString(message);
checkState(messageElement instanceof JsonArray, "Message must be a JsonArray! Received: %s", messageElement);
@@ -198,13 +214,13 @@ public void onMessage(@NotNull WebSocket webSocket, @NotNull String message) {
subscribedBars);
break;
case TRADE:
- marketDataMessage = GSON.fromJson(messageObject, TradeMessage.class);
+ marketDataMessage = GSON.fromJson(messageObject, tradeClassType);
break;
case QUOTE:
- marketDataMessage = GSON.fromJson(messageObject, QuoteMessage.class);
+ marketDataMessage = GSON.fromJson(messageObject, quoteClassType);
break;
case BAR:
- marketDataMessage = GSON.fromJson(messageObject, BarMessage.class);
+ marketDataMessage = GSON.fromJson(messageObject, barClassType);
break;
default:
LOGGER.error("Message type {} not implemented!", marketDataMessageType);
diff --git a/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/MarketDataWebsocketInterface.java b/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/MarketDataWebsocketInterface.java
index 2eb52e63..5ffcaf3c 100644
--- a/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/MarketDataWebsocketInterface.java
+++ b/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/MarketDataWebsocketInterface.java
@@ -1,10 +1,10 @@
package net.jacobpeterson.alpaca.websocket.marketdata;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.realtime.MarketDataMessage;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.realtime.control.ErrorMessage;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.realtime.control.SubscriptionsMessage;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.realtime.control.SuccessMessage;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.realtime.enums.MarketDataMessageType;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.common.realtime.MarketDataMessage;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.common.realtime.control.ErrorMessage;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.common.realtime.control.SubscriptionsMessage;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.common.realtime.control.SuccessMessage;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.common.realtime.enums.MarketDataMessageType;
import net.jacobpeterson.alpaca.websocket.AlpacaWebsocketInterface;
import java.util.Collection;
diff --git a/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/crypto/CryptoMarketDataWebsocket.java b/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/crypto/CryptoMarketDataWebsocket.java
new file mode 100644
index 00000000..fa61d1ec
--- /dev/null
+++ b/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/crypto/CryptoMarketDataWebsocket.java
@@ -0,0 +1,27 @@
+package net.jacobpeterson.alpaca.websocket.marketdata.crypto;
+
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.realtime.bar.CryptoBarMessage;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.realtime.quote.CryptoQuoteMessage;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.realtime.trade.CryptoTradeMessage;
+import net.jacobpeterson.alpaca.websocket.marketdata.MarketDataWebsocket;
+import okhttp3.OkHttpClient;
+
+/**
+ * {@link CryptoMarketDataWebsocket} is a {@link MarketDataWebsocket} for
+ * Realtime
+ * Crypto Market Data
+ */
+public class CryptoMarketDataWebsocket extends MarketDataWebsocket {
+
+ /**
+ * Instantiates a new {@link CryptoMarketDataWebsocket}.
+ *
+ * @param okHttpClient the {@link OkHttpClient}
+ * @param keyID the key ID
+ * @param secretKey the secret key
+ */
+ public CryptoMarketDataWebsocket(OkHttpClient okHttpClient, String keyID, String secretKey) {
+ super(okHttpClient, "v1beta1/crypto", "Crypto", keyID, secretKey, CryptoTradeMessage.class,
+ CryptoQuoteMessage.class, CryptoBarMessage.class);
+ }
+}
diff --git a/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/stock/StockMarketDataWebsocket.java b/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/stock/StockMarketDataWebsocket.java
new file mode 100644
index 00000000..4b897f0d
--- /dev/null
+++ b/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/stock/StockMarketDataWebsocket.java
@@ -0,0 +1,30 @@
+package net.jacobpeterson.alpaca.websocket.marketdata.stock;
+
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.realtime.bar.StockBarMessage;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.realtime.quote.StockQuoteMessage;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.realtime.trade.StockTradeMessage;
+import net.jacobpeterson.alpaca.model.properties.DataAPIType;
+import net.jacobpeterson.alpaca.websocket.marketdata.MarketDataWebsocket;
+import okhttp3.OkHttpClient;
+
+/**
+ * {@link StockMarketDataWebsocket} is a {@link MarketDataWebsocket} for
+ * Realtime
+ * Stock Market Data
+ */
+public class StockMarketDataWebsocket extends MarketDataWebsocket {
+
+ /**
+ * Instantiates a new {@link StockMarketDataWebsocket}.
+ *
+ * @param okHttpClient the {@link OkHttpClient}
+ * @param dataAPIType the {@link DataAPIType}
+ * @param keyID the key ID
+ * @param secretKey the secret key
+ */
+ public StockMarketDataWebsocket(OkHttpClient okHttpClient, DataAPIType dataAPIType,
+ String keyID, String secretKey) {
+ super(okHttpClient, "v2/" + dataAPIType.toString(), "Stock", keyID, secretKey, StockTradeMessage.class,
+ StockQuoteMessage.class, StockBarMessage.class);
+ }
+}
diff --git a/src/test/java/net/jacobpeterson/alpaca/test/live/AlpacaAPITest.java b/src/test/java/net/jacobpeterson/alpaca/test/live/AlpacaAPITest.java
index dafd1016..f9760235 100644
--- a/src/test/java/net/jacobpeterson/alpaca/test/live/AlpacaAPITest.java
+++ b/src/test/java/net/jacobpeterson/alpaca/test/live/AlpacaAPITest.java
@@ -11,14 +11,14 @@
import net.jacobpeterson.alpaca.model.endpoint.accountconfiguration.enums.TradeConfirmEmail;
import net.jacobpeterson.alpaca.model.endpoint.clock.Clock;
import net.jacobpeterson.alpaca.model.endpoint.common.enums.SortDirection;
-import net.jacobpeterson.alpaca.model.endpoint.order.Order;
-import net.jacobpeterson.alpaca.model.endpoint.order.enums.CurrentOrderStatus;
+import net.jacobpeterson.alpaca.model.endpoint.orders.Order;
+import net.jacobpeterson.alpaca.model.endpoint.orders.enums.CurrentOrderStatus;
import net.jacobpeterson.alpaca.rest.AlpacaClientException;
-import net.jacobpeterson.alpaca.rest.endpoint.AccountActivitiesEndpoint;
-import net.jacobpeterson.alpaca.rest.endpoint.AccountConfigurationEndpoint;
-import net.jacobpeterson.alpaca.rest.endpoint.AccountEndpoint;
-import net.jacobpeterson.alpaca.rest.endpoint.ClockEndpoint;
-import net.jacobpeterson.alpaca.rest.endpoint.OrdersEndpoint;
+import net.jacobpeterson.alpaca.rest.endpoint.account.AccountEndpoint;
+import net.jacobpeterson.alpaca.rest.endpoint.accountactivities.AccountActivitiesEndpoint;
+import net.jacobpeterson.alpaca.rest.endpoint.accountconfiguration.AccountConfigurationEndpoint;
+import net.jacobpeterson.alpaca.rest.endpoint.clock.ClockEndpoint;
+import net.jacobpeterson.alpaca.rest.endpoint.orders.OrdersEndpoint;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
From e39ce37b58f1d40ded1ad6a6fb220978469bfd40 Mon Sep 17 00:00:00 2001
From: Jacob Peterson <14127217+Petersoj@users.noreply.github.com>
Date: Wed, 22 Dec 2021 13:22:34 -0700
Subject: [PATCH 24/84] Update README, fix some market_data schema JSONs
---
README.md | 68 ++++++++++++-------
.../common/historical/bar/bar.json | 3 -
.../common/realtime/bar/bar_message.json | 10 +++
.../realtime/bar/crypto_bar_message.json | 10 ---
.../marketdata/MarketDataWebsocket.java | 2 -
.../streaming/StreamingWebsocket.java | 6 +-
6 files changed, 54 insertions(+), 45 deletions(-)
diff --git a/README.md b/README.md
index ffbea854..59df6b86 100644
--- a/README.md
+++ b/README.md
@@ -86,7 +86,7 @@ See the [OkHttpClient Documentation](https://square.github.io/okhttp/4.x/okhttp/
## [`AlpacaClientException`](src/main/java/net/jacobpeterson/alpaca/rest/AlpacaClientException.java)
[`AlpacaClientException`](src/main/java/net/jacobpeterson/alpaca/rest/AlpacaClientException.java) is thrown anytime an exception occurs when using various [`AlpacaEndpoints`](src/main/java/net/jacobpeterson/alpaca/rest/endpoint/AlpacaEndpoint.java). It should be caught and handled within your trading algorithm application accordingly.
-## [`AccountEndpoint`](src/main/java/net/jacobpeterson/alpaca/rest/endpoint/AccountEndpoint.java)
+## [`AccountEndpoint`](src/main/java/net/jacobpeterson/alpaca/rest/endpoint/account/AccountEndpoint.java)
The Account API serves important information related to an account, including account status, funds available for trade, funds available for withdrawal, and various flags relevant to an account's ability to trade.
Example usage:
@@ -100,14 +100,14 @@ try {
}
```
-## [`CryptoMarketDataEndpoint`](src/main/java/net/jacobpeterson/alpaca/rest/endpoint/marketdata/CryptoMarketDataEndpoint.java)
+## [`CryptoMarketDataEndpoint`](src/main/java/net/jacobpeterson/alpaca/rest/endpoint/marketdata/crypto/CryptoMarketDataEndpoint.java)
Alpaca provides cryptocurrency data from multiple venues/exchanges, namely: Coinbase, ErisX, and FTX.
Example usage:
```java
try {
// Get BTCUSD 50 one-hour bars starting on 12/18/2021 from Coinbase and print them out
- BarsResponse btcBarsResponse = alpacaAPI.cryptoMarketData().getBars(
+ CryptoBarsResponse btcBarsResponse = alpacaAPI.cryptoMarketData().getBars(
"BTCUSD",
Arrays.asList(Exchange.COINBASE),
ZonedDateTime.of(2021, 12, 18, 0, 0, 0, 0, ZoneId.of("America/New_York")),
@@ -127,7 +127,7 @@ try {
}
```
-## [`StockMarketDataEndpoint`](src/main/java/net/jacobpeterson/alpaca/rest/endpoint/marketdata/StockMarketDataEndpoint.java)
+## [`StockMarketDataEndpoint`](src/main/java/net/jacobpeterson/alpaca/rest/endpoint/marketdata/stock/StockMarketDataEndpoint.java)
The Data API v2 provides market data through an easy-to-use API for historical stock market data.
Example usage:
@@ -135,7 +135,7 @@ Example usage:
try {
// Get AAPL one hour, split-adjusted bars from 7/6/2021 market open
// to 7/8/2021 market close and print them out
- BarsResponse aaplBarsResponse = alpacaAPI.stockMarketData().getBars(
+ StockBarsResponse aaplBarsResponse = alpacaAPI.stockMarketData().getBars(
"AAPL",
ZonedDateTime.of(2021, 7, 6, 9, 30, 0, 0, ZoneId.of("America/New_York")),
ZonedDateTime.of(2021, 7, 8, 12 + 4, 0, 0, 0, ZoneId.of("America/New_York")),
@@ -147,7 +147,7 @@ try {
aaplBarsResponse.getBars().forEach(System.out::println);
// Get AAPL first 10 trades on 7/8/2021 at market open and print them out
- TradesResponse aaplTradesResponse = alpacaAPI.stockMarketData().getTrades(
+ StockTradesResponse aaplTradesResponse = alpacaAPI.stockMarketData().getTrades(
"AAPL",
ZonedDateTime.of(2021, 7, 8, 9, 30, 0, 0, ZoneId.of("America/New_York")),
ZonedDateTime.of(2021, 7, 8, 9, 31, 0, 0, ZoneId.of("America/New_York")),
@@ -169,7 +169,7 @@ try {
}
```
-## [`OrdersEndpoint`](src/main/java/net/jacobpeterson/alpaca/rest/endpoint/OrdersEndpoint.java)
+## [`OrdersEndpoint`](src/main/java/net/jacobpeterson/alpaca/rest/endpoint/orders/OrdersEndpoint.java)
The Orders API allows a user to monitor, place, and cancel their orders with Alpaca.
Example usage:
@@ -229,7 +229,7 @@ try {
}
```
-## [`PositionsEndpoint`](src/main/java/net/jacobpeterson/alpaca/rest/endpoint/PositionsEndpoint.java)
+## [`PositionsEndpoint`](src/main/java/net/jacobpeterson/alpaca/rest/endpoint/positions/PositionsEndpoint.java)
The Positions API provides information about an account's current open positions.
Example usage:
@@ -250,7 +250,7 @@ try {
}
```
-## [`AssetsEndpoint`](src/main/java/net/jacobpeterson/alpaca/rest/endpoint/AssetsEndpoint.java)
+## [`AssetsEndpoint`](src/main/java/net/jacobpeterson/alpaca/rest/endpoint/assets/AssetsEndpoint.java)
The Assets API serves as the master list of assets available for trade and data consumption from Alpaca.
Example usage:
@@ -270,7 +270,7 @@ try {
}
```
-## [`WatchlistEndpoint`](src/main/java/net/jacobpeterson/alpaca/rest/endpoint/WatchlistEndpoint.java)
+## [`WatchlistEndpoint`](src/main/java/net/jacobpeterson/alpaca/rest/endpoint/watchlist/WatchlistEndpoint.java)
The Watchlist API provides CRUD operation for the account's watchlist.
Example usage:
@@ -304,7 +304,7 @@ try {
}
```
-## [`CalendarEndpoint`](src/main/java/net/jacobpeterson/alpaca/rest/endpoint/CalendarEndpoint.java)
+## [`CalendarEndpoint`](src/main/java/net/jacobpeterson/alpaca/rest/endpoint/calendar/CalendarEndpoint.java)
The calendar API serves the full list of market days from 1970 to 2029.
Example usage:
@@ -320,7 +320,7 @@ try {
}
```
-## [`ClockEndpoint`](src/main/java/net/jacobpeterson/alpaca/rest/endpoint/ClockEndpoint.java)
+## [`ClockEndpoint`](src/main/java/net/jacobpeterson/alpaca/rest/endpoint/clock/ClockEndpoint.java)
The clock API serves the current market timestamp, whether the market is currently open, as well as the times of the next market open and close.
Example usage:
@@ -334,7 +334,7 @@ try {
}
```
-## [`AccountConfigurationEndpoint`](src/main/java/net/jacobpeterson/alpaca/rest/endpoint/AccountConfigurationEndpoint.java)
+## [`AccountConfigurationEndpoint`](src/main/java/net/jacobpeterson/alpaca/rest/endpoint/accountconfiguration/AccountConfigurationEndpoint.java)
The Account Configuration API provides custom configurations about your trading account settings. These configurations control various allow you to modify settings to suit your trading needs.
Example usage:
@@ -349,7 +349,7 @@ try {
}
```
-## [`AccountActivitiesEndpoint`](src/main/java/net/jacobpeterson/alpaca/rest/endpoint/AccountActivitiesEndpoint.java)
+## [`AccountActivitiesEndpoint`](src/main/java/net/jacobpeterson/alpaca/rest/endpoint/accountactivities/AccountActivitiesEndpoint.java)
The Account Activities API provides access to a historical record of transaction activities that have impacted your account.
Example usage:
@@ -376,7 +376,7 @@ try {
}
```
-## [`PortfolioHistoryEndpoint`](src/main/java/net/jacobpeterson/alpaca/rest/endpoint/PortfolioHistoryEndpoint.java)
+## [`PortfolioHistoryEndpoint`](src/main/java/net/jacobpeterson/alpaca/rest/endpoint/portfoliohistory/PortfolioHistoryEndpoint.java)
The Portfolio History API returns the timeseries data for equity and profit loss information of the account.
Example usage:
@@ -399,7 +399,7 @@ try {
```
## [`StreamingWebsocket`](src/main/java/net/jacobpeterson/alpaca/websocket/streaming/StreamingWebsocket.java)
-Alpaca offers WebSocket streaming of order updates.
+Alpaca offers websocket streaming of order updates.
Example usage:
```java
@@ -433,7 +433,7 @@ Thread.sleep(5000);
alpacaAPI.streaming().disconnect();
```
-## [`MarketDataWebsocket`](src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/MarketDataWebsocket.java)
+## [`StockMarketDataWebsocket`](src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/stock/StockMarketDataWebsocket.java)
Alpaca's Data API v2 provides websocket streaming for trades, quotes, and minute bars. This helps receive the most up-to-date market information that could help your trading strategy to act upon certain market movement.
Example usage:
@@ -441,27 +441,27 @@ Example usage:
// Add a 'MarketDataListener' that simply prints market data information
MarketDataListener marketDataListener = (messageType, message) ->
System.out.printf("%s: %s\n", messageType.name(), message);
-alpacaAPI.marketDataStreaming().setListener(marketDataListener);
+alpacaAPI.stockMarketDataStreaming().setListener(marketDataListener);
// Listen to 'SubscriptionsMessage', 'SuccessMessage', and 'ErrorMessage' control messages
// that contain information about the stream's current state. Note that these are subscribed
// to before the websocket is connected since these messages usually are sent
-// upon websocket connection.
-alpacaAPI.marketDataStreaming().subscribeToControl(
+// upon websocket connection.
+alpacaAPI.stockMarketDataStreaming().subscribeToControl(
MarketDataMessageType.SUCCESS,
MarketDataMessageType.SUBSCRIPTION,
MarketDataMessageType.ERROR);
// Connect the websocket and confirm authentication
-alpacaAPI.marketDataStreaming().connect();
-alpacaAPI.marketDataStreaming().waitForAuthorization(5, TimeUnit.SECONDS);
-if (!alpacaAPI.marketDataStreaming().isValid()) {
+alpacaAPI.stockMarketDataStreaming().connect();
+alpacaAPI.stockMarketDataStreaming().waitForAuthorization(5, TimeUnit.SECONDS);
+if (!alpacaAPI.stockMarketDataStreaming().isValid()) {
System.out.println("Websocket not valid!");
return;
}
-// Listen to the AAPL and TSLA trades and all ('*') bars.
-alpacaAPI.marketDataStreaming().subscribe(
+// Listen to AAPL and TSLA trades and all bars via the wildcard operator ('*').
+alpacaAPI.stockMarketDataStreaming().subscribe(
Arrays.asList("AAPL", "TSLA"),
null,
Arrays.asList("*"));
@@ -470,7 +470,23 @@ alpacaAPI.marketDataStreaming().subscribe(
Thread.sleep(5000);
// Manually disconnect the websocket
-alpacaAPI.marketDataStreaming().disconnect();
+alpacaAPI.stockMarketDataStreaming().disconnect();
+```
+
+## [`CryptoMarketDataWebsocket`](src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/crypto/CryptoMarketDataWebsocket.java)
+Alpaca also offers cryptocurrency websocket streaming for trades, quotes, and minute bars.
+
+The usage is identical to the [`StockMarketDataWebsocket`](https://github.com/Petersoj/alpaca-java/#stockmarketdatawebsocket) usage except that accessing the websocket instance via the `AlpacaAPI` instance is done using: `alpacaAPI.cryptoMarketDataStreaming()` instead of `alpacaAPI.stockMarketDataStreaming()`.
+
+Example usage:
+```java
+// The 'CryptoMarketDataWebsocket' setup is identical to the 'StockMarketDataWebsocket' setup
+
+// Listen to BTCUSD and ETHUSD trades and all bars via the wildcard operator ('*').
+alpacaAPI.cryptoMarketDataStreaming().subscribe(
+ Arrays.asList("BTCUSD", "ETHUSD"),
+ null,
+ Arrays.asList("*"));
```
# Building
diff --git a/schema_json/endpoint/market_data/common/historical/bar/bar.json b/schema_json/endpoint/market_data/common/historical/bar/bar.json
index b0284b57..b2f3b42f 100644
--- a/schema_json/endpoint/market_data/common/historical/bar/bar.json
+++ b/schema_json/endpoint/market_data/common/historical/bar/bar.json
@@ -1,8 +1,5 @@
{
"type": "object",
- "extends": {
- "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.common.realtime.quote.QuoteMessage"
- },
"title": "See Market Data.",
"properties": {
"t": {
diff --git a/schema_json/endpoint/market_data/common/realtime/bar/bar_message.json b/schema_json/endpoint/market_data/common/realtime/bar/bar_message.json
index fcf5f6c6..9df2a564 100644
--- a/schema_json/endpoint/market_data/common/realtime/bar/bar_message.json
+++ b/schema_json/endpoint/market_data/common/realtime/bar/bar_message.json
@@ -29,6 +29,16 @@
"existingJavaType": "java.time.ZonedDateTime",
"javaName": "timestamp",
"title": "The timestamp."
+ },
+ "n": {
+ "existingJavaType": "java.lang.Long",
+ "javaName": "tradeCount",
+ "title": "Trade count."
+ },
+ "vw": {
+ "existingJavaType": "java.lang.Double",
+ "javaName": "vwap",
+ "title": "VWAP (Volume Weighted Average Price)."
}
}
}
diff --git a/schema_json/endpoint/market_data/crypto/realtime/bar/crypto_bar_message.json b/schema_json/endpoint/market_data/crypto/realtime/bar/crypto_bar_message.json
index 3ef4ac16..8886e9d4 100644
--- a/schema_json/endpoint/market_data/crypto/realtime/bar/crypto_bar_message.json
+++ b/schema_json/endpoint/market_data/crypto/realtime/bar/crypto_bar_message.json
@@ -14,16 +14,6 @@
"existingJavaType": "java.lang.Double",
"javaName": "volume",
"title": "Volume."
- },
- "n": {
- "existingJavaType": "java.lang.Long",
- "javaName": "tradeCount",
- "title": "Trade count."
- },
- "vw": {
- "existingJavaType": "java.lang.Double",
- "javaName": "vwap",
- "title": "VWAP (Volume Weighted Average Price)."
}
}
}
diff --git a/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/MarketDataWebsocket.java b/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/MarketDataWebsocket.java
index 836a452a..9241f066 100644
--- a/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/MarketDataWebsocket.java
+++ b/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/MarketDataWebsocket.java
@@ -172,7 +172,6 @@ public void onMessage(@NotNull WebSocket webSocket, @NotNull String message) {
switch (marketDataMessageType) {
case SUCCESS:
marketDataMessage = GSON.fromJson(messageObject, SuccessMessage.class);
- LOGGER.debug("{}", marketDataMessage);
if (isSuccessMessageAuthenticated((SuccessMessage) marketDataMessage)) {
LOGGER.info("{} websocket authenticated.", websocketName);
@@ -202,7 +201,6 @@ public void onMessage(@NotNull WebSocket webSocket, @NotNull String message) {
break;
case SUBSCRIPTION:
marketDataMessage = GSON.fromJson(messageObject, SubscriptionsMessage.class);
- LOGGER.debug("{}", marketDataMessage);
// Update 'listenedMarketDataMessageTypes' and the associated subscribed symbols lists
SubscriptionsMessage subscriptionsMessage = (SubscriptionsMessage) marketDataMessage;
diff --git a/src/main/java/net/jacobpeterson/alpaca/websocket/streaming/StreamingWebsocket.java b/src/main/java/net/jacobpeterson/alpaca/websocket/streaming/StreamingWebsocket.java
index 57ede8a4..cfbf2106 100644
--- a/src/main/java/net/jacobpeterson/alpaca/websocket/streaming/StreamingWebsocket.java
+++ b/src/main/java/net/jacobpeterson/alpaca/websocket/streaming/StreamingWebsocket.java
@@ -136,7 +136,8 @@ protected void sendAuthenticationMessage() {
// This websocket uses binary frames and not text frames.
@Override
public void onMessage(@NotNull WebSocket webSocket, @NotNull ByteString byteString) {
- String message = byteString.utf8();
+ final String message = byteString.utf8();
+ LOGGER.trace("{}", message);
JsonElement messageElement = JsonParser.parseString(message);
checkState(messageElement instanceof JsonObject, "Message must be a JsonObject! Received: %s", messageElement);
@@ -160,7 +161,6 @@ public void onMessage(@NotNull WebSocket webSocket, @NotNull ByteString byteStri
LOGGER.error("{} websocket not authenticated! Received: {}.", websocketName, streamingMessage);
} else {
LOGGER.info("{} websocket authenticated.", websocketName);
- LOGGER.debug("{}", streamingMessage);
}
if (authenticationMessageFuture != null) {
@@ -169,7 +169,6 @@ public void onMessage(@NotNull WebSocket webSocket, @NotNull ByteString byteStri
break;
case LISTENING:
streamingMessage = GSON.fromJson(messageObject, ListeningMessage.class);
- LOGGER.debug("{}", streamingMessage);
// Remove all 'StreamingMessageType's that are no longer listened to and add new ones
List currentTypes = ((ListeningMessage) streamingMessage).getData().getStreams();
@@ -180,7 +179,6 @@ public void onMessage(@NotNull WebSocket webSocket, @NotNull ByteString byteStri
break;
case TRADE_UPDATES:
streamingMessage = GSON.fromJson(messageObject, TradeUpdateMessage.class);
- LOGGER.debug("{}", streamingMessage);
break;
default:
throw new UnsupportedOperationException();
From 24065531f43cdc8d97486226b9211f67de83970c Mon Sep 17 00:00:00 2001
From: Jacob Peterson <14127217+Petersoj@users.noreply.github.com>
Date: Wed, 22 Dec 2021 13:23:45 -0700
Subject: [PATCH 25/84] Update to 9.0.0
---
README.md | 4 ++--
build.gradle | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/README.md b/README.md
index 59df6b86..0b17443a 100644
--- a/README.md
+++ b/README.md
@@ -17,7 +17,7 @@ If you are using Gradle as your build tool, add the following dependency to your
```
dependencies {
- implementation group: 'net.jacobpeterson', name: 'alpaca-java', version: '8.3.3'
+ implementation group: 'net.jacobpeterson', name: 'alpaca-java', version: '9.0.0'
}
```
@@ -27,7 +27,7 @@ If you are using Maven as your build tool, add the following dependency to your
net.jacobpeterson
alpaca-java
- 8.3.3
+ 9.0.0
compile
```
diff --git a/build.gradle b/build.gradle
index 88519ffb..fcbdf568 100644
--- a/build.gradle
+++ b/build.gradle
@@ -30,7 +30,7 @@ tasks.getByName("generateJsonSchema2Pojo").enabled(false) // Disable default 'js
archivesBaseName = 'alpaca-java'
group = 'net.jacobpeterson'
-version = '8.3.3-SNAPSHOT'
+version = '9.0.0-SNAPSHOT'
repositories {
mavenCentral()
From 1da8305d39d994e8e97a3180c8fb3c9812171db8 Mon Sep 17 00:00:00 2001
From: Jacob Peterson <14127217+Petersoj@users.noreply.github.com>
Date: Mon, 27 Dec 2021 00:18:18 -0700
Subject: [PATCH 26/84] Add multi-symbol getBars method, make some inline
instantiations static
---
README.md | 5 +-
.../stock/historical/bar/enums/bar_feed.json | 8 ++
.../bar/multi_stock_bars_response.json | 14 +++
.../alpaca/rest/AlpacaClient.java | 3 +
.../rest/endpoint/assets/AssetsEndpoint.java | 5 +-
.../endpoint/calendar/CalendarEndpoint.java | 5 +-
.../stock/StockMarketDataEndpoint.java | 89 +++++++++++++++++--
.../rest/endpoint/orders/OrdersEndpoint.java | 13 ++-
.../endpoint/positions/PositionsEndpoint.java | 11 ++-
.../endpoint/watchlist/WatchlistEndpoint.java | 10 ++-
10 files changed, 144 insertions(+), 19 deletions(-)
create mode 100644 schema_json/endpoint/market_data/stock/historical/bar/enums/bar_feed.json
create mode 100644 schema_json/endpoint/market_data/stock/historical/bar/multi_stock_bars_response.json
diff --git a/README.md b/README.md
index 0b17443a..197064ec 100644
--- a/README.md
+++ b/README.md
@@ -134,7 +134,7 @@ Example usage:
```java
try {
// Get AAPL one hour, split-adjusted bars from 7/6/2021 market open
- // to 7/8/2021 market close and print them out
+ // to 7/8/2021 market close from the SIP feed and print them out
StockBarsResponse aaplBarsResponse = alpacaAPI.stockMarketData().getBars(
"AAPL",
ZonedDateTime.of(2021, 7, 6, 9, 30, 0, 0, ZoneId.of("America/New_York")),
@@ -143,7 +143,8 @@ try {
null,
1,
BarTimePeriod.HOUR,
- BarAdjustment.SPLIT);
+ BarAdjustment.SPLIT,
+ BarFeed.SIP);
aaplBarsResponse.getBars().forEach(System.out::println);
// Get AAPL first 10 trades on 7/8/2021 at market open and print them out
diff --git a/schema_json/endpoint/market_data/stock/historical/bar/enums/bar_feed.json b/schema_json/endpoint/market_data/stock/historical/bar/enums/bar_feed.json
new file mode 100644
index 00000000..87d8a1a4
--- /dev/null
+++ b/schema_json/endpoint/market_data/stock/historical/bar/enums/bar_feed.json
@@ -0,0 +1,8 @@
+{
+ "type": "string",
+ "title": "See Historical Stock Data.",
+ "enum": [
+ "IEX",
+ "SIP"
+ ]
+}
diff --git a/schema_json/endpoint/market_data/stock/historical/bar/multi_stock_bars_response.json b/schema_json/endpoint/market_data/stock/historical/bar/multi_stock_bars_response.json
new file mode 100644
index 00000000..65028159
--- /dev/null
+++ b/schema_json/endpoint/market_data/stock/historical/bar/multi_stock_bars_response.json
@@ -0,0 +1,14 @@
+{
+ "type": "object",
+ "title": "See Historical Stock Data.",
+ "properties": {
+ "bars": {
+ "existingJavaType": "java.util.HashMap>",
+ "title": "The {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.bar.StockBar}s of {@link java.lang.String} symbols {@link java.util.HashMap}."
+ },
+ "next_page_token": {
+ "existingJavaType": "java.lang.String",
+ "title": "Token that can be used to query the next page."
+ }
+ }
+}
diff --git a/src/main/java/net/jacobpeterson/alpaca/rest/AlpacaClient.java b/src/main/java/net/jacobpeterson/alpaca/rest/AlpacaClient.java
index 12cb6a6f..7fe5cc27 100644
--- a/src/main/java/net/jacobpeterson/alpaca/rest/AlpacaClient.java
+++ b/src/main/java/net/jacobpeterson/alpaca/rest/AlpacaClient.java
@@ -25,6 +25,9 @@
*/
public class AlpacaClient {
+ public static final Predicate STATUS_CODE_200_OR_207 = (code) -> code == 200 || code == 207;
+ public static final Predicate STATUS_CODE_200_OR_204 = (code) -> code == 200 || code == 204;
+
private final OkHttpClient okHttpClient;
private final HttpUrl baseURL;
private final Headers requestHeaders;
diff --git a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/assets/AssetsEndpoint.java b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/assets/AssetsEndpoint.java
index bfcfaffe..82763589 100644
--- a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/assets/AssetsEndpoint.java
+++ b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/assets/AssetsEndpoint.java
@@ -10,6 +10,7 @@
import okhttp3.HttpUrl;
import okhttp3.Request;
+import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
@@ -20,6 +21,8 @@
*/
public class AssetsEndpoint extends AlpacaEndpoint {
+ private static final Type ASSET_ARRAYLIST_TYPE = new TypeToken>() {}.getType();
+
/**
* Instantiates a new {@link AssetsEndpoint}.
*
@@ -54,7 +57,7 @@ public List get(AssetStatus assetStatus, AssetClass assetClass) throws Al
Request request = alpacaClient.requestBuilder(urlBuilder.build())
.get()
.build();
- return alpacaClient.requestObject(request, new TypeToken>() {}.getType());
+ return alpacaClient.requestObject(request, ASSET_ARRAYLIST_TYPE);
}
/**
diff --git a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/calendar/CalendarEndpoint.java b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/calendar/CalendarEndpoint.java
index 58ad41af..cc1cb5d2 100644
--- a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/calendar/CalendarEndpoint.java
+++ b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/calendar/CalendarEndpoint.java
@@ -8,6 +8,7 @@
import okhttp3.HttpUrl;
import okhttp3.Request;
+import java.lang.reflect.Type;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
@@ -18,6 +19,8 @@
*/
public class CalendarEndpoint extends AlpacaEndpoint {
+ private static final Type CALENDAR_ARRAYLIST_TYPE = new TypeToken>() {}.getType();
+
/**
* Instantiates a new {@link CalendarEndpoint}.
*
@@ -63,6 +66,6 @@ public List get(LocalDate start, LocalDate end) throws AlpacaClientExc
Request request = alpacaClient.requestBuilder(urlBuilder.build())
.get()
.build();
- return alpacaClient.requestObject(request, new TypeToken>() {}.getType());
+ return alpacaClient.requestObject(request, CALENDAR_ARRAYLIST_TYPE);
}
}
diff --git a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/marketdata/stock/StockMarketDataEndpoint.java b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/marketdata/stock/StockMarketDataEndpoint.java
index fe8a846e..d47b167d 100644
--- a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/marketdata/stock/StockMarketDataEndpoint.java
+++ b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/marketdata/stock/StockMarketDataEndpoint.java
@@ -2,9 +2,11 @@
import com.google.gson.reflect.TypeToken;
import net.jacobpeterson.alpaca.model.endpoint.marketdata.common.historical.bar.enums.BarTimePeriod;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.bar.MultiStockBarsResponse;
import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.bar.StockBar;
import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.bar.StockBarsResponse;
import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.bar.enums.BarAdjustment;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.bar.enums.BarFeed;
import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.quote.LatestStockQuoteResponse;
import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.quote.StockQuote;
import net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.quote.StockQuotesResponse;
@@ -19,6 +21,7 @@
import okhttp3.HttpUrl;
import okhttp3.Request;
+import java.lang.reflect.Type;
import java.time.ZonedDateTime;
import java.util.Collection;
import java.util.HashMap;
@@ -34,6 +37,9 @@
*/
public class StockMarketDataEndpoint extends AlpacaEndpoint {
+ private static final Type SNAPSHOTS_OF_STRINGS_HASHMAP_TYPE =
+ new TypeToken>() {}.getType();
+
/**
* Instantiates a new {@link StockMarketDataEndpoint}.
*
@@ -193,19 +199,21 @@ public LatestStockQuoteResponse getLatestQuote(String symbol) throws AlpacaClien
* @param barTimePeriodDuration the duration for the given barTimePeriod parameter. e.g. for
* 15Min bars, you would supply 15 for this parameter and
* {@link BarTimePeriod#MINUTE} for the barTimePeriod parameter.
- * @param barTimePeriod the {@link BarTimePeriod} e.g. for 15Min bars, you would supply {@link
+ * @param barTimePeriod the {@link BarTimePeriod}. e.g. for 15Min bars, you would supply {@link
* BarTimePeriod#MINUTE} for this parameter and 15 for the
* barTimePeriodDuration parameter.
* @param barAdjustment specifies the corporate action adjustment for the stocks. Default value is {@link
- * BarAdjustment#RAW}.
+ * BarAdjustment#RAW}
+ * @param barFeed defaults to {@link BarFeed#IEX} for Free users and {@link BarFeed#SIP} for users
+ * with an Unlimited subscription
*
* @return the {@link StockBarsResponse}
*
* @throws AlpacaClientException thrown for {@link AlpacaClientException}s
*/
public StockBarsResponse getBars(String symbol, ZonedDateTime start, ZonedDateTime end, Integer limit,
- String pageToken, int barTimePeriodDuration, BarTimePeriod barTimePeriod, BarAdjustment barAdjustment)
- throws AlpacaClientException {
+ String pageToken, int barTimePeriodDuration, BarTimePeriod barTimePeriod, BarAdjustment barAdjustment,
+ BarFeed barFeed) throws AlpacaClientException {
checkNotNull(symbol);
checkNotNull(start);
checkNotNull(end);
@@ -233,12 +241,83 @@ public StockBarsResponse getBars(String symbol, ZonedDateTime start, ZonedDateTi
urlBuilder.addQueryParameter("adjustment", barAdjustment.toString());
}
+ if (barFeed != null) {
+ urlBuilder.addQueryParameter("feed", barFeed.toString());
+ }
+
Request request = alpacaClient.requestBuilder(urlBuilder.build())
.get()
.build();
return alpacaClient.requestObject(request, StockBarsResponse.class);
}
+ /**
+ * Gets {@link StockBar} aggregate historical data for the requested securities.
+ *
+ * @param symbols a {@link Collection} of symbols to query for
+ * @param start filter data equal to or after this {@link ZonedDateTime}. Fractions of a second are
+ * not accepted.
+ * @param end filter data equal to or before this {@link ZonedDateTime}. Fractions of a second are
+ * not accepted.
+ * @param limit number of data points to return. Must be in range 1-10000, defaults to 1000 if
+ * null is given
+ * @param pageToken pagination token to continue from
+ * @param barTimePeriodDuration the duration for the given barTimePeriod parameter. e.g. for
+ * 15Min bars, you would supply 15 for this parameter and
+ * {@link BarTimePeriod#MINUTE} for the barTimePeriod parameter.
+ * @param barTimePeriod the {@link BarTimePeriod}. e.g. for 15Min bars, you would supply {@link
+ * BarTimePeriod#MINUTE} for this parameter and 15 for the
+ * barTimePeriodDuration parameter.
+ * @param barAdjustment specifies the corporate action adjustment for the stocks. Default value is {@link
+ * BarAdjustment#RAW}
+ * @param barFeed defaults to {@link BarFeed#IEX} for Free users and {@link BarFeed#SIP} for users
+ * with an Unlimited subscription
+ *
+ * @return the {@link MultiStockBarsResponse}
+ *
+ * @throws AlpacaClientException thrown for {@link AlpacaClientException}s
+ */
+ public MultiStockBarsResponse getBars(Collection symbols, ZonedDateTime start, ZonedDateTime end,
+ Integer limit, String pageToken, int barTimePeriodDuration, BarTimePeriod barTimePeriod,
+ BarAdjustment barAdjustment, BarFeed barFeed) throws AlpacaClientException {
+ checkNotNull(symbols);
+ checkArgument(!symbols.isEmpty(), "'symbols' cannot be empty!");
+ checkNotNull(start);
+ checkNotNull(end);
+ checkNotNull(barTimePeriod);
+
+ HttpUrl.Builder urlBuilder = alpacaClient.urlBuilder()
+ .addPathSegment(endpointPathSegment)
+ .addPathSegment("bars");
+
+ urlBuilder.addQueryParameter("symbols", String.join(",", symbols));
+ urlBuilder.addQueryParameter("start", FormatUtil.toRFC3339Format(start));
+ urlBuilder.addQueryParameter("end", FormatUtil.toRFC3339Format(end));
+
+ if (limit != null) {
+ urlBuilder.addQueryParameter("limit", limit.toString());
+ }
+
+ if (pageToken != null) {
+ urlBuilder.addQueryParameter("page_token", pageToken);
+ }
+
+ urlBuilder.addQueryParameter("timeframe", barTimePeriodDuration + barTimePeriod.toString());
+
+ if (barAdjustment != null) {
+ urlBuilder.addQueryParameter("adjustment", barAdjustment.toString());
+ }
+
+ if (barFeed != null) {
+ urlBuilder.addQueryParameter("feed", barFeed.toString());
+ }
+
+ Request request = alpacaClient.requestBuilder(urlBuilder.build())
+ .get()
+ .build();
+ return alpacaClient.requestObject(request, MultiStockBarsResponse.class);
+ }
+
/**
* Gets {@link Snapshot}s of the requested securities.
*
@@ -261,7 +340,7 @@ public Map getSnapshots(Collection symbols) throws Alp
Request request = alpacaClient.requestBuilder(urlBuilder.build())
.get()
.build();
- return alpacaClient.requestObject(request, new TypeToken>() {}.getType());
+ return alpacaClient.requestObject(request, SNAPSHOTS_OF_STRINGS_HASHMAP_TYPE);
}
/**
diff --git a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/orders/OrdersEndpoint.java b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/orders/OrdersEndpoint.java
index 90159bb4..c177db71 100644
--- a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/orders/OrdersEndpoint.java
+++ b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/orders/OrdersEndpoint.java
@@ -20,6 +20,7 @@
import okhttp3.HttpUrl;
import okhttp3.Request;
+import java.lang.reflect.Type;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
@@ -28,12 +29,17 @@
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Preconditions.checkState;
+import static net.jacobpeterson.alpaca.rest.AlpacaClient.STATUS_CODE_200_OR_204;
+import static net.jacobpeterson.alpaca.rest.AlpacaClient.STATUS_CODE_200_OR_207;
/**
* {@link AlpacaEndpoint} for Orders.
*/
public class OrdersEndpoint extends AlpacaEndpoint {
+ private static final Type ORDER_ARRAYLIST_TYPE = new TypeToken>() {}.getType();
+ private static final Type CANCELLED_ORDER_ARRAYLIST_TYPE = new TypeToken>() {}.getType();
+
/**
* Instantiates a new {@link OrdersEndpoint}.
*
@@ -97,7 +103,7 @@ public List get(CurrentOrderStatus status, Integer limit, ZonedDateTime a
Request request = alpacaClient.requestBuilder(urlBuilder.build())
.get()
.build();
- return alpacaClient.requestObject(request, new TypeToken>() {}.getType());
+ return alpacaClient.requestObject(request, ORDER_ARRAYLIST_TYPE);
}
/**
@@ -615,8 +621,7 @@ public List cancelAll() throws AlpacaClientException {
Request request = alpacaClient.requestBuilder(urlBuilder.build())
.delete()
.build();
- return alpacaClient.requestObject(request, (code) -> code == 200 || code == 207,
- new TypeToken>() {}.getType());
+ return alpacaClient.requestObject(request, STATUS_CODE_200_OR_207, CANCELLED_ORDER_ARRAYLIST_TYPE);
}
/**
@@ -637,6 +642,6 @@ public void cancel(String orderID) throws AlpacaClientException {
Request request = alpacaClient.requestBuilder(urlBuilder.build())
.delete()
.build();
- alpacaClient.requestVoid(request, (code) -> code == 200 || code == 204);
+ alpacaClient.requestVoid(request, STATUS_CODE_200_OR_204);
}
}
diff --git a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/positions/PositionsEndpoint.java b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/positions/PositionsEndpoint.java
index cccfdfb8..4ea3b096 100644
--- a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/positions/PositionsEndpoint.java
+++ b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/positions/PositionsEndpoint.java
@@ -11,16 +11,22 @@
import okhttp3.HttpUrl;
import okhttp3.Request;
+import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
import static com.google.common.base.Preconditions.checkNotNull;
+import static net.jacobpeterson.alpaca.rest.AlpacaClient.STATUS_CODE_200_OR_207;
/**
* {@link AlpacaEndpoint} for Positions.
*/
public class PositionsEndpoint extends AlpacaEndpoint {
+ private static final Type POSITION_ARRAYLIST_TYPE = new TypeToken>() {}.getType();
+ private static final Type CLOSED_POSITION_ORDER_ARRAYLIST_TYPE =
+ new TypeToken>() {}.getType();
+
/**
* Instantiates a new {@link PositionsEndpoint}.
*
@@ -43,7 +49,7 @@ public List get() throws AlpacaClientException {
Request request = alpacaClient.requestBuilder(urlBuilder.build())
.get()
.build();
- return alpacaClient.requestObject(request, new TypeToken>() {}.getType());
+ return alpacaClient.requestObject(request, POSITION_ARRAYLIST_TYPE);
}
/**
@@ -89,8 +95,7 @@ public List closeAll(Boolean cancelOrders) throws AlpacaClie
Request request = alpacaClient.requestBuilder(urlBuilder.build())
.delete()
.build();
- return alpacaClient.requestObject(request, (code) -> code == 200 || code == 207,
- new TypeToken>() {}.getType());
+ return alpacaClient.requestObject(request, STATUS_CODE_200_OR_207, CLOSED_POSITION_ORDER_ARRAYLIST_TYPE);
}
/**
diff --git a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/watchlist/WatchlistEndpoint.java b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/watchlist/WatchlistEndpoint.java
index 8f8762eb..605d651b 100644
--- a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/watchlist/WatchlistEndpoint.java
+++ b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/watchlist/WatchlistEndpoint.java
@@ -11,12 +11,14 @@
import okhttp3.HttpUrl;
import okhttp3.Request;
+import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
+import static net.jacobpeterson.alpaca.rest.AlpacaClient.STATUS_CODE_200_OR_204;
/**
* {@link AlpacaEndpoint} for Watchlists
@@ -24,6 +26,8 @@
*/
public class WatchlistEndpoint extends AlpacaEndpoint {
+ private static final Type WATCHLIST_ARRAYLIST_TYPE = new TypeToken>() {}.getType();
+
/**
* Instantiates a new {@link WatchlistEndpoint}.
*
@@ -46,7 +50,7 @@ public List get() throws AlpacaClientException {
Request request = alpacaClient.requestBuilder(urlBuilder.build())
.get()
.build();
- return alpacaClient.requestObject(request, new TypeToken>() {}.getType());
+ return alpacaClient.requestObject(request, WATCHLIST_ARRAYLIST_TYPE);
}
/**
@@ -183,7 +187,7 @@ public void delete(String watchlistID) throws AlpacaClientException {
Request request = alpacaClient.requestBuilder(urlBuilder.build())
.delete()
.build();
- alpacaClient.requestVoid(request, (code) -> code == 200 || code == 204);
+ alpacaClient.requestVoid(request, STATUS_CODE_200_OR_204);
}
/**
@@ -207,6 +211,6 @@ public Watchlist removeSymbol(String watchlistID, String symbol) throws AlpacaCl
Request request = alpacaClient.requestBuilder(urlBuilder.build())
.delete()
.build();
- return alpacaClient.requestObject(request, (code) -> code == 200 || code == 204, Watchlist.class);
+ return alpacaClient.requestObject(request, STATUS_CODE_200_OR_204, Watchlist.class);
}
}
From d3acf99dd783f2d4c2c34bcc354e83bad7fd5696 Mon Sep 17 00:00:00 2001
From: Jacob Peterson <14127217+Petersoj@users.noreply.github.com>
Date: Mon, 27 Dec 2021 00:18:57 -0700
Subject: [PATCH 27/84] Update to 9.1.0
---
README.md | 4 ++--
build.gradle | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/README.md b/README.md
index 197064ec..e1a3d562 100644
--- a/README.md
+++ b/README.md
@@ -17,7 +17,7 @@ If you are using Gradle as your build tool, add the following dependency to your
```
dependencies {
- implementation group: 'net.jacobpeterson', name: 'alpaca-java', version: '9.0.0'
+ implementation group: 'net.jacobpeterson', name: 'alpaca-java', version: '9.1.0'
}
```
@@ -27,7 +27,7 @@ If you are using Maven as your build tool, add the following dependency to your
net.jacobpeterson
alpaca-java
- 9.0.0
+ 9.1.0
compile
```
diff --git a/build.gradle b/build.gradle
index fcbdf568..e9552238 100644
--- a/build.gradle
+++ b/build.gradle
@@ -30,7 +30,7 @@ tasks.getByName("generateJsonSchema2Pojo").enabled(false) // Disable default 'js
archivesBaseName = 'alpaca-java'
group = 'net.jacobpeterson'
-version = '9.0.0-SNAPSHOT'
+version = '9.1.0-SNAPSHOT'
repositories {
mavenCentral()
From 0e15c393deef5e87198b223355324464510b1714 Mon Sep 17 00:00:00 2001
From: Jacob Peterson <14127217+Petersoj@users.noreply.github.com>
Date: Thu, 10 Mar 2022 22:13:39 -0700
Subject: [PATCH 28/84] Update SLF4j version, generateBuilders in POJOs, update
a Javadoc
---
README.md | 12 ++++++------
build.gradle | 7 +++++--
.../stock/historical/bar/stock_bars_response.json | 2 +-
3 files changed, 12 insertions(+), 9 deletions(-)
diff --git a/README.md b/README.md
index e1a3d562..396ee4cc 100644
--- a/README.md
+++ b/README.md
@@ -4,7 +4,7 @@
-
+
# Overview
@@ -51,7 +51,7 @@ For logging, this library uses [SLF4j](http://www.slf4j.org/) which serves as an
Note that the examples below are not exhaustive. Refer to the [Javadoc](https://javadoc.io/doc/net.jacobpeterson/alpaca-java) for all classes and method signatures.
## [`AlpacaAPI`](src/main/java/net/jacobpeterson/alpaca/AlpacaAPI.java)
-The [`AlpacaAPI`](src/main/java/net/jacobpeterson/alpaca/AlpacaAPI.java) class contains several instances of various [`AlpacaEndpoints`](src/main/java/net/jacobpeterson/alpaca/rest/endpoint/AlpacaEndpoint.java) and [`AlpacaWebsockets`](src/main/java/net/jacobpeterson/alpaca/websocket/AlpacaWebsocket.java) to interface with Alpaca. You will generally only need one instance of this class in your application. Note that many methods inside the various [`AlpacaEndpoints`](src/main/java/net/jacobpeterson/alpaca/rest/endpoint/AlpacaEndpoint.java) allow `null` to be passed in as a parameter if it is optional.
+The [`AlpacaAPI`](src/main/java/net/jacobpeterson/alpaca/AlpacaAPI.java) class contains several instances of various [`AlpacaEndpoints`](src/main/java/net/jacobpeterson/alpaca/rest/endpoint/AlpacaEndpoint.java) and [`AlpacaWebsockets`](src/main/java/net/jacobpeterson/alpaca/websocket/AlpacaWebsocket.java) to interface with Alpaca. You will generally only need one instance of this class in your application. Note that many methods inside the various [`AlpacaEndpoints`](src/main/java/net/jacobpeterson/alpaca/rest/endpoint/AlpacaEndpoint.java) allow `null` to be passed in as a parameter if it is optional.
The Alpaca API specification is located [here](https://docs.alpaca.markets/api-documentation/api-v2/) and the [`AlpacaAPI`](src/main/java/net/jacobpeterson/alpaca/AlpacaAPI.java) Javadoc is located [here](https://javadoc.io/doc/net.jacobpeterson/alpaca-java/latest/net/jacobpeterson/alpaca/AlpacaAPI.html).
@@ -409,10 +409,10 @@ StreamingListener streamingListener = (messageType, message) ->
System.out.printf("%s: %s\n", messageType.name(), message);
alpacaAPI.streaming().setListener(streamingListener);
-// Listen 'AuthorizationMessage' and 'ListeningMessage' messages that contain
+// Listen 'AuthorizationMessage' and 'ListeningMessage' messages that contain
// information about the stream's current state. Note that these are subscribed
// to before the websocket is connected since these messages usually are sent
-// upon websocket connection.
+// upon websocket connection.
alpacaAPI.streaming().streams(StreamingMessageType.AUTHORIZATION,
StreamingMessageType.LISTENING);
@@ -481,7 +481,7 @@ The usage is identical to the [`StockMarketDataWebsocket`](https://github.com/Pe
Example usage:
```java
-// The 'CryptoMarketDataWebsocket' setup is identical to the 'StockMarketDataWebsocket' setup
+// The 'CryptoMarketDataWebsocket' setup is identical to the 'StockMarketDataWebsocket' setup
// Listen to BTCUSD and ETHUSD trades and all bars via the wildcard operator ('*').
alpacaAPI.cryptoMarketDataStreaming().subscribe(
@@ -523,4 +523,4 @@ Note that the live tests will modify your account minimally. It's meant to test
# Contributing
Contributions are welcome!
-If you are creating a Pull Request, be sure to create a new branch in your forked repository for your feature or bug fix instead of committing directly to the `master` branch in your fork.
+If you are creating a Pull Request, be sure to create a new branch in your forked repository for your feature or bug fix instead of committing directly to the `master` branch in your fork.
diff --git a/build.gradle b/build.gradle
index e9552238..bfd19fbd 100644
--- a/build.gradle
+++ b/build.gradle
@@ -26,7 +26,6 @@ plugins {
}
apply plugin: 'jsonschema2pojo'
-tasks.getByName("generateJsonSchema2Pojo").enabled(false) // Disable default 'jsonSchema2Pojo' task
archivesBaseName = 'alpaca-java'
group = 'net.jacobpeterson'
@@ -38,7 +37,7 @@ repositories {
dependencies {
// Logging framework
- implementation group: 'org.slf4j', name: 'slf4j-api', version: '1.7.31'
+ implementation group: 'org.slf4j', name: 'slf4j-api', version: '1.7.32'
// This is a bridge for the Apache Jakarta Commons Logging library used in dependencies to actually use SLF4j instead
implementation group: 'org.slf4j', name: 'jcl-over-slf4j', version: '1.7.31'
@@ -178,6 +177,9 @@ processResources {
// START POJO generation
//
+// Disable default 'jsonSchema2Pojo' task
+tasks.getByName("generateJsonSchema2Pojo").enabled(false)
+
// The generated POJOs will be in a package structure analogous to the path in the 'schema_json/' directory
// See: https://github.com/joelittlejohn/jsonschema2pojo/wiki/Reference
@@ -240,6 +242,7 @@ jsonSchema2Pojo {
includeGetters = true
includeSetters = true
includeCopyConstructor = true
+ generateBuilders = true
}
//
diff --git a/schema_json/endpoint/market_data/stock/historical/bar/stock_bars_response.json b/schema_json/endpoint/market_data/stock/historical/bar/stock_bars_response.json
index b23db483..5add43d2 100644
--- a/schema_json/endpoint/market_data/stock/historical/bar/stock_bars_response.json
+++ b/schema_json/endpoint/market_data/stock/historical/bar/stock_bars_response.json
@@ -4,7 +4,7 @@
"properties": {
"bars": {
"existingJavaType": "java.util.ArrayList",
- "title": "The {@link java.util.ArrayList} of {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.bar.StockBar}s."
+ "title": "The {@link java.util.ArrayList} of {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.stock.historical.bar.StockBar}s. This may be null if no bars exist."
},
"symbol": {
"existingJavaType": "java.lang.String",
From 04545575ea122a1b5ace2077b02a94e9d1664b98 Mon Sep 17 00:00:00 2001
From: jessethouin
Date: Thu, 21 Apr 2022 16:18:38 -0400
Subject: [PATCH 29/84] Updated requestLimitOrder to take Double type quantity
for fractional limit orders.
---
.../alpaca/rest/endpoint/orders/OrdersEndpoint.java | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/orders/OrdersEndpoint.java b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/orders/OrdersEndpoint.java
index c177db71..3212bf75 100644
--- a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/orders/OrdersEndpoint.java
+++ b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/orders/OrdersEndpoint.java
@@ -285,9 +285,9 @@ public Order requestNotionalMarketOrder(String symbol, Double notional, OrderSid
*
* @throws AlpacaClientException thrown for {@link AlpacaClientException}s
*/
- public Order requestLimitOrder(String symbol, Integer quantity, OrderSide side, OrderTimeInForce timeInForce,
+ public Order requestLimitOrder(String symbol, Double quantity, OrderSide side, OrderTimeInForce timeInForce,
Double limitPrice, Boolean extendedHours) throws AlpacaClientException {
- return requestOrder(symbol, quantity.doubleValue(), null, side, OrderType.LIMIT, timeInForce, limitPrice,
+ return requestOrder(symbol, quantity, null, side, OrderType.LIMIT, timeInForce, limitPrice,
null, null, null, extendedHours, null, OrderClass.SIMPLE, null, null, null);
}
From aac872e095e3af3deafe3cdd46043ca5ba2c3cb1 Mon Sep 17 00:00:00 2001
From: Dario Arena
Date: Fri, 3 Jun 2022 13:24:38 +0200
Subject: [PATCH 30/84] #121 - use double type quantity in
PositionsEndpoint.close()
---
.../alpaca/rest/endpoint/positions/PositionsEndpoint.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/positions/PositionsEndpoint.java b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/positions/PositionsEndpoint.java
index 4ea3b096..fc8eda81 100644
--- a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/positions/PositionsEndpoint.java
+++ b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/positions/PositionsEndpoint.java
@@ -113,7 +113,7 @@ public List closeAll(Boolean cancelOrders) throws AlpacaClie
*
* @throws AlpacaClientException thrown for {@link AlpacaClientException}s
*/
- public Order close(String symbolOrAssetID, Integer quantity, Double percentage) throws AlpacaClientException {
+ public Order close(String symbolOrAssetID, Double quantity, Double percentage) throws AlpacaClientException {
checkNotNull(symbolOrAssetID);
HttpUrl.Builder urlBuilder = alpacaClient.urlBuilder()
From 43206bdc629be8a33bd28b4dc967d0f0ff63fa08 Mon Sep 17 00:00:00 2001
From: Jacob Peterson <14127217+Petersoj@users.noreply.github.com>
Date: Mon, 20 Jun 2022 09:37:36 -0600
Subject: [PATCH 31/84] Update dependency versions
---
build.gradle | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/build.gradle b/build.gradle
index bfd19fbd..80c4aa13 100644
--- a/build.gradle
+++ b/build.gradle
@@ -37,22 +37,22 @@ repositories {
dependencies {
// Logging framework
- implementation group: 'org.slf4j', name: 'slf4j-api', version: '1.7.32'
+ implementation group: 'org.slf4j', name: 'slf4j-api', version: '1.7.36'
// This is a bridge for the Apache Jakarta Commons Logging library used in dependencies to actually use SLF4j instead
- implementation group: 'org.slf4j', name: 'jcl-over-slf4j', version: '1.7.31'
+ implementation group: 'org.slf4j', name: 'jcl-over-slf4j', version: '1.7.36'
// Guava and GSON
- implementation group: 'com.google.guava', name: 'guava', version: '30.1.1-jre'
- implementation group: 'com.google.code.gson', name: 'gson', version: '2.8.7'
+ implementation group: 'com.google.guava', name: 'guava', version: '31.1-jre'
+ implementation group: 'com.google.code.gson', name: 'gson', version: '2.9.0'
// OkHttp
- implementation group: 'com.squareup.okhttp3', name: 'okhttp', version: '4.9.1'
+ implementation group: 'com.squareup.okhttp3', name: 'okhttp', version: '4.10.0'
implementation group: 'com.github.devcsrj', name: 'slf4j-okhttp3-logging-interceptor', version: '1.0.1'
// Unit test dependencies
- testImplementation group: 'org.slf4j', name: 'slf4j-simple', version: '1.7.30'
- testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter', version: '5.7.0'
- testImplementation group: 'org.mockito', name: 'mockito-core', version: '3.7.0'
+ testImplementation group: 'org.slf4j', name: 'slf4j-simple', version: '1.7.36'
+ testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter', version: '5.8.2'
+ testImplementation group: 'org.mockito', name: 'mockito-core', version: '4.6.1'
}
// Exclude any SLF4j-implementation transitive dependencies so users can use a logging framework of their choice
From 4b9970ed0d50df1e18c0980dcf44d3f8797fdc00 Mon Sep 17 00:00:00 2001
From: Jacob Peterson <14127217+Petersoj@users.noreply.github.com>
Date: Tue, 9 Aug 2022 18:09:04 -0600
Subject: [PATCH 32/84] Update to 9.1.1
---
README.md | 4 ++--
build.gradle | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/README.md b/README.md
index 396ee4cc..e3f98186 100644
--- a/README.md
+++ b/README.md
@@ -17,7 +17,7 @@ If you are using Gradle as your build tool, add the following dependency to your
```
dependencies {
- implementation group: 'net.jacobpeterson', name: 'alpaca-java', version: '9.1.0'
+ implementation group: 'net.jacobpeterson', name: 'alpaca-java', version: '9.1.1'
}
```
@@ -27,7 +27,7 @@ If you are using Maven as your build tool, add the following dependency to your
net.jacobpeterson
alpaca-java
- 9.1.0
+ 9.1.1
compile
```
diff --git a/build.gradle b/build.gradle
index 80c4aa13..692c91f3 100644
--- a/build.gradle
+++ b/build.gradle
@@ -29,7 +29,7 @@ apply plugin: 'jsonschema2pojo'
archivesBaseName = 'alpaca-java'
group = 'net.jacobpeterson'
-version = '9.1.0-SNAPSHOT'
+version = '9.1.1-SNAPSHOT'
repositories {
mavenCentral()
From f058227f9d6da94c0c70ddfc9d348d8ee76c004c Mon Sep 17 00:00:00 2001
From: Jacob Peterson <14127217+Petersoj@users.noreply.github.com>
Date: Tue, 16 Aug 2022 22:47:36 -0600
Subject: [PATCH 33/84] Fix FTX crypto exchange enum name
---
.../endpoint/market_data/crypto/common/enums/exchange.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/schema_json/endpoint/market_data/crypto/common/enums/exchange.json b/schema_json/endpoint/market_data/crypto/common/enums/exchange.json
index ff9d94e5..b17a92f8 100644
--- a/schema_json/endpoint/market_data/crypto/common/enums/exchange.json
+++ b/schema_json/endpoint/market_data/crypto/common/enums/exchange.json
@@ -3,7 +3,7 @@
"title": "See Crypto Data.",
"enum": [
"ERSX",
- "FTX",
+ "FTXU",
"CBSE"
],
"javaEnums": [
From becccd909f93a1bc58ca6326feae5e7bb56fe629 Mon Sep 17 00:00:00 2001
From: Jacob Peterson <14127217+Petersoj@users.noreply.github.com>
Date: Tue, 16 Aug 2022 22:48:12 -0600
Subject: [PATCH 34/84] Update to 9.1.2
---
README.md | 4 ++--
build.gradle | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/README.md b/README.md
index e3f98186..057e7f0e 100644
--- a/README.md
+++ b/README.md
@@ -17,7 +17,7 @@ If you are using Gradle as your build tool, add the following dependency to your
```
dependencies {
- implementation group: 'net.jacobpeterson', name: 'alpaca-java', version: '9.1.1'
+ implementation group: 'net.jacobpeterson', name: 'alpaca-java', version: '9.1.2'
}
```
@@ -27,7 +27,7 @@ If you are using Maven as your build tool, add the following dependency to your
net.jacobpeterson
alpaca-java
- 9.1.1
+ 9.1.2
compile
```
diff --git a/build.gradle b/build.gradle
index 692c91f3..bacd0079 100644
--- a/build.gradle
+++ b/build.gradle
@@ -29,7 +29,7 @@ apply plugin: 'jsonschema2pojo'
archivesBaseName = 'alpaca-java'
group = 'net.jacobpeterson'
-version = '9.1.1-SNAPSHOT'
+version = '9.1.2-SNAPSHOT'
repositories {
mavenCentral()
From aad1af49b522ebe0d683a0e8cbc8f65140b06755 Mon Sep 17 00:00:00 2001
From: Kurru
Date: Fri, 9 Dec 2022 12:10:46 -0800
Subject: [PATCH 35/84] Add nullable annotations on various fields/methods in
AlpacaClientException
---
.../alpaca/rest/AlpacaClientException.java | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/src/main/java/net/jacobpeterson/alpaca/rest/AlpacaClientException.java b/src/main/java/net/jacobpeterson/alpaca/rest/AlpacaClientException.java
index 2114b1e8..8e34795c 100644
--- a/src/main/java/net/jacobpeterson/alpaca/rest/AlpacaClientException.java
+++ b/src/main/java/net/jacobpeterson/alpaca/rest/AlpacaClientException.java
@@ -3,6 +3,9 @@
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
+
+import javax.annotation.Nullable;
+
import okhttp3.Response;
import okhttp3.ResponseBody;
@@ -11,10 +14,15 @@ public class AlpacaClientException extends Exception {
private static final String CODE_KEY = "code";
private static final String MESSAGE_KEY = "message";
+ @Nullable
private String responseBody;
+ @Nullable
private Integer responseStatusCode;
+ @Nullable
private String responseStatusMessage;
+ @Nullable
private Integer apiResponseCode;
+ @Nullable
private String apiResponseMessage;
/**
@@ -120,18 +128,22 @@ private String parseAPIErrorResponse() {
return messageBuilder.toString();
}
+ @Nullable
public Integer getResponseStatusCode() {
return responseStatusCode;
}
+ @Nullable
public String getResponseStatusMessage() {
return responseStatusMessage;
}
+ @Nullable
public Integer getAPIResponseCode() {
return apiResponseCode;
}
+ @Nullable
public String getAPIResponseMessage() {
return apiResponseMessage;
}
From 00c3bea9e44de3eb4cb687eb989add1f5191b95a Mon Sep 17 00:00:00 2001
From: Jacob Peterson <14127217+Petersoj@users.noreply.github.com>
Date: Tue, 13 Dec 2022 20:27:31 -0700
Subject: [PATCH 36/84] Remove redundant 'Nullable' annotation from private
fields
---
.../alpaca/rest/AlpacaClientException.java | 10 ++--------
1 file changed, 2 insertions(+), 8 deletions(-)
diff --git a/src/main/java/net/jacobpeterson/alpaca/rest/AlpacaClientException.java b/src/main/java/net/jacobpeterson/alpaca/rest/AlpacaClientException.java
index 8e34795c..4c902b05 100644
--- a/src/main/java/net/jacobpeterson/alpaca/rest/AlpacaClientException.java
+++ b/src/main/java/net/jacobpeterson/alpaca/rest/AlpacaClientException.java
@@ -3,26 +3,20 @@
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
-
-import javax.annotation.Nullable;
-
import okhttp3.Response;
import okhttp3.ResponseBody;
+import javax.annotation.Nullable;
+
public class AlpacaClientException extends Exception {
private static final String CODE_KEY = "code";
private static final String MESSAGE_KEY = "message";
- @Nullable
private String responseBody;
- @Nullable
private Integer responseStatusCode;
- @Nullable
private String responseStatusMessage;
- @Nullable
private Integer apiResponseCode;
- @Nullable
private String apiResponseMessage;
/**
From 32e6f149f9ba212ea207edda415aab17b6263204 Mon Sep 17 00:00:00 2001
From: Doug Graham
Date: Wed, 15 Mar 2023 08:28:19 -0500
Subject: [PATCH 37/84] This should fix Issue #131
---
schema_json/endpoint/positions/position.json | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/schema_json/endpoint/positions/position.json b/schema_json/endpoint/positions/position.json
index 7ebb619f..1217ef51 100644
--- a/schema_json/endpoint/positions/position.json
+++ b/schema_json/endpoint/positions/position.json
@@ -28,6 +28,11 @@
"javaName": "quantity",
"title": "The number of shares."
},
+ "qty_available": {
+ "existingJavaType": "java.lang.String",
+ "javaName": "quantity",
+ "title": "Total number of shares available minus open orders."
+ },
"side": {
"existingJavaType": "java.lang.String",
"title": "\"long\"."
From b171b097f2117f1cfbc71ba9f9725cdca1f8ba67 Mon Sep 17 00:00:00 2001
From: Doug Graham
Date: Wed, 15 Mar 2023 08:32:32 -0500
Subject: [PATCH 38/84] Needs a unique POJO name
---
schema_json/endpoint/positions/position.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/schema_json/endpoint/positions/position.json b/schema_json/endpoint/positions/position.json
index 1217ef51..8ae71b33 100644
--- a/schema_json/endpoint/positions/position.json
+++ b/schema_json/endpoint/positions/position.json
@@ -30,7 +30,7 @@
},
"qty_available": {
"existingJavaType": "java.lang.String",
- "javaName": "quantity",
+ "javaName": "quantityAvailable",
"title": "Total number of shares available minus open orders."
},
"side": {
From c23c6e7d05416f7f022d8f144872e2aeee89491e Mon Sep 17 00:00:00 2001
From: Jacob Peterson <14127217+Petersoj@users.noreply.github.com>
Date: Mon, 20 Mar 2023 09:13:29 -0600
Subject: [PATCH 39/84] Update to 9.1.3
---
README.md | 4 ++--
build.gradle | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/README.md b/README.md
index 057e7f0e..98b9acf0 100644
--- a/README.md
+++ b/README.md
@@ -17,7 +17,7 @@ If you are using Gradle as your build tool, add the following dependency to your
```
dependencies {
- implementation group: 'net.jacobpeterson', name: 'alpaca-java', version: '9.1.2'
+ implementation group: 'net.jacobpeterson', name: 'alpaca-java', version: '9.1.3'
}
```
@@ -27,7 +27,7 @@ If you are using Maven as your build tool, add the following dependency to your
net.jacobpeterson
alpaca-java
- 9.1.2
+ 9.1.3
compile
```
diff --git a/build.gradle b/build.gradle
index bacd0079..c7ec09bf 100644
--- a/build.gradle
+++ b/build.gradle
@@ -29,7 +29,7 @@ apply plugin: 'jsonschema2pojo'
archivesBaseName = 'alpaca-java'
group = 'net.jacobpeterson'
-version = '9.1.2-SNAPSHOT'
+version = '9.1.3-SNAPSHOT'
repositories {
mavenCentral()
From 60f2deb5a5d9a7dea89bdbec091cedd9c94f677a Mon Sep 17 00:00:00 2001
From: Balaji Kandavel
Date: Wed, 10 May 2023 23:09:49 -0400
Subject: [PATCH 40/84] Add week and month timeframes
https://alpaca.markets/docs/api-references/market-data-api/stock-pricing-data/historical/#bars
---
.../common/historical/bar/enums/bar_time_period.json | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/schema_json/endpoint/market_data/common/historical/bar/enums/bar_time_period.json b/schema_json/endpoint/market_data/common/historical/bar/enums/bar_time_period.json
index cccf0508..0305b24e 100644
--- a/schema_json/endpoint/market_data/common/historical/bar/enums/bar_time_period.json
+++ b/schema_json/endpoint/market_data/common/historical/bar/enums/bar_time_period.json
@@ -4,7 +4,9 @@
"enum": [
"Min",
"Hour",
- "Day"
+ "Day",
+ "Week",
+ "Month"
],
"javaEnums": [
{
@@ -15,6 +17,12 @@
},
{
"name": "DAY"
+ },
+ {
+ "name": "WEEK"
+ },
+ {
+ "name": "MONTH"
}
]
}
From a5638b3800e495866a7fde5d8a656bde2017712b Mon Sep 17 00:00:00 2001
From: Jacob Peterson <14127217+Petersoj@users.noreply.github.com>
Date: Fri, 26 May 2023 08:55:11 -0600
Subject: [PATCH 41/84] Update to 9.1.4
---
README.md | 4 ++--
build.gradle | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/README.md b/README.md
index 98b9acf0..a29ffc56 100644
--- a/README.md
+++ b/README.md
@@ -17,7 +17,7 @@ If you are using Gradle as your build tool, add the following dependency to your
```
dependencies {
- implementation group: 'net.jacobpeterson', name: 'alpaca-java', version: '9.1.3'
+ implementation group: 'net.jacobpeterson', name: 'alpaca-java', version: '9.1.4'
}
```
@@ -27,7 +27,7 @@ If you are using Maven as your build tool, add the following dependency to your
net.jacobpeterson
alpaca-java
- 9.1.3
+ 9.1.4
compile
```
diff --git a/build.gradle b/build.gradle
index c7ec09bf..588393d3 100644
--- a/build.gradle
+++ b/build.gradle
@@ -29,7 +29,7 @@ apply plugin: 'jsonschema2pojo'
archivesBaseName = 'alpaca-java'
group = 'net.jacobpeterson'
-version = '9.1.3-SNAPSHOT'
+version = '9.1.4-SNAPSHOT'
repositories {
mavenCentral()
From 1403348b3b74fe87c2769af2f187588631edda27 Mon Sep 17 00:00:00 2001
From: Jesse Thouin
Date: Fri, 7 Jul 2023 15:26:25 -0400
Subject: [PATCH 42/84] Updated to use v1beta3 version of Alpaca APIs.
---
.../crypto/common/enums/exchange.json | 20 ----
.../crypto/historical/bar/crypto_bar.json | 7 +-
.../historical/bar/crypto_bars_response.json | 8 +-
.../crypto/historical/quote/crypto_quote.json | 7 +-
.../quote/crypto_quotes_response.json | 8 +-
.../quote/latest_crypto_quote_response.json | 2 +-
.../crypto/historical/trade/crypto_trade.json | 7 +-
.../trade/crypto_trades_response.json | 8 +-
.../trade/latest_crypto_trade_response.json | 2 +-
.../crypto/historical/xbbo/xbbo.json | 41 -------
.../crypto/historical/xbbo/xbbo_response.json | 14 ---
.../realtime/bar/crypto_bar_message.json | 5 -
.../realtime/quote/crypto_quote_message.json | 5 -
.../realtime/trade/crypto_trade_message.json | 5 -
.../net/jacobpeterson/alpaca/AlpacaAPI.java | 4 +-
.../crypto/CryptoMarketDataEndpoint.java | 107 +++++-------------
.../crypto/CryptoMarketDataWebsocket.java | 4 +-
17 files changed, 42 insertions(+), 212 deletions(-)
delete mode 100644 schema_json/endpoint/market_data/crypto/common/enums/exchange.json
delete mode 100644 schema_json/endpoint/market_data/crypto/historical/xbbo/xbbo.json
delete mode 100644 schema_json/endpoint/market_data/crypto/historical/xbbo/xbbo_response.json
diff --git a/schema_json/endpoint/market_data/crypto/common/enums/exchange.json b/schema_json/endpoint/market_data/crypto/common/enums/exchange.json
deleted file mode 100644
index b17a92f8..00000000
--- a/schema_json/endpoint/market_data/crypto/common/enums/exchange.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "type": "string",
- "title": "See Crypto Data.",
- "enum": [
- "ERSX",
- "FTXU",
- "CBSE"
- ],
- "javaEnums": [
- {
- "name": "ERISX"
- },
- {
- "name": "FTX"
- },
- {
- "name": "COINBASE"
- }
- ]
-}
diff --git a/schema_json/endpoint/market_data/crypto/historical/bar/crypto_bar.json b/schema_json/endpoint/market_data/crypto/historical/bar/crypto_bar.json
index e23c3ec6..1fbf8b5d 100644
--- a/schema_json/endpoint/market_data/crypto/historical/bar/crypto_bar.json
+++ b/schema_json/endpoint/market_data/crypto/historical/bar/crypto_bar.json
@@ -3,13 +3,8 @@
"extends": {
"existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.common.historical.bar.Bar"
},
- "title": "See Historical Crypto Data.",
+ "title": "See Historical Crypto Data.",
"properties": {
- "x": {
- "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.common.enums.Exchange",
- "javaName": "exchange",
- "title": "Exchange."
- },
"v": {
"existingJavaType": "java.lang.Double",
"javaName": "volume",
diff --git a/schema_json/endpoint/market_data/crypto/historical/bar/crypto_bars_response.json b/schema_json/endpoint/market_data/crypto/historical/bar/crypto_bars_response.json
index 677e6633..8461d5cc 100644
--- a/schema_json/endpoint/market_data/crypto/historical/bar/crypto_bars_response.json
+++ b/schema_json/endpoint/market_data/crypto/historical/bar/crypto_bars_response.json
@@ -1,15 +1,11 @@
{
"type": "object",
- "title": "See Historical Crypto Data.",
+ "title": "See Historical Crypto Data.",
"properties": {
"bars": {
- "existingJavaType": "java.util.ArrayList",
+ "existingJavaType": "java.util.Map>",
"title": "The {@link java.util.ArrayList} of {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.bar.CryptoBar}s."
},
- "symbol": {
- "existingJavaType": "java.lang.String",
- "title": "Symbol that was queried."
- },
"next_page_token": {
"existingJavaType": "java.lang.String",
"title": "Token that can be used to query the next page."
diff --git a/schema_json/endpoint/market_data/crypto/historical/quote/crypto_quote.json b/schema_json/endpoint/market_data/crypto/historical/quote/crypto_quote.json
index 099df001..97e50e0b 100644
--- a/schema_json/endpoint/market_data/crypto/historical/quote/crypto_quote.json
+++ b/schema_json/endpoint/market_data/crypto/historical/quote/crypto_quote.json
@@ -3,13 +3,8 @@
"extends": {
"existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.common.historical.quote.Quote"
},
- "title": "See Historical Crypto Data.",
+ "title": "See Historical Crypto Data.",
"properties": {
- "x": {
- "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.common.enums.Exchange",
- "javaName": "exchange",
- "title": "Exchange."
- },
"as": {
"existingJavaType": "java.lang.Double",
"javaName": "askSize",
diff --git a/schema_json/endpoint/market_data/crypto/historical/quote/crypto_quotes_response.json b/schema_json/endpoint/market_data/crypto/historical/quote/crypto_quotes_response.json
index e8a67bfd..a5010f8c 100644
--- a/schema_json/endpoint/market_data/crypto/historical/quote/crypto_quotes_response.json
+++ b/schema_json/endpoint/market_data/crypto/historical/quote/crypto_quotes_response.json
@@ -1,15 +1,11 @@
{
"type": "object",
- "title": "See Historical Crypto Data.",
+ "title": "See Historical Crypto Data.",
"properties": {
"quotes": {
- "existingJavaType": "java.util.ArrayList",
+ "existingJavaType": "java.util.Map>",
"title": "The {@link java.util.ArrayList} of {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.quote.CryptoQuote}s."
},
- "symbol": {
- "existingJavaType": "java.lang.String",
- "title": "Symbol that was queried."
- },
"next_page_token": {
"existingJavaType": "java.lang.String",
"title": "Token that can be used to query the next page."
diff --git a/schema_json/endpoint/market_data/crypto/historical/quote/latest_crypto_quote_response.json b/schema_json/endpoint/market_data/crypto/historical/quote/latest_crypto_quote_response.json
index 64bf1d75..6db62c25 100644
--- a/schema_json/endpoint/market_data/crypto/historical/quote/latest_crypto_quote_response.json
+++ b/schema_json/endpoint/market_data/crypto/historical/quote/latest_crypto_quote_response.json
@@ -1,6 +1,6 @@
{
"type": "object",
- "title": "See Historical Crypto Data.",
+ "title": "See Historical Crypto Data.",
"properties": {
"symbol": {
"existingJavaType": "java.lang.String",
diff --git a/schema_json/endpoint/market_data/crypto/historical/trade/crypto_trade.json b/schema_json/endpoint/market_data/crypto/historical/trade/crypto_trade.json
index 0b0c1b53..8e5bf0da 100644
--- a/schema_json/endpoint/market_data/crypto/historical/trade/crypto_trade.json
+++ b/schema_json/endpoint/market_data/crypto/historical/trade/crypto_trade.json
@@ -3,13 +3,8 @@
"extends": {
"existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.common.historical.trade.Trade"
},
- "title": "See Historical Crypto Data.",
+ "title": "See Historical Crypto Data.",
"properties": {
- "x": {
- "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.common.enums.Exchange",
- "javaName": "exchange",
- "title": "Exchange where the trade happened."
- },
"s": {
"existingJavaType": "java.lang.Double",
"javaName": "size",
diff --git a/schema_json/endpoint/market_data/crypto/historical/trade/crypto_trades_response.json b/schema_json/endpoint/market_data/crypto/historical/trade/crypto_trades_response.json
index a512c775..0a007487 100644
--- a/schema_json/endpoint/market_data/crypto/historical/trade/crypto_trades_response.json
+++ b/schema_json/endpoint/market_data/crypto/historical/trade/crypto_trades_response.json
@@ -1,15 +1,11 @@
{
"type": "object",
- "title": "See Historical Crypto Data.",
+ "title": "See Historical Crypto Data.",
"properties": {
"trades": {
- "existingJavaType": "java.util.ArrayList",
+ "existingJavaType": "java.util.Map>",
"title": "The {@link java.util.ArrayList} of {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.trade.CryptoTrade}s."
},
- "symbol": {
- "existingJavaType": "java.lang.String",
- "title": "Symbol that was queried."
- },
"next_page_token": {
"existingJavaType": "java.lang.String",
"title": "Token that can be used to query the next page."
diff --git a/schema_json/endpoint/market_data/crypto/historical/trade/latest_crypto_trade_response.json b/schema_json/endpoint/market_data/crypto/historical/trade/latest_crypto_trade_response.json
index 512c6a18..b49e4ef7 100644
--- a/schema_json/endpoint/market_data/crypto/historical/trade/latest_crypto_trade_response.json
+++ b/schema_json/endpoint/market_data/crypto/historical/trade/latest_crypto_trade_response.json
@@ -1,6 +1,6 @@
{
"type": "object",
- "title": "See Historical Crypto Data.",
+ "title": "See Historical Crypto Data.",
"properties": {
"symbol": {
"existingJavaType": "java.lang.String",
diff --git a/schema_json/endpoint/market_data/crypto/historical/xbbo/xbbo.json b/schema_json/endpoint/market_data/crypto/historical/xbbo/xbbo.json
deleted file mode 100644
index d279722f..00000000
--- a/schema_json/endpoint/market_data/crypto/historical/xbbo/xbbo.json
+++ /dev/null
@@ -1,41 +0,0 @@
-{
- "type": "object",
- "title": "See Historical Crypto Data.",
- "properties": {
- "t": {
- "existingJavaType": "java.time.ZonedDateTime",
- "javaName": "timestamp",
- "title": "Timestamp with nanosecond precision."
- },
- "ax": {
- "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.common.enums.Exchange",
- "javaName": "askExchange",
- "title": "Ask Exchange."
- },
- "ap": {
- "existingJavaType": "java.lang.Double",
- "javaName": "askPrice",
- "title": "Ask price."
- },
- "as": {
- "existingJavaType": "java.lang.Double",
- "javaName": "askSize",
- "title": "Ask size."
- },
- "bx": {
- "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.common.enums.Exchange",
- "javaName": "bidExchange",
- "title": "Bid Exchange."
- },
- "bp": {
- "existingJavaType": "java.lang.Double",
- "javaName": "bidPrice",
- "title": "Bid price."
- },
- "bs": {
- "existingJavaType": "java.lang.Double",
- "javaName": "bidSize",
- "title": "Bid size."
- }
- }
-}
diff --git a/schema_json/endpoint/market_data/crypto/historical/xbbo/xbbo_response.json b/schema_json/endpoint/market_data/crypto/historical/xbbo/xbbo_response.json
deleted file mode 100644
index 2fdc8f28..00000000
--- a/schema_json/endpoint/market_data/crypto/historical/xbbo/xbbo_response.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
- "type": "object",
- "title": "See Historical Crypto Data.",
- "properties": {
- "symbol": {
- "existingJavaType": "java.lang.String",
- "title": "Symbol that was queried."
- },
- "xbbo": {
- "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.xbbo.Xbbo",
- "title": "The latest {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.xbbo.Xbbo}."
- }
- }
-}
diff --git a/schema_json/endpoint/market_data/crypto/realtime/bar/crypto_bar_message.json b/schema_json/endpoint/market_data/crypto/realtime/bar/crypto_bar_message.json
index 8886e9d4..82cfe47f 100644
--- a/schema_json/endpoint/market_data/crypto/realtime/bar/crypto_bar_message.json
+++ b/schema_json/endpoint/market_data/crypto/realtime/bar/crypto_bar_message.json
@@ -5,11 +5,6 @@
},
"title": "See Realtime Crypto Market Data.",
"properties": {
- "x": {
- "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.common.enums.Exchange",
- "javaName": "exchange",
- "title": "Exchange."
- },
"v": {
"existingJavaType": "java.lang.Double",
"javaName": "volume",
diff --git a/schema_json/endpoint/market_data/crypto/realtime/quote/crypto_quote_message.json b/schema_json/endpoint/market_data/crypto/realtime/quote/crypto_quote_message.json
index 9d9a2618..1eac99c5 100644
--- a/schema_json/endpoint/market_data/crypto/realtime/quote/crypto_quote_message.json
+++ b/schema_json/endpoint/market_data/crypto/realtime/quote/crypto_quote_message.json
@@ -5,11 +5,6 @@
},
"title": "See Realtime Crypto Market Data.",
"properties": {
- "x": {
- "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.common.enums.Exchange",
- "javaName": "exchange",
- "title": "Exchange."
- },
"as": {
"existingJavaType": "java.lang.Double",
"javaName": "askSize",
diff --git a/schema_json/endpoint/market_data/crypto/realtime/trade/crypto_trade_message.json b/schema_json/endpoint/market_data/crypto/realtime/trade/crypto_trade_message.json
index ec4f5227..09ee5a87 100644
--- a/schema_json/endpoint/market_data/crypto/realtime/trade/crypto_trade_message.json
+++ b/schema_json/endpoint/market_data/crypto/realtime/trade/crypto_trade_message.json
@@ -5,11 +5,6 @@
},
"title": "See Realtime Crypto Market Data.",
"properties": {
- "x": {
- "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.common.enums.Exchange",
- "javaName": "exchange",
- "title": "Exchange where the trade happened."
- },
"s": {
"existingJavaType": "java.lang.Double",
"javaName": "size",
diff --git a/src/main/java/net/jacobpeterson/alpaca/AlpacaAPI.java b/src/main/java/net/jacobpeterson/alpaca/AlpacaAPI.java
index 63980318..c71f496b 100644
--- a/src/main/java/net/jacobpeterson/alpaca/AlpacaAPI.java
+++ b/src/main/java/net/jacobpeterson/alpaca/AlpacaAPI.java
@@ -44,7 +44,7 @@ public class AlpacaAPI {
private static final Logger LOGGER = LoggerFactory.getLogger(AlpacaAPI.class);
private static final String VERSION_2_PATH_SEGMENT = "v2";
- private static final String VERSION_1_BETA_1_PATH_SEGMENT = "v1beta1";
+ private static final String VERSION_1_BETA_3_PATH_SEGMENT = "v1beta3";
private final OkHttpClient okHttpClient;
private final AlpacaClient brokerClient;
@@ -160,7 +160,7 @@ public AlpacaAPI(OkHttpClient okHttpClient, String keyID, String secretKey, Stri
if (oAuthToken == null) {
brokerClient = new AlpacaClient(okHttpClient, keyID, secretKey,
brokerHostSubdomain, VERSION_2_PATH_SEGMENT);
- cryptoDataClient = new AlpacaClient(okHttpClient, keyID, secretKey, "data", VERSION_1_BETA_1_PATH_SEGMENT);
+ cryptoDataClient = new AlpacaClient(okHttpClient, keyID, secretKey, "data", VERSION_1_BETA_3_PATH_SEGMENT);
stockDataClient = new AlpacaClient(okHttpClient, keyID, secretKey, "data", VERSION_2_PATH_SEGMENT);
} else {
brokerClient = new AlpacaClient(okHttpClient, oAuthToken, brokerHostSubdomain, VERSION_2_PATH_SEGMENT);
diff --git a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/marketdata/crypto/CryptoMarketDataEndpoint.java b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/marketdata/crypto/CryptoMarketDataEndpoint.java
index b3136b17..0062d3fe 100644
--- a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/marketdata/crypto/CryptoMarketDataEndpoint.java
+++ b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/marketdata/crypto/CryptoMarketDataEndpoint.java
@@ -1,7 +1,6 @@
package net.jacobpeterson.alpaca.rest.endpoint.marketdata.crypto;
import net.jacobpeterson.alpaca.model.endpoint.marketdata.common.historical.bar.enums.BarTimePeriod;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.common.enums.Exchange;
import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.bar.CryptoBar;
import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.bar.CryptoBarsResponse;
import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.quote.CryptoQuote;
@@ -10,7 +9,6 @@
import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.trade.CryptoTrade;
import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.trade.CryptoTradesResponse;
import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.trade.LatestCryptoTradeResponse;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.xbbo.XbboResponse;
import net.jacobpeterson.alpaca.rest.AlpacaClient;
import net.jacobpeterson.alpaca.rest.AlpacaClientException;
import net.jacobpeterson.alpaca.rest.endpoint.AlpacaEndpoint;
@@ -26,10 +24,11 @@
/**
* {@link AlpacaEndpoint} for
- * Historical
+ * Historical
* Crypto Market Data API.
*/
public class CryptoMarketDataEndpoint extends AlpacaEndpoint {
+ public static final String LOCALE = "us";
/**
* Instantiates a new {@link CryptoMarketDataEndpoint}.
@@ -43,8 +42,7 @@ public CryptoMarketDataEndpoint(AlpacaClient alpacaClient) {
/**
* Gets {@link CryptoTrade} historical data for the requested crypto symbol.
*
- * @param symbol the symbol to query for
- * @param exchanges a {@link Collection} of {@link Exchange}s to filter by. null for all exchanges.
+ * @param symbols a {@link Collection} of symbols to query for
* @param start filter data equal to or after this {@link ZonedDateTime}. Fractions of a second are not
* accepted. null for the current day in Central Time.
* @param end filter data equal to or before this {@link ZonedDateTime}. Fractions of a second are not
@@ -57,20 +55,16 @@ public CryptoMarketDataEndpoint(AlpacaClient alpacaClient) {
*
* @throws AlpacaClientException thrown for {@link AlpacaClientException}s
*/
- public CryptoTradesResponse getTrades(String symbol, Collection exchanges, ZonedDateTime start,
+ public CryptoTradesResponse getTrades(Collection symbols, ZonedDateTime start,
ZonedDateTime end, Integer limit, String pageToken) throws AlpacaClientException {
- checkNotNull(symbol);
+ checkNotNull(symbols);
HttpUrl.Builder urlBuilder = alpacaClient.urlBuilder()
.addPathSegment(endpointPathSegment)
- .addPathSegment(symbol)
+ .addPathSegment(LOCALE)
.addPathSegment("trades");
- if (exchanges != null) {
- urlBuilder.addQueryParameter("exchanges", exchanges.stream()
- .map(Exchange::value)
- .collect(Collectors.joining(",")));
- }
+ urlBuilder.addQueryParameter("symbols", String.join(",", symbols));
if (start != null) {
urlBuilder.addQueryParameter("start", FormatUtil.toRFC3339Format(start));
@@ -97,24 +91,22 @@ public CryptoTradesResponse getTrades(String symbol, Collection exchan
/**
* Gets the latest {@link CryptoTrade} for the requested security.
*
- * @param symbol the symbol to query for
- * @param exchange the {@link Exchange} to filter the latest {@link CryptoTrade} by.
+ * @param symbols a {@link Collection} of symbols to query for
*
* @return the {@link LatestCryptoTradeResponse}
*
* @throws AlpacaClientException thrown for {@link AlpacaClientException}s
*/
- public LatestCryptoTradeResponse getLatestTrade(String symbol, Exchange exchange) throws AlpacaClientException {
- checkNotNull(symbol);
- checkNotNull(exchange);
+ public LatestCryptoTradeResponse getLatestTrade(Collection symbols) throws AlpacaClientException {
+ checkNotNull(symbols);
HttpUrl.Builder urlBuilder = alpacaClient.urlBuilder()
.addPathSegment(endpointPathSegment)
- .addPathSegment(symbol)
+ .addPathSegment(LOCALE)
.addPathSegment("trades")
.addPathSegment("latest");
- urlBuilder.addQueryParameter("exchange", exchange.toString());
+ urlBuilder.addQueryParameter("symbols", String.join(",", symbols));
Request request = alpacaClient.requestBuilder(urlBuilder.build())
.get()
@@ -125,8 +117,7 @@ public LatestCryptoTradeResponse getLatestTrade(String symbol, Exchange exchange
/**
* Gets {@link CryptoQuote} historical data for the requested crypto symbol.
*
- * @param symbol the symbol to query for
- * @param exchanges a {@link Collection} of {@link Exchange}s to filter by. null for all exchanges.
+ * @param symbols a {@link Collection} of symbols to query for
* @param start filter data equal to or after this {@link ZonedDateTime}. Fractions of a second are not
* accepted. null for the current day in Central Time.
* @param end filter data equal to or before this {@link ZonedDateTime}. Fractions of a second are not
@@ -139,20 +130,16 @@ public LatestCryptoTradeResponse getLatestTrade(String symbol, Exchange exchange
*
* @throws AlpacaClientException thrown for {@link AlpacaClientException}s
*/
- public CryptoQuotesResponse getQuotes(String symbol, Collection exchanges, ZonedDateTime start,
+ public CryptoQuotesResponse getQuotes(Collection symbols, ZonedDateTime start,
ZonedDateTime end, Integer limit, String pageToken) throws AlpacaClientException {
- checkNotNull(symbol);
+ checkNotNull(symbols);
HttpUrl.Builder urlBuilder = alpacaClient.urlBuilder()
.addPathSegment(endpointPathSegment)
- .addPathSegment(symbol)
+ .addPathSegment(LOCALE)
.addPathSegment("quotes");
- if (exchanges != null) {
- urlBuilder.addQueryParameter("exchanges", exchanges.stream()
- .map(Exchange::value)
- .collect(Collectors.joining(",")));
- }
+ urlBuilder.addQueryParameter("symbols", String.join(",", symbols));
if (start != null) {
urlBuilder.addQueryParameter("start", FormatUtil.toRFC3339Format(start));
@@ -179,24 +166,22 @@ public CryptoQuotesResponse getQuotes(String symbol, Collection exchan
/**
* Gets the latest {@link CryptoQuote} for the requested security.
*
- * @param symbol the symbol to query for
- * @param exchange the {@link Exchange} to filter the latest {@link CryptoQuote} by.
+ * @param symbols a {@link Collection} of symbols to query for
*
* @return the {@link LatestCryptoQuoteResponse}
*
* @throws AlpacaClientException thrown for {@link AlpacaClientException}s
*/
- public LatestCryptoQuoteResponse getLatestQuote(String symbol, Exchange exchange) throws AlpacaClientException {
- checkNotNull(symbol);
- checkNotNull(exchange);
+ public LatestCryptoQuoteResponse getLatestQuote(Collection symbols) throws AlpacaClientException {
+ checkNotNull(symbols);
HttpUrl.Builder urlBuilder = alpacaClient.urlBuilder()
.addPathSegment(endpointPathSegment)
- .addPathSegment(symbol)
+ .addPathSegment(LOCALE)
.addPathSegment("quotes")
.addPathSegment("latest");
- urlBuilder.addQueryParameter("exchange", exchange.toString());
+ urlBuilder.addQueryParameter("symbols", String.join(",", symbols));
Request request = alpacaClient.requestBuilder(urlBuilder.build())
.get()
@@ -207,9 +192,7 @@ public LatestCryptoQuoteResponse getLatestQuote(String symbol, Exchange exchange
/**
* Gets {@link CryptoBar} aggregate historical data for the requested crypto.
*
- * @param symbol the symbol to query for
- * @param exchanges a {@link Collection} of {@link Exchange}s to filter by. null for all
- * exchanges.
+ * @param symbols a {@link Collection} of symbols to query for
* @param start filter data equal to or after this {@link ZonedDateTime}. Fractions of a second are
* not accepted. null for now.
* @param limit number of data points to return. Must be in range 1-10000, defaults to 1000 if
@@ -226,21 +209,17 @@ public LatestCryptoQuoteResponse getLatestQuote(String symbol, Exchange exchange
*
* @throws AlpacaClientException thrown for {@link AlpacaClientException}s
*/
- public CryptoBarsResponse getBars(String symbol, Collection exchanges, ZonedDateTime start, Integer limit,
+ public CryptoBarsResponse getBars(Collection symbols, ZonedDateTime start, Integer limit,
String pageToken, int barTimePeriodDuration, BarTimePeriod barTimePeriod) throws AlpacaClientException {
- checkNotNull(symbol);
+ checkNotNull(symbols);
checkNotNull(barTimePeriod);
HttpUrl.Builder urlBuilder = alpacaClient.urlBuilder()
.addPathSegment(endpointPathSegment)
- .addPathSegment(symbol)
+ .addPathSegment(LOCALE)
.addPathSegment("bars");
- if (exchanges != null) {
- urlBuilder.addQueryParameter("exchanges", exchanges.stream()
- .map(Exchange::value)
- .collect(Collectors.joining(",")));
- }
+ urlBuilder.addQueryParameter("symbols", String.join(",", symbols));
if (start != null) {
urlBuilder.addQueryParameter("start", FormatUtil.toRFC3339Format(start));
@@ -261,36 +240,4 @@ public CryptoBarsResponse getBars(String symbol, Collection exchanges,
.build();
return alpacaClient.requestObject(request, CryptoBarsResponse.class);
}
-
- /**
- * Returns the XBBO for a crypto symbol that calculates the Best Bid and Offer across multiple exchanges.
- *
- * @param symbol the symbol to query for
- * @param exchanges a {@link Collection} of {@link Exchange}s to filter by. If null, then only the
- * exchanges that can be traded on Alpaca are included in the calculation.
- *
- * @return the {@link XbboResponse}
- *
- * @throws AlpacaClientException thrown for {@link AlpacaClientException}s
- */
- public XbboResponse getXBBO(String symbol, Collection exchanges) throws AlpacaClientException {
- checkNotNull(symbol);
-
- HttpUrl.Builder urlBuilder = alpacaClient.urlBuilder()
- .addPathSegment(endpointPathSegment)
- .addPathSegment(symbol)
- .addPathSegment("xbbo")
- .addPathSegment("latest");
-
- if (exchanges != null) {
- urlBuilder.addQueryParameter("exchanges", exchanges.stream()
- .map(Exchange::value)
- .collect(Collectors.joining(",")));
- }
-
- Request request = alpacaClient.requestBuilder(urlBuilder.build())
- .get()
- .build();
- return alpacaClient.requestObject(request, XbboResponse.class);
- }
}
diff --git a/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/crypto/CryptoMarketDataWebsocket.java b/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/crypto/CryptoMarketDataWebsocket.java
index fa61d1ec..27168332 100644
--- a/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/crypto/CryptoMarketDataWebsocket.java
+++ b/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/crypto/CryptoMarketDataWebsocket.java
@@ -8,7 +8,7 @@
/**
* {@link CryptoMarketDataWebsocket} is a {@link MarketDataWebsocket} for
- * Realtime
+ * Realtime
* Crypto Market Data
*/
public class CryptoMarketDataWebsocket extends MarketDataWebsocket {
@@ -21,7 +21,7 @@ public class CryptoMarketDataWebsocket extends MarketDataWebsocket {
* @param secretKey the secret key
*/
public CryptoMarketDataWebsocket(OkHttpClient okHttpClient, String keyID, String secretKey) {
- super(okHttpClient, "v1beta1/crypto", "Crypto", keyID, secretKey, CryptoTradeMessage.class,
+ super(okHttpClient, "v1beta3/crypto/us", "Crypto", keyID, secretKey, CryptoTradeMessage.class,
CryptoQuoteMessage.class, CryptoBarMessage.class);
}
}
From 4aab2d5f98adde2957f4bf3845426d20ff16d098 Mon Sep 17 00:00:00 2001
From: Jesse Thouin
Date: Tue, 11 Jul 2023 11:39:41 -0400
Subject: [PATCH 43/84] Further updates to match v1beta3 crypto APIs.
---
.../bar/latest_crypto_bars_response.json | 10 ++
.../orderbook/crypto_orderbook.json | 21 +++
.../orderbook/crypto_orderbook_entry.json | 16 ++
.../latest_crypto_orderbooks_response.json | 10 ++
.../quote/latest_crypto_quote_response.json | 14 --
.../quote/latest_crypto_quotes_response.json | 10 ++
.../historical/snapshot/crypto_snapshot.json | 31 ++++
.../snapshot/crypto_snapshots_response.json | 10 ++
.../trade/latest_crypto_trade_response.json | 14 --
.../trade/latest_crypto_trades_response.json | 10 ++
.../crypto/CryptoMarketDataEndpoint.java | 147 +++++++++++++++---
11 files changed, 247 insertions(+), 46 deletions(-)
create mode 100644 schema_json/endpoint/market_data/crypto/historical/bar/latest_crypto_bars_response.json
create mode 100644 schema_json/endpoint/market_data/crypto/historical/orderbook/crypto_orderbook.json
create mode 100644 schema_json/endpoint/market_data/crypto/historical/orderbook/crypto_orderbook_entry.json
create mode 100644 schema_json/endpoint/market_data/crypto/historical/orderbook/latest_crypto_orderbooks_response.json
delete mode 100644 schema_json/endpoint/market_data/crypto/historical/quote/latest_crypto_quote_response.json
create mode 100644 schema_json/endpoint/market_data/crypto/historical/quote/latest_crypto_quotes_response.json
create mode 100644 schema_json/endpoint/market_data/crypto/historical/snapshot/crypto_snapshot.json
create mode 100644 schema_json/endpoint/market_data/crypto/historical/snapshot/crypto_snapshots_response.json
delete mode 100644 schema_json/endpoint/market_data/crypto/historical/trade/latest_crypto_trade_response.json
create mode 100644 schema_json/endpoint/market_data/crypto/historical/trade/latest_crypto_trades_response.json
diff --git a/schema_json/endpoint/market_data/crypto/historical/bar/latest_crypto_bars_response.json b/schema_json/endpoint/market_data/crypto/historical/bar/latest_crypto_bars_response.json
new file mode 100644
index 00000000..b502ddc3
--- /dev/null
+++ b/schema_json/endpoint/market_data/crypto/historical/bar/latest_crypto_bars_response.json
@@ -0,0 +1,10 @@
+{
+ "type": "object",
+ "title": "See Historical Crypto Data.",
+ "properties": {
+ "bars": {
+ "existingJavaType": "java.util.Map",
+ "title": "The {@link java.util.Map} of {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.bar.CryptoBar}s."
+ }
+ }
+}
diff --git a/schema_json/endpoint/market_data/crypto/historical/orderbook/crypto_orderbook.json b/schema_json/endpoint/market_data/crypto/historical/orderbook/crypto_orderbook.json
new file mode 100644
index 00000000..04409010
--- /dev/null
+++ b/schema_json/endpoint/market_data/crypto/historical/orderbook/crypto_orderbook.json
@@ -0,0 +1,21 @@
+{
+ "type": "object",
+ "title": "See Latest Orderbook.",
+ "properties": {
+ "t": {
+ "existingJavaType": "java.time.ZonedDateTime",
+ "javaName": "timestamp",
+ "title": "Timestamp in RFC-3339 format with nanosecond precision."
+ },
+ "b": {
+ "existingJavaType": "java.util.ArrayList",
+ "javaName": "bidSide",
+ "title": "An {@link java.util.ArrayList} of {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.orderbook.CryptoOrderbookEntry}s for the buy/bid side."
+ },
+ "a": {
+ "existingJavaType": "java.util.ArrayList",
+ "javaName": "askSide",
+ "title": "An {@link java.util.ArrayList} of {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.orderbook.CryptoOrderbookEntry}s for the ask/sell side."
+ }
+ }
+}
diff --git a/schema_json/endpoint/market_data/crypto/historical/orderbook/crypto_orderbook_entry.json b/schema_json/endpoint/market_data/crypto/historical/orderbook/crypto_orderbook_entry.json
new file mode 100644
index 00000000..5387ecc7
--- /dev/null
+++ b/schema_json/endpoint/market_data/crypto/historical/orderbook/crypto_orderbook_entry.json
@@ -0,0 +1,16 @@
+{
+ "type": "object",
+ "title": "See Latest Orderbook.",
+ "properties": {
+ "p": {
+ "existingJavaType": "java.lang.Double",
+ "javaName": "price",
+ "title": "Price."
+ },
+ "s": {
+ "existingJavaType": "java.lang.Double",
+ "javaName": "size",
+ "title": "Size."
+ }
+ }
+}
diff --git a/schema_json/endpoint/market_data/crypto/historical/orderbook/latest_crypto_orderbooks_response.json b/schema_json/endpoint/market_data/crypto/historical/orderbook/latest_crypto_orderbooks_response.json
new file mode 100644
index 00000000..31c605d3
--- /dev/null
+++ b/schema_json/endpoint/market_data/crypto/historical/orderbook/latest_crypto_orderbooks_response.json
@@ -0,0 +1,10 @@
+{
+ "type": "object",
+ "title": "See Historical Crypto Data.",
+ "properties": {
+ "orderbooks": {
+ "existingJavaType": "java.util.Map",
+ "title": "The {@link java.util.Map} of {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.orderbook.CryptoOrderbook}s."
+ }
+ }
+}
diff --git a/schema_json/endpoint/market_data/crypto/historical/quote/latest_crypto_quote_response.json b/schema_json/endpoint/market_data/crypto/historical/quote/latest_crypto_quote_response.json
deleted file mode 100644
index 6db62c25..00000000
--- a/schema_json/endpoint/market_data/crypto/historical/quote/latest_crypto_quote_response.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
- "type": "object",
- "title": "See Historical Crypto Data.",
- "properties": {
- "symbol": {
- "existingJavaType": "java.lang.String",
- "title": "Symbol that was queried."
- },
- "quote": {
- "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.quote.CryptoQuote",
- "title": "The latest {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.quote.CryptoQuote}."
- }
- }
-}
diff --git a/schema_json/endpoint/market_data/crypto/historical/quote/latest_crypto_quotes_response.json b/schema_json/endpoint/market_data/crypto/historical/quote/latest_crypto_quotes_response.json
new file mode 100644
index 00000000..995ccd02
--- /dev/null
+++ b/schema_json/endpoint/market_data/crypto/historical/quote/latest_crypto_quotes_response.json
@@ -0,0 +1,10 @@
+{
+ "type": "object",
+ "title": "See Historical Crypto Data.",
+ "properties": {
+ "quotes": {
+ "existingJavaType": "java.util.Map",
+ "title": "The {@link java.util.Map} of {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.quote.CryptoQuote}s."
+ }
+ }
+}
diff --git a/schema_json/endpoint/market_data/crypto/historical/snapshot/crypto_snapshot.json b/schema_json/endpoint/market_data/crypto/historical/snapshot/crypto_snapshot.json
new file mode 100644
index 00000000..9ff6ab0d
--- /dev/null
+++ b/schema_json/endpoint/market_data/crypto/historical/snapshot/crypto_snapshot.json
@@ -0,0 +1,31 @@
+{
+ "type": "object",
+ "title": "See Snapshots.",
+ "properties": {
+ "dailyBar": {
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.bar.CryptoBar",
+ "javaName": "dailyBar",
+ "title": "OHLC aggregate of all the trades in a given interval."
+ },
+ "latestQuote": {
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.quote.CryptoQuote",
+ "javaName": "latestQuote",
+ "title": "The best bid and ask information for a given security."
+ },
+ "latestTrade": {
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.trade.CryptoTrade",
+ "javaName": "latestTrade",
+ "title": "A crypto trade"
+ },
+ "minuteBar": {
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.bar.CryptoBar",
+ "javaName": "minuteBar",
+ "title": "OHLC aggregate of all the trades in a given interval."
+ },
+ "prevDailyBar": {
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.bar.CryptoBar",
+ "javaName": "prevDailyBar",
+ "title": "OHLC aggregate of all the trades in a given interval."
+ }
+ }
+}
diff --git a/schema_json/endpoint/market_data/crypto/historical/snapshot/crypto_snapshots_response.json b/schema_json/endpoint/market_data/crypto/historical/snapshot/crypto_snapshots_response.json
new file mode 100644
index 00000000..3ec3f3b8
--- /dev/null
+++ b/schema_json/endpoint/market_data/crypto/historical/snapshot/crypto_snapshots_response.json
@@ -0,0 +1,10 @@
+{
+ "type": "object",
+ "title": "See Historical Crypto Data.",
+ "properties": {
+ "snapshots": {
+ "existingJavaType": "java.util.Map",
+ "title": "The {@link java.util.Map} of {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.snapshot.CryptoSnapshot}s."
+ }
+ }
+}
diff --git a/schema_json/endpoint/market_data/crypto/historical/trade/latest_crypto_trade_response.json b/schema_json/endpoint/market_data/crypto/historical/trade/latest_crypto_trade_response.json
deleted file mode 100644
index b49e4ef7..00000000
--- a/schema_json/endpoint/market_data/crypto/historical/trade/latest_crypto_trade_response.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
- "type": "object",
- "title": "See Historical Crypto Data.",
- "properties": {
- "symbol": {
- "existingJavaType": "java.lang.String",
- "title": "Symbol that was queried."
- },
- "trade": {
- "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.trade.CryptoTrade",
- "title": "The latest {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.trade.CryptoTrade}."
- }
- }
-}
diff --git a/schema_json/endpoint/market_data/crypto/historical/trade/latest_crypto_trades_response.json b/schema_json/endpoint/market_data/crypto/historical/trade/latest_crypto_trades_response.json
new file mode 100644
index 00000000..4e6749c2
--- /dev/null
+++ b/schema_json/endpoint/market_data/crypto/historical/trade/latest_crypto_trades_response.json
@@ -0,0 +1,10 @@
+{
+ "type": "object",
+ "title": "See Historical Crypto Data.",
+ "properties": {
+ "trades": {
+ "existingJavaType": "java.util.Map",
+ "title": "The {@link java.util.Map} of {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.trade.CryptoTrade}s."
+ }
+ }
+}
diff --git a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/marketdata/crypto/CryptoMarketDataEndpoint.java b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/marketdata/crypto/CryptoMarketDataEndpoint.java
index 0062d3fe..bebe7a87 100644
--- a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/marketdata/crypto/CryptoMarketDataEndpoint.java
+++ b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/marketdata/crypto/CryptoMarketDataEndpoint.java
@@ -3,12 +3,17 @@
import net.jacobpeterson.alpaca.model.endpoint.marketdata.common.historical.bar.enums.BarTimePeriod;
import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.bar.CryptoBar;
import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.bar.CryptoBarsResponse;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.bar.LatestCryptoBarsResponse;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.orderbook.CryptoOrderbook;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.orderbook.LatestCryptoOrderbooksResponse;
import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.quote.CryptoQuote;
import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.quote.CryptoQuotesResponse;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.quote.LatestCryptoQuoteResponse;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.quote.LatestCryptoQuotesResponse;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.snapshot.CryptoSnapshot;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.snapshot.CryptoSnapshotsResponse;
import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.trade.CryptoTrade;
import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.trade.CryptoTradesResponse;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.trade.LatestCryptoTradeResponse;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.trade.LatestCryptoTradesResponse;
import net.jacobpeterson.alpaca.rest.AlpacaClient;
import net.jacobpeterson.alpaca.rest.AlpacaClientException;
import net.jacobpeterson.alpaca.rest.endpoint.AlpacaEndpoint;
@@ -18,7 +23,6 @@
import java.time.ZonedDateTime;
import java.util.Collection;
-import java.util.stream.Collectors;
import static com.google.common.base.Preconditions.checkNotNull;
@@ -40,7 +44,7 @@ public CryptoMarketDataEndpoint(AlpacaClient alpacaClient) {
}
/**
- * Gets {@link CryptoTrade} historical data for the requested crypto symbol.
+ * Gets {@link CryptoTrade} historical data for the requested crypto symbols.
*
* @param symbols a {@link Collection} of symbols to query for
* @param start filter data equal to or after this {@link ZonedDateTime}. Fractions of a second are not
@@ -58,6 +62,9 @@ public CryptoMarketDataEndpoint(AlpacaClient alpacaClient) {
public CryptoTradesResponse getTrades(Collection symbols, ZonedDateTime start,
ZonedDateTime end, Integer limit, String pageToken) throws AlpacaClientException {
checkNotNull(symbols);
+ if (symbols.isEmpty()) {
+ throw new AlpacaClientException("Collection symbols must not be empty.");
+ }
HttpUrl.Builder urlBuilder = alpacaClient.urlBuilder()
.addPathSegment(endpointPathSegment)
@@ -89,33 +96,65 @@ public CryptoTradesResponse getTrades(Collection symbols, ZonedDateTime
}
/**
- * Gets the latest {@link CryptoTrade} for the requested security.
+ * Gets the latest {@link CryptoTrade}s for the requested securities.
+ *
+ * @param symbols a {@link Collection} of symbols to query for
+ *
+ * @return the {@link LatestCryptoTradesResponse}
+ *
+ * @throws AlpacaClientException thrown for {@link AlpacaClientException}s
+ */
+ public LatestCryptoTradesResponse getLatestTrades(Collection symbols) throws AlpacaClientException {
+ checkNotNull(symbols);
+ if (symbols.isEmpty()) {
+ throw new AlpacaClientException("Collection symbols must not be empty.");
+ }
+
+ HttpUrl.Builder urlBuilder = alpacaClient.urlBuilder()
+ .addPathSegment(endpointPathSegment)
+ .addPathSegment(LOCALE)
+ .addPathSegment("latest")
+ .addPathSegment("trades");
+
+ urlBuilder.addQueryParameter("symbols", String.join(",", symbols));
+
+ Request request = alpacaClient.requestBuilder(urlBuilder.build())
+ .get()
+ .build();
+ return alpacaClient.requestObject(request, LatestCryptoTradesResponse.class);
+ }
+
+ /**
+ * Gets the latest {@link CryptoBar}s for the requested securities.
*
* @param symbols a {@link Collection} of symbols to query for
*
- * @return the {@link LatestCryptoTradeResponse}
+ * @return the {@link LatestCryptoBarsResponse}
*
* @throws AlpacaClientException thrown for {@link AlpacaClientException}s
*/
- public LatestCryptoTradeResponse getLatestTrade(Collection symbols) throws AlpacaClientException {
+ public LatestCryptoBarsResponse getLatestBars(Collection symbols) throws AlpacaClientException {
checkNotNull(symbols);
+ if (symbols.isEmpty()) {
+ throw new AlpacaClientException("Collection symbols must not be empty.");
+ }
HttpUrl.Builder urlBuilder = alpacaClient.urlBuilder()
.addPathSegment(endpointPathSegment)
.addPathSegment(LOCALE)
- .addPathSegment("trades")
- .addPathSegment("latest");
+ .addPathSegment("latest")
+ .addPathSegment("bars");
urlBuilder.addQueryParameter("symbols", String.join(",", symbols));
Request request = alpacaClient.requestBuilder(urlBuilder.build())
.get()
.build();
- return alpacaClient.requestObject(request, LatestCryptoTradeResponse.class);
+ return alpacaClient.requestObject(request, LatestCryptoBarsResponse.class);
}
/**
- * Gets {@link CryptoQuote} historical data for the requested crypto symbol.
+ * Gets {@link CryptoQuote} historical data for the requested crypto symbols.
*
* @param symbols a {@link Collection} of symbols to query for
* @param start filter data equal to or after this {@link ZonedDateTime}. Fractions of a second are not
@@ -133,6 +172,9 @@ public LatestCryptoTradeResponse getLatestTrade(Collection symbols) thro
public CryptoQuotesResponse getQuotes(Collection symbols, ZonedDateTime start,
ZonedDateTime end, Integer limit, String pageToken) throws AlpacaClientException {
checkNotNull(symbols);
+ if (symbols.isEmpty()) {
+ throw new AlpacaClientException("Collection symbols must not be empty.");
+ }
HttpUrl.Builder urlBuilder = alpacaClient.urlBuilder()
.addPathSegment(endpointPathSegment)
@@ -164,29 +206,89 @@ public CryptoQuotesResponse getQuotes(Collection symbols, ZonedDateTime
}
/**
- * Gets the latest {@link CryptoQuote} for the requested security.
+ * Gets the latest {@link CryptoQuote}s for the requested securities.
+ *
+ * @param symbols a {@link Collection} of symbols to query for
+ *
+ * @return the {@link LatestCryptoQuotesResponse}
+ *
+ * @throws AlpacaClientException thrown for {@link AlpacaClientException}s
+ */
+ public LatestCryptoQuotesResponse getLatestQuotes(Collection symbols) throws AlpacaClientException {
+ checkNotNull(symbols);
+ if (symbols.isEmpty()) {
+ throw new AlpacaClientException("Collection symbols must not be empty.");
+ }
+
+ HttpUrl.Builder urlBuilder = alpacaClient.urlBuilder()
+ .addPathSegment(endpointPathSegment)
+ .addPathSegment(LOCALE)
+ .addPathSegment("latest")
+ .addPathSegment("quotes");
+
+ urlBuilder.addQueryParameter("symbols", String.join(",", symbols));
+
+ Request request = alpacaClient.requestBuilder(urlBuilder.build())
+ .get()
+ .build();
+ return alpacaClient.requestObject(request, LatestCryptoQuotesResponse.class);
+ }
+
+ /**
+ * Gets the latest {@link CryptoSnapshot} for the requested securities.
+ *
+ * @param symbols a {@link Collection} of symbols to query for
+ *
+ * @return the {@link CryptoSnapshotsResponse}
+ *
+ * @throws AlpacaClientException thrown for {@link AlpacaClientException}s
+ */
+ public CryptoSnapshotsResponse getSnapshots(Collection symbols) throws AlpacaClientException {
+ checkNotNull(symbols);
+ if (symbols.isEmpty()) {
+ throw new AlpacaClientException("Collection symbols must not be empty.");
+ }
+
+ HttpUrl.Builder urlBuilder = alpacaClient.urlBuilder()
+ .addPathSegment(endpointPathSegment)
+ .addPathSegment(LOCALE)
+ .addPathSegment("snapshots");
+
+ urlBuilder.addQueryParameter("symbols", String.join(",", symbols));
+
+ Request request = alpacaClient.requestBuilder(urlBuilder.build())
+ .get()
+ .build();
+ return alpacaClient.requestObject(request, CryptoSnapshotsResponse.class);
+ }
+
+ /**
+ * Gets the latest {@link CryptoOrderbook}s for the requested securities.
*
* @param symbols a {@link Collection} of symbols to query for
*
- * @return the {@link LatestCryptoQuoteResponse}
+ * @return the {@link LatestCryptoOrderbooksResponse}
*
* @throws AlpacaClientException thrown for {@link AlpacaClientException}s
*/
- public LatestCryptoQuoteResponse getLatestQuote(Collection symbols) throws AlpacaClientException {
+ public LatestCryptoOrderbooksResponse getLatestOrderbooks(Collection symbols) throws AlpacaClientException {
checkNotNull(symbols);
+ if (symbols.isEmpty()) {
+ throw new AlpacaClientException("Collection symbols must not be empty.");
+ }
HttpUrl.Builder urlBuilder = alpacaClient.urlBuilder()
.addPathSegment(endpointPathSegment)
.addPathSegment(LOCALE)
- .addPathSegment("quotes")
- .addPathSegment("latest");
+ .addPathSegment("latest")
+ .addPathSegment("orderbooks");
urlBuilder.addQueryParameter("symbols", String.join(",", symbols));
Request request = alpacaClient.requestBuilder(urlBuilder.build())
.get()
.build();
- return alpacaClient.requestObject(request, LatestCryptoQuoteResponse.class);
+ return alpacaClient.requestObject(request, LatestCryptoOrderbooksResponse.class);
}
/**
@@ -195,6 +297,8 @@ public LatestCryptoQuoteResponse getLatestQuote(Collection symbols) thro
* @param symbols a {@link Collection} of symbols to query for
* @param start filter data equal to or after this {@link ZonedDateTime}. Fractions of a second are
* not accepted. null for now.
+ * @param end filter data equal to or before this {@link ZonedDateTime}. Fractions of a second are
+ * not accepted. null for now.
* @param limit number of data points to return. Must be in range 1-10000, defaults to 1000 if
* null is given
* @param pageToken pagination token to continue from
@@ -209,9 +313,12 @@ public LatestCryptoQuoteResponse getLatestQuote(Collection symbols) thro
*
* @throws AlpacaClientException thrown for {@link AlpacaClientException}s
*/
- public CryptoBarsResponse getBars(Collection symbols, ZonedDateTime start, Integer limit,
+ public CryptoBarsResponse getBars(Collection symbols, ZonedDateTime start, ZonedDateTime end, Integer limit,
String pageToken, int barTimePeriodDuration, BarTimePeriod barTimePeriod) throws AlpacaClientException {
checkNotNull(symbols);
+ if (symbols.isEmpty()) {
+ throw new AlpacaClientException("Collection symbols must not be empty.");
+ }
checkNotNull(barTimePeriod);
HttpUrl.Builder urlBuilder = alpacaClient.urlBuilder()
@@ -225,6 +332,10 @@ public CryptoBarsResponse getBars(Collection symbols, ZonedDateTime star
urlBuilder.addQueryParameter("start", FormatUtil.toRFC3339Format(start));
}
+ if (end != null) {
+ urlBuilder.addQueryParameter("end", FormatUtil.toRFC3339Format(end));
+ }
+
if (limit != null) {
urlBuilder.addQueryParameter("limit", limit.toString());
}
From eb7f551f547bbaf6015797b2972aa2bed1fdb50c Mon Sep 17 00:00:00 2001
From: Jesse Thouin
Date: Thu, 13 Jul 2023 16:54:02 -0400
Subject: [PATCH 44/84] Removed getQuotes as it doesn't have a matching API
call with Alpaca.
---
.../quote/crypto_quotes_response.json | 14 -----
.../crypto/CryptoMarketDataEndpoint.java | 53 -------------------
2 files changed, 67 deletions(-)
delete mode 100644 schema_json/endpoint/market_data/crypto/historical/quote/crypto_quotes_response.json
diff --git a/schema_json/endpoint/market_data/crypto/historical/quote/crypto_quotes_response.json b/schema_json/endpoint/market_data/crypto/historical/quote/crypto_quotes_response.json
deleted file mode 100644
index a5010f8c..00000000
--- a/schema_json/endpoint/market_data/crypto/historical/quote/crypto_quotes_response.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
- "type": "object",
- "title": "See Historical Crypto Data.",
- "properties": {
- "quotes": {
- "existingJavaType": "java.util.Map>",
- "title": "The {@link java.util.ArrayList} of {@link net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.quote.CryptoQuote}s."
- },
- "next_page_token": {
- "existingJavaType": "java.lang.String",
- "title": "Token that can be used to query the next page."
- }
- }
-}
diff --git a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/marketdata/crypto/CryptoMarketDataEndpoint.java b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/marketdata/crypto/CryptoMarketDataEndpoint.java
index bebe7a87..c1a8947f 100644
--- a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/marketdata/crypto/CryptoMarketDataEndpoint.java
+++ b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/marketdata/crypto/CryptoMarketDataEndpoint.java
@@ -7,7 +7,6 @@
import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.orderbook.CryptoOrderbook;
import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.orderbook.LatestCryptoOrderbooksResponse;
import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.quote.CryptoQuote;
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.quote.CryptoQuotesResponse;
import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.quote.LatestCryptoQuotesResponse;
import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.snapshot.CryptoSnapshot;
import net.jacobpeterson.alpaca.model.endpoint.marketdata.crypto.historical.snapshot.CryptoSnapshotsResponse;
@@ -153,58 +152,6 @@ public LatestCryptoBarsResponse getLatestBars(Collection symbols) throws
return alpacaClient.requestObject(request, LatestCryptoBarsResponse.class);
}
- /**
- * Gets {@link CryptoQuote} historical data for the requested crypto symbols.
- *
- * @param symbols a {@link Collection} of symbols to query for
- * @param start filter data equal to or after this {@link ZonedDateTime}. Fractions of a second are not
- * accepted. null for the current day in Central Time.
- * @param end filter data equal to or before this {@link ZonedDateTime}. Fractions of a second are not
- * accepted. null for now.
- * @param limit number of data points to return. Must be in range 1-10000, defaults to 1000 if null
- * is given
- * @param pageToken pagination token to continue from
- *
- * @return the {@link CryptoQuotesResponse}
- *
- * @throws AlpacaClientException thrown for {@link AlpacaClientException}s
- */
- public CryptoQuotesResponse getQuotes(Collection symbols, ZonedDateTime start,
- ZonedDateTime end, Integer limit, String pageToken) throws AlpacaClientException {
- checkNotNull(symbols);
- if (symbols.isEmpty()) {
- throw new AlpacaClientException("Collection symbols must not be empty.");
- }
-
- HttpUrl.Builder urlBuilder = alpacaClient.urlBuilder()
- .addPathSegment(endpointPathSegment)
- .addPathSegment(LOCALE)
- .addPathSegment("quotes");
-
- urlBuilder.addQueryParameter("symbols", String.join(",", symbols));
-
- if (start != null) {
- urlBuilder.addQueryParameter("start", FormatUtil.toRFC3339Format(start));
- }
-
- if (end != null) {
- urlBuilder.addQueryParameter("end", FormatUtil.toRFC3339Format(end));
- }
-
- if (limit != null) {
- urlBuilder.addQueryParameter("limit", limit.toString());
- }
-
- if (pageToken != null) {
- urlBuilder.addQueryParameter("page_token", pageToken);
- }
-
- Request request = alpacaClient.requestBuilder(urlBuilder.build())
- .get()
- .build();
- return alpacaClient.requestObject(request, CryptoQuotesResponse.class);
- }
-
/**
* Gets the latest {@link CryptoQuote}s for the requested securities.
*
From 6fdb6fcab02b68a0c54eeeabaa95c5d651b75ce7 Mon Sep 17 00:00:00 2001
From: Jesse Thouin
Date: Sat, 15 Jul 2023 12:50:29 -0400
Subject: [PATCH 45/84] Alpaca removed OrderTimeInForce.DAY as a valid time in
force for crypto orders.
---
.../alpaca/rest/endpoint/orders/OrdersEndpoint.java | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/orders/OrdersEndpoint.java b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/orders/OrdersEndpoint.java
index 3212bf75..d2d355dd 100644
--- a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/orders/OrdersEndpoint.java
+++ b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/orders/OrdersEndpoint.java
@@ -242,7 +242,7 @@ public Order requestMarketOrder(String symbol, Integer quantity, OrderSide side,
* most likely method of filling an order. Market orders fill nearly instantaneously. This method calls {@link
* #requestOrder(String, Double, Double, OrderSide, OrderType, OrderTimeInForce, Double, Double, Double, Double,
* Boolean, String, OrderClass, Double, Double, Double)} with {@link OrderType#MARKET} and {@link
- * OrderTimeInForce#DAY} with a fractional quantity so check the Javadoc for that method for parameter details.
+ * OrderTimeInForce#GOOD_UNTIL_CANCELLED} with a fractional quantity so check the Javadoc for that method for parameter details.
*
* @return the requested {@link Order}
*
@@ -250,7 +250,7 @@ public Order requestMarketOrder(String symbol, Integer quantity, OrderSide side,
*/
public Order requestFractionalMarketOrder(String symbol, Double quantity, OrderSide side)
throws AlpacaClientException {
- return requestOrder(symbol, quantity, null, side, OrderType.MARKET, OrderTimeInForce.DAY, null, null, null,
+ return requestOrder(symbol, quantity, null, side, OrderType.MARKET, OrderTimeInForce.GOOD_UNTIL_CANCELLED, null, null, null,
null, null, null, null, null, null, null);
}
@@ -259,7 +259,7 @@ public Order requestFractionalMarketOrder(String symbol, Double quantity, OrderS
* most likely method of filling an order. Market orders fill nearly instantaneously. This method calls {@link
* #requestOrder(String, Double, Double, OrderSide, OrderType, OrderTimeInForce, Double, Double, Double, Double,
* Boolean, String, OrderClass, Double, Double, Double)} with {@link OrderType#MARKET} and {@link
- * OrderTimeInForce#DAY} with a notional dollar amount so check the Javadoc for that method for the parameter
+ * OrderTimeInForce#GOOD_UNTIL_CANCELLED} with a notional dollar amount so check the Javadoc for that method for the parameter
* details.
*
* @return the requested {@link Order}
@@ -268,7 +268,7 @@ public Order requestFractionalMarketOrder(String symbol, Double quantity, OrderS
*/
public Order requestNotionalMarketOrder(String symbol, Double notional, OrderSide side)
throws AlpacaClientException {
- return requestOrder(symbol, null, notional, side, OrderType.MARKET, OrderTimeInForce.DAY, null, null, null,
+ return requestOrder(symbol, null, notional, side, OrderType.MARKET, OrderTimeInForce.GOOD_UNTIL_CANCELLED, null, null, null,
null, null, null, null, null, null, null);
}
From 9ca1bcd9dec7f7fab6dd58da1ab4bc8d3722dd73 Mon Sep 17 00:00:00 2001
From: Daniel Mejer
Date: Mon, 7 Aug 2023 18:13:31 +0200
Subject: [PATCH 46/84] Add builder to AlpacaAPI
---
README.md | 6 +++
.../net/jacobpeterson/alpaca/AlpacaAPI.java | 53 +++++++++++++++++++
2 files changed, 59 insertions(+)
diff --git a/README.md b/README.md
index a29ffc56..aff83e53 100644
--- a/README.md
+++ b/README.md
@@ -73,6 +73,12 @@ AlpacaAPI alpacaAPI = new AlpacaAPI(keyID, secretKey, EndpointAPIType.LIVE, Data
// This constructor is for OAuth tokens
String oAuthToken = "";
AlpacaAPI alpacaAPI = new AlpacaAPI(oAuthToken);
+
+// The following approach uses builder pattern. Attributes not provided explicitly are retrieved from 'alpaca.properties' file
+AlpacaAPI alpacaAPI = AlpacaAPI.builder()
+ .withEndpointAPIType(EndpointAPIType.PAPER)
+ .build();
+
```
Note that this library uses [OkHttp](https://square.github.io/okhttp/) as its HTTP client library which creates background threads to service requests. These threads persist even if the main thread exists so if you want to destroy these threads when you're done using [`AlpacaAPI`](src/main/java/net/jacobpeterson/alpaca/AlpacaAPI.java) so your program can exit without calling `System.exit()`, use the following snippet:
diff --git a/src/main/java/net/jacobpeterson/alpaca/AlpacaAPI.java b/src/main/java/net/jacobpeterson/alpaca/AlpacaAPI.java
index 63980318..60b47293 100644
--- a/src/main/java/net/jacobpeterson/alpaca/AlpacaAPI.java
+++ b/src/main/java/net/jacobpeterson/alpaca/AlpacaAPI.java
@@ -78,6 +78,17 @@ public AlpacaAPI() {
AlpacaProperties.DATA_API_TYPE);
}
+ /**
+ * Instantiates a new {@link AlpacaAPI} using properties specified in Builder, otherwise from
+ * alpaca.properties file (or their associated defaults).
+ */
+ private AlpacaAPI(Builder builder) {
+ this(builder.keyID,
+ builder.secretKey,
+ builder.endpointAPIType,
+ builder.dataAPIType);
+ }
+
/**
* Instantiates a new {@link AlpacaAPI}.
*
@@ -308,4 +319,46 @@ public AlpacaClient getCryptoDataClient() {
public AlpacaClient getStockDataClient() {
return stockDataClient;
}
+
+ public static Builder builder() {
+ return new Builder();
+ }
+
+ public static final class Builder {
+ private String keyID;
+ private String secretKey;
+ private EndpointAPIType endpointAPIType;
+ private DataAPIType dataAPIType;
+
+ private Builder() {
+ this.keyID = AlpacaProperties.KEY_ID;
+ this.secretKey = AlpacaProperties.SECRET_KEY;
+ this.endpointAPIType = AlpacaProperties.ENDPOINT_API_TYPE;
+ this.dataAPIType = AlpacaProperties.DATA_API_TYPE;
+ }
+
+ public Builder withKeyID(String val) {
+ keyID = val;
+ return this;
+ }
+
+ public Builder withSecretKey(String val) {
+ secretKey = val;
+ return this;
+ }
+
+ public Builder withEndpointAPIType(EndpointAPIType val) {
+ endpointAPIType = val;
+ return this;
+ }
+
+ public Builder withDataAPIType(DataAPIType val) {
+ dataAPIType = val;
+ return this;
+ }
+
+ public AlpacaAPI build() {
+ return new AlpacaAPI(this);
+ }
+ }
}
From 854a5ddf55af940d406b60d0828986984e52ca56 Mon Sep 17 00:00:00 2001
From: Jacob Peterson <14127217+Petersoj@users.noreply.github.com>
Date: Sun, 20 Aug 2023 16:19:10 -0600
Subject: [PATCH 47/84] Minor documentation updates
---
README.md | 2 +-
build.gradle | 1 +
.../net/jacobpeterson/alpaca/AlpacaAPI.java | 23 +++++++++++++------
3 files changed, 18 insertions(+), 8 deletions(-)
diff --git a/README.md b/README.md
index aff83e53..a6c51d49 100644
--- a/README.md
+++ b/README.md
@@ -74,7 +74,7 @@ AlpacaAPI alpacaAPI = new AlpacaAPI(keyID, secretKey, EndpointAPIType.LIVE, Data
String oAuthToken = "";
AlpacaAPI alpacaAPI = new AlpacaAPI(oAuthToken);
-// The following approach uses builder pattern. Attributes not provided explicitly are retrieved from 'alpaca.properties' file
+// This approach uses a builder pattern. Attributes not provided explicitly are retrieved from 'alpaca.properties' file
AlpacaAPI alpacaAPI = AlpacaAPI.builder()
.withEndpointAPIType(EndpointAPIType.PAPER)
.build();
diff --git a/build.gradle b/build.gradle
index 588393d3..a40691fa 100644
--- a/build.gradle
+++ b/build.gradle
@@ -237,6 +237,7 @@ jsonSchema2Pojo {
annotationStyle = 'gson'
sourceType = 'jsonschema'
customDateTimePattern = "yyyy-MM-ddTHH:mm:ssZ"
+ includeGeneratedAnnotation = false
includeConstructors = true
serializable = true
includeGetters = true
diff --git a/src/main/java/net/jacobpeterson/alpaca/AlpacaAPI.java b/src/main/java/net/jacobpeterson/alpaca/AlpacaAPI.java
index 60b47293..c043b78f 100644
--- a/src/main/java/net/jacobpeterson/alpaca/AlpacaAPI.java
+++ b/src/main/java/net/jacobpeterson/alpaca/AlpacaAPI.java
@@ -5,19 +5,19 @@
import net.jacobpeterson.alpaca.model.properties.EndpointAPIType;
import net.jacobpeterson.alpaca.properties.AlpacaProperties;
import net.jacobpeterson.alpaca.rest.AlpacaClient;
+import net.jacobpeterson.alpaca.rest.endpoint.AlpacaEndpoint;
+import net.jacobpeterson.alpaca.rest.endpoint.account.AccountEndpoint;
import net.jacobpeterson.alpaca.rest.endpoint.accountactivities.AccountActivitiesEndpoint;
import net.jacobpeterson.alpaca.rest.endpoint.accountconfiguration.AccountConfigurationEndpoint;
-import net.jacobpeterson.alpaca.rest.endpoint.account.AccountEndpoint;
-import net.jacobpeterson.alpaca.rest.endpoint.AlpacaEndpoint;
import net.jacobpeterson.alpaca.rest.endpoint.assets.AssetsEndpoint;
import net.jacobpeterson.alpaca.rest.endpoint.calendar.CalendarEndpoint;
import net.jacobpeterson.alpaca.rest.endpoint.clock.ClockEndpoint;
+import net.jacobpeterson.alpaca.rest.endpoint.marketdata.crypto.CryptoMarketDataEndpoint;
+import net.jacobpeterson.alpaca.rest.endpoint.marketdata.stock.StockMarketDataEndpoint;
import net.jacobpeterson.alpaca.rest.endpoint.orders.OrdersEndpoint;
import net.jacobpeterson.alpaca.rest.endpoint.portfoliohistory.PortfolioHistoryEndpoint;
import net.jacobpeterson.alpaca.rest.endpoint.positions.PositionsEndpoint;
import net.jacobpeterson.alpaca.rest.endpoint.watchlist.WatchlistEndpoint;
-import net.jacobpeterson.alpaca.rest.endpoint.marketdata.crypto.CryptoMarketDataEndpoint;
-import net.jacobpeterson.alpaca.rest.endpoint.marketdata.stock.StockMarketDataEndpoint;
import net.jacobpeterson.alpaca.websocket.AlpacaWebsocket;
import net.jacobpeterson.alpaca.websocket.marketdata.MarketDataWebsocketInterface;
import net.jacobpeterson.alpaca.websocket.marketdata.crypto.CryptoMarketDataWebsocket;
@@ -32,8 +32,8 @@
import static com.google.common.base.Preconditions.checkNotNull;
/**
- * The {@link AlpacaAPI} class contains several instances of various {@link AlpacaEndpoint}s and {@link
- * AlpacaWebsocket}s to interface with Alpaca. You will generally only need one instance of this class in your
+ * The {@link AlpacaAPI} class contains several instances of various {@link AlpacaEndpoint}s and
+ * {@link AlpacaWebsocket}s to interface with Alpaca. You will generally only need one instance of this class in your
* application. Note that many methods inside the various {@link AlpacaEndpoint}s allow null to be passed
* in as a parameter if it is optional.
*
@@ -79,7 +79,7 @@ public AlpacaAPI() {
}
/**
- * Instantiates a new {@link AlpacaAPI} using properties specified in Builder, otherwise from
+ * Instantiates a new {@link AlpacaAPI} using properties specified in the given {@link Builder}, otherwise from
* alpaca.properties file (or their associated defaults).
*/
private AlpacaAPI(Builder builder) {
@@ -320,11 +320,20 @@ public AlpacaClient getStockDataClient() {
return stockDataClient;
}
+ /**
+ * Creates a {@link Builder} for {@link AlpacaAPI}.
+ *
+ * @return a {@link Builder}
+ */
public static Builder builder() {
return new Builder();
}
+ /**
+ * A builder for {@link AlpacaAPI}
+ */
public static final class Builder {
+
private String keyID;
private String secretKey;
private EndpointAPIType endpointAPIType;
From 9d253ff4f5acf7d2ff65cbfe903720e19299fd1d Mon Sep 17 00:00:00 2001
From: Jacob Peterson <14127217+Petersoj@users.noreply.github.com>
Date: Sun, 20 Aug 2023 16:33:26 -0600
Subject: [PATCH 48/84] Auto-format
---
.../net/jacobpeterson/alpaca/AlpacaAPI.java | 12 +-
.../alpaca/rest/AlpacaClient.java | 16 +-
.../crypto/CryptoMarketDataEndpoint.java | 15 +-
.../stock/StockMarketDataEndpoint.java | 16 +-
.../rest/endpoint/orders/OrdersEndpoint.java | 154 +++++++++---------
.../marketdata/MarketDataWebsocket.java | 8 +-
.../streaming/StreamingWebsocket.java | 4 +-
src/main/resources/alpaca.default.properties | 1 -
.../alpaca/test/live/AlpacaAPITest.java | 9 +-
9 files changed, 120 insertions(+), 115 deletions(-)
diff --git a/src/main/java/net/jacobpeterson/alpaca/AlpacaAPI.java b/src/main/java/net/jacobpeterson/alpaca/AlpacaAPI.java
index c71f496b..6ae47c47 100644
--- a/src/main/java/net/jacobpeterson/alpaca/AlpacaAPI.java
+++ b/src/main/java/net/jacobpeterson/alpaca/AlpacaAPI.java
@@ -5,19 +5,19 @@
import net.jacobpeterson.alpaca.model.properties.EndpointAPIType;
import net.jacobpeterson.alpaca.properties.AlpacaProperties;
import net.jacobpeterson.alpaca.rest.AlpacaClient;
+import net.jacobpeterson.alpaca.rest.endpoint.AlpacaEndpoint;
+import net.jacobpeterson.alpaca.rest.endpoint.account.AccountEndpoint;
import net.jacobpeterson.alpaca.rest.endpoint.accountactivities.AccountActivitiesEndpoint;
import net.jacobpeterson.alpaca.rest.endpoint.accountconfiguration.AccountConfigurationEndpoint;
-import net.jacobpeterson.alpaca.rest.endpoint.account.AccountEndpoint;
-import net.jacobpeterson.alpaca.rest.endpoint.AlpacaEndpoint;
import net.jacobpeterson.alpaca.rest.endpoint.assets.AssetsEndpoint;
import net.jacobpeterson.alpaca.rest.endpoint.calendar.CalendarEndpoint;
import net.jacobpeterson.alpaca.rest.endpoint.clock.ClockEndpoint;
+import net.jacobpeterson.alpaca.rest.endpoint.marketdata.crypto.CryptoMarketDataEndpoint;
+import net.jacobpeterson.alpaca.rest.endpoint.marketdata.stock.StockMarketDataEndpoint;
import net.jacobpeterson.alpaca.rest.endpoint.orders.OrdersEndpoint;
import net.jacobpeterson.alpaca.rest.endpoint.portfoliohistory.PortfolioHistoryEndpoint;
import net.jacobpeterson.alpaca.rest.endpoint.positions.PositionsEndpoint;
import net.jacobpeterson.alpaca.rest.endpoint.watchlist.WatchlistEndpoint;
-import net.jacobpeterson.alpaca.rest.endpoint.marketdata.crypto.CryptoMarketDataEndpoint;
-import net.jacobpeterson.alpaca.rest.endpoint.marketdata.stock.StockMarketDataEndpoint;
import net.jacobpeterson.alpaca.websocket.AlpacaWebsocket;
import net.jacobpeterson.alpaca.websocket.marketdata.MarketDataWebsocketInterface;
import net.jacobpeterson.alpaca.websocket.marketdata.crypto.CryptoMarketDataWebsocket;
@@ -32,8 +32,8 @@
import static com.google.common.base.Preconditions.checkNotNull;
/**
- * The {@link AlpacaAPI} class contains several instances of various {@link AlpacaEndpoint}s and {@link
- * AlpacaWebsocket}s to interface with Alpaca. You will generally only need one instance of this class in your
+ * The {@link AlpacaAPI} class contains several instances of various {@link AlpacaEndpoint}s and
+ * {@link AlpacaWebsocket}s to interface with Alpaca. You will generally only need one instance of this class in your
* application. Note that many methods inside the various {@link AlpacaEndpoint}s allow null to be passed
* in as a parameter if it is optional.
*
diff --git a/src/main/java/net/jacobpeterson/alpaca/rest/AlpacaClient.java b/src/main/java/net/jacobpeterson/alpaca/rest/AlpacaClient.java
index 7fe5cc27..dc11df3f 100644
--- a/src/main/java/net/jacobpeterson/alpaca/rest/AlpacaClient.java
+++ b/src/main/java/net/jacobpeterson/alpaca/rest/AlpacaClient.java
@@ -127,8 +127,8 @@ public T requestObject(Request request, Type type) throws AlpacaClientExcept
*
* @param the type of object
* @param request the {@link Request}
- * @param isSuccessCode throws {@link AlpacaClientException} if passed in {@link Response#code()} to the {@link
- * Predicate#test(Object)} returns false
+ * @param isSuccessCode throws {@link AlpacaClientException} if passed in {@link Response#code()} to the
+ * {@link Predicate#test(Object)} returns false
* @param type the object {@link Type}
*
* @return the requested object
@@ -151,8 +151,8 @@ public JsonElement requestJSON(Request request) throws AlpacaClientException {
* Requests a {@link JsonElement} given a {@link Request}.
*
* @param request the {@link Request}
- * @param isSuccessCode throws {@link AlpacaClientException} if passed in {@link Response#code()} to the {@link
- * Predicate#test(Object)} returns false
+ * @param isSuccessCode throws {@link AlpacaClientException} if passed in {@link Response#code()} to the
+ * {@link Predicate#test(Object)} returns false
*
* @return the {@link JsonElement}
*
@@ -178,8 +178,8 @@ public JsonElement requestJSON(Request request, Predicate isSuccessCode
* Sends a {@link Request} and ignores any {@link ResponseBody}.
*
* @param request the {@link Request}
- * @param isSuccessCode throws {@link AlpacaClientException} if passed in {@link Response#code()} to the {@link
- * Predicate#test(Object)} returns false
+ * @param isSuccessCode throws {@link AlpacaClientException} if passed in {@link Response#code()} to the
+ * {@link Predicate#test(Object)} returns false
*
* @throws AlpacaClientException thrown for {@link AlpacaClientException}s
*/
@@ -193,8 +193,8 @@ public void requestVoid(Request request, Predicate isSuccessCode) throw
* Sends a {@link Request} and returns a {@link Response}.
*
* @param request the {@link Request}
- * @param isSuccessCode throws {@link AlpacaClientException} if passed in {@link Response#code()} to the {@link
- * Predicate#test(Object)} returns false
+ * @param isSuccessCode throws {@link AlpacaClientException} if passed in {@link Response#code()} to the
+ * {@link Predicate#test(Object)} returns false
*
* @return the {@link Response}. Be sure to call {@link Response#close()} after use.
*
diff --git a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/marketdata/crypto/CryptoMarketDataEndpoint.java b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/marketdata/crypto/CryptoMarketDataEndpoint.java
index c1a8947f..f429a32c 100644
--- a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/marketdata/crypto/CryptoMarketDataEndpoint.java
+++ b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/marketdata/crypto/CryptoMarketDataEndpoint.java
@@ -31,6 +31,7 @@
* Crypto Market Data API.
*/
public class CryptoMarketDataEndpoint extends AlpacaEndpoint {
+
public static final String LOCALE = "us";
/**
@@ -97,7 +98,7 @@ public CryptoTradesResponse getTrades(Collection symbols, ZonedDateTime
/**
* Gets the latest {@link CryptoTrade}s for the requested securities.
*
- * @param symbols a {@link Collection} of symbols to query for
+ * @param symbols a {@link Collection} of symbols to query for
*
* @return the {@link LatestCryptoTradesResponse}
*
@@ -126,7 +127,7 @@ public LatestCryptoTradesResponse getLatestTrades(Collection symbols) th
/**
* Gets the latest {@link CryptoBar}s for the requested securities.
*
- * @param symbols a {@link Collection} of symbols to query for
+ * @param symbols a {@link Collection} of symbols to query for
*
* @return the {@link LatestCryptoBarsResponse}
*
@@ -155,7 +156,7 @@ public LatestCryptoBarsResponse getLatestBars(Collection symbols) throws
/**
* Gets the latest {@link CryptoQuote}s for the requested securities.
*
- * @param symbols a {@link Collection} of symbols to query for
+ * @param symbols a {@link Collection} of symbols to query for
*
* @return the {@link LatestCryptoQuotesResponse}
*
@@ -184,7 +185,7 @@ public LatestCryptoQuotesResponse getLatestQuotes(Collection symbols) th
/**
* Gets the latest {@link CryptoSnapshot} for the requested securities.
*
- * @param symbols a {@link Collection} of symbols to query for
+ * @param symbols a {@link Collection} of symbols to query for
*
* @return the {@link CryptoSnapshotsResponse}
*
@@ -212,7 +213,7 @@ public CryptoSnapshotsResponse getSnapshots(Collection symbols) throws A
/**
* Gets the latest {@link CryptoOrderbook}s for the requested securities.
*
- * @param symbols a {@link Collection} of symbols to query for
+ * @param symbols a {@link Collection} of symbols to query for
*
* @return the {@link LatestCryptoOrderbooksResponse}
*
@@ -252,8 +253,8 @@ public LatestCryptoOrderbooksResponse getLatestOrderbooks(Collection sym
* @param barTimePeriodDuration the duration for the given barTimePeriod parameter. e.g. for
* 15Min bars, you would supply 15 for this parameter and
* {@link BarTimePeriod#MINUTE} for the barTimePeriod parameter.
- * @param barTimePeriod the {@link BarTimePeriod} e.g. for 15Min bars, you would supply {@link
- * BarTimePeriod#MINUTE} for this parameter and 15 for the
+ * @param barTimePeriod the {@link BarTimePeriod} e.g. for 15Min bars, you would supply
+ * {@link BarTimePeriod#MINUTE} for this parameter and 15 for the
* barTimePeriodDuration parameter.
*
* @return the {@link CryptoBarsResponse}
diff --git a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/marketdata/stock/StockMarketDataEndpoint.java b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/marketdata/stock/StockMarketDataEndpoint.java
index d47b167d..3111dde7 100644
--- a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/marketdata/stock/StockMarketDataEndpoint.java
+++ b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/marketdata/stock/StockMarketDataEndpoint.java
@@ -199,11 +199,11 @@ public LatestStockQuoteResponse getLatestQuote(String symbol) throws AlpacaClien
* @param barTimePeriodDuration the duration for the given barTimePeriod parameter. e.g. for
* 15Min bars, you would supply 15 for this parameter and
* {@link BarTimePeriod#MINUTE} for the barTimePeriod parameter.
- * @param barTimePeriod the {@link BarTimePeriod}. e.g. for 15Min bars, you would supply {@link
- * BarTimePeriod#MINUTE} for this parameter and 15 for the
+ * @param barTimePeriod the {@link BarTimePeriod}. e.g. for 15Min bars, you would supply
+ * {@link BarTimePeriod#MINUTE} for this parameter and 15 for the
* barTimePeriodDuration parameter.
- * @param barAdjustment specifies the corporate action adjustment for the stocks. Default value is {@link
- * BarAdjustment#RAW}
+ * @param barAdjustment specifies the corporate action adjustment for the stocks. Default value is
+ * {@link BarAdjustment#RAW}
* @param barFeed defaults to {@link BarFeed#IEX} for Free users and {@link BarFeed#SIP} for users
* with an Unlimited subscription
*
@@ -265,11 +265,11 @@ public StockBarsResponse getBars(String symbol, ZonedDateTime start, ZonedDateTi
* @param barTimePeriodDuration the duration for the given barTimePeriod parameter. e.g. for
* 15Min bars, you would supply 15 for this parameter and
* {@link BarTimePeriod#MINUTE} for the barTimePeriod parameter.
- * @param barTimePeriod the {@link BarTimePeriod}. e.g. for 15Min bars, you would supply {@link
- * BarTimePeriod#MINUTE} for this parameter and 15 for the
+ * @param barTimePeriod the {@link BarTimePeriod}. e.g. for 15Min bars, you would supply
+ * {@link BarTimePeriod#MINUTE} for this parameter and 15 for the
* barTimePeriodDuration parameter.
- * @param barAdjustment specifies the corporate action adjustment for the stocks. Default value is {@link
- * BarAdjustment#RAW}
+ * @param barAdjustment specifies the corporate action adjustment for the stocks. Default value is
+ * {@link BarAdjustment#RAW}
* @param barFeed defaults to {@link BarFeed#IEX} for Free users and {@link BarFeed#SIP} for users
* with an Unlimited subscription
*
diff --git a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/orders/OrdersEndpoint.java b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/orders/OrdersEndpoint.java
index d2d355dd..0ad4a66e 100644
--- a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/orders/OrdersEndpoint.java
+++ b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/orders/OrdersEndpoint.java
@@ -56,8 +56,8 @@ public OrdersEndpoint(AlpacaClient alpacaClient) {
* @param limit the maximum number of orders in response. Defaults to 50 and max is 500.
* @param after the response will include only ones submitted after this timestamp (exclusive)
* @param until the response will include only ones submitted until this timestamp (exclusive)
- * @param direction the chronological order of response based on the submission time. Defaults to {@link
- * SortDirection#DESCENDING}.
+ * @param direction the chronological order of response based on the submission time. Defaults to
+ * {@link SortDirection#DESCENDING}.
* @param nested if true, the result will roll up multi-leg orders under the legs field of primary order.
* @param symbols a {@link Collection} of symbols to filter by (e.g. "AAPL,TSLA,MSFT"). A currency pair is
* required for crypto orders (e.g. "BTCUSD,BCHUSD,LTCUSD,ETCUSD"). null for no
@@ -120,19 +120,19 @@ public List get(CurrentOrderStatus status, Integer limit, ZonedDateTime a
* @param timeInForce the {@link OrderTimeInForce}
* @param limitPrice required if type is {@link OrderType#LIMIT} or {@link OrderType#STOP_LIMIT}
* @param stopPrice required if type is {@link OrderType#STOP} or {@link OrderType#STOP_LIMIT}
- * @param trailPrice this or trail_percent is required if type is {@link
- * OrderType#TRAILING_STOP}
- * @param trailPercent this or trail_price is required if type is {@link
- * OrderType#TRAILING_STOP}
+ * @param trailPrice this or trail_percent is required if type is
+ * {@link OrderType#TRAILING_STOP}
+ * @param trailPercent this or trail_price is required if type is
+ * {@link OrderType#TRAILING_STOP}
* @param extendedHours (default) false. If true, order will be eligible to execute in premarket/afterhours.
* Only works with type {@link OrderType#LIMIT} and {@link OrderTimeInForce#DAY}.
* @param clientOrderId a unique identifier for the order. Automatically generated if null.
* @param orderClass the {@link OrderClass}. For details of non-simple order classes, please see "Bracket
* Order Overview" on the Alpaca Docs.
- * @param takeProfitLimitPrice additional parameter for take-profit leg of advanced orders. Required for {@link
- * OrderClass#BRACKET}.
- * @param stopLossStopPrice additional parameters for stop-loss leg of advanced orders. Required for {@link
- * OrderClass#BRACKET}.
+ * @param takeProfitLimitPrice additional parameter for take-profit leg of advanced orders. Required for
+ * {@link OrderClass#BRACKET}.
+ * @param stopLossStopPrice additional parameters for stop-loss leg of advanced orders. Required for
+ * {@link OrderClass#BRACKET}.
* @param stopLossLimitPrice additional parameters for stop-loss leg of advanced orders. The stop-loss order
* becomes a stop-limit order if specified.
*
@@ -222,10 +222,10 @@ public Order requestOrder(String symbol, Double quantity, Double notional, Order
/**
* A market order is a request to buy or sell a security at the currently available market price. It provides the
- * most likely method of filling an order. Market orders fill nearly instantaneously. This method calls {@link
- * #requestOrder(String, Double, Double, OrderSide, OrderType, OrderTimeInForce, Double, Double, Double, Double,
- * Boolean, String, OrderClass, Double, Double, Double)} with {@link OrderType#MARKET} so check the Javadoc for that
- * method for parameter details.
+ * most likely method of filling an order. Market orders fill nearly instantaneously. This method calls
+ * {@link #requestOrder(String, Double, Double, OrderSide, OrderType, OrderTimeInForce, Double, Double, Double,
+ * Double, Boolean, String, OrderClass, Double, Double, Double)} with {@link OrderType#MARKET} so check the Javadoc
+ * for that method for parameter details.
*
* @return the requested {@link Order}
*
@@ -239,10 +239,11 @@ public Order requestMarketOrder(String symbol, Integer quantity, OrderSide side,
/**
* A market order is a request to buy or sell a security at the currently available market price. It provides the
- * most likely method of filling an order. Market orders fill nearly instantaneously. This method calls {@link
- * #requestOrder(String, Double, Double, OrderSide, OrderType, OrderTimeInForce, Double, Double, Double, Double,
- * Boolean, String, OrderClass, Double, Double, Double)} with {@link OrderType#MARKET} and {@link
- * OrderTimeInForce#GOOD_UNTIL_CANCELLED} with a fractional quantity so check the Javadoc for that method for parameter details.
+ * most likely method of filling an order. Market orders fill nearly instantaneously. This method calls
+ * {@link #requestOrder(String, Double, Double, OrderSide, OrderType, OrderTimeInForce, Double, Double, Double,
+ * Double, Boolean, String, OrderClass, Double, Double, Double)} with {@link OrderType#MARKET} and
+ * {@link OrderTimeInForce#GOOD_UNTIL_CANCELLED} with a fractional quantity so check the Javadoc for that method for
+ * parameter details.
*
* @return the requested {@link Order}
*
@@ -250,17 +251,18 @@ public Order requestMarketOrder(String symbol, Integer quantity, OrderSide side,
*/
public Order requestFractionalMarketOrder(String symbol, Double quantity, OrderSide side)
throws AlpacaClientException {
- return requestOrder(symbol, quantity, null, side, OrderType.MARKET, OrderTimeInForce.GOOD_UNTIL_CANCELLED, null, null, null,
+ return requestOrder(symbol, quantity, null, side, OrderType.MARKET, OrderTimeInForce.GOOD_UNTIL_CANCELLED, null,
+ null, null,
null, null, null, null, null, null, null);
}
/**
* A market order is a request to buy or sell a security at the currently available market price. It provides the
- * most likely method of filling an order. Market orders fill nearly instantaneously. This method calls {@link
- * #requestOrder(String, Double, Double, OrderSide, OrderType, OrderTimeInForce, Double, Double, Double, Double,
- * Boolean, String, OrderClass, Double, Double, Double)} with {@link OrderType#MARKET} and {@link
- * OrderTimeInForce#GOOD_UNTIL_CANCELLED} with a notional dollar amount so check the Javadoc for that method for the parameter
- * details.
+ * most likely method of filling an order. Market orders fill nearly instantaneously. This method calls
+ * {@link #requestOrder(String, Double, Double, OrderSide, OrderType, OrderTimeInForce, Double, Double, Double,
+ * Double, Boolean, String, OrderClass, Double, Double, Double)} with {@link OrderType#MARKET} and
+ * {@link OrderTimeInForce#GOOD_UNTIL_CANCELLED} with a notional dollar amount so check the Javadoc for that method
+ * for the parameter details.
*
* @return the requested {@link Order}
*
@@ -268,7 +270,8 @@ public Order requestFractionalMarketOrder(String symbol, Double quantity, OrderS
*/
public Order requestNotionalMarketOrder(String symbol, Double notional, OrderSide side)
throws AlpacaClientException {
- return requestOrder(symbol, null, notional, side, OrderType.MARKET, OrderTimeInForce.GOOD_UNTIL_CANCELLED, null, null, null,
+ return requestOrder(symbol, null, notional, side, OrderType.MARKET, OrderTimeInForce.GOOD_UNTIL_CANCELLED, null,
+ null, null,
null, null, null, null, null, null, null);
}
@@ -276,10 +279,10 @@ public Order requestNotionalMarketOrder(String symbol, Double notional, OrderSid
* A limit order is an order to buy or sell at a specified price or better. A buy limit order (a limit order to buy)
* is executed at the specified limit price or lower (i.e., better). Conversely, a sell limit order (a limit order
* to sell) is executed at the specified limit price or higher (better). Unlike a market order, you have to specify
- * the limit price parameter when submitting your order. This method calls {@link #requestOrder(String, Double,
- * Double, OrderSide, OrderType, OrderTimeInForce, Double, Double, Double, Double, Boolean, String, OrderClass,
- * Double, Double, Double)} with {@link OrderType#LIMIT} so check the Javadoc for that method for the parameter
- * details.
+ * the limit price parameter when submitting your order. This method calls
+ * {@link #requestOrder(String, Double, Double, OrderSide, OrderType, OrderTimeInForce, Double, Double, Double,
+ * Double, Boolean, String, OrderClass, Double, Double, Double)} with {@link OrderType#LIMIT} so check the Javadoc
+ * for that method for the parameter details.
*
* @return the requested {@link Order}
*
@@ -296,10 +299,10 @@ public Order requestLimitOrder(String symbol, Double quantity, OrderSide side, O
* ensuring a higher probability of achieving a predetermined entry or exit price. Once the market price crosses the
* specified stop price, the stop order becomes a market order. Alpaca converts buy stop orders into stop limit
* orders with a limit price that is 4% higher than a stop price < $50 (or 2.5% higher than a stop price >=
- * $50). Sell stop orders are not converted into stop limit orders. This method calls {@link #requestOrder(String,
- * Double, Double, OrderSide, OrderType, OrderTimeInForce, Double, Double, Double, Double, Boolean, String,
- * OrderClass, Double, Double, Double)} with {@link OrderType#STOP} so check the Javadoc for that method for
- * parameter details.
+ * $50). Sell stop orders are not converted into stop limit orders. This method calls
+ * {@link #requestOrder(String, Double, Double, OrderSide, OrderType, OrderTimeInForce, Double, Double, Double,
+ * Double, Boolean, String, OrderClass, Double, Double, Double)} with {@link OrderType#STOP} so check the Javadoc
+ * for that method for parameter details.
*
* @return the requested {@link Order}
*
@@ -315,10 +318,10 @@ public Order requestStopOrder(String symbol, Integer quantity, OrderSide side, O
* A stop-limit order is a conditional trade over a set time frame that combines the features of a stop order with
* those of a limit order and is used to mitigate risk. The stop-limit order will be executed at a specified limit
* price, or better, after a given stop price has been reached. Once the stop price is reached, the stop-limit order
- * becomes a limit order to buy or sell at the limit price or better. This method calls {@link #requestOrder(String,
- * Double, Double, OrderSide, OrderType, OrderTimeInForce, Double, Double, Double, Double, Boolean, String,
- * OrderClass, Double, Double, Double)} with {@link OrderType#STOP_LIMIT} so check the Javadoc for that method for
- * parameter details.
+ * becomes a limit order to buy or sell at the limit price or better. This method calls
+ * {@link #requestOrder(String, Double, Double, OrderSide, OrderType, OrderTimeInForce, Double, Double, Double,
+ * Double, Boolean, String, OrderClass, Double, Double, Double)} with {@link OrderType#STOP_LIMIT} so check the
+ * Javadoc for that method for parameter details.
*
* @return the requested {@link Order}
*
@@ -332,10 +335,10 @@ public Order requestStopLimitOrder(String symbol, Integer quantity, OrderSide si
/**
* A bracket order is a chain of three orders that can be used to manage your position entry and exit. It is a
- * common use case of an OTOCO (One Triggers OCO {One Cancels Other}) order. This method calls {@link
- * #requestOrder(String, Double, Double, OrderSide, OrderType, OrderTimeInForce, Double, Double, Double, Double,
- * Boolean, String, OrderClass, Double, Double, Double)} with {@link OrderType#MARKET} and with parameters for a
- * bracket order so check the Javadoc for that method for parameter details.
+ * common use case of an OTOCO (One Triggers OCO {One Cancels Other}) order. This method calls
+ * {@link #requestOrder(String, Double, Double, OrderSide, OrderType, OrderTimeInForce, Double, Double, Double,
+ * Double, Boolean, String, OrderClass, Double, Double, Double)} with {@link OrderType#MARKET} and with parameters
+ * for a bracket order so check the Javadoc for that method for parameter details.
*
* @return the requested {@link Order}
*
@@ -351,10 +354,10 @@ public Order requestMarketBracketOrder(String symbol, Integer quantity, OrderSid
/**
* A bracket order is a chain of three orders that can be used to manage your position entry and exit. It is a
- * common use case of an OTOCO (One Triggers OCO {One Cancels Other}) order. This method calls {@link
- * #requestOrder(String, Double, Double, OrderSide, OrderType, OrderTimeInForce, Double, Double, Double, Double,
- * Boolean, String, OrderClass, Double, Double, Double)} with {@link OrderType#LIMIT} and with parameters for a
- * bracket order so check the Javadoc for that method for parameter details.
+ * common use case of an OTOCO (One Triggers OCO {One Cancels Other}) order. This method calls
+ * {@link #requestOrder(String, Double, Double, OrderSide, OrderType, OrderTimeInForce, Double, Double, Double,
+ * Double, Boolean, String, OrderClass, Double, Double, Double)} with {@link OrderType#LIMIT} and with parameters
+ * for a bracket order so check the Javadoc for that method for parameter details.
*
* @return the requested {@link Order}
*
@@ -372,10 +375,10 @@ public Order requestLimitBracketOrder(String symbol, Integer quantity, OrderSide
* OCO (One-Cancels-Other) is another type of advanced order type. This is a set of two orders with the same side
* (buy/buy or sell/sell) and currently only exit order is supported. In other words, this is the second part of the
* bracket orders where the entry order is already filled, and you can submit the take-profit and stop-loss in one
- * order submission. This method calls {@link #requestOrder(String, Double, Double, OrderSide, OrderType,
- * OrderTimeInForce, Double, Double, Double, Double, Boolean, String, OrderClass, Double, Double, Double)} with
- * parameters for a {@link OrderClass#ONE_CANCELS_OTHER} so check the Javadoc for that method for the parameter
- * details.
+ * order submission. This method calls
+ * {@link #requestOrder(String, Double, Double, OrderSide, OrderType, OrderTimeInForce, Double, Double, Double,
+ * Double, Boolean, String, OrderClass, Double, Double, Double)} with parameters for a
+ * {@link OrderClass#ONE_CANCELS_OTHER} so check the Javadoc for that method for the parameter details.
*
* @return the requested {@link Order}
*
@@ -391,10 +394,10 @@ public Order requestOCOOrder(String symbol, Integer quantity, OrderSide side,
/**
* OTO (One-Triggers-Other) is a variant of bracket order. It takes one of the take-profit or stop-loss order in
- * addition to the entry order. This method calls {@link #requestOrder(String, Double, Double, OrderSide, OrderType,
- * OrderTimeInForce, Double, Double, Double, Double, Boolean, String, OrderClass, Double, Double, Double)} with
- * {@link OrderType#LIMIT} and with parameters for a {@link OrderClass#ONE_CANCELS_OTHER} so check the Javadoc for
- * that method for parameter details.
+ * addition to the entry order. This method calls
+ * {@link #requestOrder(String, Double, Double, OrderSide, OrderType, OrderTimeInForce, Double, Double, Double,
+ * Double, Boolean, String, OrderClass, Double, Double, Double)} with {@link OrderType#LIMIT} and with parameters
+ * for a {@link OrderClass#ONE_CANCELS_OTHER} so check the Javadoc for that method for parameter details.
*
* @return the requested {@link Order}
*
@@ -410,10 +413,10 @@ public Order requestOTOMarketOrder(String symbol, Integer quantity, OrderSide si
/**
* OTO (One-Triggers-Other) is a variant of bracket order. It takes one of the take-profit or stop-loss order in
- * addition to the entry order. This method calls {@link #requestOrder(String, Double, Double, OrderSide, OrderType,
- * OrderTimeInForce, Double, Double, Double, Double, Boolean, String, OrderClass, Double, Double, Double)} with
- * {@link OrderType#LIMIT} and with parameters for a {@link OrderClass#ONE_CANCELS_OTHER} so check the Javadoc for
- * that method for parameter details.
+ * addition to the entry order. This method calls
+ * {@link #requestOrder(String, Double, Double, OrderSide, OrderType, OrderTimeInForce, Double, Double, Double,
+ * Double, Boolean, String, OrderClass, Double, Double, Double)} with {@link OrderType#LIMIT} and with parameters
+ * for a {@link OrderClass#ONE_CANCELS_OTHER} so check the Javadoc for that method for parameter details.
*
* @return the requested {@link Order}
*
@@ -429,10 +432,10 @@ public Order requestOTOLimitOrder(String symbol, Integer quantity, OrderSide sid
/**
* OTO (One-Triggers-Other) is a variant of bracket order. It takes one of the take-profit or stop-loss order in
- * addition to the entry order. This method calls {@link #requestOrder(String, Double, Double, OrderSide, OrderType,
- * OrderTimeInForce, Double, Double, Double, Double, Boolean, String, OrderClass, Double, Double, Double)} with
- * {@link OrderType#STOP} and with parameters for a {@link OrderClass#ONE_CANCELS_OTHER} so check the Javadoc for
- * that method for parameter details.
+ * addition to the entry order. This method calls
+ * {@link #requestOrder(String, Double, Double, OrderSide, OrderType, OrderTimeInForce, Double, Double, Double,
+ * Double, Boolean, String, OrderClass, Double, Double, Double)} with {@link OrderType#STOP} and with parameters for
+ * a {@link OrderClass#ONE_CANCELS_OTHER} so check the Javadoc for that method for parameter details.
*
* @return the requested {@link Order}
*
@@ -448,10 +451,11 @@ public Order requestOTOStopOrder(String symbol, Integer quantity, OrderSide side
/**
* OTO (One-Triggers-Other) is a variant of bracket order. It takes one of the take-profit or stop-loss order in
- * addition to the entry order. This method calls {@link #requestOrder(String, Double, Double, OrderSide, OrderType,
- * OrderTimeInForce, Double, Double, Double, Double, Boolean, String, OrderClass, Double, Double, Double)} with
- * {@link OrderType#STOP_LIMIT} and with parameters for a {@link OrderClass#ONE_CANCELS_OTHER} so check the Javadoc
- * for that method for parameter details.
+ * addition to the entry order. This method calls
+ * {@link #requestOrder(String, Double, Double, OrderSide, OrderType, OrderTimeInForce, Double, Double, Double,
+ * Double, Boolean, String, OrderClass, Double, Double, Double)} with {@link OrderType#STOP_LIMIT} and with
+ * parameters for a {@link OrderClass#ONE_CANCELS_OTHER} so check the Javadoc for that method for parameter
+ * details.
*
* @return the requested {@link Order}
*
@@ -468,10 +472,10 @@ public Order requestOTOStopLimitOrder(String symbol, Integer quantity, OrderSide
/**
* Trailing stop orders allow you to continuously and automatically keep updating the stop price threshold based on
- * the stock price movement. This method calls {@link #requestOrder(String, Double, Double, OrderSide, OrderType,
- * OrderTimeInForce, Double, Double, Double, Double, Boolean, String, OrderClass, Double, Double, Double)} with
- * {@link OrderType#TRAILING_STOP} and with parameters for a {@link OrderType#TRAILING_STOP} so check the Javadoc
- * for that method for parameter details.
+ * the stock price movement. This method calls
+ * {@link #requestOrder(String, Double, Double, OrderSide, OrderType, OrderTimeInForce, Double, Double, Double,
+ * Double, Boolean, String, OrderClass, Double, Double, Double)} with {@link OrderType#TRAILING_STOP} and with
+ * parameters for a {@link OrderType#TRAILING_STOP} so check the Javadoc for that method for parameter details.
*
* @return the requested {@link Order}
*
@@ -485,10 +489,10 @@ public Order requestTrailingStopPriceOrder(String symbol, Integer quantity, Orde
/**
* Trailing stop orders allow you to continuously and automatically keep updating the stop price threshold based on
- * the stock price movement. This method calls {@link #requestOrder(String, Double, Double, OrderSide, OrderType,
- * OrderTimeInForce, Double, Double, Double, Double, Boolean, String, OrderClass, Double, Double, Double)} with
- * {@link OrderType#TRAILING_STOP} and with parameters for a {@link OrderType#TRAILING_STOP} so check the Javadoc
- * for that method for parameter details.
+ * the stock price movement. This method calls
+ * {@link #requestOrder(String, Double, Double, OrderSide, OrderType, OrderTimeInForce, Double, Double, Double,
+ * Double, Boolean, String, OrderClass, Double, Double, Double)} with {@link OrderType#TRAILING_STOP} and with
+ * parameters for a {@link OrderType#TRAILING_STOP} so check the Javadoc for that method for parameter details.
*
* @return the requested {@link Order}
*
@@ -625,8 +629,8 @@ public List cancelAll() throws AlpacaClientException {
}
/**
- * Attempts to cancel an open {@link Order}. If the {@link Order} is no longer cancelable (example: {@link
- * Order#getStatus()} == {@link OrderStatus#FILLED}), the server will respond with status
+ * Attempts to cancel an open {@link Order}. If the {@link Order} is no longer cancelable (example:
+ * {@link Order#getStatus()} == {@link OrderStatus#FILLED}), the server will respond with status
* 422, and reject the request.
*
* @param orderID the {@link Order#getId()}
diff --git a/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/MarketDataWebsocket.java b/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/MarketDataWebsocket.java
index 9241f066..9c924c11 100644
--- a/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/MarketDataWebsocket.java
+++ b/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/MarketDataWebsocket.java
@@ -35,8 +35,8 @@
import static net.jacobpeterson.alpaca.util.gson.GsonUtil.GSON;
/**
- * {@link MarketDataWebsocket} is an {@link AlpacaWebsocket} implementation and provides the {@link
- * MarketDataWebsocketInterface} interface for
+ * {@link MarketDataWebsocket} is an {@link AlpacaWebsocket} implementation and provides the
+ * {@link MarketDataWebsocketInterface} interface for
* Realtime Market Data for both crypto
* and stocks.
*/
@@ -243,8 +243,8 @@ private boolean isSuccessMessageAuthenticated(SuccessMessage successMessage) {
}
/**
- * Handles a {@link SubscriptionsMessage} for updating {@link #listenedMarketDataMessageTypes} and returns a {@link
- * List} of currently subscribe symbols or null.
+ * Handles a {@link SubscriptionsMessage} for updating {@link #listenedMarketDataMessageTypes} and returns a
+ * {@link List} of currently subscribe symbols or null.
*
* @param marketDataMessageType the {@link MarketDataMessageType}
* @param newSubscribedSymbols the new subscribed symbols from {@link SubscriptionsMessage}
diff --git a/src/main/java/net/jacobpeterson/alpaca/websocket/streaming/StreamingWebsocket.java b/src/main/java/net/jacobpeterson/alpaca/websocket/streaming/StreamingWebsocket.java
index cfbf2106..92a15c0c 100644
--- a/src/main/java/net/jacobpeterson/alpaca/websocket/streaming/StreamingWebsocket.java
+++ b/src/main/java/net/jacobpeterson/alpaca/websocket/streaming/StreamingWebsocket.java
@@ -35,8 +35,8 @@
import static net.jacobpeterson.alpaca.util.gson.GsonUtil.GSON;
/**
- * {@link StreamingWebsocket} is an {@link AlpacaWebsocket} implementation and provides the {@link
- * StreamingWebsocketInterface} interface for
+ * {@link StreamingWebsocket} is an {@link AlpacaWebsocket} implementation and provides the
+ * {@link StreamingWebsocketInterface} interface for
* Streaming
*/
public class StreamingWebsocket extends AlpacaWebsocket
diff --git a/src/main/resources/alpaca.default.properties b/src/main/resources/alpaca.default.properties
index 0cef7e43..7da46f1c 100644
--- a/src/main/resources/alpaca.default.properties
+++ b/src/main/resources/alpaca.default.properties
@@ -4,7 +4,6 @@
#endpoint_api_type =
#data_api_type =
#user_agent =
-
#Defaults:
endpoint_api_type=paper
data_api_type=iex
diff --git a/src/test/java/net/jacobpeterson/alpaca/test/live/AlpacaAPITest.java b/src/test/java/net/jacobpeterson/alpaca/test/live/AlpacaAPITest.java
index f9760235..9e6d6136 100644
--- a/src/test/java/net/jacobpeterson/alpaca/test/live/AlpacaAPITest.java
+++ b/src/test/java/net/jacobpeterson/alpaca/test/live/AlpacaAPITest.java
@@ -15,7 +15,6 @@
import net.jacobpeterson.alpaca.model.endpoint.orders.enums.CurrentOrderStatus;
import net.jacobpeterson.alpaca.rest.AlpacaClientException;
import net.jacobpeterson.alpaca.rest.endpoint.account.AccountEndpoint;
-import net.jacobpeterson.alpaca.rest.endpoint.accountactivities.AccountActivitiesEndpoint;
import net.jacobpeterson.alpaca.rest.endpoint.accountconfiguration.AccountConfigurationEndpoint;
import net.jacobpeterson.alpaca.rest.endpoint.clock.ClockEndpoint;
import net.jacobpeterson.alpaca.rest.endpoint.orders.OrdersEndpoint;
@@ -156,8 +155,9 @@ public void testAccountEndpointGet() throws AlpacaClientException, NumberFormatE
}
/**
- * Tests @{@link AccountActivitiesEndpoint#get(ZonedDateTime, ZonedDateTime, ZonedDateTime, SortDirection, Integer,
- * String, ActivityType...)} one {@link AccountActivity} exists until now.
+ * Tests
+ * @{@link AccountActivitiesEndpoint#get(ZonedDateTime, ZonedDateTime, ZonedDateTime, SortDirection, Integer,
+ *String, ActivityType...)} one {@link AccountActivity} exists until now.
*
* @throws AlpacaClientException thrown for {@link AlpacaClientException}s
*/
@@ -246,7 +246,8 @@ public void testAccountConfigurationEndpointSet() throws AlpacaClientException {
}
/**
- * Test {@link OrdersEndpoint#get(CurrentOrderStatus, Integer, ZonedDateTime, ZonedDateTime, SortDirection, Boolean,
+ * Test
+ * {@link OrdersEndpoint#get(CurrentOrderStatus, Integer, ZonedDateTime, ZonedDateTime, SortDirection, Boolean,
* Collection)} one {@link Order} exists until now.
*
* @throws AlpacaClientException thrown for {@link AlpacaClientException}s
From cf282160700a5edf396a3ac0de0d32a7e8d88e19 Mon Sep 17 00:00:00 2001
From: Jacob Peterson <14127217+Petersoj@users.noreply.github.com>
Date: Sun, 20 Aug 2023 16:36:10 -0600
Subject: [PATCH 49/84] Update `.editorconfig`
---
.editorconfig | 1067 +++++++++++++++++++++++++++++++++++--------------
README.md | 1 -
2 files changed, 776 insertions(+), 292 deletions(-)
diff --git a/.editorconfig b/.editorconfig
index 604f1553..818a4c9e 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -11,8 +11,33 @@ ij_formatter_off_tag = @formatter:off
ij_formatter_on_tag = @formatter:on
ij_formatter_tags_enabled = true
ij_smart_tabs = false
+ij_visual_guides =
ij_wrap_on_typing = false
+[*.css]
+ij_css_align_closing_brace_with_properties = false
+ij_css_blank_lines_around_nested_selector = 1
+ij_css_blank_lines_between_blocks = 1
+ij_css_block_comment_add_space = false
+ij_css_brace_placement = end_of_line
+ij_css_enforce_quotes_on_format = false
+ij_css_hex_color_long_format = false
+ij_css_hex_color_lower_case = false
+ij_css_hex_color_short_format = false
+ij_css_hex_color_upper_case = false
+ij_css_keep_blank_lines_in_code = 2
+ij_css_keep_indents_on_empty_lines = false
+ij_css_keep_single_line_blocks = false
+ij_css_properties_order = font,font-family,font-size,font-weight,font-style,font-variant,font-size-adjust,font-stretch,line-height,position,z-index,top,right,bottom,left,display,visibility,float,clear,overflow,overflow-x,overflow-y,clip,zoom,align-content,align-items,align-self,flex,flex-flow,flex-basis,flex-direction,flex-grow,flex-shrink,flex-wrap,justify-content,order,box-sizing,width,min-width,max-width,height,min-height,max-height,margin,margin-top,margin-right,margin-bottom,margin-left,padding,padding-top,padding-right,padding-bottom,padding-left,table-layout,empty-cells,caption-side,border-spacing,border-collapse,list-style,list-style-position,list-style-type,list-style-image,content,quotes,counter-reset,counter-increment,resize,cursor,user-select,nav-index,nav-up,nav-right,nav-down,nav-left,transition,transition-delay,transition-timing-function,transition-duration,transition-property,transform,transform-origin,animation,animation-name,animation-duration,animation-play-state,animation-timing-function,animation-delay,animation-iteration-count,animation-direction,text-align,text-align-last,vertical-align,white-space,text-decoration,text-emphasis,text-emphasis-color,text-emphasis-style,text-emphasis-position,text-indent,text-justify,letter-spacing,word-spacing,text-outline,text-transform,text-wrap,text-overflow,text-overflow-ellipsis,text-overflow-mode,word-wrap,word-break,tab-size,hyphens,pointer-events,opacity,color,border,border-width,border-style,border-color,border-top,border-top-width,border-top-style,border-top-color,border-right,border-right-width,border-right-style,border-right-color,border-bottom,border-bottom-width,border-bottom-style,border-bottom-color,border-left,border-left-width,border-left-style,border-left-color,border-radius,border-top-left-radius,border-top-right-radius,border-bottom-right-radius,border-bottom-left-radius,border-image,border-image-source,border-image-slice,border-image-width,border-image-outset,border-image-repeat,outline,outline-width,outline-style,outline-color,outline-offset,background,background-color,background-image,background-repeat,background-attachment,background-position,background-position-x,background-position-y,background-clip,background-origin,background-size,box-decoration-break,box-shadow,text-shadow
+ij_css_space_after_colon = true
+ij_css_space_before_opening_brace = true
+ij_css_use_double_quotes = true
+ij_css_value_alignment = do_not_align
+
+[*.feature]
+indent_size = 2
+ij_gherkin_keep_indents_on_empty_lines = false
+
[*.java]
ij_java_align_consecutive_assignments = false
ij_java_align_consecutive_variable_declarations = false
@@ -22,17 +47,21 @@ ij_java_align_multiline_array_initializer_expression = false
ij_java_align_multiline_assignment = false
ij_java_align_multiline_binary_operation = false
ij_java_align_multiline_chained_methods = false
+ij_java_align_multiline_deconstruction_list_components = false
ij_java_align_multiline_extends_list = false
ij_java_align_multiline_for = false
ij_java_align_multiline_method_parentheses = false
ij_java_align_multiline_parameters = false
ij_java_align_multiline_parameters_in_calls = false
ij_java_align_multiline_parenthesized_expression = false
+ij_java_align_multiline_records = false
ij_java_align_multiline_resources = false
ij_java_align_multiline_ternary_operation = false
+ij_java_align_multiline_text_blocks = false
ij_java_align_multiline_throws_list = false
ij_java_align_subsequent_simple_methods = false
ij_java_align_throws_keyword = false
+ij_java_align_types_in_multi_catch = false
ij_java_annotation_parameter_wrap = normal
ij_java_array_initializer_new_line_after_left_brace = false
ij_java_array_initializer_right_brace_on_new_line = false
@@ -57,18 +86,22 @@ ij_java_blank_lines_before_imports = 1
ij_java_blank_lines_before_method_body = 0
ij_java_blank_lines_before_package = 0
ij_java_block_brace_style = end_of_line
+ij_java_block_comment_add_space = false
ij_java_block_comment_at_first_column = true
+ij_java_builder_methods =
ij_java_call_parameters_new_line_after_left_paren = false
ij_java_call_parameters_right_paren_on_new_line = false
ij_java_call_parameters_wrap = normal
ij_java_case_statement_on_separate_line = true
ij_java_catch_on_new_line = false
-ij_java_class_annotation_wrap = split_into_lines
+ij_java_class_annotation_wrap = normal
ij_java_class_brace_style = end_of_line
-ij_java_class_count_to_use_import_on_demand = 20
-ij_java_class_names_in_javadoc = 1
+ij_java_class_count_to_use_import_on_demand = 999
+ij_java_class_names_in_javadoc = 3
+ij_java_deconstruction_list_wrap = normal
ij_java_do_not_indent_top_level_class_members = false
ij_java_do_not_wrap_after_single_annotation = false
+ij_java_do_not_wrap_after_single_annotation_in_parameter = false
ij_java_do_while_brace_force = always
ij_java_doc_add_blank_line_after_description = true
ij_java_doc_add_blank_line_after_param_comments = true
@@ -76,7 +109,7 @@ ij_java_doc_add_blank_line_after_return = true
ij_java_doc_add_p_tag_on_empty_lines = true
ij_java_doc_align_exception_comments = true
ij_java_doc_align_param_comments = true
-ij_java_doc_do_not_wrap_if_one_line = true
+ij_java_doc_do_not_wrap_if_one_line = false
ij_java_doc_enable_formatting = true
ij_java_doc_enable_leading_asterisks = true
ij_java_doc_indent_on_continuation = false
@@ -89,10 +122,31 @@ ij_java_doc_param_description_on_new_line = false
ij_java_doc_preserve_line_breaks = false
ij_java_doc_use_throws_not_exception_tag = true
ij_java_else_on_new_line = false
-ij_java_enum_constants_wrap = normal
+ij_java_entity_dd_prefix =
+ij_java_entity_dd_suffix = EJB
+ij_java_entity_eb_prefix =
+ij_java_entity_eb_suffix = Bean
+ij_java_entity_hi_prefix =
+ij_java_entity_hi_suffix = Home
+ij_java_entity_lhi_prefix = Local
+ij_java_entity_lhi_suffix = Home
+ij_java_entity_li_prefix = Local
+ij_java_entity_li_suffix =
+ij_java_entity_pk_class = java.lang.String
+ij_java_entity_ri_prefix =
+ij_java_entity_ri_suffix =
+ij_java_entity_vo_prefix =
+ij_java_entity_vo_suffix = VO
+ij_java_enum_constants_wrap = split_into_lines
ij_java_extends_keyword_wrap = normal
ij_java_extends_list_wrap = normal
-ij_java_field_annotation_wrap = split_into_lines
+ij_java_field_annotation_wrap = normal
+ij_java_field_name_prefix =
+ij_java_field_name_suffix =
+ij_java_filter_class_prefix =
+ij_java_filter_class_suffix =
+ij_java_filter_dd_prefix =
+ij_java_filter_dd_suffix =
ij_java_finally_on_new_line = false
ij_java_for_brace_force = always
ij_java_for_statement_new_line_after_left_paren = false
@@ -109,6 +163,7 @@ ij_java_keep_blank_lines_before_right_brace = 1
ij_java_keep_blank_lines_between_package_declaration_and_header = 1
ij_java_keep_blank_lines_in_code = 1
ij_java_keep_blank_lines_in_declarations = 1
+ij_java_keep_builder_methods_indents = false
ij_java_keep_control_statement_in_one_line = true
ij_java_keep_first_column_comment = true
ij_java_keep_indents_on_empty_lines = false
@@ -118,24 +173,44 @@ ij_java_keep_simple_blocks_in_one_line = true
ij_java_keep_simple_classes_in_one_line = true
ij_java_keep_simple_lambdas_in_one_line = true
ij_java_keep_simple_methods_in_one_line = true
+ij_java_label_indent_absolute = false
+ij_java_label_indent_size = 0
ij_java_lambda_brace_style = end_of_line
ij_java_layout_static_imports_separately = true
-ij_java_line_comment_add_space = true
-ij_java_line_comment_at_first_column = false
-ij_java_method_annotation_wrap = split_into_lines
+ij_java_line_comment_add_space = false
+ij_java_line_comment_add_space_on_reformat = false
+ij_java_line_comment_at_first_column = true
+ij_java_listener_class_prefix =
+ij_java_listener_class_suffix =
+ij_java_local_variable_name_prefix =
+ij_java_local_variable_name_suffix =
+ij_java_message_dd_prefix =
+ij_java_message_dd_suffix = EJB
+ij_java_message_eb_prefix =
+ij_java_message_eb_suffix = Bean
+ij_java_method_annotation_wrap = normal
ij_java_method_brace_style = end_of_line
ij_java_method_call_chain_wrap = normal
ij_java_method_parameters_new_line_after_left_paren = false
ij_java_method_parameters_right_paren_on_new_line = false
ij_java_method_parameters_wrap = normal
ij_java_modifier_list_wrap = false
-ij_java_names_count_to_use_import_on_demand = 20
+ij_java_multi_catch_types_wrap = normal
+ij_java_names_count_to_use_import_on_demand = 999
+ij_java_new_line_after_lparen_in_annotation = false
+ij_java_new_line_after_lparen_in_deconstruction_pattern = false
+ij_java_new_line_after_lparen_in_record_header = false
+ij_java_packages_to_use_import_on_demand =
ij_java_parameter_annotation_wrap = normal
+ij_java_parameter_name_prefix =
+ij_java_parameter_name_suffix =
ij_java_parentheses_expression_new_line_after_left_paren = false
ij_java_parentheses_expression_right_paren_on_new_line = false
ij_java_place_assignment_sign_on_next_line = false
ij_java_prefer_longer_names = true
ij_java_prefer_parameters_wrap = false
+ij_java_record_components_wrap = normal
+ij_java_repeat_annotations =
ij_java_repeat_synchronized = true
ij_java_replace_instanceof_and_cast = false
ij_java_replace_null_check = true
@@ -143,6 +218,27 @@ ij_java_replace_sum_lambda_with_method_ref = true
ij_java_resource_list_new_line_after_left_paren = false
ij_java_resource_list_right_paren_on_new_line = false
ij_java_resource_list_wrap = normal
+ij_java_rparen_on_new_line_in_annotation = false
+ij_java_rparen_on_new_line_in_deconstruction_pattern = false
+ij_java_rparen_on_new_line_in_record_header = false
+ij_java_servlet_class_prefix =
+ij_java_servlet_class_suffix =
+ij_java_servlet_dd_prefix =
+ij_java_servlet_dd_suffix =
+ij_java_session_dd_prefix =
+ij_java_session_dd_suffix = EJB
+ij_java_session_eb_prefix =
+ij_java_session_eb_suffix = Bean
+ij_java_session_hi_prefix =
+ij_java_session_hi_suffix = Home
+ij_java_session_lhi_prefix = Local
+ij_java_session_lhi_suffix = Home
+ij_java_session_li_prefix = Local
+ij_java_session_li_suffix =
+ij_java_session_ri_prefix =
+ij_java_session_ri_suffix =
+ij_java_session_si_prefix =
+ij_java_session_si_suffix = Service
ij_java_space_after_closing_angle_bracket_in_type_argument = false
ij_java_space_after_colon = true
ij_java_space_after_comma = true
@@ -160,6 +256,7 @@ ij_java_space_before_class_left_brace = true
ij_java_space_before_colon = true
ij_java_space_before_colon_in_foreach = true
ij_java_space_before_comma = false
+ij_java_space_before_deconstruction_list = false
ij_java_space_before_do_left_brace = true
ij_java_space_before_else_keyword = true
ij_java_space_before_else_left_brace = true
@@ -190,6 +287,7 @@ ij_java_space_within_empty_array_initializer_braces = false
ij_java_space_within_empty_method_call_parentheses = false
ij_java_space_within_empty_method_parentheses = false
ij_java_spaces_around_additive_operators = true
+ij_java_spaces_around_annotation_eq = true
ij_java_spaces_around_assignment_operators = true
ij_java_spaces_around_bitwise_operators = true
ij_java_spaces_around_equality_operators = true
@@ -208,24 +306,31 @@ ij_java_spaces_within_braces = false
ij_java_spaces_within_brackets = false
ij_java_spaces_within_cast_parentheses = false
ij_java_spaces_within_catch_parentheses = false
+ij_java_spaces_within_deconstruction_list = false
ij_java_spaces_within_for_parentheses = false
ij_java_spaces_within_if_parentheses = false
ij_java_spaces_within_method_call_parentheses = false
ij_java_spaces_within_method_parentheses = false
ij_java_spaces_within_parentheses = false
+ij_java_spaces_within_record_header = false
ij_java_spaces_within_switch_parentheses = false
ij_java_spaces_within_synchronized_parentheses = false
ij_java_spaces_within_try_parentheses = false
ij_java_spaces_within_while_parentheses = false
ij_java_special_else_if_treatment = true
+ij_java_static_field_name_prefix =
+ij_java_static_field_name_suffix =
+ij_java_subclass_name_prefix =
ij_java_subclass_name_suffix = Impl
ij_java_ternary_operation_signs_on_next_line = false
ij_java_ternary_operation_wrap = normal
+ij_java_test_name_prefix =
ij_java_test_name_suffix = Test
ij_java_throws_keyword_wrap = normal
ij_java_throws_list_wrap = normal
ij_java_use_external_annotations = false
ij_java_use_fq_class_names = false
+ij_java_use_relative_indents = false
ij_java_use_single_class_imports = true
ij_java_variable_annotation_wrap = normal
ij_java_visibility = public
@@ -233,209 +338,99 @@ ij_java_while_brace_force = always
ij_java_while_on_new_line = false
ij_java_wrap_comments = true
ij_java_wrap_first_method_in_call_chain = false
-ij_java_wrap_long_lines = true
+ij_java_wrap_long_lines = false
-[*.json]
+[*.less]
indent_size = 2
-ij_json_keep_blank_lines_in_code = 0
-ij_json_keep_indents_on_empty_lines = false
-ij_json_keep_line_breaks = true
-ij_json_space_after_colon = true
-ij_json_space_after_comma = true
-ij_json_space_before_colon = true
-ij_json_space_before_comma = false
-ij_json_spaces_within_braces = false
-ij_json_spaces_within_brackets = false
-ij_json_wrap_long_lines = false
+ij_less_align_closing_brace_with_properties = false
+ij_less_blank_lines_around_nested_selector = 1
+ij_less_blank_lines_between_blocks = 1
+ij_less_block_comment_add_space = false
+ij_less_brace_placement = 0
+ij_less_enforce_quotes_on_format = false
+ij_less_hex_color_long_format = false
+ij_less_hex_color_lower_case = false
+ij_less_hex_color_short_format = false
+ij_less_hex_color_upper_case = false
+ij_less_keep_blank_lines_in_code = 2
+ij_less_keep_indents_on_empty_lines = false
+ij_less_keep_single_line_blocks = false
+ij_less_line_comment_add_space = false
+ij_less_line_comment_at_first_column = false
+ij_less_properties_order = font,font-family,font-size,font-weight,font-style,font-variant,font-size-adjust,font-stretch,line-height,position,z-index,top,right,bottom,left,display,visibility,float,clear,overflow,overflow-x,overflow-y,clip,zoom,align-content,align-items,align-self,flex,flex-flow,flex-basis,flex-direction,flex-grow,flex-shrink,flex-wrap,justify-content,order,box-sizing,width,min-width,max-width,height,min-height,max-height,margin,margin-top,margin-right,margin-bottom,margin-left,padding,padding-top,padding-right,padding-bottom,padding-left,table-layout,empty-cells,caption-side,border-spacing,border-collapse,list-style,list-style-position,list-style-type,list-style-image,content,quotes,counter-reset,counter-increment,resize,cursor,user-select,nav-index,nav-up,nav-right,nav-down,nav-left,transition,transition-delay,transition-timing-function,transition-duration,transition-property,transform,transform-origin,animation,animation-name,animation-duration,animation-play-state,animation-timing-function,animation-delay,animation-iteration-count,animation-direction,text-align,text-align-last,vertical-align,white-space,text-decoration,text-emphasis,text-emphasis-color,text-emphasis-style,text-emphasis-position,text-indent,text-justify,letter-spacing,word-spacing,text-outline,text-transform,text-wrap,text-overflow,text-overflow-ellipsis,text-overflow-mode,word-wrap,word-break,tab-size,hyphens,pointer-events,opacity,color,border,border-width,border-style,border-color,border-top,border-top-width,border-top-style,border-top-color,border-right,border-right-width,border-right-style,border-right-color,border-bottom,border-bottom-width,border-bottom-style,border-bottom-color,border-left,border-left-width,border-left-style,border-left-color,border-radius,border-top-left-radius,border-top-right-radius,border-bottom-right-radius,border-bottom-left-radius,border-image,border-image-source,border-image-slice,border-image-width,border-image-outset,border-image-repeat,outline,outline-width,outline-style,outline-color,outline-offset,background,background-color,background-image,background-repeat,background-attachment,background-position,background-position-x,background-position-y,background-clip,background-origin,background-size,box-decoration-break,box-shadow,text-shadow
+ij_less_space_after_colon = true
+ij_less_space_before_opening_brace = true
+ij_less_use_double_quotes = true
+ij_less_value_alignment = 0
-[*.properties]
-ij_properties_align_group_field_declarations = false
+[*.proto]
+indent_size = 2
+tab_width = 2
+ij_continuation_indent_size = 4
+ij_protobuf_keep_blank_lines_in_code = 2
+ij_protobuf_keep_indents_on_empty_lines = false
+ij_protobuf_keep_line_breaks = true
+ij_protobuf_space_after_comma = true
+ij_protobuf_space_before_comma = false
+ij_protobuf_spaces_around_assignment_operators = true
+ij_protobuf_spaces_within_braces = false
+ij_protobuf_spaces_within_brackets = false
-[*.scala]
+[*.sass]
+indent_size = 2
+ij_sass_align_closing_brace_with_properties = false
+ij_sass_blank_lines_around_nested_selector = 1
+ij_sass_blank_lines_between_blocks = 1
+ij_sass_brace_placement = 0
+ij_sass_enforce_quotes_on_format = false
+ij_sass_hex_color_long_format = false
+ij_sass_hex_color_lower_case = false
+ij_sass_hex_color_short_format = false
+ij_sass_hex_color_upper_case = false
+ij_sass_keep_blank_lines_in_code = 2
+ij_sass_keep_indents_on_empty_lines = false
+ij_sass_keep_single_line_blocks = false
+ij_sass_line_comment_add_space = false
+ij_sass_line_comment_at_first_column = false
+ij_sass_properties_order = font,font-family,font-size,font-weight,font-style,font-variant,font-size-adjust,font-stretch,line-height,position,z-index,top,right,bottom,left,display,visibility,float,clear,overflow,overflow-x,overflow-y,clip,zoom,align-content,align-items,align-self,flex,flex-flow,flex-basis,flex-direction,flex-grow,flex-shrink,flex-wrap,justify-content,order,box-sizing,width,min-width,max-width,height,min-height,max-height,margin,margin-top,margin-right,margin-bottom,margin-left,padding,padding-top,padding-right,padding-bottom,padding-left,table-layout,empty-cells,caption-side,border-spacing,border-collapse,list-style,list-style-position,list-style-type,list-style-image,content,quotes,counter-reset,counter-increment,resize,cursor,user-select,nav-index,nav-up,nav-right,nav-down,nav-left,transition,transition-delay,transition-timing-function,transition-duration,transition-property,transform,transform-origin,animation,animation-name,animation-duration,animation-play-state,animation-timing-function,animation-delay,animation-iteration-count,animation-direction,text-align,text-align-last,vertical-align,white-space,text-decoration,text-emphasis,text-emphasis-color,text-emphasis-style,text-emphasis-position,text-indent,text-justify,letter-spacing,word-spacing,text-outline,text-transform,text-wrap,text-overflow,text-overflow-ellipsis,text-overflow-mode,word-wrap,word-break,tab-size,hyphens,pointer-events,opacity,color,border,border-width,border-style,border-color,border-top,border-top-width,border-top-style,border-top-color,border-right,border-right-width,border-right-style,border-right-color,border-bottom,border-bottom-width,border-bottom-style,border-bottom-color,border-left,border-left-width,border-left-style,border-left-color,border-radius,border-top-left-radius,border-top-right-radius,border-bottom-right-radius,border-bottom-left-radius,border-image,border-image-source,border-image-slice,border-image-width,border-image-outset,border-image-repeat,outline,outline-width,outline-style,outline-color,outline-offset,background,background-color,background-image,background-repeat,background-attachment,background-position,background-position-x,background-position-y,background-clip,background-origin,background-size,box-decoration-break,box-shadow,text-shadow
+ij_sass_space_after_colon = true
+ij_sass_space_before_opening_brace = true
+ij_sass_use_double_quotes = true
+ij_sass_value_alignment = 0
+
+[*.scss]
+indent_size = 2
+ij_scss_align_closing_brace_with_properties = false
+ij_scss_blank_lines_around_nested_selector = 1
+ij_scss_blank_lines_between_blocks = 1
+ij_scss_block_comment_add_space = false
+ij_scss_brace_placement = 0
+ij_scss_enforce_quotes_on_format = false
+ij_scss_hex_color_long_format = false
+ij_scss_hex_color_lower_case = false
+ij_scss_hex_color_short_format = false
+ij_scss_hex_color_upper_case = false
+ij_scss_keep_blank_lines_in_code = 2
+ij_scss_keep_indents_on_empty_lines = false
+ij_scss_keep_single_line_blocks = false
+ij_scss_line_comment_add_space = false
+ij_scss_line_comment_at_first_column = false
+ij_scss_properties_order = font,font-family,font-size,font-weight,font-style,font-variant,font-size-adjust,font-stretch,line-height,position,z-index,top,right,bottom,left,display,visibility,float,clear,overflow,overflow-x,overflow-y,clip,zoom,align-content,align-items,align-self,flex,flex-flow,flex-basis,flex-direction,flex-grow,flex-shrink,flex-wrap,justify-content,order,box-sizing,width,min-width,max-width,height,min-height,max-height,margin,margin-top,margin-right,margin-bottom,margin-left,padding,padding-top,padding-right,padding-bottom,padding-left,table-layout,empty-cells,caption-side,border-spacing,border-collapse,list-style,list-style-position,list-style-type,list-style-image,content,quotes,counter-reset,counter-increment,resize,cursor,user-select,nav-index,nav-up,nav-right,nav-down,nav-left,transition,transition-delay,transition-timing-function,transition-duration,transition-property,transform,transform-origin,animation,animation-name,animation-duration,animation-play-state,animation-timing-function,animation-delay,animation-iteration-count,animation-direction,text-align,text-align-last,vertical-align,white-space,text-decoration,text-emphasis,text-emphasis-color,text-emphasis-style,text-emphasis-position,text-indent,text-justify,letter-spacing,word-spacing,text-outline,text-transform,text-wrap,text-overflow,text-overflow-ellipsis,text-overflow-mode,word-wrap,word-break,tab-size,hyphens,pointer-events,opacity,color,border,border-width,border-style,border-color,border-top,border-top-width,border-top-style,border-top-color,border-right,border-right-width,border-right-style,border-right-color,border-bottom,border-bottom-width,border-bottom-style,border-bottom-color,border-left,border-left-width,border-left-style,border-left-color,border-radius,border-top-left-radius,border-top-right-radius,border-bottom-right-radius,border-bottom-left-radius,border-image,border-image-source,border-image-slice,border-image-width,border-image-outset,border-image-repeat,outline,outline-width,outline-style,outline-color,outline-offset,background,background-color,background-image,background-repeat,background-attachment,background-position,background-position-x,background-position-y,background-clip,background-origin,background-size,box-decoration-break,box-shadow,text-shadow
+ij_scss_space_after_colon = true
+ij_scss_space_before_opening_brace = true
+ij_scss_use_double_quotes = true
+ij_scss_value_alignment = 0
+
+[*.vue]
indent_size = 2
tab_width = 2
-ij_continuation_indent_size = 2
-ij_scala_align_composite_pattern = true
-ij_scala_align_extends_with = 0
-ij_scala_align_group_field_declarations = false
-ij_scala_align_if_else = false
-ij_scala_align_in_columns_case_branch = false
-ij_scala_align_multiline_binary_operation = false
-ij_scala_align_multiline_chained_methods = false
-ij_scala_align_multiline_for = true
-ij_scala_align_multiline_parameters = true
-ij_scala_align_multiline_parameters_in_calls = false
-ij_scala_align_multiline_parenthesized_expression = false
-ij_scala_align_tuple_elements = false
-ij_scala_align_types_in_multiline_declarations = false
-ij_scala_all_other_imports = all other imports
-ij_scala_alternate_continuation_indent_for_params = 4
-ij_scala_binary_operation_wrap = off
-ij_scala_blank_line = _______ blank line _______
-ij_scala_blank_lines_after_anonymous_class_header = 0
-ij_scala_blank_lines_after_class_header = 0
-ij_scala_blank_lines_after_imports = 1
-ij_scala_blank_lines_after_package = 1
-ij_scala_blank_lines_around_class = 1
-ij_scala_blank_lines_around_field = 0
-ij_scala_blank_lines_around_field_in_inner_scopes = 0
-ij_scala_blank_lines_around_field_in_interface = 0
-ij_scala_blank_lines_around_method = 1
-ij_scala_blank_lines_around_method_in_inner_scopes = 1
-ij_scala_blank_lines_around_method_in_interface = 1
-ij_scala_blank_lines_before_imports = 1
-ij_scala_blank_lines_before_method_body = 0
-ij_scala_blank_lines_before_package = 0
-ij_scala_block_brace_style = end_of_line
-ij_scala_block_comment_at_first_column = true
-ij_scala_call_parameters_new_line_after_lparen = 0
-ij_scala_call_parameters_right_paren_on_new_line = false
-ij_scala_call_parameters_wrap = off
-ij_scala_case_clause_brace_force = never
-ij_scala_catch_on_new_line = false
-ij_scala_class_annotation_wrap = split_into_lines
-ij_scala_class_brace_style = end_of_line
-ij_scala_closure_brace_force = never
-ij_scala_do_not_align_block_expr_params = true
-ij_scala_do_not_indent_case_clause_body = false
-ij_scala_do_not_indent_tuples_close_brace = true
-ij_scala_do_while_brace_force = never
-ij_scala_else_on_new_line = false
-ij_scala_enable_scaladoc_formatting = true
-ij_scala_enforce_functional_syntax_for_unit = true
-ij_scala_exclude_prefix = exclude:
-ij_scala_extends_keyword_wrap = off
-ij_scala_extends_list_wrap = off
-ij_scala_field_annotation_wrap = split_into_lines
-ij_scala_finally_brace_force = never
-ij_scala_finally_on_new_line = false
-ij_scala_for_brace_force = never
-ij_scala_for_statement_wrap = off
-ij_scala_formatter = 0
-ij_scala_if_brace_force = never
-ij_scala_indent_braced_function_args = true
-ij_scala_indent_case_from_switch = true
-ij_scala_indent_first_parameter = true
-ij_scala_indent_first_parameter_clause = false
-ij_scala_indent_type_arguments = true
-ij_scala_indent_type_parameters = true
-ij_scala_insert_whitespaces_in_simple_one_line_method = true
-ij_scala_keep_blank_lines_before_right_brace = 2
-ij_scala_keep_blank_lines_in_code = 2
-ij_scala_keep_blank_lines_in_declarations = 2
-ij_scala_keep_comments_on_same_line = true
-ij_scala_keep_first_column_comment = false
-ij_scala_keep_indents_on_empty_lines = false
-ij_scala_keep_line_breaks = true
-ij_scala_keep_one_line_lambdas_in_arg_list = false
-ij_scala_keep_simple_blocks_in_one_line = false
-ij_scala_keep_simple_methods_in_one_line = false
-ij_scala_keep_xml_formatting = false
-ij_scala_line_comment_at_first_column = true
-ij_scala_method_annotation_wrap = split_into_lines
-ij_scala_method_brace_force = never
-ij_scala_method_brace_style = end_of_line
-ij_scala_method_call_chain_wrap = off
-ij_scala_method_parameters_new_line_after_left_paren = false
-ij_scala_method_parameters_right_paren_on_new_line = false
-ij_scala_method_parameters_wrap = off
-ij_scala_modifier_list_wrap = false
-ij_scala_multiline_string_align_dangling_closing_quotes = false
-ij_scala_multiline_string_closing_quotes_on_new_line = true
-ij_scala_multiline_string_insert_margin_on_enter = true
-ij_scala_multiline_string_margin_char = |
-ij_scala_multiline_string_margin_indent = 2
-ij_scala_multiline_string_opening_quotes_on_new_line = true
-ij_scala_multiline_string_process_margin_on_copy_paste = true
-ij_scala_newline_after_annotations = false
-ij_scala_not_continuation_indent_for_params = false
-ij_scala_parameter_annotation_wrap = off
-ij_scala_parentheses_expression_new_line_after_left_paren = false
-ij_scala_parentheses_expression_right_paren_on_new_line = false
-ij_scala_place_closure_parameters_on_new_line = false
-ij_scala_place_self_type_on_new_line = true
-ij_scala_prefer_parameters_wrap = false
-ij_scala_preserve_space_after_method_declaration_name = false
-ij_scala_reformat_on_compile = false
-ij_scala_replace_case_arrow_with_unicode_char = false
-ij_scala_replace_for_generator_arrow_with_unicode_char = false
-ij_scala_replace_lambda_with_greek_letter = false
-ij_scala_replace_map_arrow_with_unicode_char = false
-ij_scala_scalafmt_reformat_on_files_save = false
-ij_scala_scalafmt_show_invalid_code_warnings = true
-ij_scala_scalafmt_use_intellij_formatter_for_range_format = true
-ij_scala_sd_align_exception_comments = true
-ij_scala_sd_align_other_tags_comments = true
-ij_scala_sd_align_parameters_comments = true
-ij_scala_sd_align_return_comments = true
-ij_scala_sd_blank_line_after_parameters_comments = false
-ij_scala_sd_blank_line_after_return_comments = false
-ij_scala_sd_blank_line_before_parameters = false
-ij_scala_sd_blank_line_before_tags = true
-ij_scala_sd_blank_line_between_parameters = false
-ij_scala_sd_keep_blank_lines_between_tags = false
-ij_scala_sd_preserve_spaces_in_tags = false
-ij_scala_space_after_comma = true
-ij_scala_space_after_for_semicolon = true
-ij_scala_space_after_modifiers_constructor = false
-ij_scala_space_after_type_colon = true
-ij_scala_space_before_brace_method_call = true
-ij_scala_space_before_class_left_brace = true
-ij_scala_space_before_infix_like_method_parentheses = false
-ij_scala_space_before_infix_method_call_parentheses = false
-ij_scala_space_before_infix_operator_like_method_call_parentheses = true
-ij_scala_space_before_method_call_parentheses = false
-ij_scala_space_before_method_left_brace = true
-ij_scala_space_before_method_parentheses = false
-ij_scala_space_before_type_colon = false
-ij_scala_space_before_type_parameter_in_def_list = false
-ij_scala_space_before_type_parameter_list = false
-ij_scala_space_inside_closure_braces = true
-ij_scala_space_inside_self_type_braces = true
-ij_scala_space_within_empty_method_call_parentheses = false
-ij_scala_spaces_around_at_in_patterns = false
-ij_scala_spaces_in_imports = false
-ij_scala_spaces_in_one_line_blocks = false
-ij_scala_spaces_within_brackets = false
-ij_scala_spaces_within_for_parentheses = false
-ij_scala_spaces_within_if_parentheses = false
-ij_scala_spaces_within_method_call_parentheses = false
-ij_scala_spaces_within_method_parentheses = false
-ij_scala_spaces_within_parentheses = false
-ij_scala_spaces_within_while_parentheses = false
-ij_scala_special_else_if_treatment = true
-ij_scala_trailing_comma_arg_list_enabled = true
-ij_scala_trailing_comma_import_selector_enabled = false
-ij_scala_trailing_comma_mode = trailing_comma_keep
-ij_scala_trailing_comma_params_enabled = true
-ij_scala_trailing_comma_pattern_arg_list_enabled = false
-ij_scala_trailing_comma_tuple_enabled = false
-ij_scala_trailing_comma_tuple_type_enabled = false
-ij_scala_trailing_comma_type_params_enabled = false
-ij_scala_try_brace_force = never
-ij_scala_type_annotation_exclude_constant = true
-ij_scala_type_annotation_exclude_in_dialect_sources = true
-ij_scala_type_annotation_exclude_in_test_sources = false
-ij_scala_type_annotation_exclude_member_of_anonymous_class = false
-ij_scala_type_annotation_exclude_member_of_private_class = false
-ij_scala_type_annotation_exclude_when_type_is_stable = true
-ij_scala_type_annotation_function_parameter = false
-ij_scala_type_annotation_implicit_modifier = true
-ij_scala_type_annotation_local_definition = false
-ij_scala_type_annotation_private_member = false
-ij_scala_type_annotation_protected_member = true
-ij_scala_type_annotation_public_member = true
-ij_scala_type_annotation_structural_type = true
-ij_scala_type_annotation_underscore_parameter = false
-ij_scala_type_annotation_unit_type = true
-ij_scala_use_alternate_continuation_indent_for_params = false
-ij_scala_use_scaladoc2_formatting = false
-ij_scala_variable_annotation_wrap = off
-ij_scala_while_brace_force = never
-ij_scala_while_on_new_line = false
-ij_scala_wrap_before_with_keyword = false
-ij_scala_wrap_first_method_in_call_chain = false
-ij_scala_wrap_long_lines = false
+ij_continuation_indent_size = 4
+ij_vue_indent_children_of_top_level = template
+ij_vue_interpolation_new_line_after_start_delimiter = true
+ij_vue_interpolation_new_line_before_end_delimiter = true
+ij_vue_interpolation_wrap = off
+ij_vue_keep_indents_on_empty_lines = false
+ij_vue_spaces_within_interpolation_expressions = true
[.editorconfig]
ij_editorconfig_align_group_field_declarations = false
@@ -445,27 +440,402 @@ ij_editorconfig_space_before_colon = false
ij_editorconfig_space_before_comma = false
ij_editorconfig_spaces_around_assignment_operators = true
-[{*.gant,*.groovy,*.gradle,*.gdsl,*.gy}]
+[{*.ant,*.fxml,*.jhm,*.jnlp,*.jrxml,*.pom,*.rng,*.tld,*.wadl,*.wsdl,*.xml,*.xsd,*.xsl,*.xslt,*.xul}]
+ij_xml_align_attributes = true
+ij_xml_align_text = false
+ij_xml_attribute_wrap = normal
+ij_xml_block_comment_add_space = false
+ij_xml_block_comment_at_first_column = true
+ij_xml_keep_blank_lines = 2
+ij_xml_keep_indents_on_empty_lines = false
+ij_xml_keep_line_breaks = true
+ij_xml_keep_line_breaks_in_text = true
+ij_xml_keep_whitespaces = false
+ij_xml_keep_whitespaces_around_cdata = preserve
+ij_xml_keep_whitespaces_inside_cdata = false
+ij_xml_line_comment_at_first_column = true
+ij_xml_space_after_tag_name = false
+ij_xml_space_around_equals_in_attribute = false
+ij_xml_space_inside_empty_tag = false
+ij_xml_text_wrap = normal
+ij_xml_use_custom_settings = false
+
+[{*.ats,*.cts,*.mts,*.ts}]
+ij_typescript_align_imports = false
+ij_typescript_align_multiline_array_initializer_expression = false
+ij_typescript_align_multiline_binary_operation = false
+ij_typescript_align_multiline_chained_methods = false
+ij_typescript_align_multiline_extends_list = false
+ij_typescript_align_multiline_for = false
+ij_typescript_align_multiline_parameters = false
+ij_typescript_align_multiline_parameters_in_calls = false
+ij_typescript_align_multiline_ternary_operation = false
+ij_typescript_align_object_properties = 0
+ij_typescript_align_union_types = false
+ij_typescript_align_var_statements = 0
+ij_typescript_array_initializer_new_line_after_left_brace = false
+ij_typescript_array_initializer_right_brace_on_new_line = false
+ij_typescript_array_initializer_wrap = normal
+ij_typescript_assignment_wrap = normal
+ij_typescript_binary_operation_sign_on_next_line = false
+ij_typescript_binary_operation_wrap = normal
+ij_typescript_blacklist_imports = rxjs/Rx,node_modules/**,**/node_modules/**,@angular/material,@angular/material/typings/**
+ij_typescript_blank_lines_after_imports = 1
+ij_typescript_blank_lines_around_class = 1
+ij_typescript_blank_lines_around_field = 0
+ij_typescript_blank_lines_around_field_in_interface = 0
+ij_typescript_blank_lines_around_function = 1
+ij_typescript_blank_lines_around_method = 1
+ij_typescript_blank_lines_around_method_in_interface = 1
+ij_typescript_block_brace_style = end_of_line
+ij_typescript_block_comment_add_space = false
+ij_typescript_block_comment_at_first_column = true
+ij_typescript_call_parameters_new_line_after_left_paren = false
+ij_typescript_call_parameters_right_paren_on_new_line = false
+ij_typescript_call_parameters_wrap = normal
+ij_typescript_catch_on_new_line = false
+ij_typescript_chained_call_dot_on_new_line = true
+ij_typescript_class_brace_style = end_of_line
+ij_typescript_comma_on_new_line = false
+ij_typescript_do_while_brace_force = always
+ij_typescript_else_on_new_line = false
+ij_typescript_enforce_trailing_comma = remove
+ij_typescript_enum_constants_wrap = split_into_lines
+ij_typescript_extends_keyword_wrap = normal
+ij_typescript_extends_list_wrap = normal
+ij_typescript_field_prefix = _
+ij_typescript_file_name_style = relaxed
+ij_typescript_finally_on_new_line = false
+ij_typescript_for_brace_force = always
+ij_typescript_for_statement_new_line_after_left_paren = false
+ij_typescript_for_statement_right_paren_on_new_line = false
+ij_typescript_for_statement_wrap = split_into_lines
+ij_typescript_force_quote_style = true
+ij_typescript_force_semicolon_style = true
+ij_typescript_function_expression_brace_style = end_of_line
+ij_typescript_if_brace_force = always
+ij_typescript_import_merge_members = global
+ij_typescript_import_prefer_absolute_path = global
+ij_typescript_import_sort_members = true
+ij_typescript_import_sort_module_name = false
+ij_typescript_import_use_node_resolution = true
+ij_typescript_imports_wrap = normal
+ij_typescript_indent_case_from_switch = true
+ij_typescript_indent_chained_calls = true
+ij_typescript_indent_package_children = 0
+ij_typescript_jsdoc_include_types = false
+ij_typescript_jsx_attribute_value = braces
+ij_typescript_keep_blank_lines_in_code = 1
+ij_typescript_keep_first_column_comment = true
+ij_typescript_keep_indents_on_empty_lines = false
+ij_typescript_keep_line_breaks = true
+ij_typescript_keep_simple_blocks_in_one_line = true
+ij_typescript_keep_simple_methods_in_one_line = true
+ij_typescript_line_comment_add_space = true
+ij_typescript_line_comment_at_first_column = false
+ij_typescript_method_brace_style = end_of_line
+ij_typescript_method_call_chain_wrap = normal
+ij_typescript_method_parameters_new_line_after_left_paren = false
+ij_typescript_method_parameters_right_paren_on_new_line = false
+ij_typescript_method_parameters_wrap = normal
+ij_typescript_object_literal_wrap = on_every_item
+ij_typescript_object_types_wrap = on_every_item
+ij_typescript_parentheses_expression_new_line_after_left_paren = false
+ij_typescript_parentheses_expression_right_paren_on_new_line = false
+ij_typescript_place_assignment_sign_on_next_line = false
+ij_typescript_prefer_as_type_cast = false
+ij_typescript_prefer_explicit_types_function_expression_returns = false
+ij_typescript_prefer_explicit_types_function_returns = false
+ij_typescript_prefer_explicit_types_vars_fields = false
+ij_typescript_prefer_parameters_wrap = false
+ij_typescript_property_prefix =
+ij_typescript_reformat_c_style_comments = false
+ij_typescript_space_after_colon = true
+ij_typescript_space_after_comma = true
+ij_typescript_space_after_dots_in_rest_parameter = false
+ij_typescript_space_after_generator_mult = true
+ij_typescript_space_after_property_colon = true
+ij_typescript_space_after_quest = true
+ij_typescript_space_after_type_colon = true
+ij_typescript_space_after_unary_not = false
+ij_typescript_space_before_async_arrow_lparen = true
+ij_typescript_space_before_catch_keyword = true
+ij_typescript_space_before_catch_left_brace = true
+ij_typescript_space_before_catch_parentheses = true
+ij_typescript_space_before_class_lbrace = true
+ij_typescript_space_before_class_left_brace = true
+ij_typescript_space_before_colon = true
+ij_typescript_space_before_comma = false
+ij_typescript_space_before_do_left_brace = true
+ij_typescript_space_before_else_keyword = true
+ij_typescript_space_before_else_left_brace = true
+ij_typescript_space_before_finally_keyword = true
+ij_typescript_space_before_finally_left_brace = true
+ij_typescript_space_before_for_left_brace = true
+ij_typescript_space_before_for_parentheses = true
+ij_typescript_space_before_for_semicolon = false
+ij_typescript_space_before_function_left_parenth = true
+ij_typescript_space_before_generator_mult = false
+ij_typescript_space_before_if_left_brace = true
+ij_typescript_space_before_if_parentheses = true
+ij_typescript_space_before_method_call_parentheses = false
+ij_typescript_space_before_method_left_brace = true
+ij_typescript_space_before_method_parentheses = false
+ij_typescript_space_before_property_colon = false
+ij_typescript_space_before_quest = true
+ij_typescript_space_before_switch_left_brace = true
+ij_typescript_space_before_switch_parentheses = true
+ij_typescript_space_before_try_left_brace = true
+ij_typescript_space_before_type_colon = false
+ij_typescript_space_before_unary_not = false
+ij_typescript_space_before_while_keyword = true
+ij_typescript_space_before_while_left_brace = true
+ij_typescript_space_before_while_parentheses = true
+ij_typescript_spaces_around_additive_operators = true
+ij_typescript_spaces_around_arrow_function_operator = true
+ij_typescript_spaces_around_assignment_operators = true
+ij_typescript_spaces_around_bitwise_operators = true
+ij_typescript_spaces_around_equality_operators = true
+ij_typescript_spaces_around_logical_operators = true
+ij_typescript_spaces_around_multiplicative_operators = true
+ij_typescript_spaces_around_relational_operators = true
+ij_typescript_spaces_around_shift_operators = true
+ij_typescript_spaces_around_unary_operator = false
+ij_typescript_spaces_within_array_initializer_brackets = false
+ij_typescript_spaces_within_brackets = false
+ij_typescript_spaces_within_catch_parentheses = false
+ij_typescript_spaces_within_for_parentheses = false
+ij_typescript_spaces_within_if_parentheses = false
+ij_typescript_spaces_within_imports = false
+ij_typescript_spaces_within_interpolation_expressions = false
+ij_typescript_spaces_within_method_call_parentheses = false
+ij_typescript_spaces_within_method_parentheses = false
+ij_typescript_spaces_within_object_literal_braces = false
+ij_typescript_spaces_within_object_type_braces = true
+ij_typescript_spaces_within_parentheses = false
+ij_typescript_spaces_within_switch_parentheses = false
+ij_typescript_spaces_within_type_assertion = false
+ij_typescript_spaces_within_union_types = true
+ij_typescript_spaces_within_while_parentheses = false
+ij_typescript_special_else_if_treatment = true
+ij_typescript_ternary_operation_signs_on_next_line = false
+ij_typescript_ternary_operation_wrap = normal
+ij_typescript_union_types_wrap = on_every_item
+ij_typescript_use_chained_calls_group_indents = false
+ij_typescript_use_double_quotes = true
+ij_typescript_use_explicit_js_extension = auto
+ij_typescript_use_path_mapping = always
+ij_typescript_use_public_modifier = false
+ij_typescript_use_semicolon_after_statement = true
+ij_typescript_var_declaration_wrap = normal
+ij_typescript_while_brace_force = always
+ij_typescript_while_on_new_line = false
+ij_typescript_wrap_comments = true
+
+[{*.bash,*.sh,*.zsh}]
+indent_size = 2
+tab_width = 2
+ij_shell_binary_ops_start_line = false
+ij_shell_keep_column_alignment_padding = false
+ij_shell_minify_program = false
+ij_shell_redirect_followed_by_space = false
+ij_shell_switch_cases_indented = false
+ij_shell_use_unix_line_separator = true
+
+[{*.cjs,*.js}]
+ij_javascript_align_imports = false
+ij_javascript_align_multiline_array_initializer_expression = false
+ij_javascript_align_multiline_binary_operation = false
+ij_javascript_align_multiline_chained_methods = false
+ij_javascript_align_multiline_extends_list = false
+ij_javascript_align_multiline_for = false
+ij_javascript_align_multiline_parameters = false
+ij_javascript_align_multiline_parameters_in_calls = false
+ij_javascript_align_multiline_ternary_operation = false
+ij_javascript_align_object_properties = 0
+ij_javascript_align_union_types = false
+ij_javascript_align_var_statements = 0
+ij_javascript_array_initializer_new_line_after_left_brace = false
+ij_javascript_array_initializer_right_brace_on_new_line = false
+ij_javascript_array_initializer_wrap = normal
+ij_javascript_assignment_wrap = normal
+ij_javascript_binary_operation_sign_on_next_line = false
+ij_javascript_binary_operation_wrap = normal
+ij_javascript_blacklist_imports = rxjs/Rx,node_modules/**,**/node_modules/**,@angular/material,@angular/material/typings/**
+ij_javascript_blank_lines_after_imports = 1
+ij_javascript_blank_lines_around_class = 1
+ij_javascript_blank_lines_around_field = 0
+ij_javascript_blank_lines_around_function = 1
+ij_javascript_blank_lines_around_method = 1
+ij_javascript_block_brace_style = end_of_line
+ij_javascript_block_comment_add_space = false
+ij_javascript_block_comment_at_first_column = true
+ij_javascript_call_parameters_new_line_after_left_paren = false
+ij_javascript_call_parameters_right_paren_on_new_line = false
+ij_javascript_call_parameters_wrap = normal
+ij_javascript_catch_on_new_line = false
+ij_javascript_chained_call_dot_on_new_line = true
+ij_javascript_class_brace_style = end_of_line
+ij_javascript_comma_on_new_line = false
+ij_javascript_do_while_brace_force = always
+ij_javascript_else_on_new_line = false
+ij_javascript_enforce_trailing_comma = remove
+ij_javascript_extends_keyword_wrap = normal
+ij_javascript_extends_list_wrap = normal
+ij_javascript_field_prefix = _
+ij_javascript_file_name_style = relaxed
+ij_javascript_finally_on_new_line = false
+ij_javascript_for_brace_force = always
+ij_javascript_for_statement_new_line_after_left_paren = false
+ij_javascript_for_statement_right_paren_on_new_line = false
+ij_javascript_for_statement_wrap = normal
+ij_javascript_force_quote_style = true
+ij_javascript_force_semicolon_style = true
+ij_javascript_function_expression_brace_style = end_of_line
+ij_javascript_if_brace_force = always
+ij_javascript_import_merge_members = global
+ij_javascript_import_prefer_absolute_path = global
+ij_javascript_import_sort_members = true
+ij_javascript_import_sort_module_name = false
+ij_javascript_import_use_node_resolution = true
+ij_javascript_imports_wrap = normal
+ij_javascript_indent_case_from_switch = true
+ij_javascript_indent_chained_calls = true
+ij_javascript_indent_package_children = 0
+ij_javascript_jsx_attribute_value = braces
+ij_javascript_keep_blank_lines_in_code = 1
+ij_javascript_keep_first_column_comment = true
+ij_javascript_keep_indents_on_empty_lines = false
+ij_javascript_keep_line_breaks = true
+ij_javascript_keep_simple_blocks_in_one_line = true
+ij_javascript_keep_simple_methods_in_one_line = true
+ij_javascript_line_comment_add_space = true
+ij_javascript_line_comment_at_first_column = false
+ij_javascript_method_brace_style = end_of_line
+ij_javascript_method_call_chain_wrap = normal
+ij_javascript_method_parameters_new_line_after_left_paren = false
+ij_javascript_method_parameters_right_paren_on_new_line = false
+ij_javascript_method_parameters_wrap = normal
+ij_javascript_object_literal_wrap = on_every_item
+ij_javascript_object_types_wrap = on_every_item
+ij_javascript_parentheses_expression_new_line_after_left_paren = false
+ij_javascript_parentheses_expression_right_paren_on_new_line = false
+ij_javascript_place_assignment_sign_on_next_line = false
+ij_javascript_prefer_as_type_cast = false
+ij_javascript_prefer_explicit_types_function_expression_returns = false
+ij_javascript_prefer_explicit_types_function_returns = false
+ij_javascript_prefer_explicit_types_vars_fields = false
+ij_javascript_prefer_parameters_wrap = false
+ij_javascript_property_prefix =
+ij_javascript_reformat_c_style_comments = false
+ij_javascript_space_after_colon = true
+ij_javascript_space_after_comma = true
+ij_javascript_space_after_dots_in_rest_parameter = false
+ij_javascript_space_after_generator_mult = true
+ij_javascript_space_after_property_colon = true
+ij_javascript_space_after_quest = true
+ij_javascript_space_after_type_colon = true
+ij_javascript_space_after_unary_not = false
+ij_javascript_space_before_async_arrow_lparen = true
+ij_javascript_space_before_catch_keyword = true
+ij_javascript_space_before_catch_left_brace = true
+ij_javascript_space_before_catch_parentheses = true
+ij_javascript_space_before_class_lbrace = true
+ij_javascript_space_before_class_left_brace = true
+ij_javascript_space_before_colon = true
+ij_javascript_space_before_comma = false
+ij_javascript_space_before_do_left_brace = true
+ij_javascript_space_before_else_keyword = true
+ij_javascript_space_before_else_left_brace = true
+ij_javascript_space_before_finally_keyword = true
+ij_javascript_space_before_finally_left_brace = true
+ij_javascript_space_before_for_left_brace = true
+ij_javascript_space_before_for_parentheses = true
+ij_javascript_space_before_for_semicolon = false
+ij_javascript_space_before_function_left_parenth = true
+ij_javascript_space_before_generator_mult = false
+ij_javascript_space_before_if_left_brace = true
+ij_javascript_space_before_if_parentheses = true
+ij_javascript_space_before_method_call_parentheses = false
+ij_javascript_space_before_method_left_brace = true
+ij_javascript_space_before_method_parentheses = false
+ij_javascript_space_before_property_colon = false
+ij_javascript_space_before_quest = true
+ij_javascript_space_before_switch_left_brace = true
+ij_javascript_space_before_switch_parentheses = true
+ij_javascript_space_before_try_left_brace = true
+ij_javascript_space_before_type_colon = false
+ij_javascript_space_before_unary_not = false
+ij_javascript_space_before_while_keyword = true
+ij_javascript_space_before_while_left_brace = true
+ij_javascript_space_before_while_parentheses = true
+ij_javascript_spaces_around_additive_operators = true
+ij_javascript_spaces_around_arrow_function_operator = true
+ij_javascript_spaces_around_assignment_operators = true
+ij_javascript_spaces_around_bitwise_operators = true
+ij_javascript_spaces_around_equality_operators = true
+ij_javascript_spaces_around_logical_operators = true
+ij_javascript_spaces_around_multiplicative_operators = true
+ij_javascript_spaces_around_relational_operators = true
+ij_javascript_spaces_around_shift_operators = true
+ij_javascript_spaces_around_unary_operator = false
+ij_javascript_spaces_within_array_initializer_brackets = false
+ij_javascript_spaces_within_brackets = false
+ij_javascript_spaces_within_catch_parentheses = false
+ij_javascript_spaces_within_for_parentheses = false
+ij_javascript_spaces_within_if_parentheses = false
+ij_javascript_spaces_within_imports = false
+ij_javascript_spaces_within_interpolation_expressions = false
+ij_javascript_spaces_within_method_call_parentheses = false
+ij_javascript_spaces_within_method_parentheses = false
+ij_javascript_spaces_within_object_literal_braces = false
+ij_javascript_spaces_within_object_type_braces = true
+ij_javascript_spaces_within_parentheses = false
+ij_javascript_spaces_within_switch_parentheses = false
+ij_javascript_spaces_within_type_assertion = false
+ij_javascript_spaces_within_union_types = true
+ij_javascript_spaces_within_while_parentheses = false
+ij_javascript_special_else_if_treatment = true
+ij_javascript_ternary_operation_signs_on_next_line = false
+ij_javascript_ternary_operation_wrap = normal
+ij_javascript_union_types_wrap = on_every_item
+ij_javascript_use_chained_calls_group_indents = false
+ij_javascript_use_double_quotes = true
+ij_javascript_use_explicit_js_extension = auto
+ij_javascript_use_path_mapping = always
+ij_javascript_use_public_modifier = false
+ij_javascript_use_semicolon_after_statement = true
+ij_javascript_var_declaration_wrap = normal
+ij_javascript_while_brace_force = always
+ij_javascript_while_on_new_line = false
+ij_javascript_wrap_comments = true
+
+[{*.ft,*.vm,*.vsl}]
+ij_vtl_keep_indents_on_empty_lines = false
+
+[{*.gant,*.groovy,*.gy}]
ij_groovy_align_group_field_declarations = false
ij_groovy_align_multiline_array_initializer_expression = false
ij_groovy_align_multiline_assignment = false
ij_groovy_align_multiline_binary_operation = false
ij_groovy_align_multiline_chained_methods = false
ij_groovy_align_multiline_extends_list = false
-ij_groovy_align_multiline_for = true
+ij_groovy_align_multiline_for = false
+ij_groovy_align_multiline_list_or_map = false
ij_groovy_align_multiline_method_parentheses = false
-ij_groovy_align_multiline_parameters = true
+ij_groovy_align_multiline_parameters = false
ij_groovy_align_multiline_parameters_in_calls = false
-ij_groovy_align_multiline_resources = true
+ij_groovy_align_multiline_resources = false
ij_groovy_align_multiline_ternary_operation = false
ij_groovy_align_multiline_throws_list = false
+ij_groovy_align_named_args_in_map = false
ij_groovy_align_throws_keyword = false
ij_groovy_array_initializer_new_line_after_left_brace = false
ij_groovy_array_initializer_right_brace_on_new_line = false
-ij_groovy_array_initializer_wrap = off
-ij_groovy_assert_statement_wrap = off
-ij_groovy_assignment_wrap = off
-ij_groovy_binary_operation_wrap = off
+ij_groovy_array_initializer_wrap = normal
+ij_groovy_assert_statement_wrap = normal
+ij_groovy_assignment_wrap = normal
+ij_groovy_binary_operation_wrap = normal
ij_groovy_blank_lines_after_class_header = 0
ij_groovy_blank_lines_after_imports = 1
ij_groovy_blank_lines_after_package = 1
@@ -478,55 +848,75 @@ ij_groovy_blank_lines_before_imports = 1
ij_groovy_blank_lines_before_method_body = 0
ij_groovy_blank_lines_before_package = 0
ij_groovy_block_brace_style = end_of_line
+ij_groovy_block_comment_add_space = false
ij_groovy_block_comment_at_first_column = true
ij_groovy_call_parameters_new_line_after_left_paren = false
ij_groovy_call_parameters_right_paren_on_new_line = false
-ij_groovy_call_parameters_wrap = off
+ij_groovy_call_parameters_wrap = normal
ij_groovy_catch_on_new_line = false
ij_groovy_class_annotation_wrap = split_into_lines
ij_groovy_class_brace_style = end_of_line
-ij_groovy_do_while_brace_force = never
+ij_groovy_class_count_to_use_import_on_demand = 999
+ij_groovy_do_while_brace_force = always
ij_groovy_else_on_new_line = false
-ij_groovy_enum_constants_wrap = off
-ij_groovy_extends_keyword_wrap = off
-ij_groovy_extends_list_wrap = off
+ij_groovy_enable_groovydoc_formatting = true
+ij_groovy_enum_constants_wrap = split_into_lines
+ij_groovy_extends_keyword_wrap = normal
+ij_groovy_extends_list_wrap = normal
ij_groovy_field_annotation_wrap = split_into_lines
ij_groovy_finally_on_new_line = false
-ij_groovy_for_brace_force = never
+ij_groovy_for_brace_force = always
ij_groovy_for_statement_new_line_after_left_paren = false
ij_groovy_for_statement_right_paren_on_new_line = false
-ij_groovy_for_statement_wrap = off
-ij_groovy_if_brace_force = never
+ij_groovy_for_statement_wrap = normal
+ij_groovy_ginq_general_clause_wrap_policy = 2
+ij_groovy_ginq_having_wrap_policy = 1
+ij_groovy_ginq_indent_having_clause = true
+ij_groovy_ginq_indent_on_clause = true
+ij_groovy_ginq_on_wrap_policy = 1
+ij_groovy_ginq_space_after_keyword = true
+ij_groovy_if_brace_force = always
+ij_groovy_import_annotation_wrap = 2
+ij_groovy_imports_layout = *,|,javax.**,java.**,|,$*
ij_groovy_indent_case_from_switch = true
-ij_groovy_keep_blank_lines_before_right_brace = 2
-ij_groovy_keep_blank_lines_in_code = 2
-ij_groovy_keep_blank_lines_in_declarations = 2
+ij_groovy_indent_label_blocks = true
+ij_groovy_insert_inner_class_imports = false
+ij_groovy_keep_blank_lines_before_right_brace = 1
+ij_groovy_keep_blank_lines_in_code = 1
+ij_groovy_keep_blank_lines_in_declarations = 1
ij_groovy_keep_control_statement_in_one_line = true
ij_groovy_keep_first_column_comment = true
ij_groovy_keep_indents_on_empty_lines = false
ij_groovy_keep_line_breaks = true
-ij_groovy_keep_multiple_expressions_in_one_line = false
-ij_groovy_keep_simple_blocks_in_one_line = false
+ij_groovy_keep_multiple_expressions_in_one_line = true
+ij_groovy_keep_simple_blocks_in_one_line = true
ij_groovy_keep_simple_classes_in_one_line = true
ij_groovy_keep_simple_lambdas_in_one_line = true
ij_groovy_keep_simple_methods_in_one_line = true
+ij_groovy_label_indent_absolute = false
+ij_groovy_label_indent_size = 0
ij_groovy_lambda_brace_style = end_of_line
+ij_groovy_layout_static_imports_separately = true
ij_groovy_line_comment_add_space = false
+ij_groovy_line_comment_add_space_on_reformat = false
ij_groovy_line_comment_at_first_column = true
ij_groovy_method_annotation_wrap = split_into_lines
ij_groovy_method_brace_style = end_of_line
-ij_groovy_method_call_chain_wrap = off
+ij_groovy_method_call_chain_wrap = normal
ij_groovy_method_parameters_new_line_after_left_paren = false
ij_groovy_method_parameters_right_paren_on_new_line = false
-ij_groovy_method_parameters_wrap = off
+ij_groovy_method_parameters_wrap = normal
ij_groovy_modifier_list_wrap = false
-ij_groovy_parameter_annotation_wrap = off
+ij_groovy_names_count_to_use_import_on_demand = 999
+ij_groovy_packages_to_use_import_on_demand = *
+ij_groovy_parameter_annotation_wrap = normal
ij_groovy_parentheses_expression_new_line_after_left_paren = false
ij_groovy_parentheses_expression_right_paren_on_new_line = false
ij_groovy_prefer_parameters_wrap = false
ij_groovy_resource_list_new_line_after_left_paren = false
ij_groovy_resource_list_right_paren_on_new_line = false
-ij_groovy_resource_list_wrap = off
+ij_groovy_resource_list_wrap = normal
+ij_groovy_space_after_assert_separator = true
ij_groovy_space_after_colon = true
ij_groovy_space_after_comma = true
ij_groovy_space_after_comma_in_type_arguments = true
@@ -535,10 +925,12 @@ ij_groovy_space_after_quest = true
ij_groovy_space_after_type_cast = true
ij_groovy_space_before_annotation_parameter_list = false
ij_groovy_space_before_array_initializer_left_brace = false
+ij_groovy_space_before_assert_separator = false
ij_groovy_space_before_catch_keyword = true
ij_groovy_space_before_catch_left_brace = true
ij_groovy_space_before_catch_parentheses = true
ij_groovy_space_before_class_left_brace = true
+ij_groovy_space_before_closure_left_brace = true
ij_groovy_space_before_colon = true
ij_groovy_space_before_comma = false
ij_groovy_space_before_do_left_brace = true
@@ -555,6 +947,7 @@ ij_groovy_space_before_method_call_parentheses = false
ij_groovy_space_before_method_left_brace = true
ij_groovy_space_before_method_parentheses = false
ij_groovy_space_before_quest = true
+ij_groovy_space_before_record_parentheses = false
ij_groovy_space_before_switch_left_brace = true
ij_groovy_space_before_switch_parentheses = true
ij_groovy_space_before_synchronized_left_brace = true
@@ -564,6 +957,8 @@ ij_groovy_space_before_try_parentheses = true
ij_groovy_space_before_while_keyword = true
ij_groovy_space_before_while_left_brace = true
ij_groovy_space_before_while_parentheses = true
+ij_groovy_space_in_named_argument = true
+ij_groovy_space_in_named_argument_before_colon = false
ij_groovy_space_within_empty_array_initializer_braces = false
ij_groovy_space_within_empty_method_call_parentheses = false
ij_groovy_spaces_around_additive_operators = true
@@ -573,6 +968,7 @@ ij_groovy_spaces_around_equality_operators = true
ij_groovy_spaces_around_lambda_arrow = true
ij_groovy_spaces_around_logical_operators = true
ij_groovy_spaces_around_multiplicative_operators = true
+ij_groovy_spaces_around_regex_operators = true
ij_groovy_spaces_around_relational_operators = true
ij_groovy_spaces_around_shift_operators = true
ij_groovy_spaces_within_annotation_parentheses = false
@@ -582,42 +978,110 @@ ij_groovy_spaces_within_brackets = false
ij_groovy_spaces_within_cast_parentheses = false
ij_groovy_spaces_within_catch_parentheses = false
ij_groovy_spaces_within_for_parentheses = false
+ij_groovy_spaces_within_gstring_injection_braces = false
ij_groovy_spaces_within_if_parentheses = false
+ij_groovy_spaces_within_list_or_map = false
ij_groovy_spaces_within_method_call_parentheses = false
ij_groovy_spaces_within_method_parentheses = false
ij_groovy_spaces_within_parentheses = false
ij_groovy_spaces_within_switch_parentheses = false
ij_groovy_spaces_within_synchronized_parentheses = false
ij_groovy_spaces_within_try_parentheses = false
+ij_groovy_spaces_within_tuple_expression = false
ij_groovy_spaces_within_while_parentheses = false
ij_groovy_special_else_if_treatment = true
-ij_groovy_ternary_operation_wrap = off
-ij_groovy_throws_keyword_wrap = off
-ij_groovy_throws_list_wrap = off
-ij_groovy_variable_annotation_wrap = off
-ij_groovy_while_brace_force = never
+ij_groovy_ternary_operation_wrap = normal
+ij_groovy_throws_keyword_wrap = normal
+ij_groovy_throws_list_wrap = normal
+ij_groovy_use_flying_geese_braces = false
+ij_groovy_use_fq_class_names = false
+ij_groovy_use_fq_class_names_in_javadoc = false
+ij_groovy_use_relative_indents = false
+ij_groovy_use_single_class_imports = true
+ij_groovy_variable_annotation_wrap = normal
+ij_groovy_while_brace_force = always
ij_groovy_while_on_new_line = false
+ij_groovy_wrap_chain_calls_after_dot = false
ij_groovy_wrap_long_lines = false
-[{*.jhm,*.xslt,*.xul,*.tagx,*.rng,*.xsl,*.xsd,*.jspx,*.ant,*.xml,*.tld,*.fxml,*.wsdl,*.jrxml,*.jnlp,*.pom}]
-ij_xml_block_comment_at_first_column = true
-ij_xml_keep_indents_on_empty_lines = false
-ij_xml_line_comment_at_first_column = true
+[{*.har,*.jsb2,*.jsb3,*.json,.babelrc,.eslintrc,.prettierrc,.stylelintrc,bowerrc,jest.config}]
+indent_size = 2
+ij_json_array_wrapping = split_into_lines
+ij_json_keep_blank_lines_in_code = 0
+ij_json_keep_indents_on_empty_lines = false
+ij_json_keep_line_breaks = false
+ij_json_keep_trailing_comma = false
+ij_json_object_wrapping = split_into_lines
+ij_json_property_alignment = do_not_align
+ij_json_space_after_colon = true
+ij_json_space_after_comma = true
+ij_json_space_before_colon = false
+ij_json_space_before_comma = false
+ij_json_spaces_within_braces = false
+ij_json_spaces_within_brackets = false
+ij_json_wrap_long_lines = false
+
+[{*.htm,*.html,*.ng,*.peb,*.sht,*.shtm,*.shtml}]
+ij_html_add_new_line_before_tags = body,div,p,form,h1,h2,h3
+ij_html_align_attributes = true
+ij_html_align_text = false
+ij_html_attribute_wrap = normal
+ij_html_block_comment_add_space = false
+ij_html_block_comment_at_first_column = true
+ij_html_do_not_align_children_of_min_lines = 0
+ij_html_do_not_break_if_inline_tags = title,h1,h2,h3,h4,h5,h6,p
+ij_html_do_not_indent_children_of_tags = html,body,thead,tbody,tfoot
+ij_html_enforce_quotes = true
+ij_html_inline_tags = a,abbr,acronym,b,basefont,bdo,big,br,cite,cite,code,dfn,em,font,i,img,input,kbd,label,q,s,samp,select,small,span,strike,strong,sub,sup,textarea,tt,u,var
+ij_html_keep_blank_lines = 1
+ij_html_keep_indents_on_empty_lines = false
+ij_html_keep_line_breaks = true
+ij_html_keep_line_breaks_in_text = true
+ij_html_keep_whitespaces = false
+ij_html_keep_whitespaces_inside = span,pre,textarea
+ij_html_line_comment_at_first_column = true
+ij_html_new_line_after_last_attribute = never
+ij_html_new_line_before_first_attribute = never
+ij_html_quote_style = double
+ij_html_remove_new_line_before_tags = br
+ij_html_space_after_tag_name = false
+ij_html_space_around_equality_in_attribute = false
+ij_html_space_inside_empty_tag = false
+ij_html_text_wrap = normal
+
+[{*.http,*.rest}]
+indent_size = 0
+ij_continuation_indent_size = 4
+ij_http-request_call_parameters_wrap = normal
+ij_http-request_method_parameters_wrap = split_into_lines
+ij_http-request_space_before_comma = true
+ij_http-request_spaces_around_assignment_operators = true
+
+[{*.jsf,*.jsp,*.jspf,*.tag,*.tagf,*.xjsp}]
+ij_jsp_jsp_prefer_comma_separated_import_list = false
+ij_jsp_keep_indents_on_empty_lines = false
+
+[{*.jspx,*.tagx}]
+ij_jspx_keep_indents_on_empty_lines = false
[{*.kt,*.kts}]
ij_kotlin_align_in_columns_case_branch = false
ij_kotlin_align_multiline_binary_operation = false
ij_kotlin_align_multiline_extends_list = false
ij_kotlin_align_multiline_method_parentheses = false
-ij_kotlin_align_multiline_parameters = true
+ij_kotlin_align_multiline_parameters = false
ij_kotlin_align_multiline_parameters_in_calls = false
-ij_kotlin_assignment_wrap = off
+ij_kotlin_allow_trailing_comma = false
+ij_kotlin_allow_trailing_comma_on_call_site = false
+ij_kotlin_assignment_wrap = normal
ij_kotlin_blank_lines_after_class_header = 0
ij_kotlin_blank_lines_around_block_when_branches = 0
+ij_kotlin_blank_lines_before_declaration_with_comment_or_annotation_on_separate_line = 1
+ij_kotlin_block_comment_add_space = false
ij_kotlin_block_comment_at_first_column = true
ij_kotlin_call_parameters_new_line_after_left_paren = false
ij_kotlin_call_parameters_right_paren_on_new_line = false
-ij_kotlin_call_parameters_wrap = off
+ij_kotlin_call_parameters_wrap = normal
ij_kotlin_catch_on_new_line = false
ij_kotlin_class_annotation_wrap = split_into_lines
ij_kotlin_continuation_indent_for_chained_calls = true
@@ -628,30 +1092,34 @@ ij_kotlin_continuation_indent_in_if_conditions = true
ij_kotlin_continuation_indent_in_parameter_lists = true
ij_kotlin_continuation_indent_in_supertype_lists = true
ij_kotlin_else_on_new_line = false
-ij_kotlin_enum_constants_wrap = off
-ij_kotlin_extends_list_wrap = off
+ij_kotlin_enum_constants_wrap = split_into_lines
+ij_kotlin_extends_list_wrap = normal
ij_kotlin_field_annotation_wrap = split_into_lines
ij_kotlin_finally_on_new_line = false
ij_kotlin_if_rparen_on_new_line = false
ij_kotlin_import_nested_classes = false
+ij_kotlin_imports_layout = *,java.**,javax.**,kotlin.**,^
ij_kotlin_insert_whitespaces_in_simple_one_line_method = true
-ij_kotlin_keep_blank_lines_before_right_brace = 2
-ij_kotlin_keep_blank_lines_in_code = 2
-ij_kotlin_keep_blank_lines_in_declarations = 2
+ij_kotlin_keep_blank_lines_before_right_brace = 1
+ij_kotlin_keep_blank_lines_in_code = 1
+ij_kotlin_keep_blank_lines_in_declarations = 1
ij_kotlin_keep_first_column_comment = true
ij_kotlin_keep_indents_on_empty_lines = false
ij_kotlin_keep_line_breaks = true
ij_kotlin_lbrace_on_next_line = false
+ij_kotlin_line_break_after_multiline_when_entry = true
ij_kotlin_line_comment_add_space = false
+ij_kotlin_line_comment_add_space_on_reformat = false
ij_kotlin_line_comment_at_first_column = true
ij_kotlin_method_annotation_wrap = split_into_lines
-ij_kotlin_method_call_chain_wrap = off
+ij_kotlin_method_call_chain_wrap = normal
ij_kotlin_method_parameters_new_line_after_left_paren = false
ij_kotlin_method_parameters_right_paren_on_new_line = false
-ij_kotlin_method_parameters_wrap = off
-ij_kotlin_name_count_to_use_star_import = 5
-ij_kotlin_name_count_to_use_star_import_for_members = 3
-ij_kotlin_parameter_annotation_wrap = off
+ij_kotlin_method_parameters_wrap = normal
+ij_kotlin_name_count_to_use_star_import = 2147483647
+ij_kotlin_name_count_to_use_star_import_for_members = 2147483647
+ij_kotlin_packages_to_use_import_on_demand =
+ij_kotlin_parameter_annotation_wrap = normal
ij_kotlin_space_after_comma = true
ij_kotlin_space_after_extend_colon = true
ij_kotlin_space_after_type_colon = true
@@ -674,48 +1142,65 @@ ij_kotlin_spaces_around_range = false
ij_kotlin_spaces_around_relational_operators = true
ij_kotlin_spaces_around_unary_operator = false
ij_kotlin_spaces_around_when_arrow = true
-ij_kotlin_variable_annotation_wrap = off
+ij_kotlin_variable_annotation_wrap = normal
ij_kotlin_while_on_new_line = false
ij_kotlin_wrap_elvis_expressions = 1
-ij_kotlin_wrap_expression_body_functions = 0
+ij_kotlin_wrap_expression_body_functions = 1
ij_kotlin_wrap_first_method_in_call_chain = false
-[{*.shtm,*.htm,*.sht,*.shtml,*.html}]
-ij_html_add_new_line_before_tags = body,div,p,form,h1,h2,h3
-ij_html_align_attributes = true
-ij_html_align_text = false
-ij_html_attribute_wrap = normal
-ij_html_block_comment_at_first_column = true
-ij_html_do_not_align_children_of_min_lines = 0
-ij_html_do_not_break_if_inline_tags = title,h1,h2,h3,h4,h5,h6,p
-ij_html_do_not_indent_children_of_tags = html,body,thead,tbody,tfoot
-ij_html_enforce_quotes = false
-ij_html_inline_tags = a,abbr,acronym,b,basefont,bdo,big,br,cite,cite,code,dfn,em,font,i,img,input,kbd,label,q,s,samp,select,small,span,strike,strong,sub,sup,textarea,tt,u,var
-ij_html_keep_blank_lines = 2
-ij_html_keep_indents_on_empty_lines = false
-ij_html_keep_line_breaks = true
-ij_html_keep_line_breaks_in_text = true
-ij_html_keep_whitespaces = false
-ij_html_keep_whitespaces_inside = span,pre,textarea
-ij_html_line_comment_at_first_column = true
-ij_html_new_line_after_last_attribute = never
-ij_html_new_line_before_first_attribute = never
-ij_html_quote_style = double
-ij_html_remove_new_line_before_tags = br
-ij_html_space_after_tag_name = false
-ij_html_space_around_equality_in_attribute = false
-ij_html_space_inside_empty_tag = false
-ij_html_text_wrap = normal
+[{*.markdown,*.md}]
+ij_markdown_force_one_space_after_blockquote_symbol = true
+ij_markdown_force_one_space_after_header_symbol = true
+ij_markdown_force_one_space_after_list_bullet = true
+ij_markdown_force_one_space_between_words = true
+ij_markdown_format_tables = true
+ij_markdown_insert_quote_arrows_on_wrap = true
+ij_markdown_keep_indents_on_empty_lines = false
+ij_markdown_keep_line_breaks_inside_text_blocks = true
+ij_markdown_max_lines_around_block_elements = 1
+ij_markdown_max_lines_around_header = 1
+ij_markdown_max_lines_between_paragraphs = 1
+ij_markdown_min_lines_around_block_elements = 1
+ij_markdown_min_lines_around_header = 1
+ij_markdown_min_lines_between_paragraphs = 1
+ij_markdown_wrap_text_if_long = true
+ij_markdown_wrap_text_inside_blockquotes = true
-[{*.yml,*.yaml}]
+[{*.pb,*.textproto}]
indent_size = 2
-ij_continuation_indent_size = 2
+tab_width = 2
+ij_continuation_indent_size = 4
+ij_prototext_keep_blank_lines_in_code = 2
+ij_prototext_keep_indents_on_empty_lines = false
+ij_prototext_keep_line_breaks = true
+ij_prototext_space_after_colon = true
+ij_prototext_space_after_comma = true
+ij_prototext_space_before_colon = false
+ij_prototext_space_before_comma = false
+ij_prototext_spaces_within_braces = true
+ij_prototext_spaces_within_brackets = false
+
+[{*.properties,spring.handlers,spring.schemas}]
+ij_properties_align_group_field_declarations = false
+ij_properties_keep_blank_lines = false
+ij_properties_key_value_delimiter = equals
+ij_properties_spaces_around_key_value_delimiter = false
+
+[{*.qute.htm,*.qute.html,*.qute.json,*.qute.txt,*.qute.yaml,*.qute.yml}]
+ij_qute_keep_indents_on_empty_lines = false
+
+[{*.toml,Cargo.lock,Cargo.toml.orig,Gopkg.lock,Pipfile,poetry.lock}]
+ij_toml_keep_indents_on_empty_lines = false
+
+[{*.yaml,*.yml}]
+indent_size = 2
+ij_yaml_align_values_properties = do_not_align
+ij_yaml_autoinsert_sequence_marker = true
+ij_yaml_block_mapping_on_new_line = false
+ij_yaml_indent_sequence_value = true
ij_yaml_keep_indents_on_empty_lines = false
ij_yaml_keep_line_breaks = true
-
-[{*.zsh,*.bash,*.sh}]
-ij_shell_binary_ops_start_line = false
-ij_shell_keep_column_alignment_padding = false
-ij_shell_minify_program = false
-ij_shell_redirect_followed_by_space = false
-ij_shell_switch_cases_indented = false
+ij_yaml_sequence_on_new_line = false
+ij_yaml_space_before_colon = false
+ij_yaml_spaces_within_braces = true
+ij_yaml_spaces_within_brackets = true
diff --git a/README.md b/README.md
index a6c51d49..0ec10a33 100644
--- a/README.md
+++ b/README.md
@@ -78,7 +78,6 @@ AlpacaAPI alpacaAPI = new AlpacaAPI(oAuthToken);
AlpacaAPI alpacaAPI = AlpacaAPI.builder()
.withEndpointAPIType(EndpointAPIType.PAPER)
.build();
-
```
Note that this library uses [OkHttp](https://square.github.io/okhttp/) as its HTTP client library which creates background threads to service requests. These threads persist even if the main thread exists so if you want to destroy these threads when you're done using [`AlpacaAPI`](src/main/java/net/jacobpeterson/alpaca/AlpacaAPI.java) so your program can exit without calling `System.exit()`, use the following snippet:
From 92656f777c005302bb3245bd0a38e6ecfa6918ca Mon Sep 17 00:00:00 2001
From: Jacob Peterson <14127217+Petersoj@users.noreply.github.com>
Date: Sun, 20 Aug 2023 16:37:54 -0600
Subject: [PATCH 50/84] Update to 9.2.0
---
README.md | 4 ++--
build.gradle | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/README.md b/README.md
index 0ec10a33..82630ee6 100644
--- a/README.md
+++ b/README.md
@@ -17,7 +17,7 @@ If you are using Gradle as your build tool, add the following dependency to your
```
dependencies {
- implementation group: 'net.jacobpeterson', name: 'alpaca-java', version: '9.1.4'
+ implementation group: 'net.jacobpeterson', name: 'alpaca-java', version: '9.2.0'
}
```
@@ -27,7 +27,7 @@ If you are using Maven as your build tool, add the following dependency to your
net.jacobpeterson
alpaca-java
- 9.1.4
+ 9.2.0
compile
```
diff --git a/build.gradle b/build.gradle
index a40691fa..a861d055 100644
--- a/build.gradle
+++ b/build.gradle
@@ -29,7 +29,7 @@ apply plugin: 'jsonschema2pojo'
archivesBaseName = 'alpaca-java'
group = 'net.jacobpeterson'
-version = '9.1.4-SNAPSHOT'
+version = '9.2.0-SNAPSHOT'
repositories {
mavenCentral()
From 5d1f23126fb83cec4630630698fcba92fc367d56 Mon Sep 17 00:00:00 2001
From: Jc
Date: Tue, 7 Nov 2023 16:19:17 -0500
Subject: [PATCH 51/84] Fix
---
.../alpaca/rest/endpoint/orders/OrdersEndpoint.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/orders/OrdersEndpoint.java b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/orders/OrdersEndpoint.java
index 0ad4a66e..b2a0563d 100644
--- a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/orders/OrdersEndpoint.java
+++ b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/orders/OrdersEndpoint.java
@@ -251,7 +251,7 @@ public Order requestMarketOrder(String symbol, Integer quantity, OrderSide side,
*/
public Order requestFractionalMarketOrder(String symbol, Double quantity, OrderSide side)
throws AlpacaClientException {
- return requestOrder(symbol, quantity, null, side, OrderType.MARKET, OrderTimeInForce.GOOD_UNTIL_CANCELLED, null,
+ return requestOrder(symbol, quantity, null, side, OrderType.MARKET, OrderTimeInForce.DAY, null,
null, null,
null, null, null, null, null, null, null);
}
From 8d9ca1434d3bb5f29ca68eac16267d788021140e Mon Sep 17 00:00:00 2001
From: gretard
Date: Tue, 2 Jan 2024 21:00:58 +0200
Subject: [PATCH 52/84] Add corporate actions endpoint for #118
---
build.gradle | 1 +
.../common/announcement.json | 53 ++++++++
.../net/jacobpeterson/alpaca/AlpacaAPI.java | 9 ++
.../CorporateActionsEndpoint.java | 121 ++++++++++++++++++
.../alpaca/test/mock/AlpacaAPITest.java | 13 ++
.../CorporateActionsEndpointTest.java | 104 +++++++++++++++
6 files changed, 301 insertions(+)
create mode 100644 schema_json/endpoint/corporate_actions/common/announcement.json
create mode 100644 src/main/java/net/jacobpeterson/alpaca/rest/endpoint/corporateactions/CorporateActionsEndpoint.java
create mode 100644 src/test/java/net/jacobpeterson/alpaca/test/mock/corporateactions/CorporateActionsEndpointTest.java
diff --git a/build.gradle b/build.gradle
index a861d055..7c65cc3d 100644
--- a/build.gradle
+++ b/build.gradle
@@ -53,6 +53,7 @@ dependencies {
testImplementation group: 'org.slf4j', name: 'slf4j-simple', version: '1.7.36'
testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter', version: '5.8.2'
testImplementation group: 'org.mockito', name: 'mockito-core', version: '4.6.1'
+ testImplementation group: 'com.github.gmazzo.okhttp.mock', name: 'mock-client', version: '2.0.0'
}
// Exclude any SLF4j-implementation transitive dependencies so users can use a logging framework of their choice
diff --git a/schema_json/endpoint/corporate_actions/common/announcement.json b/schema_json/endpoint/corporate_actions/common/announcement.json
new file mode 100644
index 00000000..14c8e66e
--- /dev/null
+++ b/schema_json/endpoint/corporate_actions/common/announcement.json
@@ -0,0 +1,53 @@
+{
+ "type": "object",
+ "title": "See Corporate announcement.",
+ "properties": {
+ "id": {
+ "existingJavaType": "java.lang.String"
+ },
+ "corporate_actions_id": {
+ "existingJavaType": "java.lang.String"
+ },
+ "ca_type": {
+ "existingJavaType": "java.lang.String"
+ },
+ "ca_sub_type": {
+ "existingJavaType": "java.lang.String"
+ },
+ "initiating_symbol": {
+ "existingJavaType": "java.lang.String"
+ },
+ "initiating_original_cusip": {
+ "existingJavaType": "java.lang.String"
+ },
+ "target_symbol": {
+ "target_symbol": "java.lang.String"
+ },
+ "target_original_cusip": {
+ "target_original_cusip": "java.lang.String"
+ },
+ "declaration_date": {
+ "declaration_date": "java.lang.String"
+ },
+ "expiration_date": {
+ "declaration_date": "java.lang.String"
+ },
+ "record_date": {
+ "declaration_date": "java.lang.String"
+ },
+ "payable_date": {
+ "declaration_date": "java.lang.String"
+ },
+ "cash": {
+ "declaration_date": "java.lang.String"
+ },
+ "old_rate": {
+ "declaration_date": "java.lang.String"
+ },
+ "new_rate": {
+ "declaration_date": "java.lang.String"
+ }
+
+
+ }
+}
diff --git a/src/main/java/net/jacobpeterson/alpaca/AlpacaAPI.java b/src/main/java/net/jacobpeterson/alpaca/AlpacaAPI.java
index d1e75376..922ddd10 100644
--- a/src/main/java/net/jacobpeterson/alpaca/AlpacaAPI.java
+++ b/src/main/java/net/jacobpeterson/alpaca/AlpacaAPI.java
@@ -12,6 +12,7 @@
import net.jacobpeterson.alpaca.rest.endpoint.assets.AssetsEndpoint;
import net.jacobpeterson.alpaca.rest.endpoint.calendar.CalendarEndpoint;
import net.jacobpeterson.alpaca.rest.endpoint.clock.ClockEndpoint;
+import net.jacobpeterson.alpaca.rest.endpoint.corporateactions.CorporateActionsEndpoint;
import net.jacobpeterson.alpaca.rest.endpoint.marketdata.crypto.CryptoMarketDataEndpoint;
import net.jacobpeterson.alpaca.rest.endpoint.marketdata.stock.StockMarketDataEndpoint;
import net.jacobpeterson.alpaca.rest.endpoint.orders.OrdersEndpoint;
@@ -67,6 +68,7 @@ public class AlpacaAPI {
private final CryptoMarketDataWebsocket cryptoMarketDataWebsocket;
private final StockMarketDataWebsocket stockMarketDataWebsocket;
+ private final CorporateActionsEndpoint corporateActionsEndpoint;
/**
* Instantiates a new {@link AlpacaAPI} using properties specified in alpaca.properties file (or their
* associated defaults).
@@ -197,6 +199,7 @@ public AlpacaAPI(OkHttpClient okHttpClient, String keyID, String secretKey, Stri
new CryptoMarketDataWebsocket(okHttpClient, keyID, secretKey);
stockMarketDataWebsocket = stockDataClient == null ? null :
new StockMarketDataWebsocket(okHttpClient, dataAPIType, keyID, secretKey);
+ corporateActionsEndpoint = new CorporateActionsEndpoint(brokerClient);
}
/**
@@ -320,6 +323,12 @@ public AlpacaClient getStockDataClient() {
return stockDataClient;
}
+ /**
+ * @return the {@link CorporateActionsEndpoint}
+ */
+ public CorporateActionsEndpoint corporateActions() {
+ return corporateActionsEndpoint;
+ }
/**
* Creates a {@link Builder} for {@link AlpacaAPI}.
*
diff --git a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/corporateactions/CorporateActionsEndpoint.java b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/corporateactions/CorporateActionsEndpoint.java
new file mode 100644
index 00000000..f467c4f0
--- /dev/null
+++ b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/corporateactions/CorporateActionsEndpoint.java
@@ -0,0 +1,121 @@
+package net.jacobpeterson.alpaca.rest.endpoint.corporateactions;
+
+import com.google.gson.reflect.TypeToken;
+import net.jacobpeterson.alpaca.model.endpoint.corporateactions.common.Announcement;
+import net.jacobpeterson.alpaca.rest.AlpacaClient;
+import net.jacobpeterson.alpaca.rest.AlpacaClientException;
+import net.jacobpeterson.alpaca.rest.endpoint.AlpacaEndpoint;
+import okhttp3.HttpUrl;
+import okhttp3.Request;
+
+import java.lang.reflect.Type;
+import java.time.LocalDate;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * {@link AlpacaEndpoint} for
+ * Corporate actions
+ * Endpoint.
+ */
+public class CorporateActionsEndpoint extends AlpacaEndpoint {
+
+ private static final Type ANNOUNCEMENT_ARRAYLIST_TYPE = new TypeToken>() {}.getType();
+
+ private static final List ALL_CA_TYPES = Arrays.asList("dividend", "merger", "spinoff", "split");
+
+ /**
+ * Instantiates a new {@link AlpacaEndpoint}.
+ *
+ * @param alpacaClient the {@link AlpacaClient}
+ */
+ public CorporateActionsEndpoint(AlpacaClient alpacaClient) {
+ super(alpacaClient, "corporate_actions/announcements");
+ }
+
+ /**
+ * Gets a {@link Announcement} of the requested id.
+ * @param id - announcement id to query for
+ * @return the {@link Announcement}
+ * @throws AlpacaClientException thrown for {@link AlpacaClientException}s
+ */
+ public Announcement getAnnouncement(String id) throws AlpacaClientException {
+ checkNotNull(id);
+ HttpUrl.Builder urlBuilder = alpacaClient.urlBuilder()
+ .addPathSegment(endpointPathSegment)
+ .addPathSegment(id);
+ Request request = alpacaClient.requestBuilder(urlBuilder.build())
+ .get()
+ .build();
+ return alpacaClient.requestObject(request, Announcement.class);
+
+ }
+
+ /**
+ * Gets list of all {@link Announcement} within last 90 days
+ * @return a {@link List} of {@link Announcement}
+ * @throws AlpacaClientException thrown for {@link AlpacaClientException}s
+ */
+ public List getAnnouncements() throws AlpacaClientException {
+ return this.getAnnouncements(ALL_CA_TYPES, LocalDate.now().minusDays(90), LocalDate.now(), null, null, null);
+ }
+
+ /**
+ * Gets list of all {@link Announcement} within last 90 days for specific symbol
+ * @param symbol the symbol to query for
+ * @return a {@link List} of {@link Announcement}
+ * @throws AlpacaClientException thrown for {@link AlpacaClientException}s
+ */
+ public List getAnnouncements(String symbol) throws AlpacaClientException {
+ return this.getAnnouncements(ALL_CA_TYPES, LocalDate.now().minusDays(90), LocalDate.now(), symbol, null, null);
+ }
+
+ /**
+ * Gets list of all {@link Announcement} for specific query
+ * @param caTypes - a list of Dividend, Merger, Spinoff, or Split
+ * @param since - the start (inclusive) of the date range when searching corporate action announcements. This should follow the YYYY-MM-DD format. The date range is limited to 90 days
+ * @param until - the end (inclusive) of the date range when searching corporate action announcements. This should follow the YYYY-MM-DD format. The date range is limited to 90 days
+ * @param symbol - the symbol of the company initiating the announcement
+ * @param cusip - the CUSIP of the company initiating the announcement
+ * @param dateType - one of declaration_date, ex_date, record_date, or payable_date
+ * @return a {@link List} of {@link Announcement}
+ * @throws AlpacaClientException thrown for {@link AlpacaClientException}s
+ */
+ public List getAnnouncements(
+ List caTypes, LocalDate since, LocalDate until,
+ String symbol,
+ String cusip,
+ String dateType
+ )
+ throws AlpacaClientException {
+ HttpUrl.Builder urlBuilder = alpacaClient.urlBuilder()
+ .addPathSegment(endpointPathSegment);
+ checkNotNull(caTypes);
+ checkNotNull(since);
+ checkNotNull(until);
+
+
+ urlBuilder.addQueryParameter("ca_types", String.join(",", caTypes));
+
+ urlBuilder.addQueryParameter("since", since.toString());
+ urlBuilder.addQueryParameter("until", until.toString());
+
+ if (symbol != null) {
+ urlBuilder.addQueryParameter("symbol", symbol);
+ }
+ if (cusip != null) {
+ urlBuilder.addQueryParameter("cusip", cusip);
+ }
+ if (dateType !=null) {
+ urlBuilder.addQueryParameter("date_type", dateType);
+ }
+ Request request = alpacaClient.requestBuilder(urlBuilder.build())
+ .get()
+ .build();
+ return alpacaClient.requestObject(request, ANNOUNCEMENT_ARRAYLIST_TYPE);
+
+ }
+}
diff --git a/src/test/java/net/jacobpeterson/alpaca/test/mock/AlpacaAPITest.java b/src/test/java/net/jacobpeterson/alpaca/test/mock/AlpacaAPITest.java
index d5f4f320..0fbc722a 100644
--- a/src/test/java/net/jacobpeterson/alpaca/test/mock/AlpacaAPITest.java
+++ b/src/test/java/net/jacobpeterson/alpaca/test/mock/AlpacaAPITest.java
@@ -6,6 +6,8 @@
import okhttp3.OkHttpClient;
import org.junit.jupiter.api.Test;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
/**
* {@link AlpacaAPITest} tests {@link AlpacaAPI} using mocked objects with Mockito.
*/
@@ -71,4 +73,15 @@ public void testAlpacaAPIConstructor_okHttpClient_keyID_secret_oAuthToken_endpoi
new AlpacaAPI(okHttpClient, null, null, oAuthToken, EndpointAPIType.PAPER, DataAPIType.IEX);
new AlpacaAPI(okHttpClient, keyID, secret, null, EndpointAPIType.LIVE, DataAPIType.SIP);
}
+
+ @Test
+ public void testAlpacaAPIConstructor_corporateActionsEndpoint() {
+ OkHttpClient okHttpClient = new OkHttpClient();
+ String keyID = "ABCDEFGHIJKLM";
+ String secret = "NOPQURSTUVWXYZ";
+
+ AlpacaAPI api = new AlpacaAPI(okHttpClient, keyID, secret, null, EndpointAPIType.LIVE, DataAPIType.SIP);
+
+ assertNotNull(api.corporateActions());
+ }
}
diff --git a/src/test/java/net/jacobpeterson/alpaca/test/mock/corporateactions/CorporateActionsEndpointTest.java b/src/test/java/net/jacobpeterson/alpaca/test/mock/corporateactions/CorporateActionsEndpointTest.java
new file mode 100644
index 00000000..fd2dc0ae
--- /dev/null
+++ b/src/test/java/net/jacobpeterson/alpaca/test/mock/corporateactions/CorporateActionsEndpointTest.java
@@ -0,0 +1,104 @@
+package net.jacobpeterson.alpaca.test.mock.corporateactions;
+
+import net.jacobpeterson.alpaca.model.endpoint.corporateactions.common.Announcement;
+import net.jacobpeterson.alpaca.rest.AlpacaClient;
+import net.jacobpeterson.alpaca.rest.AlpacaClientException;
+import net.jacobpeterson.alpaca.rest.endpoint.corporateactions.CorporateActionsEndpoint;
+import okhttp3.MediaType;
+import okhttp3.OkHttpClient;
+import okhttp3.ResponseBody;
+import okhttp3.mock.MockInterceptor;
+import org.junit.jupiter.api.Test;
+
+import java.time.LocalDate;
+import java.util.ArrayList;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+public class CorporateActionsEndpointTest {
+
+ @Test
+ void getAnnouncements_givenSymbol_shouldReturnData() throws AlpacaClientException {
+ CorporateActionsEndpoint newsEndpoint = setupEndpoint(mockMultipleAnnouncementsResponse());
+
+ java.util.List result = newsEndpoint.getAnnouncements("K");
+
+ assertNotNull(result);
+ assertEquals(3, result.size());
+
+ }
+
+ @Test
+ void getAnnouncements_shouldReturnData() throws AlpacaClientException {
+ CorporateActionsEndpoint newsEndpoint = setupEndpoint(mockMultipleAnnouncementsResponse());
+
+ java.util.List result = newsEndpoint.getAnnouncements();
+
+ assertNotNull(result);
+ assertEquals(3, result.size());
+
+ }
+
+ @Test
+ void getAnnouncements_validation_caTypes() {
+ CorporateActionsEndpoint newsEndpoint = setupEndpoint(mockMultipleAnnouncementsResponse());
+
+ assertThrows(Exception.class, () -> newsEndpoint.getAnnouncements(null, LocalDate.now(), LocalDate.now(), null, null, null));
+ }
+
+ @Test
+ void getAnnouncements_validation_since() {
+ CorporateActionsEndpoint newsEndpoint = setupEndpoint(mockMultipleAnnouncementsResponse());
+
+ assertThrows(Exception.class, () -> newsEndpoint.getAnnouncements(new ArrayList<>(), null, LocalDate.now(), null, null, null));
+ }
+
+ @Test
+ void getAnnouncements_validation_until() {
+ CorporateActionsEndpoint newsEndpoint = setupEndpoint(mockMultipleAnnouncementsResponse());
+
+ assertThrows(Exception.class, () -> newsEndpoint.getAnnouncements(new ArrayList<>(), LocalDate.now(), null, null, null, null));
+ }
+
+ @Test
+ void getAnnouncement_validation_id() {
+ CorporateActionsEndpoint newsEndpoint = setupEndpoint(mockSingleAnnouncementResponse());
+
+ assertThrows(Exception.class, () -> newsEndpoint.getAnnouncement(null));
+ }
+
+ @Test
+ void getAnnouncement_shouldReturnData() throws AlpacaClientException {
+ CorporateActionsEndpoint newsEndpoint = setupEndpoint(mockSingleAnnouncementResponse());
+
+ Announcement announcement = newsEndpoint.getAnnouncement("1");
+
+ assertNotNull(announcement);
+ assertEquals(announcement.getId(), "cd0cb768-889f-47a1-a94b-1438017dad77");
+ }
+
+ private static CorporateActionsEndpoint setupEndpoint(String response) {
+ MockInterceptor interceptor = new MockInterceptor();
+ interceptor.addRule()
+ .respond(200)
+ .body(ResponseBody.create(response, MediaType.parse("application/json")));
+
+ OkHttpClient client = new OkHttpClient.Builder()
+ .addInterceptor(interceptor)
+ .build();
+
+ AlpacaClient api = new AlpacaClient(client, "token", "test", "/v1");
+
+ return new CorporateActionsEndpoint(api);
+ }
+
+ private static String mockMultipleAnnouncementsResponse() {
+ return "[{\"id\":\"cd0cb768-889f-47a1-a94b-1438017dad77\",\"corporate_action_id\":\"2642471\",\"ca_type\":\"spinoff\",\"ca_sub_type\":\"spinoff\",\"initiating_symbol\":\"KLG\",\"initiating_original_cusip\":\"92942W107\",\"target_symbol\":\"K\",\"target_original_cusip\":\"487836108\",\"effective_date\":\"2023-09-08\",\"ex_date\":\"2023-10-02\",\"record_date\":\"2023-09-21\",\"payable_date\":\"2023-10-02\",\"cash\":\"0\",\"old_rate\":\"1\",\"new_rate\":\"0.25\"},{\"id\":\"3a7fe233-7766-4f70-915f-9d1a5258eaa9\",\"corporate_action_id\":\"487836108_AD23\",\"ca_type\":\"dividend\",\"ca_sub_type\":\"cash\",\"initiating_symbol\":\"K\",\"initiating_original_cusip\":\"487836108\",\"target_symbol\":\"K\",\"target_original_cusip\":\"487836108\",\"declaration_date\":\"2023-09-19\",\"effective_date\":\"2023-09-21\",\"ex_date\":\"2023-10-02\",\"record_date\":\"2023-09-21\",\"payable_date\":\"2023-10-02\",\"cash\":\"0\",\"old_rate\":\"1\",\"new_rate\":\"1\"},{\"id\":\"ddf64bcb-fa76-4472-a98b-237f220ea38b\",\"corporate_action_id\":\"487836108_AE23\",\"ca_type\":\"dividend\",\"ca_sub_type\":\"cash\",\"initiating_symbol\":\"K\",\"initiating_original_cusip\":\"487836108\",\"target_symbol\":\"K\",\"target_original_cusip\":\"487836108\",\"declaration_date\":\"2023-11-29\",\"effective_date\":\"2023-12-01\",\"ex_date\":\"2023-11-30\",\"record_date\":\"2023-12-01\",\"payable_date\":\"2023-12-15\",\"cash\":\"0.56\",\"old_rate\":\"1\",\"new_rate\":\"1\"}]";
+ }
+
+ private static String mockSingleAnnouncementResponse() {
+ return "{\"id\":\"cd0cb768-889f-47a1-a94b-1438017dad77\",\"corporate_action_id\":\"2642471\",\"ca_type\":\"spinoff\",\"ca_sub_type\":\"spinoff\",\"initiating_symbol\":\"KLG\",\"initiating_original_cusip\":\"92942W107\",\"target_symbol\":\"K\",\"target_original_cusip\":\"487836108\",\"effective_date\":\"2023-09-08\",\"ex_date\":\"2023-10-02\",\"record_date\":\"2023-09-21\",\"payable_date\":\"2023-10-02\",\"cash\":\"0\",\"old_rate\":\"1\",\"new_rate\":\"0.25\"}";
+ }
+}
From 6d5a0436da2de9d6ebadeb5fad76f820a6ea0545 Mon Sep 17 00:00:00 2001
From: gretard
Date: Mon, 8 Jan 2024 20:23:20 +0200
Subject: [PATCH 53/84] Add news actions endpoints for #118
---
README.md | 33 +++++
.../control/subscriptions_message.json | 4 +
.../enums/market_data_message_type.json | 6 +-
.../market_data/news/common/image.json | 13 ++
.../market_data/news/common/news_article.json | 39 ++++++
.../market_data/news/news_response.json | 12 ++
.../news/realtime/news_message.json | 40 ++++++
.../net/jacobpeterson/alpaca/AlpacaAPI.java | 32 ++++-
.../marketdata/news/NewsEndpoint.java | 120 ++++++++++++++++++
.../marketdata/MarketDataWebsocket.java | 32 +++--
.../MarketDataWebsocketInterface.java | 11 +-
.../news/NewsMarketDataWebsocket.java | 15 +++
.../CorporateActionsEndpointTest.java | 11 +-
.../marketdata/news/NewsEndpointTest.java | 111 ++++++++++++++++
14 files changed, 461 insertions(+), 18 deletions(-)
create mode 100644 schema_json/endpoint/market_data/news/common/image.json
create mode 100644 schema_json/endpoint/market_data/news/common/news_article.json
create mode 100644 schema_json/endpoint/market_data/news/news_response.json
create mode 100644 schema_json/endpoint/market_data/news/realtime/news_message.json
create mode 100644 src/main/java/net/jacobpeterson/alpaca/rest/endpoint/marketdata/news/NewsEndpoint.java
create mode 100644 src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/news/NewsMarketDataWebsocket.java
create mode 100644 src/test/java/net/jacobpeterson/alpaca/test/mock/marketdata/news/NewsEndpointTest.java
diff --git a/README.md b/README.md
index 82630ee6..c483ee2d 100644
--- a/README.md
+++ b/README.md
@@ -495,6 +495,39 @@ alpacaAPI.cryptoMarketDataStreaming().subscribe(
Arrays.asList("*"));
```
+## [`NewsMarketDataWebsocket`](src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/news/NewsMarketDataWebsocket.java)
+Alpaca also offers news websocket streaming for symbols.
+
+The usage is identical to the [`StockMarketDataWebsocket`](https://github.com/Petersoj/alpaca-java/#stockmarketdatawebsocket) usage except that accessing the websocket instance via the `AlpacaAPI` instance is done using: `alpacaAPI.newsMarketDataStreaming()` instead of `alpacaAPI.stockMarketDataStreaming()`.
+
+Example usage:
+```java
+MarketDataListener marketDataListener = (messageType, message) ->
+ System.out.printf("%s: %s\n", messageType.name(), message);
+
+MarketDataWebsocketInterface newsWebsocket = alpacaAPI.newsMarketDataStreaming();
+
+newsWebsocket.setListener(marketDataListener);
+newsWebsocket.subscribeToControl(
+ MarketDataMessageType.SUCCESS,
+ MarketDataMessageType.SUBSCRIPTION,
+ MarketDataMessageType.ERROR);
+
+newsWebsocket.connect();
+newsWebsocket.waitForAuthorization(5, TimeUnit.SECONDS);
+if (!newsWebsocket.isValid()) {
+ System.out.println("Websocket not valid!");
+ return;
+}
+newsWebsocket.subscribe(null, null, null, Arrays.asList("*"));
+
+// Wait a few seconds
+Thread.sleep(5000);
+
+// Manually disconnect the websocket
+newsWebsocket.disconnect();
+```
+
# Building
To build this project yourself, clone this repository and run:
```
diff --git a/schema_json/endpoint/market_data/common/realtime/control/subscriptions_message.json b/schema_json/endpoint/market_data/common/realtime/control/subscriptions_message.json
index c302083a..b44cbb85 100644
--- a/schema_json/endpoint/market_data/common/realtime/control/subscriptions_message.json
+++ b/schema_json/endpoint/market_data/common/realtime/control/subscriptions_message.json
@@ -16,6 +16,10 @@
"bars": {
"existingJavaType": "java.util.ArrayList",
"title": "The {@link java.util.ArrayList} of subscribed bars."
+ },
+ "news": {
+ "existingJavaType": "java.util.ArrayList",
+ "title": "The {@link java.util.ArrayList} of subscribed news."
}
}
}
diff --git a/schema_json/endpoint/market_data/common/realtime/enums/market_data_message_type.json b/schema_json/endpoint/market_data/common/realtime/enums/market_data_message_type.json
index f55a5190..6999050d 100644
--- a/schema_json/endpoint/market_data/common/realtime/enums/market_data_message_type.json
+++ b/schema_json/endpoint/market_data/common/realtime/enums/market_data_message_type.json
@@ -7,7 +7,8 @@
"subscription",
"t",
"q",
- "b"
+ "b",
+ "n"
],
"javaEnums": [
{
@@ -27,6 +28,9 @@
},
{
"name": "BAR"
+ },
+ {
+ "name": "NEWS"
}
]
}
diff --git a/schema_json/endpoint/market_data/news/common/image.json b/schema_json/endpoint/market_data/news/common/image.json
new file mode 100644
index 00000000..2f3bf607
--- /dev/null
+++ b/schema_json/endpoint/market_data/news/common/image.json
@@ -0,0 +1,13 @@
+{
+ "type": "object",
+ "title": "See News.",
+ "properties": {
+ "size": {
+ "existingJavaType": "java.lang.String"
+ },
+ "url": {
+ "existingJavaType": "java.lang.String"
+ }
+ }
+ }
+
\ No newline at end of file
diff --git a/schema_json/endpoint/market_data/news/common/news_article.json b/schema_json/endpoint/market_data/news/common/news_article.json
new file mode 100644
index 00000000..ee80a6d7
--- /dev/null
+++ b/schema_json/endpoint/market_data/news/common/news_article.json
@@ -0,0 +1,39 @@
+{
+ "type": "object",
+ "title": "See News.",
+ "properties": {
+ "author": {
+ "existingJavaType": "java.lang.String"
+ },
+ "content": {
+ "existingJavaType": "java.lang.String"
+ },
+ "created_at": {
+ "existingJavaType": "java.time.ZonedDateTime"
+ },
+ "headline": {
+ "existingJavaType": "java.lang.String"
+ },
+ "id": {
+ "existingJavaType": "java.lang.Long"
+ },
+ "images": {
+ "existingJavaType": "java.util.ArrayList"
+ },
+ "source": {
+ "existingJavaType": "java.lang.String"
+ },
+ "summary": {
+ "existingJavaType": "java.lang.String"
+ },
+ "symbols": {
+ "existingJavaType": "java.util.ArrayList"
+ },
+ "updated_at": {
+ "existingJavaType": "java.time.ZonedDateTime"
+ },
+ "url": {
+ "existingJavaType": "java.lang.String"
+ }
+ }
+ }
diff --git a/schema_json/endpoint/market_data/news/news_response.json b/schema_json/endpoint/market_data/news/news_response.json
new file mode 100644
index 00000000..b25ed7f9
--- /dev/null
+++ b/schema_json/endpoint/market_data/news/news_response.json
@@ -0,0 +1,12 @@
+{
+ "type": "object",
+ "title": "See News.",
+ "properties": {
+ "news": {
+ "existingJavaType": "java.util.ArrayList"
+ },
+ "next_page_token": {
+ "existingJavaType": "java.lang.String"
+ }
+ }
+}
diff --git a/schema_json/endpoint/market_data/news/realtime/news_message.json b/schema_json/endpoint/market_data/news/realtime/news_message.json
new file mode 100644
index 00000000..bee011fe
--- /dev/null
+++ b/schema_json/endpoint/market_data/news/realtime/news_message.json
@@ -0,0 +1,40 @@
+{
+ "type": "object",
+ "title": "See News.",
+ "extends": {
+ "existingJavaType": "net.jacobpeterson.alpaca.model.endpoint.marketdata.common.realtime.MarketDataMessage"
+ },
+ "properties": {
+ "headline": {
+ "existingJavaType": "java.lang.String"
+ },
+ "created_at": {
+ "existingJavaType": "java.time.ZonedDateTime"
+ },
+ "updated_at": {
+ "existingJavaType": "java.time.ZonedDateTime"
+ },
+ "author": {
+ "existingJavaType": "java.lang.String"
+ },
+ "summary": {
+ "existingJavaType": "java.lang.String"
+ },
+ "content": {
+ "existingJavaType": "java.lang.String"
+ },
+
+ "url": {
+ "existingJavaType": "java.lang.String"
+ },
+ "symbols": {
+ "existingJavaType": "java.util.ArrayList"
+ },
+ "source": {
+ "existingJavaType": "java.lang.String"
+ },
+ "id": {
+ "existingJavaType": "java.lang.Long"
+ }
+ }
+ }
diff --git a/src/main/java/net/jacobpeterson/alpaca/AlpacaAPI.java b/src/main/java/net/jacobpeterson/alpaca/AlpacaAPI.java
index 922ddd10..4292e85d 100644
--- a/src/main/java/net/jacobpeterson/alpaca/AlpacaAPI.java
+++ b/src/main/java/net/jacobpeterson/alpaca/AlpacaAPI.java
@@ -23,6 +23,8 @@
import net.jacobpeterson.alpaca.websocket.marketdata.MarketDataWebsocketInterface;
import net.jacobpeterson.alpaca.websocket.marketdata.crypto.CryptoMarketDataWebsocket;
import net.jacobpeterson.alpaca.websocket.marketdata.stock.StockMarketDataWebsocket;
+import net.jacobpeterson.alpaca.rest.endpoint.marketdata.news.NewsEndpoint;
+import net.jacobpeterson.alpaca.websocket.marketdata.news.NewsMarketDataWebsocket;
import net.jacobpeterson.alpaca.websocket.streaming.StreamingWebsocket;
import net.jacobpeterson.alpaca.websocket.streaming.StreamingWebsocketInterface;
import okhttp3.OkHttpClient;
@@ -46,11 +48,13 @@ public class AlpacaAPI {
private static final String VERSION_2_PATH_SEGMENT = "v2";
private static final String VERSION_1_BETA_3_PATH_SEGMENT = "v1beta3";
+ private static final String VERSION_1_BETA_1_PATH_SEGMENT = "v1beta1";
private final OkHttpClient okHttpClient;
private final AlpacaClient brokerClient;
private final AlpacaClient cryptoDataClient;
private final AlpacaClient stockDataClient;
+ private final AlpacaClient newsDataClient;
// Ordering of fields/methods below are analogous to the ordering in the Alpaca documentation
private final AccountEndpoint accountEndpoint;
private final CryptoMarketDataEndpoint cryptoMarketDataEndpoint;
@@ -67,8 +71,10 @@ public class AlpacaAPI {
private final StreamingWebsocket streamingWebsocket;
private final CryptoMarketDataWebsocket cryptoMarketDataWebsocket;
private final StockMarketDataWebsocket stockMarketDataWebsocket;
-
private final CorporateActionsEndpoint corporateActionsEndpoint;
+ private final NewsMarketDataWebsocket newsMarketDataWebsocket;
+ private final NewsEndpoint newsEndpoint;
+
/**
* Instantiates a new {@link AlpacaAPI} using properties specified in alpaca.properties file (or their
* associated defaults).
@@ -175,10 +181,12 @@ public AlpacaAPI(OkHttpClient okHttpClient, String keyID, String secretKey, Stri
brokerHostSubdomain, VERSION_2_PATH_SEGMENT);
cryptoDataClient = new AlpacaClient(okHttpClient, keyID, secretKey, "data", VERSION_1_BETA_3_PATH_SEGMENT);
stockDataClient = new AlpacaClient(okHttpClient, keyID, secretKey, "data", VERSION_2_PATH_SEGMENT);
+ newsDataClient = new AlpacaClient(okHttpClient, keyID, secretKey, "data", VERSION_1_BETA_1_PATH_SEGMENT);
} else {
brokerClient = new AlpacaClient(okHttpClient, oAuthToken, brokerHostSubdomain, VERSION_2_PATH_SEGMENT);
cryptoDataClient = null;
stockDataClient = null;
+ newsDataClient = null;
}
accountEndpoint = new AccountEndpoint(brokerClient);
@@ -200,6 +208,8 @@ public AlpacaAPI(OkHttpClient okHttpClient, String keyID, String secretKey, Stri
stockMarketDataWebsocket = stockDataClient == null ? null :
new StockMarketDataWebsocket(okHttpClient, dataAPIType, keyID, secretKey);
corporateActionsEndpoint = new CorporateActionsEndpoint(brokerClient);
+ newsEndpoint = newsDataClient == null ? null : new NewsEndpoint(newsDataClient);
+ newsMarketDataWebsocket = newsDataClient == null ? null : new NewsMarketDataWebsocket(okHttpClient, keyID, secretKey);
}
/**
@@ -323,12 +333,32 @@ public AlpacaClient getStockDataClient() {
return stockDataClient;
}
+ public AlpacaClient getNewsDataClient() {
+ return newsDataClient;
+ }
+
/**
* @return the {@link CorporateActionsEndpoint}
*/
public CorporateActionsEndpoint corporateActions() {
return corporateActionsEndpoint;
}
+
+ /**
+ * @return the {@link NewsEndpoint}
+ */
+ public NewsEndpoint newsEndpoint() {
+ return newsEndpoint;
+ }
+
+ /**
+ * @return the News {@link MarketDataWebsocketInterface}
+ */
+ public MarketDataWebsocketInterface newsMarketDataStreaming() {
+ return newsMarketDataWebsocket;
+ }
+
+
/**
* Creates a {@link Builder} for {@link AlpacaAPI}.
*
diff --git a/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/marketdata/news/NewsEndpoint.java b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/marketdata/news/NewsEndpoint.java
new file mode 100644
index 00000000..88ee1b7c
--- /dev/null
+++ b/src/main/java/net/jacobpeterson/alpaca/rest/endpoint/marketdata/news/NewsEndpoint.java
@@ -0,0 +1,120 @@
+package net.jacobpeterson.alpaca.rest.endpoint.marketdata.news;
+
+import net.jacobpeterson.alpaca.model.endpoint.common.enums.SortDirection;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.news.NewsResponse;
+import net.jacobpeterson.alpaca.rest.AlpacaClient;
+import net.jacobpeterson.alpaca.rest.AlpacaClientException;
+import net.jacobpeterson.alpaca.rest.endpoint.AlpacaEndpoint;
+import okhttp3.HttpUrl;
+import okhttp3.Request;
+
+import java.time.LocalDate;
+import java.util.List;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * {@link AlpacaEndpoint} for
+ * News
+ * Endpoint.
+ */
+public class NewsEndpoint extends AlpacaEndpoint {
+
+ /**
+ * Instantiates a new {@link AlpacaEndpoint}.
+ *
+ * @param alpacaClient the {@link AlpacaClient}
+ */
+ public NewsEndpoint(AlpacaClient alpacaClient) {
+ super(alpacaClient, "news");
+ }
+
+ /**
+ * Gets latest list of news {@link NewsResponse}.
+ * @return the {@link NewsResponse}
+ * @throws AlpacaClientException thrown for {@link AlpacaClientException}
+ */
+ public NewsResponse getLatestNews() throws AlpacaClientException {
+ return this.getLatestNews(null, null, null, null, null, null, null, null);
+ }
+
+ /**
+ * Gets latest list of news {@link NewsResponse} for specific symbols.
+ * @param symbols list of symbols to query news for
+ * @return the {@link NewsResponse}
+ * @throws AlpacaClientException thrown for {@link AlpacaClientException}s
+ */
+ public NewsResponse getLatestNews(List symbols) throws AlpacaClientException {
+ checkNotNull(symbols);
+ return this.getLatestNews(null, null, null, symbols, null, null, null, null);
+ }
+
+ /**
+ * Gets latest list of news {@link NewsResponse} for specified token.
+ * @param pageToken the ID of the end of your current page of results. (See the section on paging.)
+ * @return the {@link NewsResponse}
+ * @throws AlpacaClientException thrown for {@link AlpacaClientException}s
+ */
+ public NewsResponse getLatestNewsPaged(String pageToken) throws AlpacaClientException {
+ checkNotNull(pageToken);
+ return this.getLatestNews(null, null, null, null, null, null, null, pageToken);
+ }
+
+ /**
+ * Gets latest list of news {@link NewsResponse}
+ * @param start The inclusive start of the interval
+ * @param end the inclusive end of the interval
+ * @param sortDirection sort articles by updated date
+ * @param symbols list of symbols to query news for
+ * @param limit Limit of news items to be returned for given page
+ * @param includeContent Boolean indicator to include content for news articles (if available)
+ * @param excludeContentless Boolean indicator to exclude news articles that do not contain content
+ * @param pageToken the ID of the end of your current page of results. (See the section on paging.)
+ * @return the {@link NewsResponse}
+ * @throws AlpacaClientException thrown for {@link AlpacaClientException}s
+ */
+ public NewsResponse getLatestNews(
+ LocalDate start, LocalDate end,
+ SortDirection sortDirection,
+ List symbols,
+ Integer limit,
+ Boolean includeContent,
+ Boolean excludeContentless,
+ String pageToken) throws AlpacaClientException {
+
+ HttpUrl.Builder urlBuilder = alpacaClient.urlBuilder()
+ .addPathSegment(endpointPathSegment);
+
+ if (start != null) {
+ urlBuilder.addQueryParameter("start", start.toString());
+ }
+ if (end != null) {
+ urlBuilder.addQueryParameter("end", end.toString());
+ }
+ if (sortDirection != null) {
+ urlBuilder.addQueryParameter("sort", sortDirection.value());
+ }
+ if (symbols != null && !symbols.isEmpty()) {
+ urlBuilder.addQueryParameter("symbols", String.join(",", symbols));
+ }
+ if (limit != null) {
+ urlBuilder.addQueryParameter("limit", Integer.toString(limit));
+ }
+ if (includeContent != null) {
+ urlBuilder.addQueryParameter("include_content", Boolean.toString(includeContent));
+ }
+ if (excludeContentless != null) {
+ urlBuilder.addQueryParameter("exclude_contentless", Boolean.toString(excludeContentless));
+ }
+ if (pageToken != null) {
+ urlBuilder.addQueryParameter("page_token", pageToken);
+ }
+
+ Request request = alpacaClient.requestBuilder(urlBuilder.build())
+ .get()
+ .build();
+
+ return alpacaClient.requestObject(request, NewsResponse.class);
+
+ }
+}
diff --git a/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/MarketDataWebsocket.java b/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/MarketDataWebsocket.java
index 9c924c11..48c297f9 100644
--- a/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/MarketDataWebsocket.java
+++ b/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/MarketDataWebsocket.java
@@ -13,6 +13,8 @@
import net.jacobpeterson.alpaca.model.endpoint.marketdata.common.realtime.enums.MarketDataMessageType;
import net.jacobpeterson.alpaca.model.endpoint.marketdata.common.realtime.quote.QuoteMessage;
import net.jacobpeterson.alpaca.model.endpoint.marketdata.common.realtime.trade.TradeMessage;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.news.common.NewsArticle;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.news.realtime.NewsMessage;
import net.jacobpeterson.alpaca.websocket.AlpacaWebsocket;
import okhttp3.HttpUrl;
import okhttp3.OkHttpClient;
@@ -53,7 +55,8 @@ public abstract class MarketDataWebsocket
private static final List SUBSCRIBABLE_MARKET_DATA_MESSAGE_TYPES = Arrays.asList(
MarketDataMessageType.TRADE,
MarketDataMessageType.QUOTE,
- MarketDataMessageType.BAR);
+ MarketDataMessageType.BAR,
+ MarketDataMessageType.NEWS);
/**
* Creates a {@link HttpUrl} for {@link MarketDataWebsocket} with the given websocketURLPathSegments.
@@ -74,9 +77,11 @@ private static HttpUrl createWebsocketURL(String websocketURLPathSegments) {
private final Set subscribedTrades;
private final Set subscribedQuotes;
private final Set subscribedBars;
+ private final Set subscribedNews;
private final Type tradeClassType;
private final Type quoteClassType;
private final Type barClassType;
+ private final Type newsClassType = NewsMessage.class;
/**
* Instantiates a new {@link MarketDataWebsocket}.
@@ -101,7 +106,7 @@ public MarketDataWebsocket(OkHttpClient okHttpClient, String websocketURLPathSeg
subscribedTrades = new HashSet<>();
subscribedQuotes = new HashSet<>();
subscribedBars = new HashSet<>();
-
+ subscribedNews = new HashSet<>();
this.tradeClassType = tradeClass;
this.quoteClassType = quoteClass;
this.barClassType = barClass;
@@ -124,7 +129,7 @@ protected void onReconnection() {
sendAuthenticationMessage();
if (waitForAuthorization(5, TimeUnit.SECONDS)) {
subscribeToControl(Iterables.toArray(listenedMarketDataMessageTypes, MarketDataMessageType.class));
- subscribe(subscribedTrades, subscribedQuotes, subscribedBars);
+ subscribe(subscribedTrades, subscribedQuotes, subscribedBars, subscribedNews);
}
}
@@ -210,6 +215,8 @@ public void onMessage(@NotNull WebSocket webSocket, @NotNull String message) {
subscribedQuotes);
handleSubscriptionMessageList(MarketDataMessageType.BAR, subscriptionsMessage.getBars(),
subscribedBars);
+ handleSubscriptionMessageList(MarketDataMessageType.NEWS, subscriptionsMessage.getNews(),
+ subscribedNews);
break;
case TRADE:
marketDataMessage = GSON.fromJson(messageObject, tradeClassType);
@@ -220,6 +227,9 @@ public void onMessage(@NotNull WebSocket webSocket, @NotNull String message) {
case BAR:
marketDataMessage = GSON.fromJson(messageObject, barClassType);
break;
+ case NEWS:
+ marketDataMessage = GSON.fromJson(messageObject, newsClassType);
+ break;
default:
LOGGER.error("Message type {} not implemented!", marketDataMessageType);
continue;
@@ -286,14 +296,14 @@ public void subscribeToControl(MarketDataMessageType... marketDataMessageTypes)
@Override
public void subscribe(Collection tradeSymbols, Collection quoteSymbols,
- Collection barSymbols) {
- sendSubscriptionUpdate(tradeSymbols, quoteSymbols, barSymbols, true);
+ Collection barSymbols, Collection newsSymbols) {
+ sendSubscriptionUpdate(tradeSymbols, quoteSymbols, barSymbols, newsSymbols, true);
}
@Override
public void unsubscribe(Collection tradeSymbols, Collection quoteSymbols,
- Collection barSymbols) {
- sendSubscriptionUpdate(tradeSymbols, quoteSymbols, barSymbols, false);
+ Collection barSymbols, Collection newsSymbols) {
+ sendSubscriptionUpdate(tradeSymbols, quoteSymbols, barSymbols, newsSymbols, false);
}
/**
@@ -305,7 +315,7 @@ public void unsubscribe(Collection tradeSymbols, Collection quot
* @param subscribe true to subscribe, false to unsubscribe
*/
private void sendSubscriptionUpdate(Collection tradeSymbols, Collection quoteSymbols,
- Collection barSymbols, boolean subscribe) {
+ Collection barSymbols, Collection newsSymbols, boolean subscribe) {
if (!isConnected()) {
throw new IllegalStateException("This websocket must be connected before sending subscription updates!");
}
@@ -325,6 +335,7 @@ private void sendSubscriptionUpdate(Collection tradeSymbols, Collection<
addSubscriptionUpdateList(subscriptionUpdateObject, "trades", tradeSymbols);
addSubscriptionUpdateList(subscriptionUpdateObject, "quotes", quoteSymbols);
addSubscriptionUpdateList(subscriptionUpdateObject, "bars", barSymbols);
+ addSubscriptionUpdateList(subscriptionUpdateObject, "news", newsSymbols);
boolean updateExists = subscriptionUpdateObject.size() > 1;
if (updateExists) {
@@ -368,4 +379,9 @@ public Collection subscribedQuotes() {
public Collection subscribedBars() {
return new HashSet<>(subscribedBars);
}
+
+ @Override
+ public Collection subscribedNews() {
+ return new HashSet<>(subscribedNews);
+ }
}
diff --git a/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/MarketDataWebsocketInterface.java b/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/MarketDataWebsocketInterface.java
index 5ffcaf3c..d4f7700c 100644
--- a/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/MarketDataWebsocketInterface.java
+++ b/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/MarketDataWebsocketInterface.java
@@ -33,9 +33,9 @@ public interface MarketDataWebsocketInterface extends AlpacaWebsocketInterfacenull for no change
* @param barSymbols a {@link Collection} of symbols to subscribe to bars or null for no change
*
- * @see #unsubscribe(Collection, Collection, Collection)
+ * @see #unsubscribe(Collection, Collection, Collection, Collection)
*/
- void subscribe(Collection tradeSymbols, Collection quoteSymbols, Collection barSymbols);
+ void subscribe(Collection tradeSymbols, Collection quoteSymbols, Collection barSymbols, Collection newsSymbols);
/**
* Unsubscribes from trades, quotes, or bars according to the given {@link Collection} of symbols.
@@ -49,9 +49,9 @@ public interface MarketDataWebsocketInterface extends AlpacaWebsocketInterfacenull for no change
*
- * @see #subscribe(Collection, Collection, Collection)
+ * @see #subscribe(Collection, Collection, Collection, Collection)
*/
- void unsubscribe(Collection tradeSymbols, Collection quoteSymbols, Collection barSymbols);
+ void unsubscribe(Collection tradeSymbols, Collection quoteSymbols, Collection barSymbols, Collection newsSymbols);
/**
* Gets all the currently subscribed control {@link MarketDataMessageType}s.
@@ -80,4 +80,7 @@ public interface MarketDataWebsocketInterface extends AlpacaWebsocketInterface subscribedBars();
+
+ Collection subscribedNews();
+
}
diff --git a/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/news/NewsMarketDataWebsocket.java b/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/news/NewsMarketDataWebsocket.java
new file mode 100644
index 00000000..9d2c2620
--- /dev/null
+++ b/src/main/java/net/jacobpeterson/alpaca/websocket/marketdata/news/NewsMarketDataWebsocket.java
@@ -0,0 +1,15 @@
+package net.jacobpeterson.alpaca.websocket.marketdata.news;
+
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.common.realtime.bar.BarMessage;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.common.realtime.quote.QuoteMessage;
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.common.realtime.trade.TradeMessage;
+import net.jacobpeterson.alpaca.websocket.marketdata.MarketDataWebsocket;
+import okhttp3.OkHttpClient;
+
+public class NewsMarketDataWebsocket extends MarketDataWebsocket {
+ public NewsMarketDataWebsocket(OkHttpClient okHttpClient,
+ String keyID, String secretKey) {
+ super(okHttpClient, "v1beta1/news", "News", keyID, secretKey, TradeMessage.class,
+ QuoteMessage.class, BarMessage.class);
+ }
+}
diff --git a/src/test/java/net/jacobpeterson/alpaca/test/mock/corporateactions/CorporateActionsEndpointTest.java b/src/test/java/net/jacobpeterson/alpaca/test/mock/corporateactions/CorporateActionsEndpointTest.java
index fd2dc0ae..c895ed03 100644
--- a/src/test/java/net/jacobpeterson/alpaca/test/mock/corporateactions/CorporateActionsEndpointTest.java
+++ b/src/test/java/net/jacobpeterson/alpaca/test/mock/corporateactions/CorporateActionsEndpointTest.java
@@ -45,21 +45,24 @@ void getAnnouncements_shouldReturnData() throws AlpacaClientException {
void getAnnouncements_validation_caTypes() {
CorporateActionsEndpoint newsEndpoint = setupEndpoint(mockMultipleAnnouncementsResponse());
- assertThrows(Exception.class, () -> newsEndpoint.getAnnouncements(null, LocalDate.now(), LocalDate.now(), null, null, null));
+ assertThrows(Exception.class,
+ () -> newsEndpoint.getAnnouncements(null, LocalDate.now(), LocalDate.now(), null, null, null));
}
@Test
void getAnnouncements_validation_since() {
CorporateActionsEndpoint newsEndpoint = setupEndpoint(mockMultipleAnnouncementsResponse());
- assertThrows(Exception.class, () -> newsEndpoint.getAnnouncements(new ArrayList<>(), null, LocalDate.now(), null, null, null));
+ assertThrows(Exception.class,
+ () -> newsEndpoint.getAnnouncements(new ArrayList<>(), null, LocalDate.now(), null, null, null));
}
@Test
void getAnnouncements_validation_until() {
CorporateActionsEndpoint newsEndpoint = setupEndpoint(mockMultipleAnnouncementsResponse());
- assertThrows(Exception.class, () -> newsEndpoint.getAnnouncements(new ArrayList<>(), LocalDate.now(), null, null, null, null));
+ assertThrows(Exception.class,
+ () -> newsEndpoint.getAnnouncements(new ArrayList<>(), LocalDate.now(), null, null, null, null));
}
@Test
@@ -76,7 +79,7 @@ void getAnnouncement_shouldReturnData() throws AlpacaClientException {
Announcement announcement = newsEndpoint.getAnnouncement("1");
assertNotNull(announcement);
- assertEquals(announcement.getId(), "cd0cb768-889f-47a1-a94b-1438017dad77");
+ assertEquals("cd0cb768-889f-47a1-a94b-1438017dad77", announcement.getId());
}
private static CorporateActionsEndpoint setupEndpoint(String response) {
diff --git a/src/test/java/net/jacobpeterson/alpaca/test/mock/marketdata/news/NewsEndpointTest.java b/src/test/java/net/jacobpeterson/alpaca/test/mock/marketdata/news/NewsEndpointTest.java
new file mode 100644
index 00000000..ef4b553f
--- /dev/null
+++ b/src/test/java/net/jacobpeterson/alpaca/test/mock/marketdata/news/NewsEndpointTest.java
@@ -0,0 +1,111 @@
+package net.jacobpeterson.alpaca.test.mock.marketdata.news;
+
+import net.jacobpeterson.alpaca.model.endpoint.marketdata.news.NewsResponse;
+import net.jacobpeterson.alpaca.rest.AlpacaClient;
+import net.jacobpeterson.alpaca.rest.AlpacaClientException;
+import net.jacobpeterson.alpaca.rest.endpoint.marketdata.news.NewsEndpoint;
+import okhttp3.MediaType;
+import okhttp3.OkHttpClient;
+import okhttp3.ResponseBody;
+import okhttp3.mock.MockInterceptor;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+class NewsEndpointTest {
+
+ @Test
+ void getLatestNews_validation_page() {
+ NewsEndpoint newsEndpoint = setupEndpoint(mockResponse());
+
+ assertThrows(Exception.class, () -> newsEndpoint.getLatestNewsPaged(null));
+ }
+
+ @Test
+ void getLatestNews_validation_symbols() {
+ NewsEndpoint newsEndpoint = setupEndpoint(mockResponse());
+
+ assertThrows(Exception.class, () -> newsEndpoint.getLatestNews(null));
+ }
+
+ @Test
+ void getLatestNews_shouldReturnData() throws AlpacaClientException {
+ NewsEndpoint newsEndpoint = setupEndpoint(mockResponse());
+ NewsResponse response = newsEndpoint.getLatestNews(null, null, null, null, null, null, null, null);
+
+ assertNotNull(response);
+ assertEquals("MTcwNDczNjg2NTAwMDAwMDAwMHwzNjU0MDM2Mw==", response.getNextPageToken());
+ assertEquals(1, response.getNews().size());
+ assertEquals(3, response.getNews().get(0).getImages().size());
+
+ }
+
+ @Test
+ void getLatestNews_shouldReturnLatestData() throws AlpacaClientException {
+ NewsEndpoint newsEndpoint = setupEndpoint(mockResponse());
+ NewsResponse response = newsEndpoint.getLatestNews();
+
+ assertNotNull(response);
+ assertEquals("MTcwNDczNjg2NTAwMDAwMDAwMHwzNjU0MDM2Mw==", response.getNextPageToken());
+ assertEquals(1, response.getNews().size());
+ assertEquals(3, response.getNews().get(0).getImages().size());
+
+ }
+
+ private static NewsEndpoint setupEndpoint(String response) {
+ MockInterceptor interceptor = new MockInterceptor();
+ interceptor.addRule()
+ .respond(200)
+ .body(ResponseBody.create(response, MediaType.parse("application/json")));
+
+ OkHttpClient client = new OkHttpClient.Builder()
+ .addInterceptor(interceptor)
+ .build();
+
+ AlpacaClient api = new AlpacaClient(client, "token", "test", "/v1");
+
+ return new NewsEndpoint(api);
+ }
+
+ private static String mockResponse() {
+ return "{\n" +
+ " \"news\": [\n" +
+ " {\n" +
+ " \"author\": \"Khyathi Dalal\",\n" +
+ " \"content\": \"\",\n" +
+ " \"created_at\": \"2024-01-08T18:07:34Z\",\n" +
+ " \"headline\": \"Solana Drops 9.9%, Solana Memecoins Tank Over 20%: Is This The End Of The Dogecoin Killers?\",\n" +
+ " \"id\": 36536785,\n" +
+ " \"images\": [\n" +
+ " {\n" +
+ " \"size\": \"large\",\n" +
+ " \"url\": \"https://cdn.benzinga.com/files/imagecache/2048x1536xUP/images/story/2024/01/08/solana_coin_shutter2_0.jpg\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"size\": \"small\",\n" +
+ " \"url\": \"https://cdn.benzinga.com/files/imagecache/1024x768xUP/images/story/2024/01/08/solana_coin_shutter2_0.jpg\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"size\": \"thumb\",\n" +
+ " \"url\": \"https://cdn.benzinga.com/files/imagecache/250x187xUP/images/story/2024/01/08/solana_coin_shutter2_0.jpg\"\n" +
+ " }\n" +
+ " ],\n" +
+ " \"source\": \"benzinga\",\n" +
+ " \"summary\": \"Solana (CRYPTO: SOL) dropped 1.4% in the past 24 hours, extending its losses over the previous seven days to 9.9%. Solana-based memecoins are particularly hard-hit by the correction, taking much heavier losses than established memecoins.\",\n" +
+ " \"symbols\": [\n" +
+ " \"BONKUSD\",\n" +
+ " \"DOGEUSD\",\n" +
+ " \"ETHUSD\",\n" +
+ " \"SHIBUSD\",\n" +
+ " \"SOLUSD\"\n" +
+ " ],\n" +
+ " \"updated_at\": \"2024-01-08T18:07:35Z\",\n" +
+ " \"url\": \"https://www.benzinga.com/markets/cryptocurrency/24/01/36536785/solana-drops-9-9-solana-memecoins-tank-over-20-is-this-the-end-of-the-dogecoin-killers\"\n" +
+ " }\n" +
+ " ],\n" +
+ " \"next_page_token\": \"MTcwNDczNjg2NTAwMDAwMDAwMHwzNjU0MDM2Mw==\"\n" +
+ "}";
+ }
+}
From 2750936a15114a750ce604e741fb8c6e88d87052 Mon Sep 17 00:00:00 2001
From: Jacob Peterson <14127217+Petersoj@users.noreply.github.com>
Date: Fri, 1 Mar 2024 17:16:16 -0800
Subject: [PATCH 54/84] Modify PR to account for future project structure
changes Namely: moving to OpenAPI generated clients, removing unit testing
for RestAPI
---
build.gradle | 1 -
.../alpaca/test/mock/AlpacaAPITest.java | 13 --
.../CorporateActionsEndpointTest.java | 107 -----------------
.../marketdata/news/NewsEndpointTest.java | 111 ------------------
4 files changed, 232 deletions(-)
delete mode 100644 src/test/java/net/jacobpeterson/alpaca/test/mock/corporateactions/CorporateActionsEndpointTest.java
delete mode 100644 src/test/java/net/jacobpeterson/alpaca/test/mock/marketdata/news/NewsEndpointTest.java
diff --git a/build.gradle b/build.gradle
index 7c65cc3d..a861d055 100644
--- a/build.gradle
+++ b/build.gradle
@@ -53,7 +53,6 @@ dependencies {
testImplementation group: 'org.slf4j', name: 'slf4j-simple', version: '1.7.36'
testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter', version: '5.8.2'
testImplementation group: 'org.mockito', name: 'mockito-core', version: '4.6.1'
- testImplementation group: 'com.github.gmazzo.okhttp.mock', name: 'mock-client', version: '2.0.0'
}
// Exclude any SLF4j-implementation transitive dependencies so users can use a logging framework of their choice
diff --git a/src/test/java/net/jacobpeterson/alpaca/test/mock/AlpacaAPITest.java b/src/test/java/net/jacobpeterson/alpaca/test/mock/AlpacaAPITest.java
index 0fbc722a..d5f4f320 100644
--- a/src/test/java/net/jacobpeterson/alpaca/test/mock/AlpacaAPITest.java
+++ b/src/test/java/net/jacobpeterson/alpaca/test/mock/AlpacaAPITest.java
@@ -6,8 +6,6 @@
import okhttp3.OkHttpClient;
import org.junit.jupiter.api.Test;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-
/**
* {@link AlpacaAPITest} tests {@link AlpacaAPI} using mocked objects with Mockito.
*/
@@ -73,15 +71,4 @@ public void testAlpacaAPIConstructor_okHttpClient_keyID_secret_oAuthToken_endpoi
new AlpacaAPI(okHttpClient, null, null, oAuthToken, EndpointAPIType.PAPER, DataAPIType.IEX);
new AlpacaAPI(okHttpClient, keyID, secret, null, EndpointAPIType.LIVE, DataAPIType.SIP);
}
-
- @Test
- public void testAlpacaAPIConstructor_corporateActionsEndpoint() {
- OkHttpClient okHttpClient = new OkHttpClient();
- String keyID = "ABCDEFGHIJKLM";
- String secret = "NOPQURSTUVWXYZ";
-
- AlpacaAPI api = new AlpacaAPI(okHttpClient, keyID, secret, null, EndpointAPIType.LIVE, DataAPIType.SIP);
-
- assertNotNull(api.corporateActions());
- }
}
diff --git a/src/test/java/net/jacobpeterson/alpaca/test/mock/corporateactions/CorporateActionsEndpointTest.java b/src/test/java/net/jacobpeterson/alpaca/test/mock/corporateactions/CorporateActionsEndpointTest.java
deleted file mode 100644
index c895ed03..00000000
--- a/src/test/java/net/jacobpeterson/alpaca/test/mock/corporateactions/CorporateActionsEndpointTest.java
+++ /dev/null
@@ -1,107 +0,0 @@
-package net.jacobpeterson.alpaca.test.mock.corporateactions;
-
-import net.jacobpeterson.alpaca.model.endpoint.corporateactions.common.Announcement;
-import net.jacobpeterson.alpaca.rest.AlpacaClient;
-import net.jacobpeterson.alpaca.rest.AlpacaClientException;
-import net.jacobpeterson.alpaca.rest.endpoint.corporateactions.CorporateActionsEndpoint;
-import okhttp3.MediaType;
-import okhttp3.OkHttpClient;
-import okhttp3.ResponseBody;
-import okhttp3.mock.MockInterceptor;
-import org.junit.jupiter.api.Test;
-
-import java.time.LocalDate;
-import java.util.ArrayList;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-import static org.junit.jupiter.api.Assertions.assertThrows;
-
-public class CorporateActionsEndpointTest {
-
- @Test
- void getAnnouncements_givenSymbol_shouldReturnData() throws AlpacaClientException {
- CorporateActionsEndpoint newsEndpoint = setupEndpoint(mockMultipleAnnouncementsResponse());
-
- java.util.List result = newsEndpoint.getAnnouncements("K");
-
- assertNotNull(result);
- assertEquals(3, result.size());
-
- }
-
- @Test
- void getAnnouncements_shouldReturnData() throws AlpacaClientException {
- CorporateActionsEndpoint newsEndpoint = setupEndpoint(mockMultipleAnnouncementsResponse());
-
- java.util.List result = newsEndpoint.getAnnouncements();
-
- assertNotNull(result);
- assertEquals(3, result.size());
-
- }
-
- @Test
- void getAnnouncements_validation_caTypes() {
- CorporateActionsEndpoint newsEndpoint = setupEndpoint(mockMultipleAnnouncementsResponse());
-
- assertThrows(Exception.class,
- () -> newsEndpoint.getAnnouncements(null, LocalDate.now(), LocalDate.now(), null, null, null));
- }
-
- @Test
- void getAnnouncements_validation_since() {
- CorporateActionsEndpoint newsEndpoint = setupEndpoint(mockMultipleAnnouncementsResponse());
-
- assertThrows(Exception.class,
- () -> newsEndpoint.getAnnouncements(new ArrayList<>(), null, LocalDate.now(), null, null, null));
- }
-
- @Test
- void getAnnouncements_validation_until() {
- CorporateActionsEndpoint newsEndpoint = setupEndpoint(mockMultipleAnnouncementsResponse());
-
- assertThrows(Exception.class,
- () -> newsEndpoint.getAnnouncements(new ArrayList<>(), LocalDate.now(), null, null, null, null));
- }
-
- @Test
- void getAnnouncement_validation_id() {
- CorporateActionsEndpoint newsEndpoint = setupEndpoint(mockSingleAnnouncementResponse());
-
- assertThrows(Exception.class, () -> newsEndpoint.getAnnouncement(null));
- }
-
- @Test
- void getAnnouncement_shouldReturnData() throws AlpacaClientException {
- CorporateActionsEndpoint newsEndpoint = setupEndpoint(mockSingleAnnouncementResponse());
-
- Announcement announcement = newsEndpoint.getAnnouncement("1");
-
- assertNotNull(announcement);
- assertEquals("cd0cb768-889f-47a1-a94b-1438017dad77", announcement.getId());
- }
-
- private static CorporateActionsEndpoint setupEndpoint(String response) {
- MockInterceptor interceptor = new MockInterceptor();
- interceptor.addRule()
- .respond(200)
- .body(ResponseBody.create(response, MediaType.parse("application/json")));
-
- OkHttpClient client = new OkHttpClient.Builder()
- .addInterceptor(interceptor)
- .build();
-
- AlpacaClient api = new AlpacaClient(client, "token", "test", "/v1");
-
- return new CorporateActionsEndpoint(api);
- }
-
- private static String mockMultipleAnnouncementsResponse() {
- return "[{\"id\":\"cd0cb768-889f-47a1-a94b-1438017dad77\",\"corporate_action_id\":\"2642471\",\"ca_type\":\"spinoff\",\"ca_sub_type\":\"spinoff\",\"initiating_symbol\":\"KLG\",\"initiating_original_cusip\":\"92942W107\",\"target_symbol\":\"K\",\"target_original_cusip\":\"487836108\",\"effective_date\":\"2023-09-08\",\"ex_date\":\"2023-10-02\",\"record_date\":\"2023-09-21\",\"payable_date\":\"2023-10-02\",\"cash\":\"0\",\"old_rate\":\"1\",\"new_rate\":\"0.25\"},{\"id\":\"3a7fe233-7766-4f70-915f-9d1a5258eaa9\",\"corporate_action_id\":\"487836108_AD23\",\"ca_type\":\"dividend\",\"ca_sub_type\":\"cash\",\"initiating_symbol\":\"K\",\"initiating_original_cusip\":\"487836108\",\"target_symbol\":\"K\",\"target_original_cusip\":\"487836108\",\"declaration_date\":\"2023-09-19\",\"effective_date\":\"2023-09-21\",\"ex_date\":\"2023-10-02\",\"record_date\":\"2023-09-21\",\"payable_date\":\"2023-10-02\",\"cash\":\"0\",\"old_rate\":\"1\",\"new_rate\":\"1\"},{\"id\":\"ddf64bcb-fa76-4472-a98b-237f220ea38b\",\"corporate_action_id\":\"487836108_AE23\",\"ca_type\":\"dividend\",\"ca_sub_type\":\"cash\",\"initiating_symbol\":\"K\",\"initiating_original_cusip\":\"487836108\",\"target_symbol\":\"K\",\"target_original_cusip\":\"487836108\",\"declaration_date\":\"2023-11-29\",\"effective_date\":\"2023-12-01\",\"ex_date\":\"2023-11-30\",\"record_date\":\"2023-12-01\",\"payable_date\":\"2023-12-15\",\"cash\":\"0.56\",\"old_rate\":\"1\",\"new_rate\":\"1\"}]";
- }
-
- private static String mockSingleAnnouncementResponse() {
- return "{\"id\":\"cd0cb768-889f-47a1-a94b-1438017dad77\",\"corporate_action_id\":\"2642471\",\"ca_type\":\"spinoff\",\"ca_sub_type\":\"spinoff\",\"initiating_symbol\":\"KLG\",\"initiating_original_cusip\":\"92942W107\",\"target_symbol\":\"K\",\"target_original_cusip\":\"487836108\",\"effective_date\":\"2023-09-08\",\"ex_date\":\"2023-10-02\",\"record_date\":\"2023-09-21\",\"payable_date\":\"2023-10-02\",\"cash\":\"0\",\"old_rate\":\"1\",\"new_rate\":\"0.25\"}";
- }
-}
diff --git a/src/test/java/net/jacobpeterson/alpaca/test/mock/marketdata/news/NewsEndpointTest.java b/src/test/java/net/jacobpeterson/alpaca/test/mock/marketdata/news/NewsEndpointTest.java
deleted file mode 100644
index ef4b553f..00000000
--- a/src/test/java/net/jacobpeterson/alpaca/test/mock/marketdata/news/NewsEndpointTest.java
+++ /dev/null
@@ -1,111 +0,0 @@
-package net.jacobpeterson.alpaca.test.mock.marketdata.news;
-
-import net.jacobpeterson.alpaca.model.endpoint.marketdata.news.NewsResponse;
-import net.jacobpeterson.alpaca.rest.AlpacaClient;
-import net.jacobpeterson.alpaca.rest.AlpacaClientException;
-import net.jacobpeterson.alpaca.rest.endpoint.marketdata.news.NewsEndpoint;
-import okhttp3.MediaType;
-import okhttp3.OkHttpClient;
-import okhttp3.ResponseBody;
-import okhttp3.mock.MockInterceptor;
-import org.junit.jupiter.api.Test;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-import static org.junit.jupiter.api.Assertions.assertThrows;
-
-class NewsEndpointTest {
-
- @Test
- void getLatestNews_validation_page() {
- NewsEndpoint newsEndpoint = setupEndpoint(mockResponse());
-
- assertThrows(Exception.class, () -> newsEndpoint.getLatestNewsPaged(null));
- }
-
- @Test
- void getLatestNews_validation_symbols() {
- NewsEndpoint newsEndpoint = setupEndpoint(mockResponse());
-
- assertThrows(Exception.class, () -> newsEndpoint.getLatestNews(null));
- }
-
- @Test
- void getLatestNews_shouldReturnData() throws AlpacaClientException {
- NewsEndpoint newsEndpoint = setupEndpoint(mockResponse());
- NewsResponse response = newsEndpoint.getLatestNews(null, null, null, null, null, null, null, null);
-
- assertNotNull(response);
- assertEquals("MTcwNDczNjg2NTAwMDAwMDAwMHwzNjU0MDM2Mw==", response.getNextPageToken());
- assertEquals(1, response.getNews().size());
- assertEquals(3, response.getNews().get(0).getImages().size());
-
- }
-
- @Test
- void getLatestNews_shouldReturnLatestData() throws AlpacaClientException {
- NewsEndpoint newsEndpoint = setupEndpoint(mockResponse());
- NewsResponse response = newsEndpoint.getLatestNews();
-
- assertNotNull(response);
- assertEquals("MTcwNDczNjg2NTAwMDAwMDAwMHwzNjU0MDM2Mw==", response.getNextPageToken());
- assertEquals(1, response.getNews().size());
- assertEquals(3, response.getNews().get(0).getImages().size());
-
- }
-
- private static NewsEndpoint setupEndpoint(String response) {
- MockInterceptor interceptor = new MockInterceptor();
- interceptor.addRule()
- .respond(200)
- .body(ResponseBody.create(response, MediaType.parse("application/json")));
-
- OkHttpClient client = new OkHttpClient.Builder()
- .addInterceptor(interceptor)
- .build();
-
- AlpacaClient api = new AlpacaClient(client, "token", "test", "/v1");
-
- return new NewsEndpoint(api);
- }
-
- private static String mockResponse() {
- return "{\n" +
- " \"news\": [\n" +
- " {\n" +
- " \"author\": \"Khyathi Dalal\",\n" +
- " \"content\": \"\",\n" +
- " \"created_at\": \"2024-01-08T18:07:34Z\",\n" +
- " \"headline\": \"Solana Drops 9.9%, Solana Memecoins Tank Over 20%: Is This The End Of The Dogecoin Killers?\",\n" +
- " \"id\": 36536785,\n" +
- " \"images\": [\n" +
- " {\n" +
- " \"size\": \"large\",\n" +
- " \"url\": \"https://cdn.benzinga.com/files/imagecache/2048x1536xUP/images/story/2024/01/08/solana_coin_shutter2_0.jpg\"\n" +
- " },\n" +
- " {\n" +
- " \"size\": \"small\",\n" +
- " \"url\": \"https://cdn.benzinga.com/files/imagecache/1024x768xUP/images/story/2024/01/08/solana_coin_shutter2_0.jpg\"\n" +
- " },\n" +
- " {\n" +
- " \"size\": \"thumb\",\n" +
- " \"url\": \"https://cdn.benzinga.com/files/imagecache/250x187xUP/images/story/2024/01/08/solana_coin_shutter2_0.jpg\"\n" +
- " }\n" +
- " ],\n" +
- " \"source\": \"benzinga\",\n" +
- " \"summary\": \"Solana (CRYPTO: SOL) dropped 1.4% in the past 24 hours, extending its losses over the previous seven days to 9.9%. Solana-based memecoins are particularly hard-hit by the correction, taking much heavier losses than established memecoins.\",\n" +
- " \"symbols\": [\n" +
- " \"BONKUSD\",\n" +
- " \"DOGEUSD\",\n" +
- " \"ETHUSD\",\n" +
- " \"SHIBUSD\",\n" +
- " \"SOLUSD\"\n" +
- " ],\n" +
- " \"updated_at\": \"2024-01-08T18:07:35Z\",\n" +
- " \"url\": \"https://www.benzinga.com/markets/cryptocurrency/24/01/36536785/solana-drops-9-9-solana-memecoins-tank-over-20-is-this-the-end-of-the-dogecoin-killers\"\n" +
- " }\n" +
- " ],\n" +
- " \"next_page_token\": \"MTcwNDczNjg2NTAwMDAwMDAwMHwzNjU0MDM2Mw==\"\n" +
- "}";
- }
-}
From 1f6e425087ea963e0497f616bd8f411b09d3f9b5 Mon Sep 17 00:00:00 2001
From: Jacob Peterson <14127217+Petersoj@users.noreply.github.com>
Date: Fri, 1 Mar 2024 20:33:54 -0800
Subject: [PATCH 55/84] WIP use OpenAPI specification with generated clients
---
.editorconfig | 10 +-
.gitattributes | 45 +-
.github/image/logo.png | Bin 0 -> 52737 bytes
.gitignore | 3 +-
.travis.yml | 24 -
LICENSE => LICENSE.txt | 2 +-
README.md | 47 +-
_config.yml | 2 +-
build.gradle | 376 +++++-----
buildSrc/build.gradle | 29 +
.../GeneratePOJOsTask.groovy | 128 ++++
.../JSONSchema2POJOAdaptedPlugin.groovy | 26 +
.../JSONSchemaFileConfig.groovy | 31 +
codecov.yml | 6 -
gradle/wrapper/.gitignore | 1 +
gradle/wrapper/gradle-wrapper.properties | 4 +-
schema_json/endpoint/account/account.json | 110 ---
.../account/enums/account_status.json | 44 --
.../account_activities/account_activity.json | 14 -
.../enums/activity_type.json | 152 ----
.../enums/trade_activity_side.json | 8 -
.../enums/trade_activity_type.json | 8 -
.../non_trade_activity.json | 38 -
.../account_activities/trade_activity.json | 48 --
.../account_configuration.json | 22 -
.../enums/dtbp_check.json | 10 -
.../enums/trade_confirm_email.json | 8 -
schema_json/endpoint/assets/asset.json | 51 --
.../endpoint/assets/enums/asset_class.json | 8 -
.../endpoint/assets/enums/asset_status.json | 8 -
schema_json/endpoint/calendar/calendar.json | 18 -
schema_json/endpoint/clock/clock.json | 22 -
.../endpoint/common/enums/sort_direction.json | 16 -
.../common/announcement.json | 53 --
.../endpoint/orders/cancelled_order.json | 19 -
.../orders/enums/current_order_status.json | 9 -
.../endpoint/orders/enums/order_class.json | 24 -
.../endpoint/orders/enums/order_side.json | 8 -
.../endpoint/orders/enums/order_status.json | 76 --
.../orders/enums/order_time_in_force.json | 38 -
.../endpoint/orders/enums/order_type.json | 28 -
schema_json/endpoint/orders/order.json | 134 ----
.../enums/portfolio_period_unit.json | 24 -
.../enums/portfolio_time_frame.json | 28 -
.../portfolio_history/portfolio_history.json | 18 -
.../portfolio_history_data_point.json | 22 -
.../portfolio_history_response.json | 31 -
.../positions/close_position_order.json | 19 -
schema_json/endpoint/positions/position.json | 81 ---
schema_json/endpoint/watchlist/watchlist.json | 30 -
.../net/jacobpeterson/alpaca/AlpacaAPI.java | 246 +------
.../common/historical/bar/bar.json | 0
.../historical/bar/enums/bar_time_period.json | 0
.../common/historical/quote/quote.json | 0
.../common/historical/trade/trade.json | 0
.../common/realtime/bar/bar_message.json | 0
.../realtime/control/error_message.json | 0
.../control/subscriptions_message.json | 0
.../realtime/control/success_message.json | 0
.../enums/market_data_message_type.json | 0
.../common/realtime/market_data_message.json | 0
.../common/realtime/quote/quote_message.json | 0
.../common/realtime/symbol_message.json | 0
.../common/realtime/trade/trade_message.json | 0
.../crypto/common/enums/taker_side.json | 0
.../crypto/historical/bar/crypto_bar.json | 0
.../historical/bar/crypto_bars_response.json | 0
.../bar/latest_crypto_bars_response.json | 0
.../orderbook/crypto_orderbook.json | 0
.../orderbook/crypto_orderbook_entry.json | 0
.../latest_crypto_orderbooks_response.json | 0
.../crypto/historical/quote/crypto_quote.json | 0
.../quote/latest_crypto_quotes_response.json | 0
.../historical/snapshot/crypto_snapshot.json | 0
.../snapshot/crypto_snapshots_response.json | 0
.../crypto/historical/trade/crypto_trade.json | 0
.../trade/crypto_trades_response.json | 0
.../trade/latest_crypto_trades_response.json | 0
.../realtime/bar/crypto_bar_message.json | 0
.../realtime/quote/crypto_quote_message.json | 0
.../realtime/trade/crypto_trade_message.json | 0
.../market_data/news/common/image.json | 0
.../market_data/news/common/news_article.json | 0
.../market_data/news/news_response.json | 0
.../news/realtime/news_message.json | 0
.../historical/bar/enums/bar_adjustment.json | 0
.../stock/historical/bar/enums/bar_feed.json | 0
.../bar/multi_stock_bars_response.json | 0
.../stock/historical/bar/stock_bar.json | 0
.../historical/bar/stock_bars_response.json | 0
.../quote/latest_stock_quote_response.json | 0
.../stock/historical/quote/stock_quote.json | 0
.../quote/stock_quotes_response.json | 0
.../stock/historical/snapshot/snapshot.json | 0
.../trade/latest_stock_trade_response.json | 0
.../stock/historical/trade/stock_trade.json | 0
.../trade/stock_trades_response.json | 0
.../stock/realtime/bar/stock_bar_message.json | 0
.../realtime/quote/stock_quote_message.json | 0
.../realtime/trade/stock_trade_message.json | 0
.../authorization/authorization_data.json | 0
.../authorization/authorization_message.json | 0
.../enums/streaming_message_type.json | 0
.../streaming/listening/listening_data.json | 0
.../listening/listening_message.json | 0
.../endpoint/streaming/streaming_message.json | 0
.../trade/enums/trade_update_event.json | 0
.../streaming/trade/trade_update.json | 4 +-
.../streaming/trade/trade_update_message.json | 0
.../alpaca/properties/AlpacaProperties.java | 35 +-
.../alpaca}/properties/data_api_type.json | 0
.../alpaca}/properties/endpoint_api_type.json | 0
.../alpaca/rest/AlpacaClient.java | 235 -------
.../alpaca/rest/AlpacaClientException.java | 144 ----
.../alpaca/rest/endpoint/AlpacaEndpoint.java | 23 -
.../endpoint/account/AccountEndpoint.java | 39 --
.../AccountActivitiesEndpoint.java | 142 ----
.../AccountConfigurationEndpoint.java | 64 --
.../rest/endpoint/assets/AssetsEndpoint.java | 83 ---
.../endpoint/calendar/CalendarEndpoint.java | 71 --
.../rest/endpoint/clock/ClockEndpoint.java | 39 --
.../CorporateActionsEndpoint.java | 121 ----
.../crypto/CryptoMarketDataEndpoint.java | 302 --------
.../marketdata/news/NewsEndpoint.java | 120 ----
.../stock/StockMarketDataEndpoint.java | 368 ----------
.../rest/endpoint/orders/OrdersEndpoint.java | 651 ------------------
.../PortfolioHistoryEndpoint.java | 103 ---
.../endpoint/positions/PositionsEndpoint.java | 136 ----
.../endpoint/watchlist/WatchlistEndpoint.java | 216 ------
.../util/doc/Documentation2JSONSchema.java | 130 ----
.../alpaca/util/format/FormatUtil.java | 53 --
.../alpaca/util/okhttp/JSONBodyBuilder.java | 65 --
.../alpaca/util/properties/PropertyUtil.java | 88 ++-
.../alpaca/websocket/AlpacaWebsocket.java | 3 +-
.../WebsocketStateListener.java | 2 +-
.../streaming/StreamingWebsocket.java | 18 +-
src/main/resources/alpaca.default.properties | 12 +-
.../alpaca/test/live/AlpacaAPITest.java | 289 --------
.../alpaca/test/mock/AlpacaAPITest.java | 74 --
src/test/resources/alpaca.default.properties | 5 -
140 files changed, 528 insertions(+), 5314 deletions(-)
create mode 100644 .github/image/logo.png
delete mode 100644 .travis.yml
rename LICENSE => LICENSE.txt (96%)
create mode 100644 buildSrc/build.gradle
create mode 100644 buildSrc/src/main/groovy/net/jacobpeterson/alpaca/buildsrc/plugin/jsonschema2pojoadapted/GeneratePOJOsTask.groovy
create mode 100644 buildSrc/src/main/groovy/net/jacobpeterson/alpaca/buildsrc/plugin/jsonschema2pojoadapted/JSONSchema2POJOAdaptedPlugin.groovy
create mode 100644 buildSrc/src/main/groovy/net/jacobpeterson/alpaca/buildsrc/plugin/jsonschema2pojoadapted/JSONSchemaFileConfig.groovy
delete mode 100644 codecov.yml
create mode 100644 gradle/wrapper/.gitignore
delete mode 100644 schema_json/endpoint/account/account.json
delete mode 100644 schema_json/endpoint/account/enums/account_status.json
delete mode 100644 schema_json/endpoint/account_activities/account_activity.json
delete mode 100644 schema_json/endpoint/account_activities/enums/activity_type.json
delete mode 100644 schema_json/endpoint/account_activities/enums/trade_activity_side.json
delete mode 100644 schema_json/endpoint/account_activities/enums/trade_activity_type.json
delete mode 100644 schema_json/endpoint/account_activities/non_trade_activity.json
delete mode 100644 schema_json/endpoint/account_activities/trade_activity.json
delete mode 100644 schema_json/endpoint/account_configuration/account_configuration.json
delete mode 100644 schema_json/endpoint/account_configuration/enums/dtbp_check.json
delete mode 100644 schema_json/endpoint/account_configuration/enums/trade_confirm_email.json
delete mode 100644 schema_json/endpoint/assets/asset.json
delete mode 100644 schema_json/endpoint/assets/enums/asset_class.json
delete mode 100644 schema_json/endpoint/assets/enums/asset_status.json
delete mode 100644 schema_json/endpoint/calendar/calendar.json
delete mode 100644 schema_json/endpoint/clock/clock.json
delete mode 100644 schema_json/endpoint/common/enums/sort_direction.json
delete mode 100644 schema_json/endpoint/corporate_actions/common/announcement.json
delete mode 100644 schema_json/endpoint/orders/cancelled_order.json
delete mode 100644 schema_json/endpoint/orders/enums/current_order_status.json
delete mode 100644 schema_json/endpoint/orders/enums/order_class.json
delete mode 100644 schema_json/endpoint/orders/enums/order_side.json
delete mode 100644 schema_json/endpoint/orders/enums/order_status.json
delete mode 100644 schema_json/endpoint/orders/enums/order_time_in_force.json
delete mode 100644 schema_json/endpoint/orders/enums/order_type.json
delete mode 100644 schema_json/endpoint/orders/order.json
delete mode 100644 schema_json/endpoint/portfolio_history/enums/portfolio_period_unit.json
delete mode 100644 schema_json/endpoint/portfolio_history/enums/portfolio_time_frame.json
delete mode 100644 schema_json/endpoint/portfolio_history/portfolio_history.json
delete mode 100644 schema_json/endpoint/portfolio_history/portfolio_history_data_point.json
delete mode 100644 schema_json/endpoint/portfolio_history/portfolio_history_response.json
delete mode 100644 schema_json/endpoint/positions/close_position_order.json
delete mode 100644 schema_json/endpoint/positions/position.json
delete mode 100644 schema_json/endpoint/watchlist/watchlist.json
rename {schema_json => src/main/java/net/jacobpeterson/alpaca}/endpoint/market_data/common/historical/bar/bar.json (100%)
rename {schema_json => src/main/java/net/jacobpeterson/alpaca}/endpoint/market_data/common/historical/bar/enums/bar_time_period.json (100%)
rename {schema_json => src/main/java/net/jacobpeterson/alpaca}/endpoint/market_data/common/historical/quote/quote.json (100%)
rename {schema_json => src/main/java/net/jacobpeterson/alpaca}/endpoint/market_data/common/historical/trade/trade.json (100%)
rename {schema_json => src/main/java/net/jacobpeterson/alpaca}/endpoint/market_data/common/realtime/bar/bar_message.json (100%)
rename {schema_json => src/main/java/net/jacobpeterson/alpaca}/endpoint/market_data/common/realtime/control/error_message.json (100%)
rename {schema_json => src/main/java/net/jacobpeterson/alpaca}/endpoint/market_data/common/realtime/control/subscriptions_message.json (100%)
rename {schema_json => src/main/java/net/jacobpeterson/alpaca}/endpoint/market_data/common/realtime/control/success_message.json (100%)
rename {schema_json => src/main/java/net/jacobpeterson/alpaca}/endpoint/market_data/common/realtime/enums/market_data_message_type.json (100%)
rename {schema_json => src/main/java/net/jacobpeterson/alpaca}/endpoint/market_data/common/realtime/market_data_message.json (100%)
rename {schema_json => src/main/java/net/jacobpeterson/alpaca}/endpoint/market_data/common/realtime/quote/quote_message.json (100%)
rename {schema_json => src/main/java/net/jacobpeterson/alpaca}/endpoint/market_data/common/realtime/symbol_message.json (100%)
rename {schema_json => src/main/java/net/jacobpeterson/alpaca}/endpoint/market_data/common/realtime/trade/trade_message.json (100%)
rename {schema_json => src/main/java/net/jacobpeterson/alpaca}/endpoint/market_data/crypto/common/enums/taker_side.json (100%)
rename {schema_json => src/main/java/net/jacobpeterson/alpaca}/endpoint/market_data/crypto/historical/bar/crypto_bar.json (100%)
rename {schema_json => src/main/java/net/jacobpeterson/alpaca}/endpoint/market_data/crypto/historical/bar/crypto_bars_response.json (100%)
rename {schema_json => src/main/java/net/jacobpeterson/alpaca}/endpoint/market_data/crypto/historical/bar/latest_crypto_bars_response.json (100%)
rename {schema_json => src/main/java/net/jacobpeterson/alpaca}/endpoint/market_data/crypto/historical/orderbook/crypto_orderbook.json (100%)
rename {schema_json => src/main/java/net/jacobpeterson/alpaca}/endpoint/market_data/crypto/historical/orderbook/crypto_orderbook_entry.json (100%)
rename {schema_json => src/main/java/net/jacobpeterson/alpaca}/endpoint/market_data/crypto/historical/orderbook/latest_crypto_orderbooks_response.json (100%)
rename {schema_json => src/main/java/net/jacobpeterson/alpaca}/endpoint/market_data/crypto/historical/quote/crypto_quote.json (100%)
rename {schema_json => src/main/java/net/jacobpeterson/alpaca}/endpoint/market_data/crypto/historical/quote/latest_crypto_quotes_response.json (100%)
rename {schema_json => src/main/java/net/jacobpeterson/alpaca}/endpoint/market_data/crypto/historical/snapshot/crypto_snapshot.json (100%)
rename {schema_json => src/main/java/net/jacobpeterson/alpaca}/endpoint/market_data/crypto/historical/snapshot/crypto_snapshots_response.json (100%)
rename {schema_json => src/main/java/net/jacobpeterson/alpaca}/endpoint/market_data/crypto/historical/trade/crypto_trade.json (100%)
rename {schema_json => src/main/java/net/jacobpeterson/alpaca}/endpoint/market_data/crypto/historical/trade/crypto_trades_response.json (100%)
rename {schema_json => src/main/java/net/jacobpeterson/alpaca}/endpoint/market_data/crypto/historical/trade/latest_crypto_trades_response.json (100%)
rename {schema_json => src/main/java/net/jacobpeterson/alpaca}/endpoint/market_data/crypto/realtime/bar/crypto_bar_message.json (100%)
rename {schema_json => src/main/java/net/jacobpeterson/alpaca}/endpoint/market_data/crypto/realtime/quote/crypto_quote_message.json (100%)
rename {schema_json => src/main/java/net/jacobpeterson/alpaca}/endpoint/market_data/crypto/realtime/trade/crypto_trade_message.json (100%)
rename {schema_json => src/main/java/net/jacobpeterson/alpaca}/endpoint/market_data/news/common/image.json (100%)
rename {schema_json => src/main/java/net/jacobpeterson/alpaca}/endpoint/market_data/news/common/news_article.json (100%)
rename {schema_json => src/main/java/net/jacobpeterson/alpaca}/endpoint/market_data/news/news_response.json (100%)
rename {schema_json => src/main/java/net/jacobpeterson/alpaca}/endpoint/market_data/news/realtime/news_message.json (100%)
rename {schema_json => src/main/java/net/jacobpeterson/alpaca}/endpoint/market_data/stock/historical/bar/enums/bar_adjustment.json (100%)
rename {schema_json => src/main/java/net/jacobpeterson/alpaca}/endpoint/market_data/stock/historical/bar/enums/bar_feed.json (100%)
rename {schema_json => src/main/java/net/jacobpeterson/alpaca}/endpoint/market_data/stock/historical/bar/multi_stock_bars_response.json (100%)
rename {schema_json => src/main/java/net/jacobpeterson/alpaca}/endpoint/market_data/stock/historical/bar/stock_bar.json (100%)
rename {schema_json => src/main/java/net/jacobpeterson/alpaca}/endpoint/market_data/stock/historical/bar/stock_bars_response.json (100%)
rename {schema_json => src/main/java/net/jacobpeterson/alpaca}/endpoint/market_data/stock/historical/quote/latest_stock_quote_response.json (100%)
rename {schema_json => src/main/java/net/jacobpeterson/alpaca}/endpoint/market_data/stock/historical/quote/stock_quote.json (100%)
rename {schema_json => src/main/java/net/jacobpeterson/alpaca}/endpoint/market_data/stock/historical/quote/stock_quotes_response.json (100%)
rename {schema_json => src/main/java/net/jacobpeterson/alpaca}/endpoint/market_data/stock/historical/snapshot/snapshot.json (100%)
rename {schema_json => src/main/java/net/jacobpeterson/alpaca}/endpoint/market_data/stock/historical/trade/latest_stock_trade_response.json (100%)
rename {schema_json => src/main/java/net/jacobpeterson/alpaca}/endpoint/market_data/stock/historical/trade/stock_trade.json (100%)
rename {schema_json => src/main/java/net/jacobpeterson/alpaca}/endpoint/market_data/stock/historical/trade/stock_trades_response.json (100%)
rename {schema_json => src/main/java/net/jacobpeterson/alpaca}/endpoint/market_data/stock/realtime/bar/stock_bar_message.json (100%)
rename {schema_json => src/main/java/net/jacobpeterson/alpaca}/endpoint/market_data/stock/realtime/quote/stock_quote_message.json (100%)
rename {schema_json => src/main/java/net/jacobpeterson/alpaca}/endpoint/market_data/stock/realtime/trade/stock_trade_message.json (100%)
rename {schema_json => src/main/java/net/jacobpeterson/alpaca}/endpoint/streaming/authorization/authorization_data.json (100%)
rename {schema_json => src/main/java/net/jacobpeterson/alpaca}/endpoint/streaming/authorization/authorization_message.json (100%)
rename {schema_json => src/main/java/net/jacobpeterson/alpaca}/endpoint/streaming/enums/streaming_message_type.json (100%)
rename {schema_json => src/main/java/net/jacobpeterson/alpaca}/endpoint/streaming/listening/listening_data.json (100%)
rename {schema_json => src/main/java/net/jacobpeterson/alpaca}/endpoint/streaming/listening/listening_message.json (100%)
rename {schema_json => src/main/java/net/jacobpeterson/alpaca}/endpoint/streaming/streaming_message.json (100%)
rename {schema_json => src/main/java/net/jacobpeterson/alpaca}/endpoint/streaming/trade/enums/trade_update_event.json (100%)
rename {schema_json => src/main/java/net/jacobpeterson/alpaca}/endpoint/streaming/trade/trade_update.json (82%)
rename {schema_json => src/main/java/net/jacobpeterson/alpaca}/endpoint/streaming/trade/trade_update_message.json (100%)
rename {schema_json => src/main/java/net/jacobpeterson/alpaca}/properties/data_api_type.json (100%)
rename {schema_json => src/main/java/net/jacobpeterson/alpaca}/properties/endpoint_api_type.json (100%)
delete mode 100644 src/main/java/net/jacobpeterson/alpaca/rest/AlpacaClient.java
delete mode 100644 src/main/java/net/jacobpeterson/alpaca/rest/AlpacaClientException.java
delete mode 100644 src/main/java/net/jacobpeterson/alpaca/rest/endpoint/AlpacaEndpoint.java
delete mode 100644 src/main/java/net/jacobpeterson/alpaca/rest/endpoint/account/AccountEndpoint.java
delete mode 100644 src/main/java/net/jacobpeterson/alpaca/rest/endpoint/accountactivities/AccountActivitiesEndpoint.java
delete mode 100644 src/main/java/net/jacobpeterson/alpaca/rest/endpoint/accountconfiguration/AccountConfigurationEndpoint.java
delete mode 100644 src/main/java/net/jacobpeterson/alpaca/rest/endpoint/assets/AssetsEndpoint.java
delete mode 100644 src/main/java/net/jacobpeterson/alpaca/rest/endpoint/calendar/CalendarEndpoint.java
delete mode 100644 src/main/java/net/jacobpeterson/alpaca/rest/endpoint/clock/ClockEndpoint.java
delete mode 100644 src/main/java/net/jacobpeterson/alpaca/rest/endpoint/corporateactions/CorporateActionsEndpoint.java
delete mode 100644 src/main/java/net/jacobpeterson/alpaca/rest/endpoint/marketdata/crypto/CryptoMarketDataEndpoint.java
delete mode 100644 src/main/java/net/jacobpeterson/alpaca/rest/endpoint/marketdata/news/NewsEndpoint.java
delete mode 100644 src/main/java/net/jacobpeterson/alpaca/rest/endpoint/marketdata/stock/StockMarketDataEndpoint.java
delete mode 100644 src/main/java/net/jacobpeterson/alpaca/rest/endpoint/orders/OrdersEndpoint.java
delete mode 100644 src/main/java/net/jacobpeterson/alpaca/rest/endpoint/portfoliohistory/PortfolioHistoryEndpoint.java
delete mode 100644 src/main/java/net/jacobpeterson/alpaca/rest/endpoint/positions/PositionsEndpoint.java
delete mode 100644 src/main/java/net/jacobpeterson/alpaca/rest/endpoint/watchlist/WatchlistEndpoint.java
delete mode 100644 src/main/java/net/jacobpeterson/alpaca/util/doc/Documentation2JSONSchema.java
delete mode 100644 src/main/java/net/jacobpeterson/alpaca/util/format/FormatUtil.java
delete mode 100644 src/main/java/net/jacobpeterson/alpaca/util/okhttp/JSONBodyBuilder.java
rename src/main/java/net/jacobpeterson/alpaca/{util/okhttp => websocket}/WebsocketStateListener.java (94%)
delete mode 100644 src/test/java/net/jacobpeterson/alpaca/test/live/AlpacaAPITest.java
delete mode 100644 src/test/java/net/jacobpeterson/alpaca/test/mock/AlpacaAPITest.java
delete mode 100644 src/test/resources/alpaca.default.properties
diff --git a/.editorconfig b/.editorconfig
index 818a4c9e..e8ed66b1 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -509,7 +509,7 @@ ij_typescript_finally_on_new_line = false
ij_typescript_for_brace_force = always
ij_typescript_for_statement_new_line_after_left_paren = false
ij_typescript_for_statement_right_paren_on_new_line = false
-ij_typescript_for_statement_wrap = split_into_lines
+ij_typescript_for_statement_wrap = normal
ij_typescript_force_quote_style = true
ij_typescript_force_semicolon_style = true
ij_typescript_function_expression_brace_style = end_of_line
@@ -519,7 +519,7 @@ ij_typescript_import_prefer_absolute_path = global
ij_typescript_import_sort_members = true
ij_typescript_import_sort_module_name = false
ij_typescript_import_use_node_resolution = true
-ij_typescript_imports_wrap = normal
+ij_typescript_imports_wrap = on_every_item
ij_typescript_indent_case_from_switch = true
ij_typescript_indent_chained_calls = true
ij_typescript_indent_package_children = 0
@@ -1023,7 +1023,7 @@ ij_json_wrap_long_lines = false
[{*.htm,*.html,*.ng,*.peb,*.sht,*.shtm,*.shtml}]
ij_html_add_new_line_before_tags = body,div,p,form,h1,h2,h3
-ij_html_align_attributes = true
+ij_html_align_attributes = false
ij_html_align_text = false
ij_html_attribute_wrap = normal
ij_html_block_comment_add_space = false
@@ -1182,8 +1182,8 @@ ij_prototext_spaces_within_brackets = false
[{*.properties,spring.handlers,spring.schemas}]
ij_properties_align_group_field_declarations = false
-ij_properties_keep_blank_lines = false
-ij_properties_key_value_delimiter = equals
+ij_properties_keep_blank_lines = true
+ij_properties_key_value_delimiter = colon
ij_properties_spaces_around_key_value_delimiter = false
[{*.qute.htm,*.qute.html,*.qute.json,*.qute.txt,*.qute.yaml,*.qute.yml}]
diff --git a/.gitattributes b/.gitattributes
index 1730d965..710d818f 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1,46 +1,7 @@
-# https://www.gitattributes.io/api/java
-#
-# Handle line endings automatically for files detected as text
-# and leave all files detected as binary untouched.
+# Handle line endings automatically for files detected as text and leave all files detected as binary untouched.
* text=auto
-#
-# The above will handle all files NOT found below
-#
-# These files are text and should be normalized (Convert crlf => lf)
-*.css text
-*.df text
-*.htm text
-*.html text
-*.java text
-*.js text
-*.json text
-*.jsp text
-*.jspf text
-*.jspx text
-*.properties text
-*.sh text
-*.tld text
-*.txt text
-*.tag text
-*.tagx text
-*.xml text
-*.yml text
-
-# Declare files that will always have CRLF line endings on checkout.
+# Declare files that should always have CRLF line endings at checkout.
*.sln text eol=crlf
*.bat text eol=crlf
-
-# These files are binary and should be left untouched
-# (binary is a macro for -text -diff)
-*.class binary
-*.dll binary
-*.ear binary
-*.gif binary
-*.ico binary
-*.jar binary
-*.jpg binary
-*.jpeg binary
-*.png binary
-*.so binary
-*.war binary
+*.cmd text eol=crlf
diff --git a/.github/image/logo.png b/.github/image/logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..a9cdaa37b4314105f5b4663bc274384a7cba552d
GIT binary patch
literal 52737
zcmaI;bySp!Cju4
ze!jo=eg1mRA%}C4JG(oxv)9aAGn)uyMQJQ_67(leo?yw!NUA=0@=W{jg^CQk(_)@F
z2mC{Gl+kf{@`R1{@%7XLF8b-olc7pkNilT~*xsEx?BgGu#n{#neqQyhgI^}@78bdh
zjfEQ8X4E*SXp%3HzkM_f`ekg2iTv9McO>2mF`O4B<~mQ42X-ggOqOJqsFx<%n&0^`66LYQwKWi2S})0e
z=6x0|f0PqQg$n$=Bf2C$Yz+{7M$tOM?!k#PrMR^Fx%GL|_J`*1e-CsZUvVEYw>jX_
z7=9b>#?hXBCW`9AFuJf8jqz^;TRi5r(q|789`CJrB*_L`SB}8p~Ruf$+|L-G{@1E?3)$c5Xu?Tzdp)F78aa-KCKpH_IXjPE9sv?w0Mo)bI=Q0C`@_1m>O|nVW@iH
z4$u6q^|1xCpoa(?=wGCN3JCs;(t>xHV1=zMZ#<9egPuBj>-L}UgWUO_8^3;#5@3Z`
zeqMa{ztKDBK0Ryw1!Cn7N>Kf?X1D)1GG*+Y`qc-{H`d{P*r#
z@n^TjccES{YWk_{I9z2*xQv(4v?3>X4My+|mjzm$Y8f@hDiiqaF$22bGh^LI3SGm|E|5JY9
zAp}P?n01N!!^l6?20CWD2JDk~VEzA=7DRu@gw?de#s0rdI>~j`A^3RQZJJKJ=#G}`|N*)lYkrWpPtHog}41XcVaUi|Nq0#
zl>KjzSGd~$E$Ca+|L1TKY!}a7h|RF{Y}OPGRG>dj3`{yGw4euLEgN2Gmd+m4HO)bV
zW71R&qu>?>Qt1-|bC^gSEv&$3M_BLtGKEH*hO-lCpr#~Na%4JDoM2YUGndtNZy0lb
zB$ANatEdQN0r8&&1>!GKs8DTar47VV#hRG=Fr-@-*}FB6`I^+g@G^*4+-8^4``j@q
zS#fpw;C4Ep1s!y~C0Kr02Frls)U&MW*D=B>Yolp6y
zvw2SS@}qnn=j{2+Ua42}o>X`9uthe$%d*%;g}A-(nGLJw^46Kx42>jGy8ETGG!wk<
zgbW_&5xttqtq?(@fzImkbuokrRg0!yOBz=Ur^JKFsd{`{dF|B#%2S-+2}|zodMdmo
zcS)&)x4PUURx+;)&u9i#VYCCz4b2pg3{$%RcM(*^X0Hbi1hOb8K5j4Pka+@KGN_0O
zwJkZKThVHT%;$F=XqR~g-O@SVO!%At1blz^lunfB)PS%XK`ADIYD$4O`rRmt@o
z%ie&{^LLEVF;W++eU(i;H;4K*kyL$6($%wF$I3nv?9-S!SCl3Ho#6v)y`6nL{h0&>%3Oor71)|)lvX3
zN}!@h2?QaYXiF`04nq&*KmrVh<9V=sdmzn-BLz(^=f>PK=9#xo7EBFfT+SK|qNeiD
ze`~-igocyj3J=h0%EWAwQ><334{Z@BE7rt}uBYC<@pNJ~5g*V3IV1sF(qHyKfYIe^
zXS;PHIXN3Z+7mCtUzfmK+I^pdXc1aa*Yc+;qNso4Zt;>#c8T#z9@}?w43V%2DmY&x
z87qVa7_&k&XIhPceKs>2yO}I!M-t=X1#EB`y;o2^*-Tq6E3qeWyPc{CMDKx;1=<>a
z+s4?2d!UByAjVkc(PnI?SUL+Sq<0!jj&0(zkP!2(#i!BYaVh}8>(Fn|h5EgPDB#@a
z1m`BKOnen~HouNxq0yW@v{P7tRG)#PQ`do3t)-Kk#G`TcBT2l_xDkL3=+2t`lTx8!
z!K!MoY1!usWJJ5JQk=!<4YHb4XARSW-f>gb1RCx;_^IU@cF0>MkJ=R6f`X^-rd0!U
z8GT+gkLzOR=okjL+b3N#0yg)bG(Fy7tQZ9WV_wXV@Gi`8J(5L!$oU=vSRg;*Vlm>+
z16NdplG^RgwyEt_p<^1)@z?zI3`Xm9X5IsJ+2N*eN|S
zMfJqYHo-_nWS3CDeI-QI2yU$ehA+WusUzv^i;+Potnl!jpdBWi3*0av?y?)M)dzMRG{&ZMjc$JyrZ
zRfex-Z?k^`o05|?%|3rHxwDnTrU3D+5#J0D%|3}(%;vl1DA@{i&A#{n?xygM3K@Bz
zKAp3Nu}VEqCiVzQo3IWCi0wQAD*(M(+zVRWlhkM2Ol42FTUxu0d;OB`CH$dso1?OC
zUc}@C-;P>r&D}Jz?A0U9&kzbMg3RXQo(hGqZe4f*;6b<3q^7^n$l=u!P#q&Q!Uzq_
zfo>yPNb43mp0awfi@C?>euJjlM-
zLV3riKG!z;>g_&8%a6h_dMv^&1Zm0x@G3m#KXAW5Fqnxh8^UdlpD1d!`{`p=fWfejdb69R;56&^mlE!W`pWFsYiqE
z-kB|zF%A&DFu|b0Wf4n-G?hBrgXE>1-eL!KPYxe0Wakj4u&R+=W7;2ac+Cb>XfNcR
zIhto*Orm}jQOS!qtBDQ5N5x2Enfb=%%qEU`F0--|Y_hcfq)AR`bZt{gZGE9Owyv9JO>gM}$OKHI(
zQ#(&MSH?pHlGu#yKZnp0bmBpl@q@*?G)zU@AVKg5^L#5eb$>cHvBR>=5GzMeBV9`+
zI9xs4RY7SIDKZSFy5emKJiLxW!v3w4{F!a0(u@-Zu
zNUE6Bf}!^ll<lzzoQ;&oQTpJE_6o9Ka?E%595W&0d*l)#cn^Di_-s+rkrHa?3O
zfsQ=1jN$--e&wz~>Q87KPd&Go
z;?U6a)52%y?B%di_&3u{k612TkzEy--&6gk{aHe$V}(q17K~6b8~i98yEL7MLPZNC
z8&=)oj0ir~Kpv~X_XI-)!C%H2xP^pU_4UB^nYM$v#S+YrPg`%+M&|Wi4!`x-wC-SR
za>%@Blgz7ajXv$+eS!8}9qdQx&km=YLV~{qwoSEf>>Yr5;*#*49n$acCd%*mId`?W
zwMHnzF|M^(ym;A7ovbb41_A;cy<|jUNp50h4of}I`NFT^^NL|PU~!9uVAM%n+`?@d
z7St9n7uc<3@g{WsOS_e?kQrJ7DC+7YGmr1?nSdh7jVHLQgGxHnJ;K2QYrpZq9OtKv
zRB52{1QFHC|1%)wWaVj4uM_{U8H=;3A*9hr+<7S}i>7HvdVWS8#REb9=?L}H)eKb<
zk6|W=4Ob3#P+|TM;-fSDd*AKXG>+CL^rJ#+aJi_Q#?P9QPC+HZYr|r%XlqNC3(%j+
zOvy8%F%^F7un}s>MszuIZ+t+eP9#(H}-tZ^g)VE}N#=P&=l?AA^T>
zOMLupb4g<{z-uyTqe?RVDt3T4h<+XsEX-j6he)q_MUD!S)(BF2@!&voSD)?*4HI}|
zV(+Bcs$hmnloDi*_2M5)xHkpY`YAQA1x?ws25bzpyx1H_Tn*luT(S_~PtHR{68rHbHvm`+nBYApb7{dZT#&TaiACJp
z@gHhDHFcFD)hJvV7N*@5!Tf>!v}3RMK4=??Q4tGsUnQ&w>{x>8rfObwV6D3B)x7cZ
zULavHw<9%`4oyU7Gv!0!c+e|8!HO8C>?BHG)K-tG_nTMkeyU8aSY9?(Eh~kVt;>4K
zD!Eb5Dy$!-{ju#2RF?qd-~a~g7?LZWt<3I9nX1b~(6BzvuUmRek|SKZTxnK-%hs|J
zJ3->`M&IG5W)RZq7_%v694GOcJ@DRHXW7S5V*DtHUECsE+L5#`X&)yz7`>1v>@an2
z%5%J0d(3zikl0H(ZoLL0BaKU!PT0DS7>+!Nh#*N-=wn4W*bu2*0;6BIdaaa|W$Ydi
zNEYK7Io9B+z_U)IkB>GT_|N;Karq|Gfjg8YA@d`*>~*=L_g=KM-@3$15&z1$~vnL=pT9nL%)1~>&wP8C}z
z*>sXqI!k-e4+nfz&@!&mIt(%Ex;tm^m6m;Qci?hya$}u;qIw2e14GzvaRCqrvlj~`
z|FSyW`6@1Pdnh`F81ID%GwoX}KzaB*Lwt!-+TXGb$}~}tS6-H4E)an6Cz@^?RLMNQ
z9QgWUssw5wL$-e8ZY^sTfU-NL^%qeHk*n3$Mh(SEp>hg^g#`|~`k0wSh7$tOBR8L4
z)%9CIaEo5|qsC8#^2u7}G0F;&5v}Qq8P1pps29g%F~Z9%4BJ>K(d-ZUvwQ*u8b9Zs
z^_QC8+daIf+}#kfpz>pN(s0AEUg^tDAU9+Lqa7-Uk0AcD
z%3&F_#z6W8YY{4Zgn1R2DaBJ8_9R6OzTHTA)K5kv;Wkom?RM8<6|$31!`rfd)IK@c
z?XA?RwFDMl>(fEEahggx*m)V!%O6{bR07VLXM-g72*y@^`l4t+pu-%wxgU{#)NGb0
z+qQYx6a>|+GQ5Z$Y+m=~z?jDDS$IJoS>Q#kS?$Z{Nc18*<}pNGL0e%`P%EnDvlufp
znI8qaZUt=1+I!LNkK8LJ-=8v+Gc#nBVaEQyPmvC0V)JvN%^PkHfdb*5smi#t6ef$~2
z$Nf+$Pmni6ZUn8GuXmMYZ7k_Y7H*9xf3pwQ|E;5hfFPD*nt@bN)Id~e{sfNI15)>7
z-t8ze-z4i#wBM6MsZ_xq^Xb-FCB&}049JvTH{dYAapiwvUN@h%^vbijTt@S*W@qzg
zaazAsl@^zh_&aUbg-xO}v2_W;Tqw;PxmAx8Ss@nMqHC8rz8=-~rKgkN^3BMqregNy
zMf}3mr@xtZ^LZ$SXn&uyz}ATm-xFzdUNbAie<#MLJp)Lk-;as>8!;LD9;f%EeL-&;
zU1)Rd19_9#_CYj%9c~Hdju|yY&KI-FvekyMEe^11gdiU^F4A{v&ZhJgy!Ptux~f3y
zRl7%a(Z9pCxdPWaN6z
zWHf4Fb%q{M1c&(&|MKS1u9u{36>6pl3FuHD=Z=3d@{iwV%guIY(WD%EXdQ_X+7!E-
z)k*+=fn@0mF=EIgr+_MFMMG}whpzWx02$tsqn+e|ekNybB6^bfAaN;_d$TS2F8@R=
zmo?$VL=|ZHs@R{Hu~53OU@;%9@EVao@uvB*rKz+?A(HSshwwaQ_&kw9D`9b>D(Bo}
zU*pdhu{7M|ClzW3*!d$)@K-UDoN#W1NAJC#_0Fg3*x1
q?Qn7aWPMBcmETZD2{Kq*s`h1Ek54i4X4E
zQdpD@q_V|I%=}b^2V|gKYM@ul%)-}q3&vZ{AV}f+cZFcZNwG~$#U+D)uZ#Zmi(P5Y
zcJyP7?C?2l#OF7vJimI#S16Wy9$R_M-W#Us+Ef|(1v89YjQ_^OXmGVA|KZyX_X2Ej$tZi
z;<%&=xNNxM*L-k-b@~&{Y8=C-MOshn)cJ~e-FR79`8avD$mtbjRxFoj*a4~yZJU)a
z_^YXJYN#NO%>);>=6H+O4Cn{;=m=gxY!u?VBvmju
zXv&u64BR`uO#T#$bR*OwtPi4%!H=hV<&*`Guc@KGANib|L~5=t->tsV!(bGkDf16l
z$+VYI^;9J}eA#1`IMTZ4vq)mvM8_KMamGfD7(U7X(V&)YM&HYgC|(!$u$9nCs4&hx2INu?j{pK6%@`Yy`e;y>C{NxGk18XmADrCVc|Uo5RV0udnQ!v8nCrCoRqYVlA(y(fo&n$nCAa);(GYBikTGiqrJ
zvD8K#(aN>>uTlzF#n&3YT&2{nQ@S54j0tS
z3Ep`FC)A)ox#YR!70z{k>5pyTS#&fPIg;167~bbhSWIA*_Tl}Y$HjL5&ba@9b#@hX
z47Um>TbYk?JVXP1cU-cx<6MK0?^b<2Tk14r=w^-C!qHPyNX@gU!8ylnvc+X#wdpz1
zUrFL(<-hs|>i`ue@h?A=Fo}9RN4;q1VHfZ(UzPpcj=JP!GD8T8RWkF`UllwvT62wU
zeOKc_Gq>)`Sj9GuH~ouAWk-nb9pegEe3x0`2|y7F{yWx^j1qX#+-Z!uq@aYzIrbIw
z{*RfIw<2H1s_STSy>I!iEnlWx1e>%Ze>>w&*@paAMef`KIID!EfnFr+I>7wXk2qWbJ>R)o}@s_kMd0yRal5
zFY5_b6bCRfno1f=EY<2X%eLuYqDrKd-YD{2NG9_LLuo&<$Kv-4eenItl&J`|IsDs})6D>-l)P_EgjeL$ts$
zl}FvPtdLLX7Ga3m6o&;FyftRXvSw_#KO*A4xnyu!NEXp^i_;(_RU@UH5cLcP-sihp
zG8z{=*T2FMW{P&@8$68>?p>L<$Q?)iYpI#xA8xyDtCPDfMfV9k4#sxaS6
z)4HbK8oh&_ykgu4m57(K2*;i5){pBUy_N@mq$^B`nAwGfBD^19!^;eod-WMVIKu`S
zP8BJ$T~4hkCVFLS5L8yRoK|vN)89{SpA#3)+>cM^=Hz|1U|O#2SgFKzK0k`h9UG)<
zdYy~my$V%3C=+tJ5gZi(~4r1PJJb^!b^k*l`>%*7Hv|-;+i-zb}>>B@9#}1gPzF1Hp+ecLiwhZk-y+}%w1|;z;Ol*A}&+7{TL&5oc|c~
z*K#GquFK`5>fC6gKXRn(^0$Sy$SI!+Y^At+!$3a{pXV>P`@RGNqsWLX;U`sB0hs4n
zY2PqeuG{Z!{VKUU>bpbO(z=
zI=qr_@pN>iImLC8;=MP85yz9KC38B^}6h#-7rj`fuu|sc?GrWV7az}7@{_HMBSdv?s5`4<%$P1%8~#J
zf|q+^GjVxr2HB30Sh(2MN{sEVG&9JlzAp?>jMv>(|52@~yLv1#Zz{c&E)Xzqva}6x
zRE{NKT?yIe{&djMg?88drfU|vVioRys(18qR03-|sPHz+Llpc&W4HHaNyO+67hkN)
z%gz3cr+UgDq+x+7&Z@tx<8;Yjpf0ofDCFRa3?W2i)7M&XN5$i6-B?JFA0*q=~h!ksNx!1wt~E
zPUWVSBaw`zCyqY;Qp_?Y>517JgXLSkSTcXg8|y4S7>_cFka_
z3Zf7Ekv4M;kFyKhD)jhf?6;F%P8m|VAMCCFDNY9bp`u8tb|!CDfN->ym5GR
z>-nA+2rZKJ;6lsDNSvjZ(ba7YdpffO*N@0jq)nN&Elia#0Mp+&WWP_sz+sC+xa$0YPO7ara-Fe=
zcEqJffy3NOR~6^KL^bs(Y~WYqGlZ~ip;+^z$8?tJQj#=tv{jX*feZehan7ddATM|F
z?yh3`qmH*Z8)W_9!0hA>ov@261sw7cu$w9wic$(w@dlG9lhFc5GJ>J$o=SDSuo?>z
zQEHBVz4M29QtKBbw3UMCwBhl3FaObYtMU5bL{&+Bi0chSjuZwt
zud?p)F`3pWqbA`m!q_oU-zWfl!Z+Q^M`2<8n}wSG8b~Kes$lZ|+C(fXrCk=I@ZjYS5vEPg
z!*xQC{UK~Tqw1PK?x}junmXg&`>r`R-f_`un)~0Cr&CkaVkV;bOA{#i%AmhzHaZ&?vry^N}oRWuZ)Qh7QHxJ~v|
z_aB_azW`wv|Gy}&-J=O<=V$v^*vsx1b|JQbcitSI3o)f$VTRfBke=SWdN}dFf8~G4
zfLJZxH2mn~gtRHFLgKQYVbFA@;C>Qqbg@47X*b&S##jIAI4KvcbUt4r8P249S9d~g`0XCSuElBv+?)&!ZT7p!U8Y`TNYea?&A
z!E?2+ZhtE1V@Rg}hisrMzUxQJgXV}jVNqY~*nBjGJ)>B|2@0U~Ap4O@9em*y`+bt(
z{->Yv+ulD-WZFU=99f48W43gzT3)xUtygS*%UbuJI~f$SU(r7icHFzPqVU~9qwu+8
z^xKneNziIp`Q+8?C&N5tq@_Xbi%t&lKy0yOWYxMN>#c$9!b$D^Vl;-wgDfK3i^Pl~
zKNovpFC@^R$+c5H{CZe!z3-uPdho@r{5`^G(E23xq44G^(wky+w&kkuGKc+IzfD;?
zECy?VK(g4*viZ~9@4P!*1M#rz&YNfOyqEGg!PWnEV3^5C!-{~?7EOPlH!nA^%~L79
zOMCY+)Bo7d?_BiZW&SW*xdL;P=JUywW{W?biq8@ETlto^bESt4_v@m|X?NaRXE%j8
z{1gz-s|v%g3F(aW!Sc;t4a}V{CGpG4TtvM~{27O?>}F`ftd8XZ+%x!I+MglrCt8;n
z{5M(;XE3C#p4-7k)%`S~Nq#*y2fnGD`6(PjZ;ftaYO^q;lP@|qT%YX{&oybf_VW|v
zI01>;=DSc~jE?szULuot*14LW%(D5G(rJzOgNClNa+hbw#GxDt_!%B6{C;=558{?Ed^lcOgc7ZnK0QBPgQ7-Vb}7*)t*}fPgut)XyBO_>bhIeuuc(fs1vV*j-!b9x0`46!S
zMtuDgxmK?f9Gy^WK=l{ISy(DuZWpZ@!g&V!Gw;v
z7xZ%Y#J&+1=PnIWu$
z?FiSO?EPu}hPZD*tY+RGVxR2j*>B*-igW`ydx$rCWrc^*7#3%sS*l4%P&m<)lB7zU
zJ0|z+A&?42`j{%>zZjtpDVbDOzCNy6&2X`V
zGgB%j26lL>ryX}2oh3D`?>lV1cAslsygGN->}kI7*b0#5ciUmn{q{xiqy;vQ!hkK@
z{l|19?AZml2fqQt%n9;o>cH%N)0?q*i4nUBB`Y4&iCq98;1P6jPY*v>eKZ#8I;q!$2?(R#(
z|&^Tb$CAbk36LFePqFK->M;|WV7r`%}w7QpAu?z%RR
ziTZJoy+D3*^9)^iA>r&gXtrUVZOS`Y%WKV(!Y8MHXs55t=NgD
z)Nf+DoNmdscwq~x^Ha-rs$B18BoYn5+p7CBgKKo)Ppo>!vceJpyIb^zkyYT}|POw@lQ
z(-F}tI{a|+aLW}ILjf0_?nrdGRc`;*Pr#oaDntshkmKTA&@83r(o+F>c@RXbcH%i=R7Lz@j}yqS
zaK2fYT$1U~dM>QE2a8f8$-%|lG(>Sszl*=9fUX+@In^I2uo;-$kwx_Pdww_l9W%}DFuS9}IO$BDB+_Nsxz
zpW@P?@ce`J^K0AIyR%fjY{N(%Mw%_;F=hjFeJ3ZN5bpagy%MtlNOqugsA&%-VIz#^
z#%UFKepb7B9Z7d`A{qU5c!PFUMJ{d=XK=C^gz
zLX_+3p|JFwwA2*QVqj+RQSrAWE)U+Y(7Bd}R@o}N6q3JxY%m#;%*+lS?ZB7D?Fqhq
z3os04k3A{o&q6qHtAhbfpdX4DX1Lo9
zqS%b(-+$Q3r)(FeK8ze7<;a-Y;c%$r{W=b`$Q1n*hi~CTQ8F()!a9WH#VkLFuwAy}
zOifK7LTdc9x5Vn;$LfE69~;N7l*6Q=b8W#0$pLwqI5CA+zCD~8@f8-VVgIszH@dw=
z7Ck?$`tg+o#T{{tcd}h=bB1g0y>bvDu*}(Pt-p~&QN~6h?Ym?T)fn?*;&~O3c^Q#e
zHy4TXVtG!T+#A9Vd&Ok*-FnpJQb!tXK@ggxw#2&it3_c-_wPO-uYPN$nzYjKsM^Sw
zdxkPLrDW*Ys8dYL30adlw&>~IV#n;lwG^~NRXc19-Nr?c()Vdf@!{o!^wqq(Kg_-P
zVM6Hg6t`ryxy|jyJ@|}CW+l9}<$}@g$o+x6^`S+{Wo?wvzS#nUaEBygs-^LpjVA0IWzTqkWtNfW^#Pm#RT1{1OL!B^_7?6+
zEVQQ;$pW_6`6E)}f@kq2(UAN{NmC*E?o6!(FT4Mr;!{lkLVc4BlU1~datw9HV416D
z?sFa3J{P=48b(KN->J-S9O~>Eqm_HC;LImM&i5Cj(ugTUUDK3=-9YJj2Q4RFy2Z%4
zR*ISXhr5VtV*jfyYD1Sp(#ly$0abiCdsFD^MblBq>}5ISJ)6D%wgM2A`gQ5Fo4$YlJ41Rm{NR^FQPU-#
zfTFCsVG#R8F$Ohjl_ocd!pe+{*CQWJ4K!?|QUf#qo@0qv>GZ2&0wxre=XE)4I$AGP
zOU&=0bCP=aN96K5&rnL&8T@WOe%F{RnrahO?~x{HX)z4PZ7f2E(LQDd|s62Fg6PIsTQT&qx>
z)1uB94I%Eu9WoDk>_LJ*f59A9Urz|J-#+s;L^!wGUc-3orDClrOkGj7DUbAQg+5j%3And4Kh^r}G6z!Qra_
zYRlJ+9W!K*%CFAngIxZ15jU5=g|UxTBBc)(T$b8+nhvVjH{D8`BSS*?z2-&iZ52P*
zp=iouGxm}5CLAF)Ycsk*F%=MXL8V+#FsddQ1DWqKClGQz
z5gAbt=wS}0mB^py6_BpP&E@{66Tlft2kk3{8ljfYByLLV&t4pF8VUU{di0e=2
z;&j4Oxfifx{w+6#uvn`n2mMl-aRHZ#r{wPA^VCc7=1Soo+8w?DWAfF0FAWb
zpx1!M0SXy1P~}t|McVIt%#)ab=0y1zRb;q;87qN$+z+{gEk1bt4HdvlS;8Y4
zBG=N@E^~N!<~1grJQ2T6J~(>w>&V4lk$XUanLrhzh>pU>!OMG^g#zbsSzcz>!8L
z*q|t|_RHz+VvUz7+*>=ruYN!34lU~IJ1zqG2-FpNhjeE9@F-ebx16+FV+f`82r*d)
z@5hEWltp)JfFMz0)PeM<{}n*q$og&2UHC07wh8ub-fjowd6(4B$v0qHc5t_hkjo%gMhkwWISqGQ?soA6|-oGic*VQepsgWa3>d`gnkCna}Rnd;dOv@`**I8Uo
zN8&c@=5Vy2gced!v~MJrP=1#`ON@CBxHqRfXSGz>26mAkD2-2?%cXFuOMQyVucKiT
z1NBdM$!;2nL+)k*BZW*ft4DJ9BM5js0>0Iw&&a_>MUxvUD}^8zfd28^AL8D0H@17Z
zkgSPeB4)yxMPRA^%F*SL#^T1UwqkQbD;QUBw?KO|`*VR;K;00FZ0uYx=(VzN%{#8nPf)+Gj}WUeUH`-2sDqu(&3012CbA%S+%dlI8fXw$
z@G5%Br)+1MR+L#GvF2AUF#p$g&49Oh5bk1tH|bV{4L!#ED2s-@0vA2DcMPuual;XxQ
zWS1yXLVc}O{9~?kN*rj5j7Fw+2EYFK$gBViBu4_wcS-HtpPog;n4nkq)ETeQ0>t21
zQza11Lz|wON+C_rIcbRC_y2~mL%FPTB}{6M&6=+c`8zwVtP*icDh}tg47?3-A!vdZ
z`klkV)2bk#8+3QYP7%Zagmx-_X~sV@ThBKAj-!s=XNk`g4z(Z5O(YRmOR*Y)?z9LE
z$k4<_kjQ8OHyvz%x?(DSMS`@B-)(@H->il2`*_1C9s`oVkawkvy*kn$2!6<9USHA$
zI=t;q;KEnaj{}i;v!9ZGHeeX(jOtk9j1}ZW#;FWe>y1(n(LsD$j?KiDk95cQ&$$)z
zxjz{YovScb7&mv{1G#o#90`lbhPKz5$ThoAkfyQvC9R0dVlVqe1)IpaHnCRBPaWph
zd{`-NzeX}7J!>P7X5lsr8q4)1Bj2+PgGG%eO|A8zio)dC#>$rBPmnFHwJ{t1+dQ?eO70=>*oH8j94CM3We8c!q(^jZr}=I2FukR
zF$MB4lJgb!&3j9$tkE@=NS3>8j0qkbKdmOy?m=W}+7R!KzrrDG*9>$<^Vi^C~sCVR>Y?
zJ1@1q`NxLh`*F!{d@p|4#_VUbvyr!-r3?sEI)mNDrK&HoR}<-ErMf2b?uh+9flXyd
zv2ywntIZ#2n#W`FM(8T@p8umSO)g+Y
zC)m=sr~2QXi(y4a#nPfBo_@Nl)t#h6wy>O9#ag#em70iHt*jiAyj|E>!8NID#HR&G
zq1ta?#nJU2-wypqFE_~SXGMSrdQHC9(G#1JN2Pdv>thUG4Cf{>!CEtR4W_3U>}_}z
zO9rueJmo{N9`Q*PQ)I73YyJ6P!aO@J~&qhaWa1Lj^<_D{i9zbXFB>!I3)S
z!)gg2V#({o6UHAH@&LYp1TdHqk0w@+t=<+agO79#@3E74hF*@`?w2;r$u~(p7QrVH
zbHI+nD=^aVkR$HtJeg!wC^&|5?4^%4>D$%}8tfKb;-D!`dM-;laXF`@Tmslkq*P>1
zb>zw(#^u4bOJhmnGbLWWp2G5mf}CC{NF-Ek#cmqs^>%|TW7S(as|3DR=p$bEZB?M%
zLkpCGciUH3#cKcVG&w>h0OA_E`DB(cMnp*>47dc)h=PGV+<7o^Gd|EfC?7f=%7;#$
zt3xP&UR+H}V^hq%Y%D03ohX*Ckdw!$Ix5V{6g-s*LR)WYkYBykDKxT|z@;wZ1Xdm(|(tn0zPlDSC
z6qyTLG9d-b+p&90)GxL7em>T*;vBv(8Slo!pjf|Nus^_yPSm?dVEbh^t7P5z=z
zj&4Q4g3kl^tJ|{G%BB&mW`_
zKc&Tg%W;P5Gm8IaVrMtMVJo>wa}Z`%`k^Cj1Bs_I%h#*Pw(n3dkg$1KePe!H8CEv`
z#*DhL;~R2Gb?kXfGq)b=X;(~7DxKY^&0wW77yS;IltM*}GWz7-=(O3O`o6KkhB{UB
z6>ffuUceu9&;d(GNk51jao)oAkACBSCzeckNf)P@y-*OPJ1Ja>j`-ETtJjKPC~4Tz
z2vH3M2XZSo4u2?~RpwnbH+dhNF&iN}JF|eN;~wH?&N<{+W4FkEn3fhgm8RJk5@G+{
zn@g&=Dcl9UN_<&GK#Hd(ceat!$?KPOc7ZPuWW)M50%!_(MpG6%Ahmgw&v(qwI<)M5
z$JG6ERZ=c4Ib_d?AH6q`fp?esBBLc}&hxK(OQ=ojv4c_4SRp!`TWTE)KUyf+p=)y8
zRqm1v0xL%73R?0>lQ|UGGb*UX-|?EB*lfFMZe85a#nD6YIXLOjH?mS{2nz}n8oeHR
z0N3UJC_ii>^O8g9enn~A`@m`L&xEAh7|T8p4bt~0T@4Tg7vh(GouWfSy4L+TWe%HI
z`3XU+st0JeKJIiW#IYr=6z7Ql;Q=4$zxw-u+HM(^3r4S+dfpf=&sY*#%2Vb1Mcf_e
z6bOW62g?V#$Cx5+Xfy5*4>1R7*txLRs@6+31U4MO;TmofE@r=(P?`H+y?b*51`p@c
z5w-huO%7YociFDbH#Lb7D~(^oFPOz-EQ@912XylfNXAM-aW;>
z+p5iOhA_({(r{IWYba=I*vq&%O}c+!hMb&hInQE0G!}kf8TK0ci}RR^vc3vFu@F+#
zj2`^iKnbw~*v7|ZC8ChqJ;s=Ogy>Se(T&b=E_-NNK}Ab}+;b8nlF@3Hq`0$EJwQG5@pYYhjtB9$MWzCIpk?pEa1ub16N}1XqULeH>la{g
zKhPRHj2@xc738|~(PSN!c1J2W37ZgetmXNh_X&~XfaoRKik%=kg7n){80ky>lE~oe
zYL2fBbp_Z#C2YDjz%8x;m$a2Fpe-F4Xb;oJVOA3Eka)Ol)b`w>pz#500y*0Y%fxKA
zqu;wIj6CxMGIyUVs?>mJI5A8pg~r!D+1)m-d|Q`kWc9&%ssTYCQ7G5+Nq~HuF7E#-
z>W&L6B0lUF{y;L7A)*pf&8QZriv^wT4M`%8)FyzJS(YhUcaK~M|>$WI%H8!Z@+broLDPlGw-!&=b
z&gKjSZapq!$CdN{Pv@RTE0niPv3G?C2F=k?XkL_Vx0yg0lyWj8>Gcd72(UQk`RKVL
zrHAK@3%4P=e*5rVkJs6Ta?oogR4j?!_S_2D&ojHIM>3LkHOu=e?Nz
zRfQZ-Jsv!{>OIfq;^LBG`UkisN(CSTmdoB9f+D<7oq4?c2LWc}G*Fp!L)PTc8q!0o
zB>SJTr}}R*%Y52TzyGkH#=`ClJZ*l|uH>{8>qnmceI{wWefPH&MP0(>KTPI_Tl{C*CVl8&^7@cF~d6%YNlQ546^^}YH
z6G`7+^7g$H4WpS6QnsIco}B$9vUY#%-2Gnqy!oz>Z9}is7ADU^0O168Wt?i`>g}4U
zrj<1`H|Up``~~z(59rx#xkBW^Z#qSVOb|q)WeqL?Wlt4Ab=TMT+UC4}-+nsxZJ%~r
zU3?HDxhc(TxWlKsUlckie8^a+j5Qf}IvSxF)Te=?E)vcHw*<89Yjj#Yce*d?tU>z4
zT<0wprl%@va(K~+sZgK>aGh_RqSNL%-u+|#DpW0b%<8&o$gg)ZNHMZXh
zUehjfm@I=cLKvcA9Q76aW39{I@4bAb7eILUe2FQxPq<_G&*^REo!qLC`HncmF+sQp
z>kGyMzn+{5pQeXh?UUX1Al9!Pt_^d}Z@cWw^J7jr5O-RJx6KbxMnV!rolmw3loxKk
zpcjotPjzOn-wW8^XHe!l4F$+w9+YCzr*{Dn6Vky1jdsV?n-)soir}QRLNo9y2#P!jzQ0`sP6r{bsRE(~5u2HvK(Zh$9j+Zr}OiiP!yCNKzRs(6QzJVd<&^qH4ajMN2PT
zx*#Ck(nu>vOD$azOLrsPAQI9D2na0Q-7T!t(k(3Ao!{mCeSgEwojWu4%!%iD4&c`!
zex2+Rnli)?5RL_$eSF=@x1WEQIdxZeQ7Vw^u@!gYekt3Q*sr5X)QFeMwXiv8b4GRA
z(zh$p&boA>Sb9}yr(0L`2yF!g=S}Sx*;Ev@>q#Mkt2F9Ia
z#JNj;01z&_@ZMP!QqCA5F6ocpqL+Qd`#zJ`BFy;JzMVaIHYeP{XGqQG%-)wXiOL_f&aDa405&Z2al;<>
zl@e4v1=o4*u>N|%3HxehT&*sSN-U_<GPaIX@l=D*yAaPDeS3%^b^@!wl&=n
zr<04JQ60aAgkH2wOZ%CGzxSj+
z|B-`yWcQq#%}7oi9cCUceFSP?sL^LBg~mOrT!QyI3uw?hROakFP&I`0yVf>9yLf~z
z2l0jzyM7HvMcFHLT`cNWbv-7{pUk|xUGJkN{YA!*jlRk(=0j;0IjnO@EVUCx7Zbk9
zkG{ak`2<{Pn0&0mJ`RxbaSkYda`gUxec*8o^LT}pPS5?{Nb*iM2u?Dh?#`#{3i6!0!bEY!JjGBR*ImLSAdQnrA1h;p*N5F3+1i6Z5Ax~(vke0y6&gnl%R>-jIs
zFapd+eu97_`i?|O81w<*rkpUcQ!6aHH74wQ#GRFVD_oM|wKY_+?o`CHw(Ki$r_L);
zaPeo&8CS&ZXz4F8pl6}MH_@=d!1oGWvKM8OCwtx6f;0?ZY{#g`;lu-jQ$7wZ`Bwip
z_TkMy4I0|B;^QHWuRAPC89MG=b+;zM+3#CD_3z^3{57mNat{j)t_vft6l+PXI+Z%<
zwp~7tN6ba${4D2lhVrFK{l`ENj>`=#e~sfigsbANq#tSgltskRKv|CPZ#4bhkCu>m
z?5uaxJ!4;AOLZkt-%g}T<_7~P#~sjOsK7T>W@lT394-VpQ27!`>5z^m9rws(;Dt6p#Y!=D>$M29#GsO38NGb!mipGHu!LY_<=2zgcgxVWNq$o9iOoJ=HZ{Yy%|YP
z23}85d4^d|gAIx0S(Orz4e-tf@>%p$z1ZRP5SnRvb>99e=F(NxZyNgH?M+OWyE0orjqHoT4=$hE9WpGALdlN
z(n8A)5LR#xs31GX#>$?R^#s{9)WVnwpdPLXZM-0b*NyX7czmIR=1w?SgY_2`Zxq?I
zW3mSLeQOP;B!XP*zcd(L)P_Ob=&RFGc}90M8d1*R1jvVB+~Xm%?jerL?W
zhe{9Blce*Dk?`~rkGlKiwhiv3J0i1p*?nHT9ItC$#PL2HPo=}z>MK6
zhc2rl%lV$enFonAX3T-}NB}PXlHTcge@NSRwOl|lQ1UDf;DRLdcE2@m{0iWe92`d-
zR;@`6s1}6|jS!GYtr|PoPO5j+9$Ov6bu`u$e<3$;lLHcO-jlZbEG_R%>L)S2%S!cY
zS$C_c@RYW@M7$m?&E>mtzNVt#9V16t
zZ~fcpN
z;M8!F)(gdJ>0X_r)})q>8mebWYbYrppQD);agqsJ%41}4ciU$GM2=wo=rFR4
z9zvhRlL|Ee2AGq;Xo>2OSR1xVPj74ZDPRn>nVnYi^_#H|5}R_&(@nJE(4Lrvu;*T?
zsf8N~>~p;mUOrDpn*6q61GJp>(_OS$NU~lV2tN<1He3;DFfqKc-<$Gf-pYisS@&6s
z7fI~qFdni+5viI*DCcM*m3-PP^BApV02b3@&0hD_cW}DVbwfd#Ky~=2N)#ssy&UQm
z_5l?_sM(3%E=8VbYS-$pwyCZHs`F>$D!C!wsL&+Ej_gUJk1XvZg(J$6>lC#9O6dM=
zC=gy)?zY(u_fg-SxMeq^<=Kl)=&e(8A!h(E-cXIfncIkyowZGK9VobGmV;bY0Z)UV
zrI90t@fogm5`G_Q$&^mqqg^M**W&&&JjD}6OVoJOn*mQ`(m9p*hiQHl!#)R>FS9G1
zReV$WBz5Zwh1c$?lxDqs%6lkvl)>O1;He*|wm>voaflbI4jbWXZ^RDAU(eD<;pb?2
zWUjSjk=A_Qoa{}mZmZ_wC%G+$osq7Yi2)JSVpw~sQMJar&k$vnJ1nqD0P)4lTssIs
z4{H9wdaEdV8~WgYo-1PKv;NGj%{245ms;w;hFLf~aaQPbf9aWBm#zd&h^Uv%^vU{C
zyN%eTUD!s?jTQN#P&$@nam{uqz#hB*T}eNhn4jzLOPRi5eh4TQ$f)?LZ%QV=Iqp1Z
zc{p>)jc?f^nw0OPVyj$?lbg5qw&H(phDLZA1cxLhv$Z|(@0O?_JlPGkU3x_S6
zRSDHZZE$~LkC%MzXwHHhhf2gR3_u=;M#|9U>2=DQ?ET!h^Yu$;#VV*Imur3FXk;a$
zr{S477NAYFwD&5y-c6_5yv^8ObAb!a+r)Q})--f2d?f!6fb_i+LoI$SaekcScd0gi
z$tqTESytsjhRFimlk(>+`Kw22rfaAUE+){F#uufqoHZ@YAn3scuJ8bR(XjSeiCe@?
z%yGv}(%)X-6NoXc4p*6ty1aI$=}vMZHkZ!^*t&zEv+=HyPJ5*ZLO6U4TdAmM=fA2c
zkeW0u|61DM&kt^08P#;L+*(3(+AgvxPNK8g-X3@jtx;)bR#lE+jLH&Xzt9lzR1aq{
z5`<#Fa{AxGdW2+iM}I9ShX3dMcz}7e0BtzW8_~u4RI1yFGBMfA3uQjpG{y;2X--Ir
z|Fo)1V9Z~YXJ$XLt56n+-4C?31*kn;y0l}BXhmc7D8Zh>)A6`Hsk1IlnukLWE%^P+k
zv%TI_5AKM6E_OA>SqLc=o~h?5(RyJrw0$x5v^9lsBQ-U+c4amL1MMPjzP_yk`-Z$2
zv3eXee&P3hkG+XvTx+4n{dKzTp9W;b8`0}_?WD$}@gbB5<#~e)%5g1|YV#Z2?qY+n
zjS{y5!)#vWg@{ZrTzkuT;N)eA?0BF$NPaAE#{{6BV)JS>upTac?|uu2c`=el-#&Uk
zFYvW=($yjb9&QK=8ZN?#MoRe;_|^>#3DXy9FqS52sOy`i$imnTtR#kTdiUIszpa|V
z&mqA>=K@_rw$=`FXRM_QWZYBAKe032ZnfOvFlzSBt*YU8f}
z1~5FVy-|+8CgG%goZ0*GUOH1`mInWoxU=;04)tL!UEWKCm$2_<39o&qTQ15;-m&%sV>HGl}G!UoPcEh6EQ}V=Bfiz^)^Gq}bXkGn_OIo`pZlW7s|K*rKRKp0c?C
zfVcrQ@6{E+d1!!C_?4HuhuU}4b^-*bIETKD1e(j)=Rdv_*pUL7T`Xm=3~HEcc~DIX
zT{%-4DikYWjEDTKgD%2wKooFwgz^1rdfvj2|BOcpvb1^y;T7Wock`7kR7dM}iwa3z
z)IP0Uz|x!y^d${#sPZPS)u
zdadCAU*E*i0|goxx8KoNPvBqUThx`|Wcv%Jxbd^%l>;SVp9v(-
zdGark>V7xg-2E^G=O^k`vt0SSuVk9$B3B>9zSc6f8_Ubgo5z!~I{Iec%P}}HlOo-4
zn^z&R9y8`>5~J0Xre>2kq3(H5p9P4zhG|q4aqb(g5kK~M&3FPNfjRoR1Ai%1TzJee4#=(Ubq%8x(11x_t`;^%>u&oaR
z4g<4oX4>U^ldYB0l!7Eh@OtSww^Et?gBr8&x%ZErm^WMywQQbql01hI6Ods7MChQbfZ6kVz?!`sdw^_w
zsw)!WCMC>u3F73`pioR7=69esho8IWHeKbc`f!rQs&Rf)4)2GEt#uapjzZR2*mJdU
zpkA-@7Oe35K_J(sxj7_nEcI7MB_r(eec-xU3N?zc*7g=R}|dX
z4)cXVRZ7R@1=utDflt@z*t$aw?zsDDq^j>4gou|(g&m$&*>jD{ab|9wEarY?#H97B
zg-bK84>-d2rs`(uxHls8>##t`^b{=+3P2kNATmz2%C`#RYsOW-aG
zaIRE-ub+2V9gc=im)7-gvY)#<;~K#3(}e>76ot1uUV1Nb(o~uFHonr{1+loW;CcVX
z$=C(nLXn&I*GK-imeXtEg;tXWXoHbKAk4nw->CI2-9}5n(!uzi>(OGYyQF1FO6;<{
z{@g~a=pt*z4%Ohxogw82FB${#@L4@y;l-`Om!3Wlmi^z-NRXP=eJyYa?fN3qp?CF3i6d3$j9
zlHgtrw=s(S0fMqJC>1lS^NnZpHn6NA#_vQ3ZeoK)X-R}k7-qJMprzBGM3N=TfabqZ$9*RoH+H#yWsDZpsS8)8UmbsQ2e3d#g
z-tl;x*__OmmvJ7JkY8jq&QIiGpM8+hGZb;*$6a$Os$O39SZP=gJ-zXX$N>t_-{=N@
z#>h{5PDCygFZlybS>uA2QYNwnDF_>?koK?fICMH$&Ojsj-bh_89pgl-V+yMMxk4@#
zhidROqMYwn-AT?@uA=+|a{hDKIIMAexwHhQaJmCMj&YYW_juW@a_o|v!hjY6FAx21
zX4-ffY|}*vUV($EZ?qa-G=1Zb05A>x3HWO+SS8WuV&cgnfb(fox{!E0(&qDR$@778
z-={gyiFl1g6jRSR`>znDWR`-kvuPd5qPD*9y8C@M0dQMMH(yk%_C()M%vX!81CA5b
z34XLxmDg+P2?q~9k7sP-+wlpir(AGZ>g|^c+r@-m%T#}7ip+Il3`67##$OLra-|X(
z@i~u8cVB#VH9}yOp>>5rr{Y!hI~!7Jm*}M{nU-L}aJk5LG`I7e+#Ivd$p`V1TVd%G
zGWnF!nWHW^COOA7fIuX%wq-rVizrnqLzd#94=R*>QeR3e;@H(vdX^&tYFrP^x&Zu6
zA04NZOzfZSpl=Z)kpZ^vl4k|Yi(7cYP7!;W!nPdv*^FGrIjJ576oJR}2)bK%eE5T(!tIQ@hl9uhgnT*^P=C?<)_?w(`3ZkJ&pUK+5
zCxtl>$!wxNfOz?EaAcT4JH+J)h|tDi*NW(7$w0%_obj?twpm*)Otls3=H8;1o?S@2
z-3T$z(l{ty@#T~uWWY|1#>*>~jmTg=#DSd@tHvZgc}b$q?UvYPZd8l!??N=XC$xA`
zINpq0E9escyz{EM7fozRX~Kn2IYj#844=Q9Dfh2~9rJ-m90s`PM=)|XJyvT=z%yk%
zq~)#HbscV|<~8RK*GQ&_5Tj$6RR2*`($dYLcBZIR_$sQ(Shv($Im>kBfOs#2QLE9_
zk=<;pO75E4wgmG>g4E$JmVzFZIQNs3or(p7=Sv`eUj9+AUNCZqCr+INGM*DQzRN`~
zP0@#27mw36j(GMGtd;n;NWYYkrA0q9hx9r>y6jE;1al5!{)}}9JoQ)$>&`b;cxW(A
zyEypfa%qz1wN(^2Ms19aY@*1c3@CI9!{z7j>#Phu$JO%VY?K-y^4()Gs-n?h#R)fA
zkc|iL0a8Z<+;YxG?nBZb#)QJ;`3xySuk-BP!%
zlSziRw2J-tuJ*AoO;{{9^I?^rd&E4p?0Pc4^jktJg$PmUHp#e)%lRL5m$P-dl;Ijt
z223}hUy7y4`&Q;2q(v{iXmSXKYE%SVo(fogjzNc=n19DB!U{XO=}n=Npx29i@GeD0
zVUZp39%T<&BvW}e_o6Ia)&?YFNDQkXYy@JDTW`l|Ai5=Q%6p|Xev?I_E{UgOxfuDH
zVtZQay@sFxDjb%%AFDR}$eKty={N!?tCnL0bD)3Dov~FoFABx9Yt6+^0Un!@|lMr&Es{2*90R
z%GH#Ta)=10upkU2jBuL9&wjBpzpzfsV-p@+ffTM^Ng)o_l>L
z00_047hZupE5D53Kn08vLBJosAL?{)0BnY3nTSZhmyRF2>WjH@E4-EpYw&_k1|hNK
z)Vc=W+K;IX5Wd*CbI3)p#Qq|1uM9MGParj#Cu)t{2UQ&-5O7H@3lnAJJyq%h@cdm8
z|H2pA562mMS~CXv?}E?LAx!S8!8lpIj=>~~rYxoWm7Tbl#)*j6MZESBG%Y^wU2?LV
zzo}UzUSbBHi5t#<&5_Nk=B;Z<*ezm6N?9eABOMz49+ObrE#oZX)#_V5DxAxajp^oC
zRxW#ihvni6r@juv@-HVJY;dpz
z(PR9=npu=F@G40#3dTG;3OW#vr)?jX%IU;yWh864wzEvtqA*Y^FR(ZJEC?$Qjdh+~
zT3^0GtPY0No#4raG&Ee{LnHrgk+!;jJ|`_brlcrTQ3F>84FLyvo1g(P`Cs
zWL);z{U8Nukr2Y}eumTfFS;pT^dfl8huSN$hR#q3|;d>C1*#k#JhE%lHc=JhLk{wDjQBd^lye4
zbtxZj%|$=B<^6IOLwTuHAfWg}e84hwpm2%wyU2I3V`mobQ#7X(ORK6^wYRERJ}iu4
zz&X>})*92wP0UGaSP}R5_e8|^kX*>pLu^yG+v|So-D0~uPIZ21pNIQ}LFV#<_x8&M
z*2r@OUHzO&g+*+&Z+vLTX@rLNf#&Y|?84U1H+~R@V|Rv`qG#?XDxf&}$)`Ri!5Wu{
zeLy+fRNL-bZ+MQ@SP)6du%NK5lvebEXvsZPHPx{N<)TJ2`&u^!tH{BD_ao`#l=@_7
zaP0Byfg40N$0=6s9A;@Uj+5XPieOnY(
zNX?63&sxrpUtwprmimt4`nmhGuBC!CAED%aFel8skh$WZq?(>X2W8(8hPJj960lO;
zT*qv{mnwAt$Xe5hL?i{2aD7&PX`?Sw!XagWfee)@uVqxC**`Axy+NrC4TRLm~nqeTj&l--c4y|gnc0$eX_yd#6yGpj%ZP+Qxg>Y?mAGP36F5Csx#qcb(
zeEH`dnx$;+>u5@YqY&b<#=P(`a&EKqk!oXotz5pLM)AGy3w72H!ZT%?&&F{Vbt+kM
z$M*s+zSGa=d=jLy`-Nj&@^Et|mDF2Tk$H;zbyiYJsN=_~d51iMd5!U<9t^&mpL;!T8yO|5
z-|v2TflEjRH(#o0H*fRyf9^$2h%ypfi8w0sow|gQAWr)HJkoJ}u3s{X2-W-i&Df;;
zt=xoPyADKxt3>Zu?fbAWKAdHYz`~k=q;QM$)}LG-C};7RHUV*ZG
ze2Y0Elp0On3%hT|VWlN~X^yMns6p`#OOxn3xH-z51`{Y3wu1|jFdOgebI#Q-6z-k`
z7Ni6n7zUqM+sV%RmOsV^yR*dHQ&IH}ekP_je#aGr%{RH`91g1FHheNUTFS(Ub2*3(
zl92I`BmT^*{8jb3YL7|zjrzU!kur`R+xS3SesWmF%tO$%Z^Id;&*DaRbd3PD
zri6GvwUbKZ2xAInM%14e5N&uKRIq_IxsoI(^MwOatc+M4<_&FaV;CcpA=o9JE2sf8j$tLmKz@~DiNZT+6|j73K7-R^GW5{{?gaH
zvb>l;ah~`1ifLswIbYS}1%|u-e&TIm3EI%vy2|Th<3m7z;%SRMu3=Gs5f-u5okGjC
zN3*M`Dl+@RmxGDUy9sBjr@xy=$4ScJ^O@t*mtQK?JBPgFGuNFxebR?j24CVVPOjyL
z0}9t;0-7RIo^=&Te<26t^piRgq(2h#F=TXv@kfF~;$cg<ht
zde!o=s(DwR$ahOM(eK*4Z;Gb-9&QgE7Tw_Bm~X^9Dyk7M3$0h8=;OF01VwDkMYM1a
z9hpf99+_eeQ)0tXOZ&y~EfmS|g*h;woDH|J=_(CQW^sEwSI8Eto4mPEwZp~GfTL7@
zBxDr!QKEQO(M6>2eH~kEM5W1qz&kvh_a)KI&Ip-!dTfZ34VVyL>Id!6HAougaxBN_
zxIg`f7qgS4T*Ki(rq-eK!!!WLfIKVqR6O%=8Zoi~cwxTQ<>$-%+g&8aCFqjnX~VPM
zY_7cZu>p(l$-A%35A^9%I#2j2eIqRLc+vPo)C2JvY<}R{0~iC7rI?_1iw*5FiN?wX
z6T<=hA5EfNe22vcfS6$ALd-oK8A}qlGBVpuN{AaOGW8`*9W7k$)0Lca;>ga*Dr%jA
z>A&R-wAhFArj4r&x80?ADo^UqDtU?pk}9A;^uLfen3D@dOeF03Kw9OcFAYu`cBa9|
zRF2-rql##__}iTRZ**_XQiSNozEgv0d5~U^)CAl4{`1~keHVZAJe-{~h}pp8wkHSj
z=%r7~EB^7iS*Kr?j*HQ3oz}0P?QkupBMbc2wDtMdAIr33kae}h3(c_2lLdo{*dNpu
zNlTt=>0Vh{8zMA9Jtuu9l}#K>Xu`6A;&4bBhA~#Be_oMLk&JQuB)e)cMX_%g*tkQX
zWf{w$s(s3LKU2X&38|!|siM`mK&_qhv{)^~Wu+#mKVWhxwXY3ZQ;Y;ifwGRjb3>ySp`ZXzgnst`SE2S0>bq`kgOr~lopjndG}F__(l2|*L4%!R#V_S5B7GRhs`wivCBYNuCZh6h{Q%I|
zibuYF0~N6-(MnEZD1}iE&IGO%ihsn#lrYRK>~+|QsKHz>2(SG}6}_fLV{P+``r|unB4Z97dKiwF$ek}!7+J@I)|FRt3~=6$9F82#{;0kL4og9bt$wzt
zhP$Xe+;ZQ;JB38?A1KKPRJ`#`6a=Yx4d*@i)A97n?LSd44`pdTIsZJ)Sy+UXLNT0N3@ku^$qvQuIo9I32#VryG16Un{WXBnB?E4*MjegD1^-a&kg9P)@5doeF$D
zQS%QITn|@DF@`N<&X;8I3D4*+YhPsZQmXD|tj+3i9=Pwh?zh@xZqU!rpE~ue#FJf!
zw*FzD(b`z9E*mfXuP2>#Dp?LI;uUcq?~BC~1-m6UvdyzEzx3f21LevCf0y#OIrhSc
ze%Z4LdrFQ%V}e%8BNMlE4}qfboen@nM{yEH9=-vzlGBEQ5snH>-*H!q+Gn3B13Yp^yF4>ithqnS_m-y*K083=JJ~)8VK5+?
zERqdu2K1zC29d3fLhMZy!`?fqF2z75Ux{YRarKj8!NI0k%$hk?k|4^|zT5}n=$cH|
zT*~V0$19d+^j8ISJ=_3et0VlALX
z72q24gI<;uI
zFCVmpQrGV`nOZ6Wc
zx+d}XZS^)7dg!#3h!VjVVZoQiGX}DeG94BK07p-7fjU+wfbK~`%i8)zqy_^OfxuBx
zwcCojlcbc*3|yJdn+W$CD|+N{cp8lS)*>=!+}H7RQ%`{QHV5$+H}zb1bxHltG^DGU
znnJ9C6wSt!U5F4(*mHY)(J~(jVx~;OADhEOT58~~z3m!|nwVWVaIm(h=|1vde)SC6
ztF;fI_WlxlvE&p|5POP7tmgEp^~?Qe)G7)~}}tnp`(_k8Ecex)k_
zds8VR_%fr52&KpHHkl#D1X5DV-wNk{gj_w|g(kRc$J1CMf_FvnO1R!d)qKjuGvvJ8
z6eDP-BS}uE3(MykMJaZcwKdpit_+m(X^w06s8jo`m5p~#s69%%3;=W#yb(%K)@-&<
z&|;-7ss8ui3@Gpm+54A8{@glKRfm+bm2davx&)5NDV22Llts!=)5TteB|LtrN;ivBKODaIS<)!kyiBgW1?K|L`~M
z+DBoQI=nl-)?lUx7PoTXu(N0ET@AzAljD7-H@=L3Qp`I@M(#OrHn@JSZRj7F6|=jgg8Rwv4<2Pk*H+|+UI!`(-4?sSz15GyI@yPBl^
zpte4eE?XKPX%U@f5O%8WlZ3+#m$|7F*^wX(75=uta6L=x$#-;l$^fHKTJ=q-+{$`0
zuCZ~C)A12omM1LmgkdPr<9zRf#XBBLm<3%b)a}i@w@sjH7oKc{hShY74Wn;*=y3o0
zb0@L#^2`3`=2sE$S)UaOJqAGdJ@@Z0stO22C=_OZPzMD+goAZ(x3SeAwZJ!>_0>Yc8la
zGW&jPp2~=*13-Xz50kX1R_DwgOTwv4Uf2D~_99NzO8N;j*Q(a)BfIShj3m$Txxeef
za6PFVM5twYism+S$V))MXMcEk-|fn$K*^&tc9SEgTUfs|m*`fq{
ztb4;w1Gt+sF#TfU_$6--FCgM~hEj@K2>m>Yoy+SrRGb5~d&;}8sI=3s;t6|HWeXik
zx6M93_OJ}hkl&C3E&8#xb%1~e$}5F&@rbf*R2X2j+?|DU)br5b>veA)t)+EuAHuwiYHlqG`-Uvs!GDETI{M|Ae-4P2R~l9896M)rRh?*UZND*qMn~yE=`-A_mGU#
zDTCt6cHJnkZ3v(4V&eW#DP1qkwWr?syg61Z-Sl;`6MFl?Al9^ER>n~IqQ}%_iaw8ujkg001u`)DbR~zXF-o7L!76$9JmSuGl(L0TU8_j8Tzac98NT>RpsUNhjoh2eZZgi-M+jmSYo6ryozjyYRC}~Nwx0a
zmhHmZjE_W#Q=yB?A9q{dm^@rZRY^KS_lI2D!+f(F4|?z3-qiLrZ`2CtJO1p^JsA{1
z7eMx7$s-ObDx0N}kRWMoA&ng-a=vS*dFFBELu7nJ;1%0aPc)9uGe0l2E8|mNe+5Ih=
z;hazq6|uiG%@V$-CJ(Xw;<51|wu%{Lq1C+5M`r8ga~meNI@<>2kDunGv3BM
zs6xo^s$CoK_QMz3)2pu!V^R%qP^Of>rf}6ve+tCzk}rii&YdaPHq?6PmmVy%(sD)c
zt2%ooDK1rb=|r6vVN=ZHpBNdQ8;Di*)A(NU7bH32?0y7_Y^~w_y4q;J~e<{9)05UM0P?K=0~DU}@l
zJj^t1u*;JEp8XgG}vO{0gMZ4hr01ieQ)3S>|PV$d*WfS^{
z-XE^E-^drgs(#YC!RmFj`fk5b0#}I|Dk5#Pb>YRr&OQqFG`)Lf$BF|7rc$B-eO2B|
zt2K%8sQX*h&C@li9HxAK(b&z1q?&_*GVBKvywY2lY)Wp-1V
z