Merge branch '3-create-universal-interface-for-exchange-data' into 'main'

Resolve "Create universal interface for exchange data"

Closes #3

See merge request finvis/usxi!4
This commit is contained in:
Carter Bertolini 2023-10-06 16:51:40 -04:00
commit e61d1a9a18
3 changed files with 186 additions and 13 deletions

View File

@ -1,14 +1,23 @@
import { createLogger, transports, format } from "winston";
import { PortfolioProvider } from "./interface/portfolio";
import { QuoteProvider } from "./interface/quote";
const logger = createLogger({
transports: [new transports.Console()],
format: format.combine(
format.colorize(),
format.timestamp(),
format.printf(({ timestamp, level, message }) => {
return `[${timestamp}] ${level}: ${message}`;
})
),
});
/**
* Represents an exchange, which provides access to a portfolio provider and a quote provider.
*/
export interface Exchange {
logger.info("Hello world!");
/**
* The portfolio provider for the exchange.
*/
readonly portfolioProvider: PortfolioProvider;
/**
* The quote provider for the exchange.
*/
readonly quoteProvider: QuoteProvider;
/**
* The name of the exchange.
*/
readonly name: string;
}

View File

@ -0,0 +1,99 @@
/**
* Represents a financial position in a portfolio.
*/
export class Position {
/**
* The price of the last trade made for this position.
*/
readonly lastTrade: number;
/**
* The date and time of the last trade made for this position.
*/
readonly lastTradeTime: Date;
/**
* The change in the position value.
*/
readonly change: number;
/**
* The percentage change in the position value.
*/
readonly changePercent: number;
/**
* The earnings per share of the position.
*/
readonly earningsPerShare: number;
/**
* The market capitalization of the position.
*/
readonly marketCap: number;
/**
* The symbol of the position.
*/
readonly symbol: string;
/**
* Represents a position in a portfolio.
* @constructor
* @param {number} lastTrade - The price of the last trade made for this position.
* @param {Date} lastTradeTime - The date and time of the last trade made for this position.
* @param {number} change - The change in the position value.
* @param {number} changePercent - The percentage change in the position value.
* @param {number} earningsPerShare - The earnings per share of the position.
* @param {number} marketCap - The market capitalization of the position.
* @param {string} symbol - The symbol of the position.
*/
constructor(
lastTrade: number,
lastTradeTime: Date,
change: number,
changePercent: number,
earningsPerShare: number,
marketCap: number,
symbol: string
) {
this.lastTrade = lastTrade;
this.lastTradeTime = lastTradeTime;
this.change = change;
this.changePercent = changePercent;
this.earningsPerShare = earningsPerShare;
this.marketCap = marketCap;
this.symbol = symbol;
}
}
/**
* Represents a portfolio of financial positions.
*/
export class Portfolio {
/**
* An array of positions held in the portfolio.
*/
readonly positions: Position[];
/**
* Creates a new Portfolio instance.
* @constructor
* @param {Position[]} positions - An array of Position objects representing the positions in the portfolio.
*/
constructor(positions: Position[]) {
this.positions = positions;
}
}
/**
* A provider for fetching a portfolio.
*/
export interface PortfolioProvider {
/**
* Fetches the portfolio.
* @returns A promise that resolves with the fetched portfolio.
*/
readonly fetchPortfolio: () => Promise<Portfolio>;
}

65
src/interface/quote.ts Normal file
View File

@ -0,0 +1,65 @@
/**
* Represents a stock quote.
*/
export class Quote {
/**
* The name of the company associated with this quote.
*/
readonly companyName: string;
/**
* The earnings per share of a company.
*/
readonly earningsPerShare: number;
/**
* The estimated earnings for a stock.
*/
readonly estimatedEarnings: number;
/**
* The price of the last trade for the security.
*/
readonly lastTrade: number;
/**
* The symbol of the financial instrument being quoted.
*/
readonly symbol: string;
/**
* Represents a quote for a particular stock.
* @constructor
* @param {string} companyName - The name of the company associated with the stock.
* @param {number} earningsPerShare - The earnings per share for the stock.
* @param {number} estimatedEarnings - The estimated earnings for the stock.
* @param {number} lastTrade - The last trade price for the stock.
* @param {string} symbol - The symbol for the stock.
*/
constructor(
companyName: string,
earningsPerShare: number,
estimatedEarnings: number,
lastTrade: number,
symbol: string
) {
this.companyName = companyName;
this.earningsPerShare = earningsPerShare;
this.estimatedEarnings = estimatedEarnings;
this.lastTrade = lastTrade;
this.symbol = symbol;
}
}
/**
* A provider for fetching stock quotes.
*/
export interface QuoteProvider {
/**
* Fetches a quote for the given stock symbol.
* @param symbol The stock symbol to fetch the quote for.
* @returns A Promise that resolves to a Quote object.
*/
readonly fetchQuote: (symbol: string) => Promise<Quote>;
}