UNPKG

8.66 kBJavaScriptView Raw
1const LibraryError = require('../globals/LibraryError');
2const Robinhood = require('../broker/robinhood/Robinhood');
3const request = require('request');
4const cheerio = require('cheerio');
5
6/**
7 * Find and filter securities based on certain criteria.
8 */
9class Query {
10
11 /**
12 * Searches for a given symbol based on the given string.
13 * @author Torrey Leonard <https://github.com/Ladinn>
14 * @param {String} string - Search query.
15 * @returns {Promise<Array>}
16 */
17 static search(string) {
18 return new Promise((resolve, reject) => {
19 request({
20 uri: 'https://autoc.finance.yahoo.com/autoc?query=' + string + '&region=1&lang=en'
21 }, (error, response, body) => {
22 if (error) reject(error);
23 else if (response.statusCode !== 200) reject(new LibraryError(body));
24 else try {
25 let result = JSON.parse(body).ResultSet.Result;
26 if (result instanceof Array) resolve(result);
27 else reject(new LibraryError(body));
28 } catch (error) {
29 reject(error);
30 }
31 })
32 })
33 }
34
35 /**
36 * Returns an array of quotes for the best performing 'x' amount of stocks.
37 * @author Torrey Leonard <https://github.com/Ladinn>
38 * @param {Number} count
39 * @returns {Promise<Array>}
40 */
41 static getTopGainers(count) {
42 return new Promise((resolve, reject) => {
43 request({
44 uri: 'https://query2.finance.yahoo.com/v1/finance/screener/predefined/saved?formatted=false&lang=en-US&region=US&scrIds=day_gainers&count=' + count + '&corsDomain=finance.yahoo.com'
45 }, (error, response, body) => {
46 if (error) reject(error);
47 else if (response.statusCode !== 200) reject(new LibraryError(body));
48 else try {
49 let result = JSON.parse(body).finance.result[0].quotes;
50 if (result instanceof Array) resolve(result);
51 else reject(new LibraryError(body));
52 } catch (error) {
53 reject(error);
54 }
55 })
56 })
57 }
58
59 /**
60 * Returns an array of quotes for the worst performing 'x' amount of stocks.
61 * @author Torrey Leonard <https://github.com/Ladinn>
62 * @param {Number} count
63 * @returns {Promise<Array>}
64 */
65 static getTopLosers(count) {
66 return new Promise((resolve, reject) => {
67 request({
68 uri: 'https://query2.finance.yahoo.com/v1/finance/screener/predefined/saved?formatted=false&lang=en-US&region=US&scrIds=day_losers&count=' + count + '&corsDomain=finance.yahoo.com'
69 }, (error, response, body) => {
70 if (error) reject(error);
71 else if (response.statusCode !== 200) reject(new LibraryError(body));
72 else try {
73 let result = JSON.parse(body).finance.result[0].quotes;
74 if (result instanceof Array) resolve(result);
75 else reject(new LibraryError(body));
76 } catch (error) {
77 reject(error);
78 }
79 })
80 })
81 }
82
83 /**
84 * Returns an array of quotes for 'x' amount of stocks with the highest volume today.
85 * @author Torrey Leonard <https://github.com/Ladinn>
86 * @param {Number} count
87 * @returns {Promise<Array>}
88 */
89 static getHighestVolume(count) {
90 return new Promise((resolve, reject) => {
91 request({
92 uri: 'https://query2.finance.yahoo.com/v1/finance/screener/predefined/saved?formatted=false&lang=en-US&region=US&scrIds=most_actives&count=' + count + '&corsDomain=finance.yahoo.com'
93 }, (error, response, body) => {
94 if (error) reject(error);
95 else if (response.statusCode !== 200) reject(new LibraryError(body));
96 else try {
97 let result = JSON.parse(body).finance.result[0].quotes;
98 if (result instanceof Array) resolve(result);
99 else reject(new LibraryError(body));
100 } catch (error) {
101 reject(error);
102 }
103 })
104 })
105 }
106
107 /**
108 * Returns an array of quotes for options with the highest open interest.
109 * @author Torrey Leonard <https://github.com/Ladinn>
110 * @param {Number} count
111 * @returns {Promise<Array>}
112 */
113 static getHighestOpenInterest(count) {
114 return new Promise((resolve, reject) => {
115 request({
116 uri: 'https://query2.finance.yahoo.com/v1/finance/screener/predefined/saved?formatted=false&lang=en-US&region=US&scrIds=65f51cea-8dc8-4e56-9f99-6ef7720eb69c&count=' + count + '&corsDomain=finance.yahoo.com'
117 }, (error, response, body) => {
118 if (error) reject(error);
119 else if (response.statusCode !== 200) reject(new LibraryError(body));
120 else try {
121 let result = JSON.parse(body).finance.result[0].quotes;
122 if (result instanceof Array) resolve(result);
123 else reject(new LibraryError(body));
124 } catch (error) {
125 reject(error);
126 }
127 })
128 })
129 }
130
131 /**
132 * Returns an array of quotes for the most actively traded ETFs.
133 * @author Torrey Leonard <https://github.com/Ladinn>
134 * @param {Number} count
135 * @returns {Promise<Array>}
136 */
137 static getTopETFs(count) {
138 return new Promise((resolve, reject) => {
139 request({
140 uri: 'https://query2.finance.yahoo.com/v1/finance/screener/predefined/saved?formatted=false&lang=en-US&region=US&scrIds=top_etfs_us&count=' + count + '&corsDomain=finance.yahoo.com'
141 }, (error, response, body) => {
142 if (error) reject(error);
143 else if (response.statusCode !== 200) reject(new LibraryError(body));
144 else try {
145 let result = JSON.parse(body).finance.result[0].quotes;
146 if (result instanceof Array) resolve(result);
147 else reject(new LibraryError(body));
148 } catch (error) {
149 reject(error);
150 }
151 })
152 })
153 }
154
155 /**
156 * Returns an array of equities similar to the one given.
157 * @author Torrey Leonard <https://github.com/Ladinn>
158 * @param {String} symbol
159 * @returns {Promise<Array>}
160 */
161 static getSimilar(symbol) {
162 return new Promise((resolve, reject) => {
163 request({
164 uri: 'https://query1.finance.yahoo.com/v6/finance/recommendationsbysymbol/' + symbol
165 }, (error, response, body) => {
166 if (error) reject(error);
167 else if (response.statusCode !== 200) reject(new LibraryError(body));
168 else try {
169 let result = JSON.parse(body).finance.result[0].recommendedSymbols;
170 if (result instanceof Array) resolve(result);
171 else reject(new LibraryError(body));
172 } catch (error) {
173 reject(error);
174 }
175 })
176 })
177 }
178
179 /**
180 * Returns an array of 'x' amount of trending symbols on Yahoo Finance.
181 * @author Torrey Leonard <https://github.com/Ladinn>
182 * @param {Number} count
183 * @returns {Promise<Array>}
184 */
185 static getTrendingSymbols(count) {
186 return new Promise((resolve, reject) => {
187 request({
188 uri: 'https://query1.finance.yahoo.com/v1/finance/trending/US?lang=en-US&region=US&count=' + count + '&corsDomain=finance.yahoo.com'
189 }, (error, response, body) => {
190 if (error) reject(error);
191 else if (response.statusCode !== 200) reject(new LibraryError(body));
192 else try {
193 const json = JSON.parse(body).finance.result[0].quotes;
194 let array = [];
195 json.forEach(o => {
196 array.push(o.symbol);
197 });
198 resolve(array);
199 } catch (error) {
200 reject(error);
201 }
202 })
203 })
204 }
205
206 /**
207 * Returns an array of objects with information on companies that are reporting earnings within 'x' number of days, along with estimates and call URLs.
208 * @author Torrey Leonard <https://github.com/Ladinn>
209 * @param {Number} days
210 * @returns {Promise<Array>}
211 */
212 static getEarnings(days) {
213 return new Promise((resolve, reject) => {
214 request({
215 uri: "https://api.robinhood.com/marketdata/earnings/",
216 qs: {
217 range: days + "day"
218 }
219 }, (error, response, body) => {
220 return Robinhood.handleResponse(error, response, body, null, resolve, reject);
221 })
222 })
223 };
224
225 /**
226 * Returns an object containing this company's past and future earnings data.
227 * @author Torrey Leonard <https://github.com/Ladinn>
228 * @param {String} symbol
229 * @returns {Promise<Object>}
230 */
231 static getEarningsBySymbol(symbol) {
232 return new Promise((resolve, reject) => {
233 request({
234 uri: "http://finance.yahoo.com/q/ks?s=",
235 qs: {
236 symbol: symbol
237 }
238 }, (error, response, body) => {
239 return Robinhood.handleResponse(error, response, body, null, resolve, reject);
240 })
241 })
242 }
243
244 // static getFinancials(symbol) {
245 // return new Promise((resolve, reject) => {
246 // request({
247 // uri: "http://finance.yahoo.com/q/ks",
248 // qs: {
249 // s: symbol
250 // }
251 // }, (error, response, body) => {
252 // if (error) reject(error);
253 // else if (response.statusCode !== 200) reject(new LibraryError(body));
254 // else {
255 // let keys = [];
256 // let data = [];
257 // const $ = cheerio.load(body);
258 // const td = $('.table-qsp-stats');
259 // $(td).each((j, val) => {
260 // console.log(val);
261 // keys[j] = $(val).text();
262 // });
263 // $(td).each(function(j, val) {
264 // data[j] = $(val).text();
265 // });
266 // resolve(null);
267 // }
268 // })
269 // })
270 // }
271
272}
273
274module.exports = Query;
\No newline at end of file