Skip to content
This repository has been archived by the owner on May 5, 2020. It is now read-only.

StefanoMartin/FinnhubRB

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

22 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

FinnhubRB Gem Version

📢 Caution

04-05-2020 - This library has been archived.

Finnhub is an API for retrieving Stock market data in JSON or CSV format. FinnhubRB is a wrapper Gem to use Finnhub with Ruby. FinnhubRB is based on the HTTP API of Finnhub.

To install FinnhubRB: gem install finnhubrb

To use it in your application: require "finnhub"

How to test

To test the Gem create a config.yml file inside the folder /spec with inside a line

key: [YOUR KEY]

Then run "rspec spec/test_all.rb".

Support

  • Without a premium account, testing is hard and I could have missed something. Any bug, suggestions and improvements are more than welcome. Please do not be shy to create issues or pull requests. Premium features are implemented but untested.
  • This is a personal project, any stars for giving your support will make a man happy.

Client

To contact Alpha Vantage you need to use a valid key that you can require from here.

To setup your clients use:

client = Finnhub::Client.new(key: "YOURKEY")

If you want to see the request that the client will do to Finnhub you can setup verbose equal to true.

  client.verbose = true # You can setup this during the initialization too

Stock

To analyse a stock you can start by choosing which stock exchange you want to analyse.

client.stock_exchanges # Retrieve the available stock exchanges on Finnhub (Finnhub::Stock_Exchange instances)
client.stock_exchanges(plain: true) # As above, but it returns simply the output of the request
stock_exchange = client.stock_exchanges(name: "NAME_CRYPTO_EXCHANGE") # Create a single instance of Finnhub::Stock_Exchange

After that you can choose in that crypto exchange which symbol you want to check.

stock_exchange.symbols # Retrieve the available stock symbols on the chosen stock exchange (Finnhub::Stock instances)
stock_exchange.symbols(plain: true) # As above, but it returns simply the output of the request

In alternative you can create a stock instance directly:.

stock = client.stock symbol: "AAPL"

Finnhub::Stock is used to manage a stock class. Several methods are available under this class:

  stock.symbol # Return the symbol
  stock.profile # (PREMIUM) Retrieve profile of the stock
  stock.profile(isin: "US5949181045") # (PREMIUM) Retrieve profile of the stock by its isin
  stock.profile(cusip: "023135106") # (PREMIUM) Retrieve profile of the stock by its cusip
  stock.ceo_compensation # Retrieve compensation of the stock's CEO
  stock.executive # Retrieve list of company's executives
  stock.recommendation # Retrieve recommendation about this stock
  stock.price_target # Retrieve price target about this stock
  stock.upgrade_downgrade # Retrieve latest stock upgrade and downgrade
  stock.option_chain # Retrieve option chain about this stock
  stock.earnings # Retrieve earnings about this stock
  stock.metrics # Retrieve key metrics
  stock.investors # Retrieve full list of investors
  stock.funds # Retrieve list of fund investors
  stock.financials # (PREMIUM) Retrieve standardized balances sheet
  stock.news # Retrieve news about this stock (only US)
  stock.major_development # Retrieve major development
  stock.sentiment # Retrieve social sentiment about this stock (only US)
  stock.peers(plain: true) # Retrieve peers company similar to the one chosen
  stock.peers # Like the previous one, but the results are Finnhub::Stock instances
  stock.pattern # Retrieve pattern
  stock.support_resistance # Retrieve support resistance
  stock.technical_indicators # Retrieve technical indicators
  stock.revenue_estimate # Retrieve revenue estimate
  stock.earnings_estimate  # Retrieve earnings estimate
  stock.earnings_calendar # Retrieve earnings calendar (you can add from and to)
  stock.dividends(from: Time.now-24*30*3600, to: Time.now) # Retrieve dividends
  stock.splits(from: Time.now-24*30*3600, to: Time.now) # Retrieve splits

To create a timeseries you can use:

  stock.timeseries(count: 100) # Return the last 100 entries (default count is 100)
  stock.timeseries(resolution: "D") # Resolution is daily "D", alternative are 1, 5, 15, 30, 60, D, W, M) where the numeric one are for minutes (default resolution is "D")
  stock.timeseries(from: Time.now-24*30*3600, to: Time.now) # Fetch from a date to another date (default from: nil, to: nil)
  stock.timeseries(format: "json") # Return the output in json or in csv (default format: "json")
  stock.timeseries(adjusted: true) # Return adjusted data (default false)

Remember count and from/to are exclusive. If you use one, you cannot use the other two. The methods "open", "high", "low", "close", "volume" and "status" will not work if you use format csv.

  timeseries = stock.timeseries(from: Time.now-24*30*3600, to: Time.now, resolution: 60)
  timeseries.output # Return output obtained from the request
  timeseries.timestamps # Return timestamps obtained from the request
  timeseries.open # Return open obtained from the request  
  timeseries.low # Return low obtained from the request
  timeseries.close # Return close obtained from the request
  timeseries.volume # Return volume obtained from the request
  timeseries.status # Return status obtained from the request  

(PREMIUM) To manage tick data use:

  tick = stock.tick(from: Time.now-24*30*3600, to: Time.now) # Create stick data
  tick.output # Return output obtained from the request
  tick.timestamps # Return timestamps obtained from the request
  tick.price  # Return price  obtained from the request
  tick.volume # Return volume obtained from the request
  tick.status # Return status obtained from the request  

(PREMIUM) To retrieve transcripts you can use:

client.transcripts # Retrieve the available transcripts on Finnhub (Finnhub::Transcript instances)
client.transcripts(plain: true) # As above, but it returns simply the output of the request
client.transcripts[0].transcript # Retrieve the specific transcript

To handle indicators you can do:

  timeseries = stock.indicator(from: Time.now-24*30*3600, to: Time.now, resolution: 60, indicator: "sma", args: {timeperiod: 3})
  timeseries.sma # Return technical values (in this case is sma since the indicator)
  timeseries.output # Return output obtained from the request
  timeseries.timestamps # Return timestamps obtained from the request
  timeseries.open # Return open obtained from the request  
  timeseries.low # Return low obtained from the request
  timeseries.close # Return close obtained from the request
  timeseries.volume # Return volume obtained from the request
  timeseries.status # Return status obtained from the request  

Crypto

To analyse a crypto currency you should start by choosing which crypto exchange you want to analyse.

client.crypto_exchanges # Retrieve the available crypto exchanges on Finnhub (Finnhub::Crypto_Exchange instances)
client.crypto_exchanges(plain: true) # As above, but it returns simply the output of the request
crypto_exchange = client.crypto_exchange(name: "NAME_CRYPTO_EXCHANGE") # Create a single instance of Finnhub::Crypto_Exchange

After that you can choose, in that crypto exchange which symbol you want to check.

crypto_exchange.symbols # Retrieve the available crypto symbols on the chosen crypto exchange (Finnhub::Crypto_Symbol instances)
crypto_exchange.symbols(plain: true) # As above, but it returns simply the output of the request
crypto_symbol = crypto_exchange.symbol(symbol: "BTC") # Create a single instance of Finnhub::Crypto_Symbol

From crypto_symbol instance you can retrieve some interesting information.

crypto_symbol.exchange # Exchange of the crypto_symbol
crypto_symbol.hasWM # If it has week and month
crypto_symbol.displaySymbol # Displayed symbol
crypto_symbol.symbol # Symbol of the crypto currency

Furthermore you can create a timeseries with the same logic used for Stock timeseries.

  timeseries = crypto_symbol.timeseries(from: Time.now-24*30*3600, to: Time.now, resolution: 60)
  timeseries.output # Return output obtained from the request
  timeseris.timestamps # Return timestamps obtained from the request
  timeseries.open # Return open obtained from the request  
  timeseries.low # Return low obtained from the request
  timeseries.close # Return close obtained from the request
  timeseries.volume # Return volume obtained from the request
  timeseries.status # Return status obtained from the request  

Forex

To analyse a forex exchange you should start by choosing which forex exchange you want to analyse.

client.forex_exchanges # Retrieve the available forex exchanges on Finnhub (Finnhub::Forex_Exchange instances)
client.forex_exchanges(plain: true) # As above, but it returns simply the output of the request
forex_exchange = client.forex_exchange(name: "NAME_FOREX_EXCHANGE") # Create a single instance of Finnhub::Forex_Exchange

After that you can choose, in that forex exchange which symbol you want to check.

forex_exchange.symbols # Retrieve the available forex symbols on the chosen forex exchange (Finnhub::Forex_Symbol instances)
forex_exchange.symbols(plain: true) # As above, but it returns simply the output of the request
forex_symbol = forex_exchange.symbol(symbol: "USD") # Create a single instance of Finnhub::Forex_Symbol

From forex_symbol instance you can retrieve some interesting information.

forex_symbol.exchange # Exchange of the crypto_symbol
forex_symbol.hasWM # If it has week and month
forex_symbol.displaySymbol # Displayed symbol
forex_symbol.symbol # Symbol of the crypto currency

Furthermore you can create a timeseries with the same logic used for Stock timeseries.

  timeseries = forex_symbol.timeseries(from: Time.now-24*30*3600, to: Time.now, resolution: 60)
  timeseries.output # Return output obtained from the request
  timeseris.timestamps # Return timestamps obtained from the request
  timeseries.open # Return open obtained from the request  
  timeseries.low # Return low obtained from the request
  timeseries.close # Return close obtained from the request
  timeseries.volume # Return volume obtained from the request
  timeseries.status # Return status obtained from the request  

Merge

(PREMIUM) You can retrieve information about company that are merging in relation of a given country.

client.merge_countries # Retrieve the available merge countries on Finnhub (Finnhub::Merge_Country instances)
client.merge_countries(plain: true) # As above, but it returns simply the output of the request
country = client.merge_country(country: "France") # Create a single instance of Finnhub::Merge_Country
country.merger # Fetch information about the company that are going to merge

Economic Code

You can retrieve information about economic_codes.

client.economic_codes # Retrieve the available economic_codes on Finnhub (Finnhub::Economic_Code instances)
client.economic_codes(plain: true) # As above, but it returns simply the output of the request
economic = client.economic_code(code: "CODE") # Create a single instance of Finnhub::Economic_Code
economic.data # Data of economic_code
economic.data(plaint: true) # As above, but it returns simply the output of the request

News and calendar

You can retrieve news and calendar in the following way.

client.news(category: "forex") # Retrieve news by category (general, forex, crypto, merger) and by minId (default 0)
client.economic_calendar # Retrieve economic calendar
client.earnings_calendar # Retrieve earning calendar
client.ipo_calendar # Retrieve IPO calendar
client.ico_calendar # Retrieve ICO calendar

Websocket

Here an example of how to create websocket.

Thread.new do
  EM.run do
    websocket = client.websocket # Create websocket
    websocket.on :message do |event|
      result = event.data # Result is not parsed
    end
    websocket.on :close do |event|
      result = [:close, event.code, event.reason]
      websocket = nil
    end  
  end
end

websocket.subscribe("AAPL") # Subscribe to a stock
websocket.unsubscribe("AAPL") # Unubscribe to a stock

The symbol under subscribe/unsubscribe can be a string of a stock, a crypto_symbol or a forex_symbol. Or in alternative can be a Finnhub::Stock, Finnhub::Crypto_Symbol, or a Finnhub::Forex_Symbol instance.

Webhook

You can manage the webhook in the following way.

webhook = client.webhook # Instantiate a webhook
webhook.create(body: {'event': 'earnings', 'symbol': 'AAPL'}) # Create a new webhook
webhook.id #Retrieve id of the webhook
client.webhooks # List webhooks
client.webhooks(plain: true)  # As above, but it returns simply the output of the request
webhook.delete # Delete webhook

Other

client.covid # Retrieve United States Covid-19 info

Errors

Error from FinnhubRB are returned under Finnhub::Error exception. You can use e.code to retrieve the code returned to a not successful request.