diff --git a/pom.xml b/pom.xml index 41e219335..3fb9c7000 100644 --- a/pom.xml +++ b/pom.xml @@ -59,6 +59,7 @@ triggertask twitter websocket + yahoo-quotes starter-parent spring-cloud-stream-app-documentation-maven-plugin diff --git a/spring-cloud-stream-app-dependencies/pom.xml b/spring-cloud-stream-app-dependencies/pom.xml index 273790554..f0b44bb44 100644 --- a/spring-cloud-stream-app-dependencies/pom.xml +++ b/spring-cloud-stream-app-dependencies/pom.xml @@ -311,6 +311,11 @@ spring-cloud-starter-stream-source-mail 1.0.3.BUILD-SNAPSHOT + + org.springframework.cloud.stream.app + spring-cloud-starter-stream-source-yahoo-quotes + 1.0.3.BUILD-SNAPSHOT + org.springframework.cloud @@ -350,6 +355,7 @@ test + diff --git a/spring-cloud-stream-app-generator/pom.xml b/spring-cloud-stream-app-generator/pom.xml index afa09ed07..45b5664f2 100644 --- a/spring-cloud-stream-app-generator/pom.xml +++ b/spring-cloud-stream-app-generator/pom.xml @@ -164,6 +164,7 @@ org.springframework.cloud.stream.app.test.twitter.TwitterTestConfiguration.class + diff --git a/yahoo-quotes/pom.xml b/yahoo-quotes/pom.xml new file mode 100644 index 000000000..b6d6cb5ef --- /dev/null +++ b/yahoo-quotes/pom.xml @@ -0,0 +1,22 @@ + + + 4.0.0 + spring-cloud-stream-yahoo-quotes-parent + pom + + + spring-cloud-stream-app-starters + org.springframework.cloud.stream.app + 1.0.3.BUILD-SNAPSHOT + ../starter-parent + + + + + spring-cloud-starter-stream-source-yahoo-quotes + + + + \ No newline at end of file diff --git a/yahoo-quotes/spring-cloud-starter-stream-source-yahoo-quotes/README.adoc b/yahoo-quotes/spring-cloud-starter-stream-source-yahoo-quotes/README.adoc new file mode 100644 index 000000000..582601c4c --- /dev/null +++ b/yahoo-quotes/spring-cloud-starter-stream-source-yahoo-quotes/README.adoc @@ -0,0 +1,136 @@ +//tag::ref-doc[] += Yahoo Quotes Stream Source + +This source ingests data from https://developer.yahoo.com/yql/[Yahoo! YQL finance quotes] . It pulls symbols from the API using a configurable cron expression. You can select which fields are going to be returned, or fetch all the fields (83 at the moment). + +YQL has a limit of 2000 calls per hour, so the source does its best on batching calls. It's tuned to fetch up to 400 symbols on one single call. This can be changed by modifying the `yahoo.quotes.batchSize` property. + +With it's default configuration, the source makes 20 (7925/400) calls per minute to the API. + +The source splits the batch calls and send one message per symbol. The content is the same as the one received from Yahoo! + +You can play with a `yahoo.quotes.throttle` property to avoid bursts (for example, avoid sending 7900 message at a burst). + +[source,javascript] +---- +{ + "symbol": "VMW", + "Ask": "68.49", + "AverageDailyVolume": "2161690", + "Bid": "68.16", + "AskRealtime": null, + "BidRealtime": null, + "BookValue": "19.50", + "Change_PercentChange": "+0.50 - +0.81%", + "Change": "+0.50", + "Commission": null, + "Currency": "USD", + "ChangeRealtime": null, + "AfterHoursChangeRealtime": null, + "DividendShare": null, + "LastTradeDate": "7/18/2016", + "TradeDate": null, + "EarningsShare": "2.27", + "ErrorIndicationreturnedforsymbolchangedinvalid": null, + "EPSEstimateCurrentYear": "4.14", + "EPSEstimateNextYear": "4.41", + "EPSEstimateNextQuarter": "1.05", + "DaysLow": "62.14", + "DaysHigh": "63.00", + "YearLow": "43.25", + "YearHigh": "93.43", + "HoldingsGainPercent": null, + "AnnualizedGain": null, + "HoldingsGain": null, + "HoldingsGainPercentRealtime": null, + "HoldingsGainRealtime": null, + "MoreInfo": null, + "OrderBookRealtime": null, + "MarketCapitalization": "26.55B", + "MarketCapRealtime": null, + "EBITDA": "1.76B", + "ChangeFromYearLow": "19.32", + "PercentChangeFromYearLow": "+44.67%", + "LastTradeRealtimeWithTime": null, + "ChangePercentRealtime": null, + "ChangeFromYearHigh": "-30.86", + "PercebtChangeFromYearHigh": "-33.03%", + "LastTradeWithTime": "4:02pm - 62.57", + "LastTradePriceOnly": "62.57", + "HighLimit": null, + "LowLimit": null, + "DaysRange": "62.14 - 63.00", + "DaysRangeRealtime": null, + "FiftydayMovingAverage": "60.39", + "TwoHundreddayMovingAverage": "54.17", + "ChangeFromTwoHundreddayMovingAverage": "8.40", + "PercentChangeFromTwoHundreddayMovingAverage": "+15.52%", + "ChangeFromFiftydayMovingAverage": "2.18", + "PercentChangeFromFiftydayMovingAverage": "+3.60%", + "Name": "Vmware, Inc. Common stock, Clas", + "Notes": null, + "Open": "62.46", + "PreviousClose": "62.07", + "PricePaid": null, + "ChangeinPercent": "+0.81%", + "PriceSales": "3.92", + "PriceBook": "3.18", + "ExDividendDate": null, + "PERatio": "27.54", + "DividendPayDate": null, + "PERatioRealtime": null, + "PEGRatio": "1.11", + "PriceEPSEstimateCurrentYear": "15.11", + "PriceEPSEstimateNextYear": "14.19", + "Symbol": "VMW", + "SharesOwned": null, + "ShortRatio": "8.75", + "LastTradeTime": "4:02pm", + "TickerTrend": null, + "OneyrTargetPrice": "63.12", + "Volume": "5474990", + "HoldingsValue": null, + "HoldingsValueRealtime": null, + "YearRange": "43.25 - 93.43", + "DaysValueChange": null, + "DaysValueChangeRealtime": null, + "StockExchange": "NYQ", + "DividendYield": null, + "PercentChange": "+0.81%" + } + +---- + + +== Options + +The **$$yahooquotes$$** $$source$$ has the following options: + +//tag::configuration-properties[] +$$yahoo.quotes.symbols$$:: $$Comma delimited list of symbols$$ *($$String$$, default: `A list of 7925 symbols from NASDAQ and NYSE`)* +$$yahoo.quotes.fields$$:: $$Field selector to filter which fields should be returned$$ *($$String$$, default: `*` all fields)* +$$yahoo.quotes.batchSize$$:: $$How many symbols to fetch per call$$ *($$Integer$$, default: `400`)* +$$yahoo.quotes.cronExpression:: $$Cron expression to determine when to poll for quotes$$ *($$String$$, default: `0 * 9-17 * * MON-FRI` Only polls during exchange hours)* +$$yahoo.quotes.zone:: $$Timezone used for the cron expression$$ *($$String$$, default: `EST`)* +$$yahoo.quotes.throttle$$:: $$How many messages per second should the source emmit$$ *($$Integer$$, default: `null`, if set the source will throttle message output instead of sending a burst. Be mindful of the number of symbols and frequency when setting this in order to avoid blocking the output queue)* +//end::configuration-properties[] + +== Example : Query for Google and Apple stocks every 5 seconds fetching only the symbol, bid and ask price: + +[source,yaml] +---- +yahoo: + quotes: + symbol: GOOG,AAPL + fields: Symbol,Ask,Bid + cronExpression: 0/5 * * * * * + +---- + +//end::ref-doc[] +== Build + +``` +$ mvn clean package +``` + diff --git a/yahoo-quotes/spring-cloud-starter-stream-source-yahoo-quotes/pom.xml b/yahoo-quotes/spring-cloud-starter-stream-source-yahoo-quotes/pom.xml new file mode 100644 index 000000000..bf435237d --- /dev/null +++ b/yahoo-quotes/spring-cloud-starter-stream-source-yahoo-quotes/pom.xml @@ -0,0 +1,30 @@ + + + 4.0.0 + + spring-cloud-starter-stream-source-yahoo-quotes + jar + Yahoo YQL quotes source + + + spring-cloud-stream-yahoo-quotes-parent + org.springframework.cloud.stream.app + 1.0.3.BUILD-SNAPSHOT + + + + + + org.isomorphism + token-bucket + 1.6 + + + org.springframework.boot + spring-boot-starter-test + test + + + \ No newline at end of file diff --git a/yahoo-quotes/spring-cloud-starter-stream-source-yahoo-quotes/src/main/java/org/springframework/cloud/stream/app/yahoo/quotes/source/YahooQuotesClient.java b/yahoo-quotes/spring-cloud-starter-stream-source-yahoo-quotes/src/main/java/org/springframework/cloud/stream/app/yahoo/quotes/source/YahooQuotesClient.java new file mode 100644 index 000000000..b449d09d8 --- /dev/null +++ b/yahoo-quotes/spring-cloud-starter-stream-source-yahoo-quotes/src/main/java/org/springframework/cloud/stream/app/yahoo/quotes/source/YahooQuotesClient.java @@ -0,0 +1,28 @@ +/* + * Copyright 2016 original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.springframework.cloud.stream.app.yahoo.quotes.source; + +import java.util.List; +import java.util.Map; + +/** + * @author Vinicius Carvalho + */ +public interface YahooQuotesClient { + List> fetchQuotes(List symbols, String filter); +} diff --git a/yahoo-quotes/spring-cloud-starter-stream-source-yahoo-quotes/src/main/java/org/springframework/cloud/stream/app/yahoo/quotes/source/YahooQuotesClientImpl.java b/yahoo-quotes/spring-cloud-starter-stream-source-yahoo-quotes/src/main/java/org/springframework/cloud/stream/app/yahoo/quotes/source/YahooQuotesClientImpl.java new file mode 100644 index 000000000..94e7742a8 --- /dev/null +++ b/yahoo-quotes/spring-cloud-starter-stream-source-yahoo-quotes/src/main/java/org/springframework/cloud/stream/app/yahoo/quotes/source/YahooQuotesClientImpl.java @@ -0,0 +1,98 @@ +/* + * Copyright 2016 original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.springframework.cloud.stream.app.yahoo.quotes.source; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +import org.springframework.http.ResponseEntity; +import org.springframework.util.StringUtils; +import org.springframework.web.client.RestTemplate; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ObjectNode; + +/** + * @author Vinicius Carvalho + */ +public class YahooQuotesClientImpl implements YahooQuotesClient { + + private final String endpoint = "https://query.yahooapis.com/v1/public/yql?q={query}&format=json&env={env}&callback="; + + private final String queryTemplate = "select %s from yahoo.finance.quotes(%d) where symbol in (%s)"; + + private RestTemplate client; + + private ObjectMapper mapper = new ObjectMapper(); + + final DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX"); + + public YahooQuotesClientImpl(RestTemplate client) { + this.client = client; + } + + + + @Override + public List> fetchQuotes(List symbols, String filter) { + String fields = (StringUtils.isEmpty(filter)) ? "*" : filter; + String query = String.format(queryTemplate, fields, symbols.size(), + wouldbeSimplerWithLambdas(symbols)); + Map vars = new HashMap<>(); + vars.put("query", query); + vars.put("env", "store://datatables.org/alltableswithkeys"); + ResponseEntity response = client.getForEntity(endpoint, JsonNode.class, + vars); + return processResponse(response); + } + + private List> processResponse(ResponseEntity response) { + if (!response.getStatusCode().is2xxSuccessful()) + return Collections.emptyList(); + String timestamp = df.format(new Date()); + JsonNode node = response.getBody(); + JsonNode resultsNode = node.get("query").get("results").get("quote"); + List> results = new LinkedList<>(); + if (resultsNode.isArray()) { + for (JsonNode child : resultsNode) { + ((ObjectNode)child).put("timestamp",timestamp); + results.add(mapper.convertValue(child, Map.class)); + } + } + else { + ((ObjectNode)resultsNode).put("timestamp",timestamp); + results.add(mapper.convertValue(resultsNode, Map.class)); + } + return results; + } + + private String wouldbeSimplerWithLambdas(List symbols) { + for (int i = 0; i < symbols.size(); i++) { + if (!symbols.get(i).startsWith("'") && !symbols.get(i).startsWith("\\")) + symbols.set(i, StringUtils.quote(symbols.get(i))); + } + return StringUtils.collectionToCommaDelimitedString(symbols); + } +} diff --git a/yahoo-quotes/spring-cloud-starter-stream-source-yahoo-quotes/src/main/java/org/springframework/cloud/stream/app/yahoo/quotes/source/YahooQuotesSourceConfiguration.java b/yahoo-quotes/spring-cloud-starter-stream-source-yahoo-quotes/src/main/java/org/springframework/cloud/stream/app/yahoo/quotes/source/YahooQuotesSourceConfiguration.java new file mode 100644 index 000000000..675277e31 --- /dev/null +++ b/yahoo-quotes/spring-cloud-starter-stream-source-yahoo-quotes/src/main/java/org/springframework/cloud/stream/app/yahoo/quotes/source/YahooQuotesSourceConfiguration.java @@ -0,0 +1,68 @@ +/* + * Copyright 2016 original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.springframework.cloud.stream.app.yahoo.quotes.source; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.cloud.stream.annotation.EnableBinding; +import org.springframework.cloud.stream.app.yahoo.quotes.source.utils.LoggingErrorHandler; +import org.springframework.cloud.stream.messaging.Source; +import org.springframework.context.annotation.Bean; +import org.springframework.messaging.MessageChannel; +import org.springframework.web.client.RestTemplate; + +/** + * @author Vinicius Carvalho + */ +@EnableBinding(Source.class) +@EnableConfigurationProperties(YahooQuotesSourceProperties.class) +public class YahooQuotesSourceConfiguration { + + @Autowired + private YahooQuotesSourceProperties properties; + + @Autowired + @Qualifier(Source.OUTPUT) + private MessageChannel output; + + @Bean + public YahooQuotesSourceMessageProducer messageProducer(YahooQuotesClient client) + throws Exception { + YahooQuotesSourceMessageProducer producer = new YahooQuotesSourceMessageProducer( + client); + producer.setProperties(properties); + producer.setOutput(output); + return producer; + } + + @Bean + @ConditionalOnMissingBean + public YahooQuotesClientImpl quotesClient() throws Exception { + return new YahooQuotesClientImpl(template()); + } + + @Bean + public RestTemplate template() { + RestTemplate template = new RestTemplate(); + template.setErrorHandler(new LoggingErrorHandler()); + return template; + } + +} diff --git a/yahoo-quotes/spring-cloud-starter-stream-source-yahoo-quotes/src/main/java/org/springframework/cloud/stream/app/yahoo/quotes/source/YahooQuotesSourceMessageProducer.java b/yahoo-quotes/spring-cloud-starter-stream-source-yahoo-quotes/src/main/java/org/springframework/cloud/stream/app/yahoo/quotes/source/YahooQuotesSourceMessageProducer.java new file mode 100644 index 000000000..334d17e80 --- /dev/null +++ b/yahoo-quotes/spring-cloud-starter-stream-source-yahoo-quotes/src/main/java/org/springframework/cloud/stream/app/yahoo/quotes/source/YahooQuotesSourceMessageProducer.java @@ -0,0 +1,193 @@ +/* + * Copyright 2016 original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.springframework.cloud.stream.app.yahoo.quotes.source; + +import java.io.InputStreamReader; +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Scanner; +import java.util.Set; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +import org.isomorphism.util.TokenBucket; +import org.isomorphism.util.TokenBuckets; + +import org.springframework.cloud.stream.app.yahoo.quotes.source.utils.PartitionedList; +import org.springframework.context.Lifecycle; +import org.springframework.messaging.MessageChannel; +import org.springframework.messaging.support.MessageBuilder; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.util.StringUtils; + +/** + * @author Vinicius Carvalho + */ +public class YahooQuotesSourceMessageProducer implements Lifecycle { + + private YahooQuotesSourceProperties properties; + + private Lock lock = new ReentrantLock(); + + private volatile boolean running; + + private MessageChannel output; + + private ExecutorService pool; + + private BlockingQueue> dispatchQueue; + + private YahooQuotesClient client; + + private PartitionedList partitionedSymbols; + + private TokenBucket bucket; + + public YahooQuotesSourceMessageProducer(YahooQuotesClient client) { + this.client = client; + } + + @Override + public void start() { + try { + lock.lock(); + loadSymbols(); + this.dispatchQueue = new ArrayBlockingQueue<>(10000); + this.pool = Executors.newFixedThreadPool(3); + if (!StringUtils.isEmpty(properties.getThrottle())) { + this.bucket = TokenBuckets.builder() + .withCapacity(properties.getThrottle()) + .withFixedIntervalRefillStrategy(properties.getThrottle(), 1, + TimeUnit.SECONDS) + .build(); + } + pool.submit(new Runnable() { + @Override + public void run() { + try { + Map payload = null; + while ((payload = dispatchQueue.take()) != null) { + if (bucket != null) + bucket.consume(); + output.send(MessageBuilder.withPayload(payload).build()); + } + } + catch (InterruptedException e) { + e.printStackTrace(); + } + } + }); + } + finally { + lock.unlock(); + } + } + + @Scheduled(cron = "${yahoo.quotes.cronExpression:0 * 9-17 * * MON-FRI}", zone = "${yahoo.quotes.zone:EST}") + public void poll() { + for (List symbols : partitionedSymbols) { + pool.submit(new WebWorker(symbols)); + } + } + + private void loadSymbols() { + if (StringUtils.isEmpty(properties.getSymbols())) { + loadDefaultSymbols(); + } + else { + this.partitionedSymbols = new PartitionedList<>( + Arrays.asList(StringUtils + .commaDelimitedListToStringArray(properties.getSymbols())), + properties.getBatchSize()); + } + + } + + private void loadDefaultSymbols() { + Scanner scanner = new Scanner( + new InputStreamReader(YahooQuotesSourceMessageProducer.class + .getClassLoader().getResourceAsStream("symbols"))); + LinkedList symbols = new LinkedList<>(); + while (scanner.hasNext()) { + symbols.add(scanner.nextLine()); + } + scanner.close(); + this.partitionedSymbols = new PartitionedList<>(symbols, + properties.getBatchSize()); + } + + @Override + public void stop() { + try { + lock.lock(); + this.pool.shutdown(); + + } + finally { + lock.unlock(); + } + } + + private Set getSymbols() { + return StringUtils.commaDelimitedListToSet(properties.getSymbols()); + } + + @Override + public boolean isRunning() { + return running; + } + + public void setOutput(MessageChannel output) { + this.output = output; + } + + public void setProperties(YahooQuotesSourceProperties properties) { + this.properties = properties; + } + + public class WebWorker implements Runnable { + + private List symbols; + + public WebWorker(List symbols) { + this.symbols = symbols; + } + + @Override + public void run() { + List> results = client.fetchQuotes(symbols, + properties.getFields()); + for (Map r : results) { + try { + dispatchQueue.put(r); + } + catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + } + +} diff --git a/yahoo-quotes/spring-cloud-starter-stream-source-yahoo-quotes/src/main/java/org/springframework/cloud/stream/app/yahoo/quotes/source/YahooQuotesSourceProperties.java b/yahoo-quotes/spring-cloud-starter-stream-source-yahoo-quotes/src/main/java/org/springframework/cloud/stream/app/yahoo/quotes/source/YahooQuotesSourceProperties.java new file mode 100644 index 000000000..6574d2446 --- /dev/null +++ b/yahoo-quotes/spring-cloud-starter-stream-source-yahoo-quotes/src/main/java/org/springframework/cloud/stream/app/yahoo/quotes/source/YahooQuotesSourceProperties.java @@ -0,0 +1,82 @@ +/* + * Copyright 2016 original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.springframework.cloud.stream.app.yahoo.quotes.source; + +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * @author Vinicius Carvalho + */ +@ConfigurationProperties("yahoo.quotes") +public class YahooQuotesSourceProperties { + + private String symbols; + private String fields; + private Integer batchSize = 400; + private String cronExpression = "0 * 9-17 * * MON-FRI"; + private String zone = "EST"; + private Integer throttle; + + public Integer getThrottle() { + return throttle; + } + + public void setThrottle(Integer throttle) { + this.throttle = throttle; + } + + public String getCronExpression() { + return cronExpression; + } + + public void setCronExpression(String cronExpression) { + this.cronExpression = cronExpression; + } + + public String getZone() { + return zone; + } + + public void setZone(String zone) { + this.zone = zone; + } + + public String getSymbols() { + return symbols; + } + + public void setSymbols(String symbols) { + this.symbols = symbols; + } + + public String getFields() { + return fields; + } + + public void setFields(String fields) { + this.fields = fields; + } + + public Integer getBatchSize() { + return batchSize; + } + + public void setBatchSize(Integer batchSize) { + this.batchSize = batchSize; + } + +} diff --git a/yahoo-quotes/spring-cloud-starter-stream-source-yahoo-quotes/src/main/java/org/springframework/cloud/stream/app/yahoo/quotes/source/utils/LoggingErrorHandler.java b/yahoo-quotes/spring-cloud-starter-stream-source-yahoo-quotes/src/main/java/org/springframework/cloud/stream/app/yahoo/quotes/source/utils/LoggingErrorHandler.java new file mode 100644 index 000000000..dee4a28c8 --- /dev/null +++ b/yahoo-quotes/spring-cloud-starter-stream-source-yahoo-quotes/src/main/java/org/springframework/cloud/stream/app/yahoo/quotes/source/utils/LoggingErrorHandler.java @@ -0,0 +1,48 @@ +/* + * Copyright 2016 original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.springframework.cloud.stream.app.yahoo.quotes.source.utils; + +import java.io.IOException; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.springframework.http.client.ClientHttpResponse; +import org.springframework.web.client.ResponseErrorHandler; + +/** + * @author Vinicius Carvalho + */ +public class LoggingErrorHandler implements ResponseErrorHandler { + + private Logger logger = LoggerFactory.getLogger(LoggingErrorHandler.class); + + @Override + public boolean hasError(ClientHttpResponse clientHttpResponse) throws IOException { + if (!clientHttpResponse.getStatusCode().is2xxSuccessful()) { + logger.error("Server replied with an error {}", + clientHttpResponse.getRawStatusCode()); + } + return false; + } + + @Override + public void handleError(ClientHttpResponse clientHttpResponse) throws IOException { + + } +} diff --git a/yahoo-quotes/spring-cloud-starter-stream-source-yahoo-quotes/src/main/java/org/springframework/cloud/stream/app/yahoo/quotes/source/utils/PartitionedList.java b/yahoo-quotes/spring-cloud-starter-stream-source-yahoo-quotes/src/main/java/org/springframework/cloud/stream/app/yahoo/quotes/source/utils/PartitionedList.java new file mode 100644 index 000000000..4984e2f12 --- /dev/null +++ b/yahoo-quotes/spring-cloud-starter-stream-source-yahoo-quotes/src/main/java/org/springframework/cloud/stream/app/yahoo/quotes/source/utils/PartitionedList.java @@ -0,0 +1,67 @@ +/* + * Copyright 2016 original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.springframework.cloud.stream.app.yahoo.quotes.source.utils; + +import java.util.AbstractList; +import java.util.List; + +/** + * @author Vinicius Carvalho Taken from + * http://svn.apache.org/viewvc/commons/proper/collections/trunk/src/main/java/org/apache/ + * commons/collections4/ListUtils.java + */ +public class PartitionedList extends AbstractList> { + + final List list; + private final int size; + + public PartitionedList(List list, int size) { + if (list == null) { + throw new NullPointerException("List must not be null"); + } + if (size <= 0) { + throw new IllegalArgumentException("Size must be greater than 0"); + } + this.list = list; + this.size = size; + } + + @Override + public List get(int index) { + final int listSize = size(); + if (listSize < 0) { + throw new IllegalArgumentException("negative size: " + listSize); + } + if (index < 0) { + throw new IndexOutOfBoundsException( + "Index " + index + " must not be negative"); + } + if (index >= listSize) { + throw new IndexOutOfBoundsException( + "Index " + index + " must be less than size " + listSize); + } + final int start = index * size; + final int end = Math.min(start + size, list.size()); + return list.subList(start, end); + } + + @Override + public int size() { + return (list.size() + size - 1) / size; + } +} diff --git a/yahoo-quotes/spring-cloud-starter-stream-source-yahoo-quotes/src/main/resources/META-INF/spring-configuration-metadata-whitelist.properties b/yahoo-quotes/spring-cloud-starter-stream-source-yahoo-quotes/src/main/resources/META-INF/spring-configuration-metadata-whitelist.properties new file mode 100644 index 000000000..223dd3cd8 --- /dev/null +++ b/yahoo-quotes/spring-cloud-starter-stream-source-yahoo-quotes/src/main/resources/META-INF/spring-configuration-metadata-whitelist.properties @@ -0,0 +1,2 @@ +configuration-properties.classes=org.springframework.cloud.stream.app.yahoo.quotes.source.YahooQuotesSourceConfiguration + diff --git a/yahoo-quotes/spring-cloud-starter-stream-source-yahoo-quotes/src/main/resources/META-INF/spring.provides b/yahoo-quotes/spring-cloud-starter-stream-source-yahoo-quotes/src/main/resources/META-INF/spring.provides new file mode 100644 index 000000000..6c5f06f29 --- /dev/null +++ b/yahoo-quotes/spring-cloud-starter-stream-source-yahoo-quotes/src/main/resources/META-INF/spring.provides @@ -0,0 +1 @@ +provides: spring-cloud-starter-stream-source-yahoo-quotes diff --git a/yahoo-quotes/spring-cloud-starter-stream-source-yahoo-quotes/src/main/resources/application.properties b/yahoo-quotes/spring-cloud-starter-stream-source-yahoo-quotes/src/main/resources/application.properties new file mode 100644 index 000000000..b7ab6818e --- /dev/null +++ b/yahoo-quotes/spring-cloud-starter-stream-source-yahoo-quotes/src/main/resources/application.properties @@ -0,0 +1,3 @@ +yahoo.quotes.cron-expression="0 * 9-17 * * MON-FRI" +yahoo.quotes.batch-size=400 +yahoo.quotes.zone=EST diff --git a/yahoo-quotes/spring-cloud-starter-stream-source-yahoo-quotes/src/main/resources/symbols b/yahoo-quotes/spring-cloud-starter-stream-source-yahoo-quotes/src/main/resources/symbols new file mode 100644 index 000000000..7473c7105 --- /dev/null +++ b/yahoo-quotes/spring-cloud-starter-stream-source-yahoo-quotes/src/main/resources/symbols @@ -0,0 +1,7925 @@ +CVCO +SCQ +BBC +SCS +BBD +STPP +BBG +BBF +BBH +SCON +SCX +BBK +SCZ +JIVE +NEAR +STPZ +BBL +BBN +BBP +SDD +NVCR +BBU +SCOR +BBT +BBW +NVCN +BBY +BBX +FNLC +SDP +SDR +STOT +SCNB +SDT +BCC +SDS +STOR +BCE +BCH +STON +SDY +BSAC +FNJN +BCM +SEA +BCO +BCR +KLXI +SEB +SEE +BCS +BCV +SEF +CVCY +BCX +HCOM +SEM +SEP +BDC +A +BDE +NVEC +B +CVEO +BDD +C +STRT +BDG +D +SEV +STRS +E +F +G +H +MSBI +BDJ +I +BDL +K +NVEE +L +BDN +M +MSBF +HCRF +N +O +P +CECO +YECO +BDR +Q +R +NVET +S +SFE +T +V +BDX +W +SFL +X +Y +Z +SFN +CECE +SFM +OHGI +SFR +NVDA +BSCP +SFS +BSCO +BSCN +BSCM +SCPB +BSCL +BSCK +TWTR +BSCJ +BEL +BSCI +BSCH +BEN +BSCG +TFSL +BEP +SGA +SGC +SGB +DELTW +NVDQ +VLGEA +SGG +SGF +SGI +STRA +SGM +STRP +STRM +STRL +BSBR +PVCT.W +SGU +SGY +APAM +SCSC +BFK +DHIL +BBBY +HTUS +CVGI +BFO +NVGN +ARTNA +BFS +MSDI +BFR +NVGS +SHE +NEFF +SHG +BFY +SHI +SCSS +BFZ +SHM +SHO +BGB +BGC +MSCA +SHV +BGE +MSCC +BGH +BGG +SHW +BGI +SHY +MSCI +BGR +HCSG +BGT +BGS +SID +SIG +SIF +BGX +BBCN +BGY +SIJ +SIM +CEFL +SIL +CVGW +GQRE +SIR +BHB +BHE +NVFY +BSFT +BHI +MSFG +SIX +BHK +HTWR +SIZ +BHL +STWD +SJB +BHP +LPCN +MSFT +NVIV +BHV +SJI +BBDO +SJM +BIB +SJR +BID +SJT +BIF +BSET +BIG +SJW +MBCN +BIL +BIK +APDN +BIP +BIO +BIT +BIS +SCTO +BIV +SKF +SCTY +SKM +DYLS +MSEX +SKT +SKY +SKX +BJK +FNSR +VMAX +SLB +SLF +APEI +KTOVW +SLG +BJZ +SLM +FNTC +SLP +SCWX +QNST +BKD +ZYNE +BKF +SLV +BKE +BKH +SLX +SLW +SCVL +BKJ +WPCS +SLY +BKK +CVLT +BKN +MSGN +SMB +BKT +DYNC +BKS +SMG +BKU +SMI +APFH +SMH +SMK +PKOH +SMM +SMN +SMP +BLE +DYNT +SMT +STXS +BLD +MBFI +BBGI +BLH +NVMI +BLK +BLJ +CELG +BLL +SNA +SCYX +SNC +BSJN +BSJM +SNE +SNH +BLW +BSJL +BLV +BSJK +SBLKL +BSJJ +SNI +ZHNE +BLX +BSJI +BSJH +MBII +BSJG +SNN +VLY.W +SNP +SNR +BMA +C.A +SNV +BME +SNX +CVLY +BMI +SNY +VMBS +BML +CEMI +BMO +CEMB +BMS +NVLS +BMY +SOL +SON +SOP +APHB +SOR +BND +CELP +SOV +KMDA +BNK +BNJ +BNO +SPB +SPA +BNS +MSLI +SPE +SPH +SPG +BNY +SPI +DYSL +SPN +SPP +SPR +APIC +SPU +BOE +CEMP +BOH +BOI +SPY +DHRM +BOM +BSMX +BOS +SQI +BOX +SQM +FNWB +CENX +CENT +VMEM +YELP +BPI +XBIT +BPK +BPL +MBLX +SRC +MBLY +SRF +BPT +SRE +SRG +BPY +SRI +SRT +SRS +SRV +BQH +LPLA +NEPT +GFNSL +SSB +SSD +SSG +SSI +SSH +NEOG +CVRS +CVRR +XSLV +APLP +SSL +SSO +SSN +SSP +NEON +OHRP +BRC +SSS +SST +APLE +BRG +SSW +BRF +NEOT +SSY +XBKS +BRO +NEOS +BRN +STB +CERN +BRS +STC +BRT +STE +STJ +BRX +STI +CERE +NGHCZ +STL +STK +CERC +STN +STM +STO +STR +BSPM +NVTA +BSD +STT +HDAW +STS +BSF +STV +BSE +STX +STZ +ZNWAA +BSL +BSM +CEQP +NERV +MSON +NVRO +SUB +BST +BSV +BSX +SUI +SUM +BSQR +SUN +BTA +HUBB +SUP +HUBG +NGHCP +BTE +BTG +VMIN +BBOX +NGHCN +BTI +CVTI +NGHCO +XSOE +CERU +CERS +BTO +HUBS +BTN +SVA +BTT +BTX +BTZ +NETE +BSRR +CETC +BUD +SVT +APOL +SVU +GRBK +BUI +APOG +DHXM +BUR +SWC +NVTR +IGEM +DHVW +SWH +APPY +BUZ +SWK +SWJ +SWM +LPNT +BBRG +SWN +APPS +BVA +BBRC +WHFBL +SWX +GRAM +SWZ +CETX +APPF +CETV +TGEN +BVN +SXC +MSTR +SXE +MBSD +BVX +SXI +SXL +BBSI +BWA +MSTX +SXT +HDEZ +CEVA +BWG +BBRY +BWP +BSTG +SYE +BSTC +IGIH +SDEM +BWV +SYG +SYF +BWX +BWZ +SYK +SYN +BXC +MBRG +BXE +SYT +SYV +SYY +SYX +MICTW +APRI +GABC +BXP +BXS +HDEF +HDEE +SZC +MBRX +IGHG +SZK +KMPR +SZO +GCVRZ +RADA +BYD +MBUU +BYM +GRFS +LPTH +LPTN +MBTF +NEWM +BZF +LPSB +NEWT +APTS +GREK +KMPA +BZH +WPRT +APTO +BBVA +BZM +NEWR +NEWS +BSWN +RACE +BZQ +GRES +KMPH +HDGE +LPSN +MBWM +PLAY +PLBC +SDIV +TGLS +APWC +IGLD +MBVT +PLAB +TXMD +RRGB +TGNA +PLCM +FOGO +GAIA +DIAX +GAIN +TACOW +GRID +GRIF +LGCYO +LGCYP +CERCW +CERCZ +TAC +PLCE +CPAAU +SUNS +TAN +TAP +EVGBC +TAO +TAT +TAX +SUNW +FOIL +HDNG +GGACR +TBF +GGACU +TBI +GGACW +TBK +TXRH +SUMR +CAA +HDLS +CAC +ELEC +CAB +CAE +IGOV +HDLV +TBT +CAG +CAF +CWBC +CAI +CAH +TBX +CAJ +TBZ +CAL +JJSF +TCB +CWAY +SDLP +RAIL +CAS +CAR +CAT +CAW +WPXP +TCI +TCK +RRMS +TCP +TCO +CBB +GALT +CBA +CBD +TCS +CBF +SUPN +TCX +CBG +USATP +CBI +CBL +CBK +CBM +SDOG +SUPV +RALS +TDA +CBO +CBR +TDC +CBT +TDE +CBS +TDG +CBU +TDF +CBX +TDI +CBZ +TDJ +HURC +GAMR +SDOW +CCA +BTAL +CCC +TDS +CCE +CCD +TDW +CCF +CCI +TDY +CCK +CCJ +CCM +GRMN +CCL +CCO +CCP +GALE +NWBO +CCS +CFBK +NWBI +CCU +TEF +CCV +ELGX +RNVAW +CCX +IGRO +TEI +TEL +RNVAZ +CCZ +TEN +TEP +CWCO +TEO +TER +CDC +RAND +CDE +TEX +CWEI +GRPN +CDI +CDL +HDRA +CDK +MTBC +CFCO +TGTX +CDR +TFG +FOMX +TFI +CDW +CFCB +CEA +FOLD +CEB +CEE +NFBK +CEF +TFX +CEM +HURN +CEL +CEO +SDPI +CEN +TGB +IXUS +TGA +TGD +TGC +GROW +CET +CEW +TGH +CEV +TGI +CEZ +HUSA +BNTCW +TGP +HUSE +VALE.P +CFA +CFD +TGT +CFC +TGS +ELLI +CFG +CFI +ELLO +CFO +CFR +THC +BCBP +MTDR +THD +THG +CFX +OIIL +THM +THO +OIIM +CGA +THQ +ELMD +THS +THR +HDRW +KODK.W +FONE +CGG +THW +CGI +MTCH +CGO +NWFL +FONR +SDRL +TIF +ELKU +NFEC +CGW +MCBC +CFFN +HDSN +TIL +TIK +CFFI +TIP +CHA +CHD +PLKI +TIS +CHE +CHH +ELNK +RARE +CHI +CHL +CHK +CHN +CHT +CHS +CHU +GASL +CHW +CHY +PLND +GRUB +RRTS +FORD +CIA +GASS +TMUSP +CIB +CFGE +CIE +GASX +CID +CIG +GRSH +CIF +CII +TJX +CIK +CIM +CIL +CIO +NWHM +IXYS +CIR +GARD +TKC +CIU +TKF +CIT +CIX +CIZ +GARS +BCEI +TKR +MTEX +MCFT +PLOW +FOSL +OILX +OILU +RATE +PLPC +BIOA.W +GRVY +TLF +TLI +TLH +TLK +TLO +TLN +TLP +PLPM +TLT +MTGE +CKH +FORK +FORM +MCEP +ELON +PLNT +FORR +LQDH +ELOS +TMF +TMH +CKX +HDWM +TMK +LQDT +TMP +OILD +TMO +CLB +ECACR +CLA +CLD +XCEM +CLC +CLF +HDWX +TMV +ECACU +CLH +GATX +RAVN +CLI +MCHX +SDYL +RAVI +CLM +TNA +CLR +TNC +KNDI +CLS +CLX +CLW +TNH +TNK +CLY +CMA +TNP +CMC +ELSE +CME +CMD +CMG +VNDA +CMF +CMI +NWLI +GRWN +CMO +LVNTB +CMN +LVNTA +CMP +CMS +CMU +TOF +CMT +TOL +TOK +VNCE +MCHI +TOO +CNA +ELRC +RAVE +TOT +CNC +DIOD +MCHP +CNI +OZRK +CNK +CNP +CNO +CNR +TPC +CNQ +TPB +CFNB +CNS +CNV +MTLS +MTBCP +CNX +TPH +VNET +CNY +TPL +FOXA +CFMS +FOXF +TPS +COB +COE +TRTLU +COG +XTLB +COF +COH +TPX +TPZ +NFLX +BCLI +COL +COO +ZION +NFLT +COP +TRTLW +COR +LBTYA +LBTYB +COT +COW +PLSE +CPB +CPA +CPF +CPE +ZIOP +CPG +CPI +CFNL +ELTK +LBTYK +CPL +CPK +CPN +TRC +CPT +CPS +TRI +TRK +HDRAR +TRN +TRQ +TRP +TRS +TRR +TRU +TRT +TRV +HDRAW +CQH +TRX +HDRAU +XTLY +CQP +TSC +DIRT +TSE +BHACR +PLUG +TSI +BHACW +TSL +BHACU +TSN +TSM +TSO +TYBS +TSQ +TST +NWPX +CRC +TSS +CRF +TSU +CRH +DISH +CRI +CRL +CRK +PLUS +CRM +BCOM +IHDG +CRR +TTC +NFRA +CRT +CRS +TTF +AQMS +TTI +CWST +CRY +TTM +SVBI +HEAR +CSA +DIVA +TTP +PLXS +SEAC +TTS +CSC +DIVC +CSB +CSD +TTT +CSF +CSI +DIVI +CSH +CSJ +CSM +CSL +CSQ +CSS +CSU +CST +CSV +CSX +BCPC +XTNT +MTOR +TUP +CTB +TUR +NWSA +CTF +CFRX +BCOV +CTG +TUZ +CTL +BCOR +CTO +CTR +TVC +CTQ +CTT +TVE +CTS +CTV +CTU +CTX +CTW +MTRN +CTZ +HECO +MTRX +CTY +GSBC +GSBD +CUB +MTSC +THFF +CUI +CUK +MTSI +CUO +GBAB +XCOM +CUR +SEAS +CUT +TWI +BCRH +DIVY +CUZ +TWN +TWM +TWO +CVB +CVA +JKHY +CVE +TWX +CVG +CVI +CVM +CVO +CVR +GSAT +CVT +CVS +CVV +CVU +CVX +HEEM +CVY +HEES +ZIXI +TXN +RSCO +CWB +TXT +CWI +SEED +BCRX +HEFA +MTUM +TYD +TYC +CWT +MCRB +HEDJ +TYG +MTSL +TYL +MCRI +THGA +TYO +CXA +CXE +CXH +SEDG +XCRA +MCRN +MCRO +CXP +TZA +CXO +CXW +IYLD +CYB +CYD +CYH +MCUR +CYS +ABEOW +GBCI +THHY +QPAC +KNOP +KNOW +CZA +HEFV +CZR +GBDC +RBCN +GSEU +VNOM +CZZ +LEN.B +EMBB +SEIC +THLD +EMBH +VNRX +PMBC +EMAG +ZJZZT +EMAN +VNQI +VNTV +HELE +EMDV +GSJY +TYPE +GBIM +EMCB +EMCD +GSIE +EMCF +EMCG +TYNS +EMCI +TI.A +AUMAW +AQXP +AUMAU +GSIT +EMCR +UAE +UAG +IRDMB +UAM +UAL +GSLC +UAN +HEMV +SEMI +SEMG +DJCI +EMFM +DJCO +UBA +EMFT +UBC +UBG +UBN +UBM +UBP +UBR +UBT +DAC +UBS +SELF +DAG +SELB +DAL +DAN +DAR +UCC +EMES +UCD +DAX +UCI +UCO +DBA +UCP +DBC +DBB +DBE +DBD +THRM +THRK +DBL +DBO +DBP +DBS +UDF +DBU +DBV +EMHY +EMHZ +UDN +VKTXW +UDR +DCA +EMGF +HBM.W +CXDC +DCI +DCM +DCO +SENS +UEC +DCT +HVPW +GBLI +HEOP +DDC +DDE +DDD +DDG +DDF +DDM +NXEO +DDP +DDS +DDR +DDT +UFI +DEA +UFS +DEF +EMIF +DEE +DEG +EMIH +GSOL +DEI +DEL +JCTCF +DEM +UGA +DEO +THST +UGE +DES +GFNCP +DEX +UGI +DEW +GBNK +UGL +OXBRW +UGP +DFE +DFJ +LRAD +EMLP +DFP +DFS +MDCA +CGEN +DFT +UHN +AA +UHT +AB +UHS +AC +WYIGW +AE +AF +WYIGU +AG +BDCZ +DGI +RSPP +AI +DGL +AL +AM +DGP +AN +BDCS +EMKR +AP +DGT +SERV +AR +DGS +AT +AU +BDCL +DGX +AV +DGZ +ARAY +EMLB +UIS +BA +EMLC +STRZB +STRZA +BC +DHG +ARCO +DHF +DHI +BG +BH +ARCI +BK +BUFF +UJB +ARCB +BP +DHS +ARCC +DHR +NGHC +RSTI +BR +AAAP +DHT +BT +BV +DHY +LABD +BW +DHX +BX +GBSN +LRCX +LABL +DIA +CA +CB +CC +CE +CF +DIG +ARDM +CG +CH +CI +MDCO +DIN +CL +DIM +CM +CN +CO +CP +EMMS +ARDC +DIT +CR +DIS +CS +DIV +CW +CX +CY +SVVC +ARCX +HEUS +ARCW +DB +DJD +HEUV +DD +ARES +DE +DF +DG +SVXY +DI +DK +DL +DM +DJP +DO +CGIX +DQ +ULE +ULH +DV +DW +DX +DY +LRET +WREI +MDGN +ARDX +EA +EC +ED +EE +HEVY +WABC +DKL +EJ +LABS +EL +HEWC +UMC +EP +LABU +DKT +HEWG +DKS +ES +HEWI +AADR +FPRX +EV +HEWJ +UMH +EW +HEWL +HEWP +GSVC +DLA +AREX +HEWU +DLB +FB +HEWW +FC +HEWY +BDGE +FE +ARGT +FF +UMX +FH +ARGS +FI +FL +LRGF +DLN +FM +UNB +FN +KODK +DLS +DLR +FR +UNF +FT +UNH +UNG +FV +DLX +UNL +RSXJ +UNM +EMSA +UNP +DMB +EMSD +HEZU +DMD +UNT +DMF +EMSH +GD +GE +GF +GG +LADR +GI +GK +GM +MDGS +DMO +EMQQ +GS +GT +GV +UOP +HA +DNB +EMRE +HD +HE +DNI +HF +EMTL +HH +WAGE +HI +DNL +HK +DNO +HL +ARIS +DNN +DNP +HP +DNR +HR +HT +ARII +HW +HY +ARIA +DOD +PMTS +DOC +UPS +FPXI +UPV +DOG +IF +UPW +MDIV +WAFD +DOL +DON +IL +EMSO +IM +NGLS +DOO +IO +IP +IR +DOV +IT +DOX +DOW +IX +UQM +CGNX +CGNT +ULBI +JD +DPG +JE +RSYS +DPK +DPM +MDLY +MDLZ +ARKW +JO +URA +ARKR +BUNT +DPS +JP +MUNI +ARKQ +URE +DPW +URG +URI +BUNL +ARKK +DPZ +ARKG +URR +KB +KE +KF +WAIR +ARLZ +USA +KN +CXRX +KO +USB +NXPI +PPHMP +KR +USD +KS +USG +KT +ARLP +KW +USM +KZ +USL +USO +DRA +DRE +LB +DRD +LC +UST +LD +LE +USV +DRI +DRH +LH +LL +DRN +LM +DRQ +LN +DRR +LQ +UTF +DRW +EMXX +DRV +UTG +GLADO +UTI +HCACW +UTL +HWCC +HCACU +NXST +HRMNW +ARMK +ARMH +MA +MB +MC +HRMNU +DSE +MD +WALA +CXSE +UTX +MG +DSI +MH +DSL +HFBC +LALT +NXTD +DSM +MN +MO +MP +DST +HWAY +DSS +AAME +MS +DSU +MT +MU +AAMC +DSX +NXRT +DSW +MX +LAKE +IZEA +UUP +TICC +DTE +UUU +DTD +NC +DTF +NE +DTH +NG +ARNA +HWBK +NH +DTK +WRLD +DTJ +NI +NK +DTO +NL +DTN +NM +DTQ +SFBS +NP +NQ +NR +NS +TIER +UVE +AROW +LAND +LANC +NW +NX +DTZ +BURL +MUSA +OA +DUC +OB +OC +UVV +DUG +OI +AROC +DUK +ON +AAON +YGRO +OR +AAOI +NXTM +HFBL +UWM +GTAA +UWN +DVA +SFBC +PB +DVD +PE +PF +PG +PH +LAMR +BUSE +PL +DVN +PM +PN +DVP +KOLD +PQ +AAPL +NGVC +DVY +UXJ +BDSI +PW +UXI +PX +PY +AAPC +DWA +ARQL +HFEZ +NGVT +SWFT +MDSO +VONE +MDSY +VONG +DWM +UYG +DWX +PNC.W +ARRY +UYM +GCAP +ARRS +DXB +DXD +RE +KONA +DXI +RF +RH +DXJ +KONE +MDRX +RL +RM +GCBC +UZB +UZA +RP +DXR +UZC +KOPN +RS +RT +RTEC +RY +VOOV +LARE +DYB +LARK +SA +SB +SC +SE +SF +SH +DYN +SM +SN +SO +SP +SQ +SR +ST +KOOL +SU +DYY +IIIN +VONV +ARTW +ARTX +TA +TD +TG +DZK +TI +TK +SWHC +TM +VOOG +IIJI +TR +TS +MDWD +TU +SFHY +TV +KORU +TX +DZZ +TY +KORS +LILAK +TILE +UA +HWKN +UE +UG +ENBL +SFIG +UL +UN +TILT +ICLDW +ARWA +SWIR +MDVN +VA +VB +VC +VG +WASH +IILG +VO +VR +MDVX +VT +VV +TZOO +MDYG +VZ +WB +WD +WF +MDYV +WG +ARWR +WK +ENDP +WM +RTIX +WR +WU +MDXG +PNBK +WATT +WY +KOSS +TIME +SWKS +GTIM +QQEW +XL +GTIP +VAC +XT +VAL +CYAD +ENFC +SFLY +VAR +AAXJ +VAW +RTLA +GTLS +ENFR +TIPZ +TIPX +VBF +AAWW +TIPT +VBK +ULST +YY +EAA +CYBE +EAC +WPPGY +TINY +EAB +VBR +EAE +ZB +EAD +ZF +ZG +SFLA +LAWS +HCAPL +ZN +RCII +VCF +BANFP +EAT +CYAN +SWNC +ZX +VCO +VCR +CHAU +EBF +VCV +CYCC +NYCB +VOXX +VDC +VDE +CHAD +EBS +CYBR +ECA +ULTA +ECC +LAYN +ECF +ULTI +ECH +PNFP +SFNC +ECL +ULTR +VEA +ECR +VEC +WAYN +ECT +RCKY +VER +EDD +VET +EDC +EDF +EDE +VEU +TITN +CHCT +EDI +SBNYW +CHCO +EDN +EDR +VFC +CHCI +EDV +EDU +VFH +EDZ +VFL +EEA +ENIA +EEB +ENIC +TISA +BEAV +EEI +BEAT +EEH +VOYA +EEM +TISI +CHDN +EEQ +EEP +EES +EET +EEV +VGI +BOFIL +VGK +VGM +RCMT +ENLC +VGR +EFA +VGT +EFC +EFF +EFG +ENLK +JPM.W +VGZ +TIVO +EFM +CHEP +EFO +EFR +VHC +SFST +EFT +CHEK +EFV +EFU +EFX +VHI +EFZ +BEBE +CHEF +VHT +EGF +EGI +EGL +ASBB +EGO +MVCB +EGN +MEAR +VIA +EGP +BECN +IIVI +CHFN +EGT +VIG +RCON +EGY +VII +VIP +CHFC +VIS +VIV +LSCC +ABAX +EHI +WSBF +SFUN +OIBR.C +EHT +QQQE +QQQC +CHGG +WBAI +EIA +ABAC +ENOC +EIG +EIM +EIO +ABBV +EIP +RTRX +EIS +LSBG +LSBK +WSFSL +EIV +WSBC +EIX +VKI +LBAI +VKQ +ENPH +ASEI +HFXE +CHIX +HFXI +ASEA +HFXJ +CHIQ +ABCO +CHIM +LBDC +VLO +CHII +VLP +ABCD +ABCB +CHIE +VLU +VLT +CHKE +PNNT +QQQX +VLY +MEET +RTTR +HFWA +WSCI +ASFI +ENOR +VMC +VMI +VMM +VMO +ELB +ELA +ELD +ABDC +ASET +WSFS +ENRJ +VMW +ELJ +MDVXW +XVIX +ASGN +PNRA +ELP +ABEV +ELS +ELU +NYMX +CHKR +ELY +VNM +ABEO +CHKP +NHLD +NYMT +PNRG +VNO +VNQ +EMC +MEIP +VNR +EMB +EME +ENSG +EMD +EMG +EMF +CHMG +EMI +ASHR +ASHS +EMJ +EML +GTWN +CHMA +EMO +EMN +NYLD +CYNO +VOD +EMR +VOC +VOE +PNQI +EMZ +FCNCA +CYNA +MVIS +VOO +ENB +VOT +ENH +VOX +ENG +GTXI +ENJ +ENTL +CYOU +ENO +ENR +ENT +ENS +ENV +VPG +ENX +PNTA +ENZ +ENY +CHMT +VPL +PNTR +VPU +EOD +ASHX +EOG +VPV +CHMI +EOI +JMBA +CHOC +EOS +EOT +ENSV +AGFSW +NYNY +CHNR +ENTA +EPD +VQT +EPC +UMBF +EPE +ENTG +EPI +WBIF +WBIG +WBIH +EPM +WBII +VRA +EPP +JMEI +LBIX +YHOO +EPR +WBIL +BF.B +BF.A +EPS +XELB +EPV +EPU +WBIA +WBIB +WBIC +OKSB +WBID +WBIE +VRP +EQC +ABIO +ABIL +VRX +MEMP +EQM +EQL +CYRX +EQS +EQR +EQT +VSH +EQY +CYRN +VSI +MELI +ENVA +ERB +VSR +ERA +ERC +VSS +ERF +MELR +QQXT +BEMO +ERH +ERJ +ERI +LBIO +UMDD +ERN +VTA +ERO +ERS +ERX +VTI +WBKC +XENE +ERY +ASML +VTL +LSXMB +VTN +LSXMA +MEOH +VTR +ESE +ESD +ESG +ASMB +LSXMK +VTV +XENT +ESI +ESL +ESP +ESS +CYTX +ABMD +BTX.W +ESV +NYRT +VUG +CYTR +QPACW +QPACU +CYTK +ETB +CHRW +ASND +ETE +ETH +CHRS +ETG +MENT +ETJ +ASNA +ETN +ETM +ETP +ETO +ETR +VVC +ETV +ENZY +LMFAW +ETX +VVI +ETW +WBMD +ETY +NHTC +LBND +VVR +EUM +CHSP +EUO +SGAR +NYMTO +NYMTP +ASPS +ASPN +VWO +BVSN +VWR +EVA +EVC +EVF +SXCP +EVH +EVG +EVJ +EVI +ENZL +EVK +SGBK +CHTR +EVN +EVM +EVP +EVO +EVR +EVT +EVV +VXF +EVX +MESG +EVY +EWA +HGEU +MESO +EWC +EWD +EWG +BERY +CHUY +EWI +EWH +FRAK +VXX +FRAN +EWK +EWJ +VXZ +EWM +SGEN +EWL +EWO +EWN +EWQ +EWP +EWS +EWU +EWT +EWW +EWV +EWY +EWX +ASRV +EWZ +VYM +RUBI +MERC +EXA +EXD +EXC +EXG +EXI +EXK +SGDM +EXP +SGDJ +VZA +EXR +EXT +ABRN +FAAR +GDDY +LSTK +BETR +JMLP +FRBA +EZA +FRBK +EZJ +EZM +RDCM +EZR +ASTE +EZT +ASTC +EZU +EZY +ABTL +FRED +BVXV +ASUR +FREL +JMPC +JMPB +ABUS +WSTC +LSTR +GDEN +WSTG +QABA +ABTX +WSTL +RDEN +ROIAK +FRGI +RDHL +PODD +HGJP +GUID +QADA +EOCA +EOCC +LSVX +QADB +WAC +KPTI +WAB +IJNK +UMPQ +OLBK +WAL +GDJS +GULF +WAT +SGMA +SGMO +ASYS +WBB +WBA +WBC +SGMS +NUROW +WBK +FAB +FAD +FAC +WBS +FAF +RDIB +DLBL +FAN +FAM +WCC +DLBS +FAS +RDIV +QRHC +FAV +WCG +FAX +GDJJ +FAZ +WCN +FBC +FBG +SGOC +GUNR +FBP +WDC +FBR +SGOL +OLED +FBT +MOG.A +MOG.B +FBZ +FCB +WDR +FCA +FCF +CIBR +HOTRW +FCH +FCG +FCN +WEA +FCO +SGNL +WEC +WEB +FCT +FCS +FCX +SGNT +ARWAU +WEN +FDC +WES +FRME +ARWAW +NICK +FDD +WEX +ARWAR +FDM +FDL +FDN +FALC +FDP +WFD +FDS +WFC +FDT +WFE +FDX +FALN +RDNT +WFM +OLEM +WFT +CZFC +FEI +FEN +FEM +BFAM +CIDM +FEP +WGA +FEO +FET +FES +FEU +FEX +NICE +FEZ +WGL +WGO +GURE +FFA +WGP +FFC +GURI +ATAI +FFG +CIEN +GURU +FFR +FANG +WHF +WHG +MFCB +FGB +WHR +BWEN +FGD +DLHC +GDOT +FGL +FGM +FGP +WIA +HGSD +ATAX +SGRP +HGSH +WIL +CIFC +SGRY +WIN +WIP +WIT +WIW +RUSS +WIX +FHK +BWFG +ACAS +ACAT +FHN +RBCAA +RUTH +NIHD +FHY +CIGI +GRSHW +GRSHU +ACAD +FIF +GUSH +FRPH +FIG +FII +FIT +FRPT +FIS +WTBA +FIX +FIW +XWEB +ACBI +RUSL +LTBR +FRSH +ATEN +WLB +FJP +ATEC +ACCO +POPE +WLH +FARM +WLL +WLK +FARO +FKO +WMC +WMB +FKU +WMK +POOL +FLC +WMS +OLLI +WMT +WMW +ACFC +FLM +FLL +FLO +FLN +FATE +FLS +SGYP +FLR +WNC +ACET +MTGEP +FLT +NILE +FLY +RDVY +FMB +MFIN +WNR +FMD +FMC +SGZA +WNS +FMF +ZCZZT +DLNG +FMI +FMK +ATHM +FMN +ATHN +FMO +FMS +BFIT +FMX +WTFC +CZNC +FMY +BFIN +RDUS +FNB +WOR +FAST +FNF +FNI +CINF +CBMXW +FNK +ACHC +POST +QAUS +WPC +FNV +WPG +FNY +FNX +BWLD +NINI +ACGL +WPT +WPS +FOF +ATHX +FOE +WPX +WCFB +DLPH +WPZ +UNAM +ACIA +FOR +RDWR +FOX +GDXJ +CINR +ACHN +FPA +FAUS +GDXS +FPE +QRVO +GDXX +FPF +FPI +MFLX +FPL +ATKR +FPO +WRB +FPP +FPT +WRE +ZLRG +ACIW +WCIC +FPX +WRI +WRK +WRN +SLMBP +ACIM +DLTH +ATLO +MFLA +WSM +WSO +ATLC +FRA +SLMAP +FRC +WSR +TKAI +FRD +WST +YINN +FRI +FRO +FRN +FRP +ZLTQ +ATMP +FRT +WTI +WTM +FSB +WTR +FSD +WTT +FSC +WTS +SHAK +FAZZ +WTW +FSI +SYBT +FSM +FSP +CISG +BELFA +DLTR +BELFB +FSS +FSV +MFNC +FSZ +ATNM +ATNI +POWL +FTA +FTC +POWI +ACLS +FTD +BFOR +FTF +FTI +UNFI +FTK +FTR +WVE +ACNB +FTW +LCNB +ATOS +FTV +FTY +FUD +FUE +HYEM +FUL +FUN +FUR +FUT +WWE +WWD +MSDIW +FVC +HYDD +FVE +FVD +WWW +SHBI +GVAL +FVL +CIVI +MFSF +CIVB +HYGH +CZWI +FSAM +SHEN +ACOR +FWP +HYGS +IKGH +UNIS +ATRS +WYN +ATRO +FXA +MFRM +FXC +FXB +LTPZ +FXE +FXD +ATRI +MFRI +FXG +FXF +FXI +WYY +ACPW +FXH +ATRC +FXL +ATRA +FXO +FXN +FXP +FXS +FXR +FXU +FSBW +FXY +FXZ +ACRE +FSCE +FYC +HYIH +ATSG +QBAK +FYT +FYX +ATTU +ACSF +LTRX +FSBC +ATTO +HYHG +ACRX +FSBK +RECN +ACRS +EPAY +REET +CIZN +ACTG +BWXT +ACTA +REFR +SHIP +IBKCP +ACST +IBKCO +ACUR +REED +EPAM +ACTX +ATVI +ACTS +HYMB +IKNX +LTXB +VQTS +OMAB +SYMC +PPBI +JNPR +SYKE +VNRCP +ACWI +HYLD +FSFG +ACWF +REGI +LCUT +FSFR +SYLD +HYLS +REGN +REGL +SYNL +FSIC +SHLX +VNRBP +XAR +ACXM +SYNT +FBGX +LINDW +ACWX +XBI +ACWV +HYND +GAA +VNRAP +GAB +SHLD +GAF +OMAM +SHLM +GAM +GAL +SYMX +REIS +SYNC +SHLO +SYNA +GAZ +FBIO +XCO +GBB +EPHE +GBF +FBIZ +SYPR +GBL +SHOP +SHOO +RELL +GBR +GBT +OMED +RELX +NTRSP +RELV +GBX +SHOR +RVNC +SHOS +OMCL +QSII +GCC +FBHS +GCE +RVLT +GCI +GCH +GCO +JNUG +GCP +XEC +UNTY +GCV +XEL +SYRS +XES +GDF +SYRX +GDL +GDO +RENN +GDV +GDX +RENX +PPHM +GEC +GEB +RELY +GEF +SHPG +GEH +GEK +RVNU +OMER +GEM +GEL +GEO +GEN +FSLR +GENC +GEQ +UNVR +EPIQ +GENE +OMEX +GES +REML +GER +REMX +EPIX +GEX +SYRG +FBMS +GFA +GFF +CJES +GFI +REPH +GFN +FBNC +FBND +XHB +SHSP +XHE +FBNK +GFY +MGCD +XHS +GEOS +GGB +XHR +GGE +GGG +UNXL +FSNN +GGM +BGCP +GGN +GGP +GGT +GGZ +BGCA +XIN +GHC +XIV +GHE +GHL +ADAP +GHM +NEWTL +GHS +GHY +HYXE +AUBN +MGEE +GIB +SYUT +GIG +GII +GIM +GIL +AUDC +PPLT +GIS +XKE +RVSB +WUBA +ADBE +GERN +GJH +RETA +BGFV +GJP +FBRC +GJO +RETL +GJR +XLB +GJT +XLE +GJS +GJV +XLG +XLF +XLI +XLK +HYZD +GEUR +FSTA +VRAY +XLP +ZMLP +XLU +XLV +XLY +RESN +EPOL +HYXU +DMLP +WDAY +RESI +XME +CJJD +GLD +GLF +SHYG +GLL +SHYD +EPRO +XXII +GLP +GLO +EPRS +GLQ +GLT +ADES +MGIC +GLV +GLU +GLW +GME +GMF +XNY +GMM +GML +GMO +FSTR +MXIM +GMS +XXIA +GMZ +GEVO +XON +XOM +XOP +FBSS +GNC +HHYX +EPRF +GNE +ADHD +REXI +GNL +GNK +GNR +REXR +GNT +GNW +XPH +REXX +XPL +XPO +XPP +DMRC +ADGE +GOF +DMPI +WDFC +BXMT +GOL +GOV +PPSI +JOBS +CJNK +GPC +GPE +GPI +GPL +GPK +GPN +GPM +GPP +XRA +GPT +GPS +GPX +WDIV +XRM +XRS +XRT +BXMX +XRX +BGNE +XSD +GRA +MGLN +GRC +GRF +XSW +GRI +MGNX +GRN +GRO +GRR +MXPT +AUMN +GRU +GRX +XTH +XTL +XTN +AUMA +GSC +GSB +WFC.W +GSD +GSG +TLDH +GSI +GSH +GSK +LUNA +GSJ +GSM +GSL +GSP +GSS +ADMA +GST +GSV +GSY +DMTX +LULU +GTE +GTN +GTO +GTT +GTS +GTY +ADMS +ADMP +KRMA +SICK +XVZ +AUNZ +HIBB +GUR +GUT +AUPH +GVA +EYEGW +MGPI +GVI +TLEH +EPZM +GVP +TLGT +RFAP +BGSF +VALE +KRNT +KRNY +GWB +KAMN +FTAG +SIEB +FTAI +XXV +SIEN +VALU +GWL +VALX +GWR +GWW +GWX +XYL +MGRC +VRML +GXC +GXF +GXG +ADPT +KALU +GXP +LDOS +ADRE +FCAM +FCAN +ADRD +ADRA +FCAP +LDRI +XGTI +SIFY +GYC +FCAU +GYB +RFDA +AUSE +SIGM +QCAN +FCBC +SIGI +JONE +FTCS +GFED +RFDI +KROO +ADSK +VAMO +HEI.A +VRNS +VRNT +KANG +HIFR +HIFS +ADRU +RFCI +ADRO +SIFI +GZT +RFEU +ADTN +HIIQ +FCCO +WMGIZ +FTEC +FCCY +EQBK +FTEK +RFFC +FTEO +TLLP +MXWL +HIHO +GWGH +EQAL +RFEM +WDRW +VRTB +ADVM +FCEL +FTGC +DNAI +VASC +VRTS +VRTU +VRTV +MGYR +ADUS +ILMN +QTEC +HOVNP +WDTI +LDUR +EQCO +TLMR +VRSK +VRSN +ADXS +YAO +HIMX +EQFN +SIMO +FCFI +SZMK +ZXYZ.A +KATE +HILO +FCFP +VRTX +FCFS +SILC +HAE +DNBF +FTHI +RFIL +HAL +SILJ +HZNP +HAP +TLOG +HAO +HAR +YCB +HAS +ONDK +YCL +JOUT +YCS +TLRD +HBI +HBK +HBM +HBP +HBU +HBZ +RWLK +ONCE +HCA +ONCS +HCJ +SINA +HCI +SINO +HCN +HCM +HCP +EQGP +EBAYL +HDB +GWPH +HDG +TLTE +TLTD +HDP +HDS +FCLF +HDV +OACQW +ONEK +OACQU +HEB +FTLB +OACQR +HIPS +ONEO +HEI +SIPE +ONEQ +HEP +ILTB +FTLS +HEQ +ONEV +PBR.A +ONEY +YGE +BHAC +HES +EQIX +BYBK +GWRE +HFC +QTNT +BHBK +GWRS +FORTY +EQLT +CKEC +ZNGA +HGH +MYCC +HGG +SIRI +HGI +QCLN +AVAV +HGT +FTNT +AVAL +YIN +FCOR +HHC +BYFC +DNKN +HIVE +HHS +QCOM +HHY +SITE +EVLMC +HIE +HIG +HII +HIL +HIO +HIX +SITO +HIW +FCOM +LEAD +AVEO +FTSL +LECO +VSAR +RFTA +FTSM +YLD +DRWIW +MHGC +HJV +VSAT +LEDD +FCPT +FTRI +SIVB +WEAT +SIVR +TLYS +MYGN +FTSD +WEBK +HLG +AVGO +HLF +HLI +HLM +HLS +HLT +DNOW +HLX +WEET +HMC +RWXL +KBAL +HMG +AVHI +HMN +LEDS +RFUN +FCSC +QCRH +YOD +WVFC +HMY +AVGR +AVIR +HNI +HNH +HNP +HNR +AVID +YPF +BYLD +HNW +AEGR +AEGN +FCVT +QTWN +QTWO +HOG +BHLB +LVHD +HON +SIZE +HOT +HOS +HOV +AEHR +VSEC +HPE +HPF +HPI +VBFC +HPJ +MIIIU +HPQ +HPP +HPS +YRD +JPEH +JPEM +HPT +AEIS +JPEP +JPEU +HQH +HQL +HQY +MHLA +MHLD +HRC +HRB +IMAX +HRG +HRI +HRL +ONTX +JPGE +HRS +HRT +IMDZ +HSC +AVNW +EQWL +EQWM +AEMD +LEJU +EQWS +HST +MHNB +MYOK +HSY +YUM +LVLT +MYOS +HTA +MHNC +HTD +HTF +HTH +HTM +MYRG +HTR +JPIH +JPIN +HTY +HTZ +LENS +NKTR +HUN +HUM +LEMB +VBIV +NKSH +ONVI +ONVO +AEPI +HVT +YXI +TMHC +VBLT +BOKFL +GGAC +OCLSW +IMGN +GGAL +VSLR +YYY +HXL +CYRXW +YZC +AERI +RGCO +VBND +JPMV +HYB +HYD +HYH +HYG +HYI +QUAD +HYT +HYS +QUAL +UPLD +RXDX +HZO +JPME +HZN +AETI +PRAA +PRAN +IMLP +PRAH +FUEL +WERN +JPNH +JPNL +AEUA +VSPY +RGEN +JSYNW +RXII +IMNP +PAAS +KBSF +PRCP +JSYNR +JSYNU +FDEU +VSTO +QDEF +VSTM +QDEL +WETF +IMMR +AVXS +IMMU +IMMY +PAAC +AVXL +WVVI +FDEF +PACW +IMPR +IMPV +VBTX +IMOM +ZBH +ZBK +QDEU +EACQ +IAC +IMOS +IAE +IAG +IAF +IAI +IAK +PACB +PACE +PACD +IAU +IAT +UPRO +WEYS +CLAW +KBWB +AEZS +PAEU +JPUS +KBWD +IBB +FDIS +IBA +FDIV +PRGS +RGLD +PRGO +KBWR +KBWP +CLAC +IBN +IBM +PRGX +IBP +IBO +RGLS +KBWY +QUIK +CLBS +ICB +ICE +ICD +ERGF +ICF +ICI +CLBH +SJNK +PRFZ +ICL +PRFT +ICN +ZEN +PRIM +CLCT +IDA +PAHC +ZOES +IDE +IDI +IMUC +IDN +CLCD +YLCO +ZFC +IDT +RGNX +IDV +GTN.A +IDU +IDX +JPXN +EAGL +CLDX +CLDT +IEC +ERIC +ERIE +HJPX +IEF +IEI +ERII +FULL +IEO +PAGG +IEP +FULT +CLDC +IEV +IEX +TMST +IEZ +IMTM +PAGP +IFF +PRKR +QUNR +IFN +IFV +PRLB +GPACW +IGA +FUND +IGC +FUNC +GGOV +IGE +GPACU +IGD +IGF +QUMU +IGI +IGM +BICK +TMUS +IGN +AGIIL +IGS +IGR +IGU +IGT +CLFD +IGV +FDML +IGZ +IHD +CLGX +IHC +ZIV +IHF +BIDU +IHE +PRMW +IHG +MIDU +IHI +AFAM +IHT +PALL +RGRO +MIDZ +IHY +LWAY +IID +IIF +III +MICT +IIM +IIN +QUOT +MIDD +GOODN +GOODM +WWAV +GOODP +GOODO +PRME +IJH +IJJ +PANL +VTAE +IJK +PROV +CLIR +AFCO +IJR +OOMA +IJT +IJS +PRPH +PANW +RGSE +QURE +EROS +MIFI +BIGD +WFBI +ILB +GOOGL +ILF +PRQR +DOOR +ZNH +FDTS +IMI +KCAP +IMH +KTCC +IMO +IMN +IMS +CLLS +FUTY +INB +IND +BIIB +INF +ING +PRSS +PARN +INN +PRTA +XGTIW +INP +INO +WHLRW +INR +INT +CLMT +INS +CLMS +INZ +PARR +INY +PRTO +AFGH +PRTK +IOC +AFGE +NLNK +KTEC +IOO +CLNY +IOT +CLNT +WHLRP +VTEB +PRSC +EARN +IPB +FDUS +IPD +EARS +IPF +CLNE +IPE +IPG +PATI +IPI +FITBI +IPL +IPK +WFIG +IPN +TNAV +WFHY +IPO +INBK +PATK +VTGN +IPS +IPU +MIME +IPW +IQI +BIND +PRTY +PRTS +DORM +ERUS +ZSL +INAP +MILN +VCEL +IRG +INDA +INDB +IRL +BIOD +BIOC +INDF +IRM +CLRB +BIOA +MINT +IRR +IRT +IRS +IRV +VTIP +QDYN +XINA +INDL +IRY +PRXL +INDY +ZTS +ZTR +ISD +ISG +ISF +VTHR +AFMD +ISM +CYCCP +ISL +CLSD +ISP +ISR +IST +NEWTZ +MINI +INCO +BIOS +MZOR +MINC +INCR +MIND +ITB +ITA +CLRO +INCY +ITC +BIOL +ITE +IMKTA +ITG +ITI +ITM +ITR +ITT +INFI +INFO +ITW +TNET +INFN +PRZM +RYAM +INFU +INFY +CLSN +ZVV +PAYC +TNDM +WAFDW +CLUB +ERYY +VCIT +IVC +BPOPN +BPOPM +IVE +IVH +NLST +NLSN +IVR +TNGO +IVV +IVW +IVZ +IWC +IWB +IWD +IWF +DGICB +DGICA +VCLT +IWM +IWL +IWO +IWN +IWP +IWS +IWR +BITE +IWV +IWY +BITA +IWX +BZUN +INGN +INGR +JASNW +PAYX +IXC +AWRE +CLVS +IXG +IXJ +MIRN +IXN +IXP +KCNY +XITK +IYC +GHDX +IYE +IYG +IYF +CLWT +IYH +IYK +IYJ +IYM +IYR +AFSI +IYT +IYW +CLYH +ININ +AFSD +IYY +VTNR +IYZ +KTOS +MITL +KTOV +QVAL +MITK +MITT +GYEN +UA.C +VTRB +XIVH +ESBA +PSAU +ESBK +AFST +AFSS +QVCB +QVCA +INKM +AFTY +PSCE +INNL +PSCD +PSCF +PSCC +PSCM +PSCI +PSCH +FEEU +PSCU +LFVN +PSCT +INOD +VTTI +PBBI +SKIS +ESCA +BIZD +VCRA +EBAY +SIVBO +LFUS +MIXT +PSEC +PBCT +APDNW +GYLD +VTVT +PSET +GHII +DYN.W +ESEA +VCSH +QEFA +INOV +PSDV +ESES +SKLN +JAX +FEIM +JBK +JBL +JBN +JBR +INSM +SKOR +JBT +KTWO +CMBS +VTWG +ESGD +ESGE +JCE +ESGG +JCI +VTWV +ESGN +JCP +ESGR +FEIC +ESGS +JCS +VTWO +ESGW +CMCT +INTU +FTRPR +INTT +PBHC +CMCO +INTX +CMCM +JDD +JDG +PSIX +FELE +PBFX +INST +CMDT +INSY +JEC +NMBL +JEM +ESIO +INTF +INTC +JEQ +INTG +INTL +INVT +FEMS +JFC +OPHT +GYRO +QEMM +ESLT +JFR +FENG +NMFC +INWK +HBANP +HBANO +VCYT +EBIO +FELP +INUV +JGH +EBIX +CMFN +OPGN +PBIB +INVA +FEMB +INVE +AXAS +JGV +OPHC +PBIP +INVN +JHA +ESNC +ESND +INXX +JHD +SKUL +JHI +PSMT +ESNT +JHS +TNXP +JHY +JHX +ESMC +PSLV +FENX +FENY +MJCO +ZPIN +INXN +JJA +PBNC +JJC +JJE +JJG +WGBS +AGCO +JJM +JJN +ESPR +JJP +LGCY +JJS +JJU +AXDX +JJT +COF.W +CNBKA +JKD +EBMT +JKF +JKE +JKH +JKG +JKJ +JKI +JKL +JKK +PBMD +DPLO +EBND +JKS +NMIH +AXGN +PBPB +JLL +SKYW +ESRT +JLS +AGEN +ESRX +SKYS +QESP +ESSA +OPOF +SKYY +JMF +JMM +JMP +AGFS +CMLS +JMT +JMU +BAC.A +BAC.B +LXFT +LXFR +FEUZ +AGGY +JNK +JNJ +EBSB +JNP +URBN +GHYG +JNS +AGGP +PSTG +PSTB +MARPS +AGGE +JOB +PSTI +JOF +JOE +AXJL +YMLP +JOY +YMLI +JPC +ESTE +JPI +JPM +JPN +JPP +JPS +DPST +JPW +AGIO +JPX +HIG.W +AGII +AXJV +JQC +SBRAP +AXLL +EBTC +PBSK +DPRX +CMPR +LGIH +JACK +JRI +AGLE +CMRE +OPTT +JRO +JRS +JSD +JSC +SLAB +PSXP +JSM +FEYE +CMRX +JTA +ESXB +JTD +AGND +AGNC +AXON +JAGX +SLCA +LGND +BJRI +NMRX +LGLV +JVA +CMTL +JWN +TOFR +JRJC +PBYI +SLCT +OPXA +JRJR +JXI +AXSM +JYN +IOIL +RIBT +LXRX +AGRX +AXTI +JAKK +RICK +AXTA +AGRO +RICE +GIFI +AGTC +HLIT +STZ.B +SLIM +GIGA +UAMY +FFBC +SLGN +FWDB +FWDD +FWDI +ETAK +KURA +PCAR +RIGS +RIGP +IONS +PTCT +PCBK +ECCA +ECAC +STI.A +STI.B +GIGM +TOLZ +VUSE +RIGL +PTEN +VDTH +ETFC +PTEU +TOPS +GIII +TONS +VDSI +KAI +ECCZ +PCCC +URRE +KAP +KAR +CNAT +CYTXW +FFIN +URTY +GILT +KBA +FFIV +AGZD +KBE +KBH +TORM +ETHO +ZIONZ +KBR +AGYS +ZIONW +HLS.W +FFHL +KCC +KCE +KCG +JASN +JASO +PCEF +URTH +FFIC +GILD +CNCR +ECHO +PTIE +VUZI +IOTS +CNCO +FFKT +RINF +SLQD +CNCE +TOTL +RING +TOTS +IOSP +RILY +GIMO +JRVR +KED +KEG +KEF +CNDF +KEM +NNBR +KEN +CNDA +KEP +QWLD +KEY +KEX +YNDX +CNET +KFH +KFI +KFN +HLTH +KFS +PTLA +PTLC +KFY +KGC +CNFR +SLRC +NNDM +SLRA +BKCC +TOUR +KHC +KHI +PCLN +CMA.W +JAZZ +SLTB +CNHX +CHSCL +KIE +CHSCO +CHSCP +FFNW +CHSCM +BKEP +CHSCN +KIM +KIO +KIN +TOWR +KIQ +CNHI +TOWN +PTMC +LHCG +ECNS +CNIT +BKFS +WYDE +ECOL +ECOM +ECON +FWRD +PTNQ +KKD +PCMI +PTNR +RISE +KKR +SLVO +SLVP +WSO.B +SLYG +KLD +BKHU +ETRM +SLYV +KMB +BATRA +KMG +KMF +KMI +KMM +CIVBP +BATRK +GIVE +KMT +PCOM +ECPG +KMX +KND +USBI +DRIOW +KNL +AHGP +KNX +PCRX +CNMD +VEDL +CNOB +KOF +USAG +FFTY +USAC +KOL +LTRPB +USAP +CNNX +LTRPA +KOP +KOS +USAK +VECO +ETSY +USAT +PTSI +USDU +VEEV +PCTI +USDP +KVHI +BKLN +PCTY +UBCP +USCI +WYIG +USCR +IPAC +OXLCN +OXLCO +BKMU +FFWM +IPAR +IPAS +KRA +COWNL +IPAY +KRC +KRE +KRG +KRO +KRS +USFR +KRU +IPDN +KSA +PTXP +CNSF +VEGA +KSM +IPCC +USEG +KSS +KSU +KST +IPCI +VEGI +USFD +KTF +KTH +CNTF +KTN +SMBK +IPFF +KTP +WYNN +ZXZZT +CBSHP +ECYT +CNSL +COYNW +CNTY +UBFO +CNTR +WHLM +SMBC +WHLR +BKSC +NNVC +IPHI +SMDV +WVVIP +IPHS +MKSI +UBIO +PAACR +KEMP +SMED +EACQU +PAACW +SMCP +KWN +PCYG +JBHT +SMCI +EACQW +PAACU +KWR +KWT +PCYO +IPGP +SMDD +KXI +AHPI +JSMD +MKTX +CNXC +JSML +USLV +USMD +FXCH +KYE +FXCM +KYO +TPHS +KYN +SMEZ +CNYA +USLB +USLM +CNXT +CNXR +MKTO +SMFG +QGBR +SMIN +TPLM +FXEP +KEQU +USMV +HMHC +JBLU +FGBI +LYTS +SMHD +IPKW +USNA +SOHOM +SOHOL +UBOH +KERX +EDBI +FGEN +PDBC +DRAD +EUDG +BLVDU +BLVDW +DRAM +QGEN +SMIT +FXEU +UBND +UBNK +EDAP +USPH +UBNT +ORBC +SMLV +PDCO +SMLR +USSD +ORBK +SMMF +EUFN +HMNF +EUDV +HMLP +IPOS +LAD +SMLF +PDCE +ORAN +VVUS +SMLP +SMLL +LAQ +PDEX +UBSI +LAZ +UBSH +TPRE +NOAH +LBF +LBJ +EDGE +EUFX +LBY +SMMU +COBO +SMMT +EDEN +ORCL +HMNY +LCI +LCM +FXJP +JBSS +USWD +LDF +LDL +KEYS +LDP +COBZ +KEYW +LDR +OACQ +PDFS +CIG.C +HMPR +LEA +LEE +CODI +EDGW +LEG +NOBL +LEI +OREX +LEN +LEO +LEU +FNTCW +ZBZZT +FNTCU +HMST +LFC +HMSY +TPVG +DRII +BLBD +LFL +DRIO +DRIP +SMSI +MLAB +EDIT +LGF +BLCM +EDIV +LGI +LGL +SMRT +JSYN +BLDR +BLDP +LHO +PDLI +SNFCA +IPWR +PULM +MBFIP +ORIG +COHU +HMTV +TPVZ +COHR +ORIT +LII +ZAGG +SMTC +LIT +SMTX +IPXL +EUMV +CVM.W +DAIO +FXSG +BLFS +ORLY +EDOG +OAKS +LKQ +TPYP +ZAIS +DAKT +WIBC +EURL +EURN +MLHR +LLL +LLY +COKE +EUSA +LIFE +DRNA +ORMP +XLFS +DANG +BLIN +COLM +LMT +COLL +COLB +LNC +LND +ORPN +LNG +ZROZ +JCAP +COMT +LNN +COMM +LNT +LOB +EUSC +QGTA +KWEB +LOR +LOV +CONN +LOW +CONE +NOMD +WIFI +BLKB +LPG +LPI +LPL +EDUC +AGM.A +LPT +LPX +COOL +AIII +LQD +CBS.A +UCBA +COPX +PUTW +BLMT +OAPH +ORRF +UCBI +BLMN +DRRX +KFFB +CORE +OASM +IQDF +IQDG +LRN +IQDE +OASI +MLNX +PDVW +LILA +XLNX +NORD +BLNG +LSC +IQDY +AIMC +UTEK +UTES +BLOX +CORT +CORR +CORP +DATA +CORN +MLNK +LTC +CORI +DRWI +MLPW +AINC +MLPX +MLPQ +LTL +MLPS +LTS +MLPY +MLPZ +UTHR +LIND +AIMT +LINC +SRAQU +COST +LUB +LINK +BLPH +COSI +SRAQW +WILC +NORW +SNAK +LUK +AZPN +UCFC +LUV +AINV +COTY +LUX +COTV +YORW +MLPG +DAVE +MLPA +MLPB +LIME +MLPC +MLPN +SNBC +MLPO +WILN +MLPI +MLPJ +UCIB +LVL +LIOX +DRYS +LVS +SNDX +XLRE +BLRX +XLRN +LWC +NOVT +MLSS +WING +SNCR +WINA +WINT +COVS +LXK +LION +WINS +AIRI +LIQT +BLUE +LXP +LXU +RKDA +UTMD +LYB +ZAYO +LYG +COWN +FSCFL +BLVD +LYV +MLTI +AIRT +LZB +AIRR +LCAHU +VWOB +AIRM +UTLF +EVAR +LITB +SNHY +LITE +FHCO +IQLT +EVBN +COYN +TCBIW +TCBIP +GAINN +TCBIL +MLVF +WIRE +GAINP +GAINO +IQNT +LIVE +PVCT +LIVN +PEBK +AGNCP +EVBS +PVBC +KFRC +JTPY +AGNCB +JCOM +OSBC +FCE.A +FCE.B +AIXG +ZSAN +UTSI +DSCI +HNNA +EVDY +PEBO +DBAW +MAA +DBAU +MAC +MAB +DBAP +MAG +MAN +SNLN +EVEP +EVER +MAS +MAR +MAT +MAV +CPAH +EVHC +MBB +CELGZ +EEFT +CPAC +DBBR +MBG +MBI +WIZE +RDS.B +RDS.A +OBCI +MBT +SNMX +OBAS +MCA +MCC +MCD +MCF +MCI +MCK +EVGN +MCO +MCN +TQQQ +MCQ +MCS +MCR +DBEF +MCV +MCY +MCX +MCZ +QYLD +MDD +MDC +KFYP +MDM +MDP +FHLC +HNRG +MDR +MDT +ZAZZT +MDU +MDY +SNOW +INTLL +NXTDW +UCTT +PEGA +ZWZZT +FYLD +DBEZ +MED +MEG +MEI +DBEU +PEGI +DBES +MEN +SNPS +DBEM +MEP +MES +MER +MET +HNSN +PEIX +CPER +MFA +MFD +MFC +MFG +MFL +MFM +MFO +MFT +EVLV +MFS +MFV +SNSS +DSGX +MMAC +MGA +MGC +GKOS +MGF +MGI +BMCH +MGH +MGK +MGM +MGN +DBGR +MGP +MGR +OSHC +MGU +MGT +MGV +DBIF +MHD +EELV +MHF +MHE +MHH +MHG +MHI +MHK +MHN +EEMA +MHO +DSKX +DSKY +EEML +MHY +MIC +CPHR +OSIR +MIE +OSIS +MIK +SNTA +CPHI +MIN +CPHD +DBIT +CPHC +MIW +MIY +CPIX +PENN +MJN +DBJP +MINDP +EEMO +MKC +EEMS +ZBIO +EEMV +EVOK +EVOL +MKL +DSLV +DBKO +EVRI +MLI +MLN +MLM +MLP +MLR +MMC +MMD +MMI +MMM +CPLP +MMP +MMS +ZSML +MMU +MMT +DBMX +MMV +PHIIK +CPLA +EVTC +MNA +MNE +PERI +MNI +MNK +PERF +MNP +MNR +PVTB +PVTD +PERM +PERY +MOC +MOD +VXDN +DSPG +MOH +MOM +MOO +MON +MOS +GEF.B +MOV +MPB +MPA +MMLP +MPC +MPG +PETS +MPV +MPX +MPW +XMLV +IRBT +PETX +BMLA +PESI +DBRE +UDBI +MQT +MQY +CAPNW +CPPL +MRD +MRC +TRCH +DBSP +DSUM +MRK +MRO +TRCO +DBSE +IRDM +MSA +MSB +MSD +MSG +MSF +MSI +MSK +MSM +MSL +MSN +MSP +CPRX +CPRT +IRCP +TRCB +MTB +MTD +OSTK +ZBRA +MTH +MTG +DSWL +MTL +CPTA +MTK +MTN +MTP +MTR +DBUK +MTT +MTU +MTX +XMPT +CPST +MTW +CPSS +MTZ +TREX +MUA +NPTN +MUC +MUB +CPSI +MUE +CPSH +MUI +MUH +BMRC +DBVT +MUJ +OSUR +MUS +MUR +SBFGP +MUX +VGIT +KGJI +TACT +TREE +IRET +MVC +TREC +MVF +YPRO +TACO +TRGP +MVO +MVT +MVV +GLBL +VGLT +LJPC +MMSI +MWA +GLBS +BMRN +IAGG +GLBZ +MWG +SOCL +MWO +BMTC +DSXN +GLAD +MWR +MWW +MXC +MXF +MXE +SODA +MXI +MXL +TRIP +SOFO +GLDD +GLDC +AJRD +TRIL +GLDI +TAHO +MYC +GLDX +MYE +MYD +MYF +MYI +MYJ +MYL +PACEW +MYN +PACEU +MYY +TRIB +HOFT +MZA +MZF +IRIX +MMTM +TAGS +EVSTC +SOHO +MZZ +SOHU +FICO +ZBZX +EWBC +SOIL +JUNE +TCB.W +FIBG +FIBK +JUNO +FIBR +TAIT +RLGT +FIEE +TRMR +FIEG +TALL +RLGY +UDOW +PFBC +FIEU +TRNC +PFBI +TRNO +HOLD +MMYT +IRMD +EFAD +TRMB +FIDU +SOJA +EFAV +CLACU +TRMK +CLACW +TANH +TROX +TROW +TROV +HOML +VXUS +CLRBW +RLJE +HOMX +FIGY +HONE +FIHD +TRNS +HOLI +IROQ +PFBX +VGSH +NAD +NAC +CLRBZ +HOLX +VXUP +NAK +KELYB +EWEM +NAN +KELYA +NAP +HOMB +NAO +EFFE +NAT +QIHU +NAV +NAZ +SONS +TAPR +DTEA +NBB +NBD +NBH +NBL +NBO +NBN +GM.B +GLMD +NBR +NBW +NBY +SONA +NCB +NCA +NCI +SONC +JDST +NCR +NCQ +EWGS +NCT +NCS +NCV +NCZ +TARO +TRTL +GLOB +NDP +GLOG +TRTN +UUUU +OTEL +SENEA +SENEB +NEA +NEE +TRSK +NEN +NEM +PFGC +IART +TRST +NEP +NEO +OTEX +NEV +GLNG +NEU +PFIS +TATT +NFG +TRVN +NFJ +IRWD +NFO +OTIC +EFII +NFX +FILL +GLOP +BNCN +RLOC +TAST +TRUE +BNCL +NGD +TASR +GLOW +NGE +NGG +SORL +PFIG +NGL +RLOG +OCFC +PFIE +NGS +GLPG +PFIN +TRUP +GLPI +BNDS +AKAO +NHA +AKAM +MNDO +NHC +XNCR +NHF +NHI +TRXC +NHS +PFLT +OCIP +FINL +HOTR +NIB +QINC +EWMC +NID +FINU +NIE +FINZ +DCIX +NIM +BNED +AKBA +OTIV +NIQ +GLRE +GLRI +BNDX +GLTR +BNFT +XNET +NJR +EFOI +NJV +MNGA +TAYD +DTLA +NKA +NKE +NKG +SOVB +DTLK +PFMT +PWOD +NKX +CHEKW +EFNL +SOYB +EWRE +FISV +AKER +SRTSU +FITB +NLS +NLR +NLY +PFPT +GLUU +PFNX +DCNG +NMI +NML +NMK +NMM +NMO +SOXS +NMR +NMT +NMS +SOXL +FISI +SOXX +NMZ +FISK +NMY +OCLR +OCLS +NNA +DCOM +NNC +NNI +GLYC +NNN +EFSC +FIVE +NNY +FIVN +ELECW +MNKD +ELECU +NOA +FITS +EWSC +NOC +LKFN +NOG +NOK +DISCA +DISCB +NOM +NOV +DISCK +NOW +NPD +NPF +DTSI +VYGR +NPI +NPK +ISBC +NPM +NPO +NPN +QIWI +NPP +NPV +PFSI +DTRM +NQM +NQP +EWUS +NQS +CMCSA +RLYP +WKHS +PFSW +SRCLP +NRE +NRG +NRF +OTTR +NRK +DTUL +NRO +TSCO +NRP +DTUS +TBBK +CQQQ +NRT +NRZ +IBCD +IBCE +ISDR +IBCC +NSA +NSC +EFUT +NSH +NSL +NSM +ISCA +NSP +DCTH +NSR +TSBK +ISCF +NSS +NSU +NTC +OCRX +TSEM +IBDM +NTG +IBDN +PFXF +IBDK +IBDL +NTK +IBDQ +IBDO +IBDP +NTL +NTN +EWZS +NTP +OCUL +NTT +DCUC +NTX +NTZ +SPCB +NUE +FIZZ +IBCP +NUM +SPAR +NUO +MNOV +SPAN +MKC.V +NUS +NUV +NUW +IBDB +BIO.B +IBDF +IBDC +IBDD +SNHNL +IBDJ +SNHNI +NVG +IBDH +LKOR +SPDN +DTYL +NVO +DTYS +NVS +ISHG +NVR +UEIC +NVX +RMAX +NWE +NWL +BNTC +NWN +NWS +NWY +GMAN +BNSO +VYMI +NXC +MNRO +MNTX +RUSHB +NXJ +RUSHA +JW.A +JW.B +GBLIZ +KLREU +NXN +NXQ +KLREW +NXP +NXR +SPGH +SPGI +NYF +NYH +IBIO +MNST +NYT +ISIG +MNTA +RMBS +NYV +AKRX +ISIL +SPEX +RMCF +NZF +SPFF +NZH +SPHQ +ISLE +EXAR +EXAS +SPHS +IBKC +TSLA +TSLF +GMED +NRCIA +TAP.A +NRCIB +AKTX +SPHB +TBIO +EXAC +EXAM +SPHD +RMGN +EXCU +PGAL +CENTA +ISNS +EGBN +IBMF +SPKE +IBMG +IBME +IBMJ +IBMK +IBMH +IBMI +IBKR +SPIL +TSLX +EGAN +AST.W +EGAS +IBLN +SPLV +SPLS +SPLP +TBNK +IBOC +SPLX +UVSP +SPMO +EXFO +TSNU +IBND +UEPS +OAK +EXEL +SPLK +OAS +TBPH +SPNS +ISRL +CRAK +CRAI +TSRA +GMLP +TSRI +DDBI +ISSC +JETS +GMMB +TSRO +SPOK +CRBP +CRBN +OCC +SPNE +SPNC +CRAY +PGEM +ISRA +OCN +CYHHZ +ISRG +OCX +CRCM +ISTR +EGHT +CAAS +ODC +PGHD +ODP +EGIF +CRDT +CACC +CRDS +CACB +EMITF +DDEZ +OEC +SPPI +OEF +CABO +TBRA +ISTB +SPPP +OEW +CADC +UVXY +HVT.A +MOBL +SPSC +MOBI +OFC +CREG +BOBE +CREE +CRED +OFG +CACQ +EXLS +CACI +OFS +IBUY +NADL +YRCW +GMOM +OGE +BOCH +PGHY +MOAT +SPRT +OGS +IBTX +ODFL +CAFE +CAFD +PXMG +MODN +EGLT +PGLC +DUKH +SPUN +OHI +PXMV +SPUU +CRD.A +CRD.B +ZDGE +OIA +PXLG +MOCO +CRHM +OII +OIH +SPTN +OIL +PXLW +PXLV +GMRE +OIS +EGLE +CRIS +EXPD +MOFG +EXPE +SPWH +PGND +ALCO +NRIM +BOFI +EXPO +EXPR +RMTI +DDJP +SPWR +ALDW +ALDX +ALDR +OKE +GMTA +QJPN +GMTB +OKS +ISZE +SPVU +VIAV +ALEX +SPYB +ZUMZ +OLD +EGPT +LLEM +SPYG +SPYD +OLN +OLP +OLO +OUNZ +DDLS +SPYX +SPYV +PGNX +OMC +OME +CAKE +EGOV +OMF +LLDM +OMI +SPXH +SPXE +SPXC +BOIL +ALFI +OMN +NAIL +SPXN +NAII +WLDN +SPXL +ALFA +SPXX +VIAB +SPXU +SPXV +SPXS +SPXT +CALM +CALL +ONB +CALI +ALGT +ONE +EGRX +CALD +CRMT +ONG +VICR +ALGN +CALA +EXTN +PXSV +PGRE +VIDI +ONP +EXTR +ONS +UFAB +CRME +CRMD +BOJA +NAKD +CRNT +VICL +CALX +BOKF +PXSG +WLFC +OPB +OPD +CROX +PGTI +CANF +CANE +OPK +File Creation Time: 0715201621:33 +CROP +NANO +ALIM +OUSA +DUST +NANR +NXEOU +NXEOW +OPY +CAMT +CROC +CAMP +ICAD +ASRVP +NAME +ALJJ +ORA +ICBK +OUTR +ORC +CAPN +ORG +CAPL +XONE +ORI +ORN +ORM +BONT +CAPE +ALKS +TCBI +WLKP +ICCC +BOND +TCBK +OSB +MOMO +XOMA +OSG +UFCS +ALLY +OSK +OSM +ITCB +YANG +OSN +ALLT +BOOT +ITCI +BOOM +ONSIZ +CAPX +TCAP +ALLE +VIGI +CAPR +ONSIW +TTEK +CARO +SQBG +VIIX +VIIZ +CARB +CARA +HQCL +CASS +CASM +ALNY +TCCB +TCCA +CASI +CASH +OUT +CASC +NWBOW +ITEK +CRTO +ITEQ +CRTN +CARZ +TTEC +TCCO +CARV +CART +MORT +BOSC +NATH +CATO +CATM +GNBC +DDWM +TTGT +TCFC +NATI +CATH +ALOT +NATL +CRUS +CATB +NATR +BORN +LBRDA +CASY +ALOG +ALQA +LLNW +TTFS +NASH +LBRDK +MORE +CRVS +ITGR +CRVP +MORL +CRVL +MORN +GNAT +CATY +ICFI +KINS +NAVG +NAVI +ASB.W +OXM +CAVM +TCHF +OXY +CRWS +BOTJ +RNDB +FULLL +NAUH +GNCA +TTHI +ITIC +MOSY +ITIP +MOTI +ALRM +NAVB +OZM +LLTC +RNET +ALSN +ALSK +VIPS +VIOG +BOXC +ALTY +VIOV +LLSC +ALTS +CRZO +VIOO +LLSP +ICLR +XOXO +VIRC +VIRT +ASCMA +ICLD +WLTW +KIRK +TTMI +ICLN +TANNL +EYES +TANNI +TTOO +OVBC +ICOL +ICON +PHDG +CFRXW +TTPH +VISI +TTNP +VISN +DVAX +PAVMU +KITE +UFPI +PAA +UFPT +ITOT +PAC +PAF +EYEG +PAH +PAG +PAI +PAK +OVAS +PYDS +PAM +ALXN +ITRI +PAR +BWINB +CSAL +VIVO +ITRN +TCPC +SQNS +PAY +VIVE +BWINA +PBA +TCPI +PBB +PBE +PBD +NSAM +PBF +PBI +PBH +PBJ +GNMA +DVEM +NSAT +PBP +PBS +DVCR +PBR +PBT +PBW +CSBK +TCON +UWTI +PCF +PCH +PCG +DECK +PCI +PCK +PCN +SQNM +PCM +ICPT +PCO +PCQ +CSCR +VIXM +CSCO +TCRD +PCY +CBAY +VIXH +ICSH +TCRZ +TCRX +CBAN +TROVW +PDI +CBAK +TROVU +SQQQ +PDM +ITUB +PDN +VIXY +EHIC +PDP +PDS +CSBR +PDT +DEFA +GNMK +PEB +PED +PEG +PEJ +PEI +PEK +PEN +LNC.W +PEP +PEO +PER +DEEF +AIG.W +PES +PEX +PEZ +PEY +NSEC +ICUI +EYLD +PFE +PFD +PFG +PFF +PFI +PFH +PFK +PFM +PFL +PFO +PFN +PFS +MPAA +CSFL +ITUS +PGD +PGC +PGF +PGH +PGJ +DVHI +DVHL +PGM +PGP +PGR +PHII +PGX +AMAT +PGZ +CSGS +CSGP +GNRT +PHB +AMAG +GNRX +PHD +PHG +PHF +PHI +PHH +PHK +PHM +PHO +LMAT +QKOR +PHT +PHX +AMBR +PID +PIE +PIH +CBFV +MPCT +PII +AMBC +OPXAW +PIN +AMBA +PIM +PIP +PIO +PIR +GNRC +ICVT +TTWO +PIZ +PIY +AMCO +CSIQ +PJC +AMCN +GNTX +LMCK +NBHC +BPFH +CSII +PJH +OVLY +AMCC +NSIT +PJP +PJS +PJT +PKB +PKD +PHMD +PKE +PKG +MPEL +WMAR +PKI +LMBS +TANNZ +PKO +MPET +AMDA +RNST +OVLC +LMCA +PKX +PKW +AMCX +PKY +RNVA +DEMG +NBIX +PLD +PLG +PLM +AMED +DELT +PLT +CBIO +PLW +PLX +LMFA +PYPL +AMFW +PMD +CSLT +PMC +CSLS +PMF +PME +WMCR +PML +PMM +PMO +PMR +GNVC +PMT +PMX +MHLDO +CBLI +PNC +PNF +PNI +PNK +ADXSW +AMGN +PNM +WMGI +PNR +PNW +LMHA +PNY +EAGLW +JGBD +DENN +EAGLU +JGBB +CBMG +POL +POR +POT +RNWK +PPA +PPC +CBNK +PPG +PPH +CBND +MPLX +VJET +PPL +PPP +PPS +PPR +CBMX +PPT +XPLR +AMIC +AMID +PPX +CSOD +WMIH +DEPO +CBON +DERM +JGBL +BPMX +CBOE +JGBS +UGAZ +JGBT +AMJL +CSPI +EHTH +LMIA +BPMC +PRA +CSRA +CBPO +PRB +PRE +PRF +PRI +PRH +PRK +PRO +AMKR +PRN +DESC +PRU +IDCC +PSB +OESX +PSA +PSF +TUBE +NSPR +PSG +PSJ +PSI +PSL +PSK +PSP +PSO +AMLP +PSR +PSQ +BPOP +PST +OPGNW +PSX +CBPX +DEST +PTC +DEUS +PTF +PTI +PTH +CBRL +BRK.A +BRK.B +TUES +PTM +PTN +OEUH +PTR +PTY +PTX +OEUR +NBRV +NSTG +PUB +PUI +LMLP +PUK +SRAQ +CBSH +NSSC +WMLP +PUW +CSTM +AMNB +CSTE +HACK +PVG +PVI +PVH +DVYL +LMOS +NBTB +DEWJ +HACW +AMOV +HACV +AMOT +ROAM +SRDX +PWB +HREX +PWC +PWE +ZEUS +CSWC +LMNR +SAAS +SRCE +LMNX +HABT +PWR +SRCL +PWV +PWX +PWZ +PHYS +SABR +AMPH +DVYA +PXE +PXD +DVYE +AMPE +PXF +PXI +PXH +AMRB +ROCK +AMRC +PXJ +IDHQ +PXQ +PXS +PXR +FLAG +PVTBP +HAFC +FLAT +LMRK +BPTH +CSWI +AMSF +AMSC +HBHCL +DEZU +PYN +SRET +PYT +PYS +ROBO +MPSX +PYZ +AMRS +AMRN +SREV +PZA +PZC +PZE +AMRK +PZD +PZG +AMRI +PZI +AMTG +AMTD +PZN +SAGG +SAGE +PZT +ANDAR +ANDAU +HAHA +ANDAW +MPWR +AMSG +RODM +RODI +SAEX +AMUB +CBYL +UGLD +AMTX +SAFM +NYLD.A +SAFT +TDIV +NSYS +SAIA +IDLV +SAIC +ROGS +BKEPP +FLEX +IDMO +AMWD +GOGL +FLDM +GOGO +IDLB +TUMI +HAIN +PICO +FLGE +PICK +SRLP +SRLN +HRMN +EIDO +IDOG +QLGC +DWCH +HALL +HALO +SAJA +DWAQ +DWAS +DWAT +ROIC +ROIA +HAKD +HAKK +QAI +PICB +JXSB +FLIC +GOLD +QAT +AMZA +SAMG +CTAA +FLIR +NTAP +ROLA +DFBG +QLIK +IUSB +ROLL +SALE +TDOC +CTBI +SALM +SRNE +SALT +ROKA +CTAS +AMZN +SRPT +IDSA +FLKS +TUTI +OFED +QDF +NTCT +GOOD +IUSG +SAND +EIGI +IDRA +TUSA +SANM +IUSV +EIGR +SANW +QED +QEH +DWFI +GPIAU +CCBG +GPIAW +QEP +NTEC +FLML +TDTF +SRSC +CCCR +NTES +CCCL +TDTT +DWIN +HRTG +GOOG +NCBS +RBPAA +IDSY +TUTT +IDTI +ROOF +SRTY +GORO +AMSWA +SASR +FLOT +QHC +FLOW +NTGR +PILL +RORO +CTHR +QID +HASI +HRTX +ZFGN +ANAT +NTIC +LNCE +NTIP +CRESY +PINC +ANCB +CTIC +CTIB +SAVE +EZPW +CCIH +OFIX +GRP.U +PILS +IDXG +HAUD +SATS +IDXJ +ANDE +ANDA +ROSG +ROST +IDXX +FLQD +SAUC +FLQE +ANCX +CLDCW +FLQG +DWLV +FLQH +ANET +NCIT +OFLX +GOVT +QLD +QLC +FLTB +ROVI +QLS +HRZN +NTLA +LNDC +FLRN +CTLT +DFND +FLRT +HAWK +ANFI +QMN +HAWX +ROUS +CTMX +ANGO +ANGL +LNGR +ANGI +NCLH +UHAL +PIRS +FLTR +FLTX +QLTB +QLTA +CTNN +HAYN +QLTC +PZRX +QLTI +SGYPU +CCLP +EIRL +SGYPW +FLWS +CCNE +ANIP +DWSN +ANIK +CCMP +FLXN +CCOI +DFRG +IVAC +QQQ +NCMI +IVAL +ROYT +TEAR +QLYS +NTRA +NTRI +FLXS +JHDG +DWTI +CTRV +CTRP +DWTR +QSR +CTRN +CTRL +NCOM +LNKD +TEAM +CTRE +SSBI +CCRN +HBAN +TECS +QTM +CCRC +TECZ +QTS +CTSO +PZZA +SBAC +CTSH +CATYW +DFVS +NTRS +DFVL +HSBC +QUS +TECH +TECD +TECL +MTB.W +RPAI +SBBX +HBCP +HSEA +HSEB +QVM +SBCF +SBCP +GNCMA +NCTY +CCUR +HSCZ +TEDU +GPAC +IEFA +ZTEST +SBBP +SSFN +CTWS +TVIZ +TVIX +SBEU +FMAT +HSGX +IEIL +CTXS +AMBCW +TVIA +TEGP +NTWK +HSIC +JHMU +JHMS +JHMT +HSII +CCXI +CCXE +SBGL +ANSS +HBHC +IVLU +LNTH +SBGI +IEIS +AMSGP +FMBH +FMBI +ANTX +JHMA +JHME +JHMF +SBFG +JHMC +JYNT +ANTM +JHMI +WNRL +JHMH +JHMM +ANTH +JHML +HSKA +HBIO +KODK.A +SBIO +FMER +IEMG +HPTRP +IELG +VKTX +MFINL +SHLDW +OXBR +TENX +DXCM +GPIA +GPIC +DGAZ +SSKN +IVOG +DGAS +QMEX +IVOP +IVOO +RAD +IVOV +RAI +RAS +RAX +HSON +RIBTW +HBNC +NUAN +RBA +RBC +RBL +CUBN +TVPT +RBS +AAC +CUBI +HSNI +SBLK +CUBE +AAL +CUBA +AAN +HBMD +AAP +RCD +SSNC +AAT +AAU +AAV +RCG +RCI +RCL +SSNI +RYAAY +ABB +NDAQ +OXFD +ABC +RCS +ABE +LMRKP +ABG +TERP +ABM +IESC +IVTY +RDC +ABR +DXGE +SBOT +ABT +IESM +RDI +ABX +ABY +CUBS +RDN +ACC +OGCP +SBND +SBNA +SBNB +ACH +RDY +ACM +ACN +ACP +CUDA +HSPX +ACU +ACV +ACW +REG +ACY +REI +REK +REN +REM +SBNY +ADC +RES +REV +REX +REW +ADI +REZ +ADK +ADM +ADP +FFBCW +ADS +RFG +RFI +ADX +BRAZ +ADZ +IEUS +SBRA +FMNB +XRAY +IEUR +RFP +AEB +BRAQ +AED +BABA +SBPH +AEE +RFT +AEG +RFV +AEH +OGEN +AEK +AEL +AEM +TESO +AEO +FMLP +AEP +GPOR +RGA +BRCD +AER +AES +RGC +AET +SSRI +GALTW +GALTU +AEY +RGI +TESS +AFA +RGR +AFB +AFC +RGT +RGS +AFG +AFH +SBSI +GPRK +AFI +AFK +GPRO +AFL +BABY +BABS +AFT +XRDC +NUGT +AFW +RHI +LOAN +AGA +RHP +RHS +AGC +AGD +MACK +QMOM +RHT +AGF +MRCC +AGG +AGI +HSTM +AGM +AGN +AGO +AGQ +AGR +DXJC +RIC +RIF +AGU +DXJF +RIG +SSTK +AGX +DXJH +AGZ +RIO +SBSA +TEVA +DGII +AHC +DXJR +DXJS +GPRE +DXJT +RIV +MRCY +AHH +BRFS +OXLC +AHL +LOCK +RJA +AHP +SBUS +LOCO +AHS +AHT +RJD +RJF +RJI +SSWN +SBUX +RJN +AIA +AIB +AIC +RPTP +BREW +AIF +AIG +DXKW +RPRX +RJZ +DGLD +AIN +AIQ +AIR +AIT +AIV +DXLG +AIW +AIY +AIZ +AJG +ZVZZT +RLI +DGLY +AJX +RLH +YDIV +RLJ +ZVZZC +SSYS +AKG +RLY +KLAC +BWL.A +AKP +LODE +AKR +RMD +AKS +BRID +MRGR +RMP +FMSA +RMR +ALB +RMT +ALD +ALE +ALG +ALJ +ALK +ALL +ALN +ALP +LOGI +ALR +YDKN +LOGM +RNG +ALV +ALX +RPXC +RNN +RNP +KLDX +AMC +KLDW +RNR +AMD +NDLS +AME +YUMA +MAIN +AMG +AMH +YUME +ZGNX +AMJ +MAGS +AMP +BRKS +AMS +BRKR +AMT +DXPE +AMU +ROG +AMX +BRKL +MRIN +ROL +ROK +ROM +ROP +DXPS +AND +CUNB +ANF +ROX +ANH +MRLN +RPD +RPG +ANW +CDNA +ANY +RPM +AOA +AOD +RPT +RPV +AOI +AOK +AOM +AON +AOR +AOS +DGRE +KLEM +RQI +CUPM +APA +APB +APC +APD +CFCOU +APF +CFCOW +CDNS +APH +APO +RRC +RRD +APT +APU +RRF +DGSE +MRNS +DXUS +RRR +DGRW +KLIC +MAMS +CDOR +DGRS +DGRO +RSG +BANF +BANC +XRLV +RSP +RSO +ARA +DXTR +ARC +RST +ARE +RSX +ARH +ARI +CURE +ARL +ARR +HTBX +ARU +STBA +ARW +RTH +RTK +RTM +HCAP +RTN +AKO.B +AKO.A +ASA +HTCH +ASB +ASC +RTR +NDRM +ASG +ASH +BANX +TWER +NDRO +LONE +SCAP +ASM +BANR +SCAI +STBZ +NURO +STAF +ASR +STAG +AST +ASX +STAA +RUN +MANH +CUTR +HTBI +HTBK +STAR +ATI +MANU +MANT +HCAC +ATO +ATR +STAY +HCCI +ATU +ATV +ATW +WOOD +WOOF +CDTI +DXYN +RVP +STDY +RVT +NUVA +SCCO +LOPE +AUO +RWC +NUTR +GOVNI +RWJ +AUY +RWL +RWK +UIHC +RWM +RWO +AVA +RWR +AVB +RWT +IFEU +AVD +BRSS +RWV +AVG +RWX +AVH +RWW +NDSN +AVK +CDTX +AVP +MRRL +AVT +RXD +AVV +RXI +AVX +AVY +RXL +MASI +HTGC +RXN +BASI +MRTX +TWIN +AWF +FPP.W +AWH +HTGM +AWI +AWK +AWP +AWR +HTGX +LORL +HTGZ +RYF +HTGY +RYE +IFGL +MARA +BATS +RYH +AWX +RYJ +RYI +RYN +RYT +OGXI +MARK +AXE +STEM +RYU +AXL +AXN +STFC +RZA +AXP +MRTN +AXR +RZB +AXS +AXU +RZG +BPFHW +CDXS +BPFHP +AYA +MAUI +FNCF +RZV +AYI +FNCL +CDXC +KMI.W +HCHC +AOSL +AYR +AYT +FNCX +MATF +MRUS +FNBC +MATH +MATN +MATR +MATW +AZN +MRVC +AZO +HTHT +MATX +MRVL +AZZ +SCHZ +SCHX +IFLY +SCIF +SCID +CDZI +TFLO +SCIN +SCIJ +SCIX +SCIU +IFMI +VLRS +TWLO +FNDA +FNDB +FNDC +SCHF +FNDE +SCHG +FNDF +SCHD +SCHE +SCHB +SCHC +STIP +SCHA +SCHN +SCHO +SCHL +SCHM +SCHH +KLRE +SCHV +SCHW +FNDX +SCHR +TWMC +SCHP +HCKT +STLY +MAYS +VLTC +TWOU +BVXVW +FNGN +BRZU +LOXO +IFON +HCLP +SCKT +PKBK +STKL +HTLD +HTLF +FNFG +LOWC +STKS +SAA +OSBCP +FNFV +TWOK +SAH +SAM +SAL +STLD +SAN +WTFCM +SAQ +SAP +SAR +WTFCW +SBB +SCMP +SBH +NVAX +SBI +SBM +STMP +BAA +SBR +FNHC +BAB +BAC +OHAI +SBS +STML +SBV +BAF +CVBF +BAH +SBW +SBY +BAK +BAL +BAM +VLUE +BAP +SCC +SCLN +BAS +SCE +SCD +SCG +SCI +BAX +SCJ +SCM +STNG +SCL +SCO \ No newline at end of file diff --git a/yahoo-quotes/spring-cloud-starter-stream-source-yahoo-quotes/src/test/java/org/springframework/cloud/stream/app/yahoo/quotes/source/YahooQuotesSourceApplicationTests.java b/yahoo-quotes/spring-cloud-starter-stream-source-yahoo-quotes/src/test/java/org/springframework/cloud/stream/app/yahoo/quotes/source/YahooQuotesSourceApplicationTests.java new file mode 100644 index 000000000..6c37a8591 --- /dev/null +++ b/yahoo-quotes/spring-cloud-starter-stream-source-yahoo-quotes/src/test/java/org/springframework/cloud/stream/app/yahoo/quotes/source/YahooQuotesSourceApplicationTests.java @@ -0,0 +1,126 @@ +/* + * Copyright 2016 original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.springframework.cloud.stream.app.yahoo.quotes.source; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Random; +import java.util.concurrent.TimeUnit; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.test.IntegrationTest; +import org.springframework.boot.test.SpringApplicationConfiguration; +import org.springframework.cloud.stream.annotation.Bindings; +import org.springframework.cloud.stream.messaging.Source; +import org.springframework.cloud.stream.test.binder.MessageCollector; +import org.springframework.context.annotation.Bean; +import org.springframework.messaging.Message; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.util.StringUtils; + +import junit.framework.Assert; + +/** + * @author Vinicius Carvalho + */ +@RunWith(SpringJUnit4ClassRunner.class) +@SpringApplicationConfiguration(classes = YahooQuotesSourceApplicationTests.TestYahooQuotesSourceApplication.class) +@DirtiesContext +public abstract class YahooQuotesSourceApplicationTests { + + @Autowired + @Bindings(YahooQuotesSourceConfiguration.class) + protected Source yahooSource; + + @Autowired + protected MessageCollector messageCollector; + + @IntegrationTest({ "yahoo.quotes.cronExpression=0/1 * * * * *", + "yahoo.quotes.zone=EST", "yahoo.quotes.symbols=GOOGL" }) + public static class ReceiveOneTests extends YahooQuotesSourceApplicationTests { + + @Test + public void test() throws Exception { + Message received = messageCollector.forChannel(yahooSource.output()) + .poll(5, TimeUnit.SECONDS); + Assert.assertNotNull(received); + } + + } + + @IntegrationTest({ "yahoo.quotes.cronExpression=0/1 * * * * *", + "yahoo.quotes.zone=EST", "yahoo.quotes.symbols=AAPL,GOOGL" }) + public static class ReceiveMultipleTests extends YahooQuotesSourceApplicationTests { + + @Test + public void test() throws Exception { + Message received = messageCollector.forChannel(yahooSource.output()) + .poll(5, TimeUnit.SECONDS); + Assert.assertNotNull(received); + } + + } + + @SpringBootApplication + public static class TestYahooQuotesSourceApplication { + + @Bean + public YahooQuotesClient quotesClient() { + return new MockingYahooQuotesClient(); + } + } + + public static class MockingYahooQuotesClient implements YahooQuotesClient { + + @Override + public List> fetchQuotes(List symbols, + String filter) { + List> result = new ArrayList<>(); + for (String symbol : symbols) { + Map quote = new HashMap<>(); + quote.put("symbol", symbol); + quote.putAll(randomFields(filter)); + result.add(quote); + } + return result; + } + + private Map randomFields(String filter) { + Map properties = new HashMap<>(); + Random random = new Random(); + if (StringUtils.isEmpty(filter)) { + properties.put("foo", "bar"); + } + else { + String[] fields = filter.split(","); + for (String field : fields) { + properties.put(field, random.nextInt()); + } + } + + return properties; + } + } +}