Terminal stock & crypto price watcher and position tracker
- Live stock & crypto price quotes
- Track value of your stock positions
- Support for multiple cost basis lots
- Support for pre and post market price quotes
Download the pre-compiled binaries from the releases page and copy to a location in PATH
or see quick installs below
homebrew
brew install achannarasappa/tap/ticker
linux
curl -Ls https://api.github.com/repos/achannarasappa/ticker/releases/latest \
| grep -wo "https.*linux-amd64*.tar.gz" \
| wget -qi - \
&& tar -xvf ticker*.tar.gz ticker \
&& chmod +x ./ticker \
&& sudo mv ticker /usr/local/bin/
windows
winget install -e --id achannarasappa.ticker
docker
docker run -it --rm achannarasappa/ticker
Note: config file can be mounted from the host machine by using a bind mount with -v ~/.ticker.yaml:/.ticker.yaml
snap
sudo snap install ticker
Note: config file will need to be set with --config $HOME/ticker.yaml
since Snap does not allow access to dotfiles
These repositories are maintained by a third-party and may not have the latest versions available
MacPorts
sudo port selfupdate
sudo port install ticker
ticker -w NET,AAPL,TSLA
Option Name | Alias | Flag | Default | Description |
---|---|---|---|---|
--config | ~/.ticker.yaml |
config file location with watchlist and positions | ||
interval |
-i | --interval | 5 |
Refresh interval in seconds |
watchlist |
-w | --watchlist | comma separated list of symbols to watch | |
show-tags |
--show-tags | display currency, exchange name, and quote delay for each quote | ||
show-fundamentals |
--show-fundamentals | display open price, previous close, and day range | ||
show-separator |
--show-separator | layout with separators between each quote | ||
show-summary |
--show-summary | show total day change, total value, and total value change | ||
show-holdings |
--show-holdings | show holdings including weight, average cost, and quantity | ||
sort |
--sort | sort quotes on the UI - options are change percent (default), alpha , value , and user |
||
version |
--version | print the current version number | ||
debug |
enable debug logging to ./ticker-log-<date>.log |
Configuration is not required to watch stock price but is helpful when always watching the same stocks. Configuration can also be used to set cost basis lots which will in turn be used to show total gain or loss on any position.
# ~/.ticker.yaml
show-summary: true
show-tags: true
show-fundamentals: true
show-separator: true
show-holdings: true
interval: 5
currency: USD
currency-summary-only: false
watchlist:
- NET
- TEAM
- ESTC
- BTC-USD # Bitcoin price via Yahoo
- SOL.X # Solana price via Coinbase
- BIT-30MAY25-CDE.CB # Bitcoin futures contract price via Coinbase
lots:
- symbol: "ABNB"
quantity: 35.0
unit_cost: 146.00
- symbol: "ARKW"
quantity: 20.0
unit_cost: 152.25
- symbol: "ARKW"
quantity: 20.0
unit_cost: 145.35
fixed_cost: 7.00 # e.g. brokerage commission fee
groups:
- name: crypto
watchlist:
- SHIB-USD
- VGX-USD
holdings:
- symbol: SOL1-USD
quantity: 17
unit_cost: 159.10
- All properties in
.ticker.yaml
are optional - Symbols not on the watchlist that exists in
lots
are implicitly added to the watchlist - To add multiple cost basis lots (
quantity
,unit_cost
) for the samesymbol
, include two ore more entries - seeARKW
example above .ticker.yaml
can be set in user home directory, the current directory, or XDG config home
With --show-summary
, --show-tags
, --show-fundamentals
, --show-holdings
, and --show-separator
options set, the layout and information displayed expands:
It's possible to set a custom sort order with the --sort
flag or sort:
config option with these options:
- Default - change percent with closed markets at the end
alpha
to sort alphabetically by symbolvalue
to sort by position valueuser
to sort by the order defined in configuration with positions on top then lots
Watchlists and holdings can be grouped in .ticker.yml
under the groups
property. While running ticker
, press TAB to cycle forward through groups or SHIFT+TAB to cycle backward.
- If top level
watchlist
orlots
properties are defined in the configuration file, the entries there will be added to a group nameddefault
which will always be shown first - Ordering is defined by order in the configuration file
- The
holdings
property replaceslots
undergroups
but serves the same purpose
ticker
pulls market data from a few different sources with Yahoo Finance as the default. Symbols for non default data sources follow the format <symbol>.<source>
where <symbol>
is the canonical symbol within that data source and <source>
is the data source specifier. Below is a list of the supported data sources and their specifiers:
- none - symbols with no suffix will default to Yahoo Finance as the data source
.X
- symbols with this suffix are shorthand symbols that are specific to ticker and intended to provide more concise and familiar symbols for popular assets (e.g. usingSOL.X
rather thanSOLANA.CG
)- The full list of ticker symbols can be found here. Initial values are populated with the top cryptocurrencies by volume on Coinbase at the time of update
.CB
- symbols with this suffix will use Coinbase as the data source. The symbol can be found by searching for the asset on Coinbase and finding the symbol for the asset. (e.g. for Starknet check the market page to find the symbolSTRK
and set the symbol toSTRK.CB
in ticker).
Note: Coincap (.CC
) and CoinGecko (.CG
) are no longer supported after v5.0.0
ticker
supports converting from the exchange's currency to a local currency. This can be set by setting the currency
property in .ticker.yaml
to a ISO 4217 3-digit currency code.
- When a
currency
is defined, all values are converted including summary, quote, and position - Add cost basis lots in the currency of the exchange - these will be converted automatically when
currency
is defined - If a
currency
is not set (default behavior) and theshow-summary
option is enabled, the summary will be calculated in USD regardless of the exchange currency to avoid mixing currencies - Currencies are retrieved only once at start time - currency exchange rates do fluctuate over time and thus converted values may vary depending on when ticker is started
- If the
currency-summary-only
is set totrue
and a value is set forcurrency
, only the summary values will be converted - If
currency-disable-unit-cost-conversion
flag totrue
, currency conversion will not be done when calculating the cost basis. This can be useful for users that purchase a non-US asset and want to use the currency exchange rate at the time of purchase by inputting the unit cost in their local currency (set incurrency
) rather than using the most recent currency exchange rate.
ticker
supports setting custom color schemes from the config file. Colors are represented by a hex triplet. Below is an annotated example config block from .ticker.yaml
where custom colors are set:
# ~/.ticker.yaml
watchlist:
- NET
- TEAM
- ESTC
- BTC-USD
colors:
text: "#005fff"
text-light: "#0087ff"
text-label: "#00d7ff"
text-line: "#00ffff"
text-tag: "#005fff"
background-tag: "#0087ff"
- Terminals supporting TrueColor will be able to represent the full color space and in other cases colors will be down sampled
- Any omitted or invalid colors will revert to default color scheme values
ticker
supports printing holdings to the terminal as text by using ticker print
. Output defaults to JSON but CSV output can also be generated by passing the --format=csv
flag.
$ ticker --config=./.ticker.yaml print
[{"name":"Airbnb, Inc.","symbol":"ABNB","price":164.71,"value":16965.13,"cost":15038,"quantity":103,"weight":53.66651978212161},{"name":"Tesla, Inc.","symbol":"TSLA","price":732.35,"value":14647,"cost":15660,"quantity":20,"weight":46.33348021787839}]
- Ensure there is at least one lot in the configuration file in order to generate output
- A specific config file can be specified with the
--config
flag
- Market data delay
- Yahoo Finance - Market data pulled from Yahoo finance will have some lag (<~30s) introduced by intermediary systems and certain exchanges will impose intentional delays on data. NYSE and NASDAQ offer real-time market data but other exchanges may not. Consult the help article on exchange delays to determine which exchanges you can expect delays for or use the
--show-tags
flag to include timeliness of data alongside quotes inticker
. Yahoo Finance also relies on polling which introduces some delay (>=5s).refresh-interval
determines the polling frequency. - Coinbase - Market data for spot assets on Coinbase is directly streamed from the exchange through a WebSocket connection and is available in near real-time. Derivatives assets (i.e. symbols with
-CDE
suffix) are polling based however Basis is updated in near real-time based on spot market data changes
- Yahoo Finance - Market data pulled from Yahoo finance will have some lag (<~30s) introduced by intermediary systems and certain exchanges will impose intentional delays on data. NYSE and NASDAQ offer real-time market data but other exchanges may not. Consult the help article on exchange delays to determine which exchanges you can expect delays for or use the
- Non-US Symbols, Forex, ETFs - The names for there may differ from their common name/symbols. Try searching the native name in Yahoo finance to determine the symbol to use in
ticker
- Terminal fonts - Font with support for the
HORIZONTAL LINE SEPARATOR
unicode character is required to properly render separators (--show-separator
option)
- alpaca-ticker-config - Pull alpaca.markets positions into
.ticker.yaml
from the command line
Running tests:
go run github.com/onsi/ginkgo/v2/ginkgo -cover ./...
Linting:
golangci-lint run