Permalink
Cannot retrieve contributors at this time
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
bullish/editions/widgets.rb
Go to fileThis commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
293 lines (249 sloc)
6.83 KB
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# frozen_string_literal: true | |
module Editions | |
module Widgets | |
def index_performance | |
[ | |
generic_title('Performance'), | |
sp500_performance, | |
nasdaq_performance, | |
dowjones_performance | |
] | |
end | |
def index_summary | |
[ | |
generic_title('S&P 500'), | |
Templates::Element.spacer('15px'), | |
stats_summary(ticker(:sp500)), | |
generic_title('Nasdaq'), | |
Templates::Element.spacer('15px'), | |
stats_summary(ticker(:nasdaq)), | |
generic_title('Dow Jones'), | |
Templates::Element.spacer('15px'), | |
stats_summary(ticker(:dowjones)), | |
generic_title('Bitcoin'), | |
Templates::Element.spacer('15px'), | |
stats_summary(ticker(:bitcoin)) | |
] | |
end | |
def index_week_summary | |
[ | |
generic_title('Week', 'Summary'), | |
Templates::Element.spacer('25px'), | |
stats_week_summary(ticker(:sp500)), | |
stats_week_summary(ticker(:nasdaq)), | |
stats_week_summary(ticker(:dowjones)), | |
stats_week_summary(ticker(:bitcoin)) | |
] | |
end | |
def sector_summary | |
[ | |
generic_title('Sector', 'Performance'), | |
Templates::Element.spacer('25px'), | |
Services::Sector.data.sample(6).map do |sector| | |
[ | |
generic_title(sector.name), | |
Templates::Element.spacer('15px'), | |
stats_summary(sector) | |
] | |
end | |
] | |
end | |
def trending(limit = Services::Trending::LIMIT) | |
[ | |
generic_title('Trending'), | |
Services::Trending.new.stocks(limit).map do |ticker| | |
stats_top(ticker) | |
end, | |
Templates::Element.spacer('20px') | |
] | |
end | |
def crypto | |
[ | |
generic_title('Crypto'), | |
Templates::Element.spacer('25px'), | |
Services::Crypto.data.map do |ticker| | |
[ | |
generic_title(ticker.name, ticker.price), | |
Templates::Element.spacer('15px'), | |
stats_summary(ticker) | |
] | |
end | |
] | |
end | |
def world | |
[ | |
generic_title('International'), | |
Templates::Element.spacer('35px'), | |
Services::World.data.sample(4).map do |ticker| | |
[ | |
generic_title(ticker.name), | |
Templates::Element.spacer('15px'), | |
stats_summary(ticker) | |
] | |
end | |
] | |
end | |
def world_futures | |
futures = Services::Futures.world.map do |key, value| | |
name = Services::Futures::ALIAS[key] | |
data = Templates::Element::Item.new( | |
title: name[:title], | |
subtitle: name[:subtitle], | |
value: value | |
) | |
Templates::Element.item(data) | |
end | |
[ | |
generic_title('Tomorrow', 'Asia & Europe Futures'), | |
Templates::Element.spacer('25px'), | |
futures | |
] | |
end | |
def top_gainers_losers_performance | |
[ | |
top_gainers_title, | |
top_gainers_performance, | |
Templates::Element.spacer('20px'), | |
Templates::Element.divider, | |
top_losers_tittle, | |
top_losers_performance, | |
Templates::Element.spacer('20px') | |
] | |
end | |
def top_gainers_losers | |
[ | |
top_gainers_title, | |
Templates::Element.spacer('25px'), | |
top_gainers_items, | |
Templates::Element.divider, | |
top_losers_tittle, | |
Templates::Element.spacer('25px'), | |
top_losers_items, | |
Templates::Element.divider | |
] | |
end | |
def top_gainers_items | |
top_gainers.map do |stock| | |
title = stock.symbol + ' · ' + stock.price.to_s | |
subtitle = stock.name | |
generic_item(title, stock.stats['1D'], subtitle) | |
end | |
end | |
def top_losers_items | |
top_losers.map do |stock| | |
title = stock.symbol + ' · ' + stock.price.to_s | |
subtitle = stock.name | |
generic_item(title, stock.stats['1D'], subtitle) | |
end | |
end | |
def top_gainers_performance | |
top_gainers.map do |stock| | |
stats_top(stock) | |
end | |
end | |
def top_losers_performance | |
top_losers.map do |stock| | |
stats_top(stock) | |
rescue StandardError => e | |
Service::Log.error(e.message) | |
nil | |
end.compact | |
end | |
def top_gainers | |
@top_gainers ||= Services::Top.new.gainers | |
end | |
def top_losers | |
@top_losers ||= Services::Top.new.losers | |
end | |
def futures | |
@futures ||= Services::Futures.usa | |
end | |
def generic_title(title, subtitle = nil, undertitle = nil) | |
data = Templates::Element::Title.new( | |
title: title, | |
subtitle: subtitle, | |
undertitle: undertitle | |
) | |
Templates::Element.title(data) | |
end | |
def main_title(subtitle) | |
generic_title( | |
formatted_date, | |
subtitle, | |
formatted_time | |
) | |
end | |
def top_gainers_title | |
generic_title('Top Gainers') | |
end | |
def top_losers_tittle | |
generic_title('Top Losers') | |
end | |
def item_futures(key) | |
data = Templates::Element::Item.new( | |
title: Services::Ticker::ALIAS[key], | |
symbol: Services::Ticker::INDEX[key], | |
value: futures[key] | |
) | |
Templates::Element.item(data) | |
end | |
def generic_item(title, value, subtitle = nil, undertitle = nil) | |
data = Templates::Element::Item.new( | |
title: title, | |
subtitle: subtitle, | |
undertitle: undertitle, | |
value: value | |
) | |
Templates::Element.item(data) | |
end | |
def stats(ticker, title = nil, subtitle = nil) | |
performance = ticker.stats | |
title ||= Services::Ticker::ALIAS[ticker.key] || ticker.name | |
subtitle ||= ticker.price | |
symbol = Services::Ticker::INDEX[ticker.key] || ticker.symbol | |
news = ticker.news || {} | |
data = Templates::Element::Stats.new( | |
title: title, | |
subtitle: subtitle, | |
symbol: symbol, | |
news: news[:headline], | |
news_url: news[:url], | |
news_source: news[:source], | |
_1D: performance['1D'], | |
_5D: performance['5D'], | |
_1M: performance['1M'], | |
_3M: performance['3M'], | |
_6M: performance['6M'], | |
_1Y: performance['1Y'], | |
_5Y: performance['5Y'], | |
_10Y: performance['10Y'] | |
) | |
Templates::Element.stats(data) | |
end | |
def stats_top(stock) | |
title = stock.symbol + ' · ' + stock.price.to_s | |
subtitle = stock.name | |
stats(stock, title, subtitle) | |
end | |
def stats_summary(ticker) | |
data = Templates::Element::Group.new( | |
title1: 'Year to date', | |
subtitle1: formatted_date, | |
value1: ticker.stats['YTD'], | |
title2: 'All time high', | |
subtitle2: ticker.peak.date, | |
value2: ticker.peak.diff | |
) | |
Templates::Element.group(data) | |
end | |
def stats_week_summary(ticker) | |
data = Templates::Element::Item.new( | |
title: ticker.name, | |
subtitle: ticker.price, | |
symbol: ticker.symbol, | |
value: ticker.stats['5D'] | |
) | |
Templates::Element.item(data) | |
end | |
end | |
end |