diff --git a/README.md b/README.md index 7967ed6..f9781a0 100644 --- a/README.md +++ b/README.md @@ -6,13 +6,11 @@ Based from [ticker.sh](https://github.com/pstadler/ticker.sh) -![ticker.sh](https://raw.githubusercontent.com/pstadler/ticker.sh/master/screenshot.png) - ![stocks.sh](https://gitea.maboiteverte.fr/shell/stocks_mbv/raw/branch/master/screenshot.jpg) -![stocks.sh](https://gitea.maboiteverte.fr/shell/stocks_mbv/src/commit/c8e904fa4e3594ab8f878565faf61062d6401e6f/screenshot.jpg) + ## Install @@ -22,11 +20,41 @@ $ curl -o ticker.sh https://raw.githubusercontent.com/pstadler/ticker.sh/master/ ## Requirements -- [jq](https://stedolan.github.io/jq/), a versatile command-line JSON processor. -- [yq](https://github.com/kislyuk/yq), a versatile command-line YAML processor (Python version). +- [jq](https://stedolan.github.io/jq/), a versatile command-line JSON processor. +- [yq](https://github.com/mikefarah/yq/), a versatile command-line YAML processor. ## Usage +#### Preferences: + +```bash +# Preference file: +$ nano ~/.stocks.yaml + +watchlist: + - ^FCHI + - AC.PA + - ALCLS.PA + - ATO.PA + - AUB.PA + - CS.PA + - DG.PA + - ORA.PA + - VIRP.PA + - WLN.PA +lots: + - symbol: "AUB.PA" + quantity: 600 + unit_cost: 32.164 + - symbol: "ORA.PA" + quantity: 700 + unit_cost: 9.426 + + +``` + +#### Running: + ```sh # Single symbol: $ ./ticker.sh AAPL @@ -34,23 +62,16 @@ $ ./ticker.sh AAPL # Multiple symbols: $ ./ticker.sh AAPL MSFT GOOG BTC-USD -# Read from file: -$ echo "AAPL MSFT GOOG BTC-USD" > ~/.ticker.conf -$ ./ticker.sh $(cat ~/.ticker.conf) +# Run stocks.sh: +$ ./stocks.sh -# Use different colors: -$ COLOR_BOLD="\e[38;5;248m" \ - COLOR_GREEN="\e[38;5;154m" \ - COLOR_RED="\e[38;5;202m" \ - ./ticker.sh AAPL - -# Disable colors: -$ NO_COLOR=1 ./ticker.sh AAPL # Update every five seconds: $ watch -n 5 -t -c ./ticker.sh AAPL MSFT GOOG BTC-USD # Or if `watch` is not available: -$ while true; do clear; ./ticker.sh AAPL MSFT GOOG BTC-USD; sleep 5; done +$ while true; do clear; ./ticker.sh; sleep 5; done +# Or +./run_stocks.sh ``` diff --git a/run_stocks.sh b/run_stocks.sh index afb9633..0059b20 100755 --- a/run_stocks.sh +++ b/run_stocks.sh @@ -1,5 +1,18 @@ #!/usr/bin/env bash -refresh="60" +refresh="600" + +sleep-with-countdown() { + secs=$1 + while [ $secs -gt 0 ]; do + printf "\rProchaine dans $secs\033[0K s" + sleep 1 + : $((secs--)) + done + printf "\n" +} +# sleep-with-countdown $refresh; + +#while true; do clear; ./stocks.sh $(cat ~/.ticker.conf); sleep $refresh; done +while true; do clear; ./stocks.sh; sleep $refresh; done -while true; do clear; ./stocks.sh $(cat ~/.ticker.conf); sleep $refresh; done diff --git a/stocks.sh b/stocks.sh index 139af79..7487569 100755 --- a/stocks.sh +++ b/stocks.sh @@ -14,6 +14,8 @@ reset="\033[0m" LANG=C LC_NUMERIC=C +stocks_list=~/.stocks.yaml + query() { echo "$obj" | jq -r ".$1" } @@ -24,30 +26,36 @@ round() { # Test if jq & yq executables are in $PATH -if ! $(type jq > /dev/null 2>&1); then - echo "'jq' is not in the PATH. (See: https://stedolan.github.io/jq/)" - exit 1 +if ! $(type jq >/dev/null 2>&1); then + echo "'jq' is not in the PATH. (See: https://stedolan.github.io/jq/)" + exit 1 fi -if ! $(type yq > /dev/null 2>&1); then - echo "'yq' is not in the PATH. (See: https://github.com/kislyuk/yq" - exit 1 +if ! $(type yq >/dev/null 2>&1); then + echo "'yq' is not in the PATH. (See: https://github.com/kislyuk/yq" + exit 1 fi # Read stocks from .stocks.yaml config file -a=$(cat ~/.stocks.yaml | yq .watchlist) -b=$(cat ~/.stocks.yaml | yq .lots) +if [ -f $stocks_list ]; then + #a=$(cat ~/.stocks.yaml | yq '.watchlist') + a=$(cat $stocks_list | yq '.watchlist') + b=$(cat $stocks_list | yq '.lots') +else + echo "$stocks_list not present !" + echo "" +fi while IFS= read -r obj; do - stock=$(echo "$obj" | jq -r) + stock=${obj:2} list+="$stock," -done < <(echo "$a" | jq -c '.[]') +done < <(echo "$a") symbols=$(echo "$list" | sed 's/.$//') -#echo "$symbols" # AC.PA ATO.PA AUB.PA CS.PA DG.PA ^FCHI VIRP.PA WLN.PA + ##### if [ -z "$symbols" ]; then @@ -61,7 +69,6 @@ fi API_ENDPOINT="https://query1.finance.yahoo.com/v7/finance/quote?lang=fr-FR®ion=FR&corsDomain=finance.yahoo.com" results=$(curl --silent "$API_ENDPOINT&fields=$fields&symbols=$symbols" | jq '.quoteResponse .result') -#echo "$results" # Display stocks data @@ -72,57 +79,60 @@ echo -e "${bold}stocks.sh${reset}\n" while IFS= read -r obj; do marketState=$(query 'marketState') symbol=$(query 'symbol') - + preMarketChange=$(query 'preMarketChange') postMarketChange=$(query 'postMarketChange') - + longName=$(query 'longName') if [ "$longName" == "null" ] && [ $symbol == "^FCHI" ]; then longName="CAC 40" fi - + if [ $t == "0" ]; then - printf "${bold}%-10s | %-23s | %-7s | " "Symbole" "Entreprise" "Cours" + printf "${bold}%-10s | %-21s | %-7s | " "Symbole" "Entreprise" "Cours" printf "%-6s | %-7s | %-7s | " "Diff" "%" "Veille" - printf "%-7s | %-7s | %-8s | " "+ Haut" "+ Bas" "Volume" - printf "%-9s | %-25s | %-18s | " "Ouverture" "Heure" "52 semaines" - printf "%-7s | %-9s | %-9s | %-6s${reset}\n" "Qté" "Valoris." "+/- value" "Perf." + printf "%-7s | %-7s | %-8s | " "+ Haut" "+ Bas" "Volume" + printf "%-9s | %-25s | %-18s | " "Ouverture" "Heure" "52 semaines" + printf "%-7s | %-9s | %-9s | %-6s${reset}\n" "Qté" "Valoris." "+/- value" "Perf." fi t=1 - + if [ $marketState == "PRE" ] && [ $preMarketChange != "0" ] && [ $preMarketChange != "null" ]; then - nonRegularMarketSign='*' - price=$(query 'preMarketPrice') - diff=$preMarketChange - percent=$(query 'preMarketChangePercent') + nonRegularMarketSign='*' + price=$(query 'preMarketPrice') + diff=$preMarketChange + percent=$(query 'preMarketChangePercent') elif [ $marketState != "REGULAR" ] && [ $postMarketChange != "0" ] && [ $postMarketChange != "null" ]; then - nonRegularMarketSign='*' - price=$(query 'postMarketPrice') - diff=$postMarketChange - percent=$(query 'postMarketChangePercent') + nonRegularMarketSign='*' + price=$(query 'postMarketPrice') + diff=$postMarketChange + percent=$(query 'postMarketChangePercent') else - nonRegularMarketSign='' - price=$(query 'regularMarketPrice') - diff=$(query 'regularMarketChange') - percent=$(query 'regularMarketChangePercent') - previous=$(query 'regularMarketPreviousClose') - volume=$(query 'regularMarketVolume') - haut=$(query 'regularMarketDayHigh') - bas=$(query 'regularMarketDayLow') - ouverture=$(query 'regularMarketOpen') - ts=$(query 'regularMarketTime') - heure=$(LC_ALL=fr_FR.UTF-8 date -d @$ts +"%c" 2>/dev/null || LC_ALL=fr_FR.UTF-8 date -r $ts +"%c") - ftweeks=$(query 'fiftyTwoWeekRange') + nonRegularMarketSign='' + price=$(query 'regularMarketPrice') + diff=$(query 'regularMarketChange') + percent=$(query 'regularMarketChangePercent') + previous=$(query 'regularMarketPreviousClose') + volume=$(query 'regularMarketVolume') + haut=$(query 'regularMarketDayHigh') + bas=$(query 'regularMarketDayLow') + ouverture=$(query 'regularMarketOpen') + ts=$(query 'regularMarketTime') + heure=$(LC_ALL=fr_FR.UTF-8 date -d @$ts +"%c" 2>/dev/null || LC_ALL=fr_FR.UTF-8 date -r $ts +"%c") + ftweeks=$(query 'fiftyTwoWeekRange') fi - + # Stocks owned - z=$(jq -c '.[] | select(.symbol == "'${symbol}'")' <<< $b) - + #z=$(jq -c '.[] | select(.symbol == "'${symbol}'")' <<<$b) + z=$(yq '.[] | select(.symbol == "'${symbol}'")' <<< "$b") + if [ -n "$z" ]; then #echo "$z" #quantity=$(jq -c '.[] | select(.symbol == "'${symbol}'") | .quantity' <<< $b) - quantity=$(jq -c '.quantity' <<< $z) - unit_cost=$(jq -c '.unit_cost' <<< $z) + #quantity=$(jq -c '.quantity' <<<$z) + #unit_cost=$(jq -c '.unit_cost' <<<$z) + quantity=$(yq '.quantity' <<<$z) + unit_cost=$(yq '.unit_cost' <<<$z) purchase=$(echo "$quantity * $unit_cost" | bc -l) valuations=$(echo "$quantity * $price" | bc -l) profit=$(echo "$valuations - $purchase" | bc -l) @@ -136,13 +146,13 @@ while IFS= read -r obj; do #((profit = valuations - purchase)) #echo "Qte: $quantity - PM: $unit_cost - Achat: $purchase - Valorisation: $valuations" - #echo "+-value: $profit - Perf: $performance%" + #echo "+-value: $profit - Perf: $performance%" fi # Lines colors: + green ; - red ; 0 no color if [ "$diff" == "0" ] || [ "$diff" == "0.0" ]; then color= - elif ( echo "$diff" | grep -q ^- ); then + elif (echo "$diff" | grep -q ^-); then color=$red #cours_color="\033[3;31m" cours_color="\033[1;37;1;41m" @@ -151,17 +161,21 @@ while IFS= read -r obj; do #cours_color="\033[3;32m" cours_color="\033[1;37;1;42m" fi - + # Displaying if [ "$price" != "null" ]; then - printf "${color}%-10s | %-23s | ${reset}${cours_color}%7.2f${reset}${color} | " $symbol "$longName" $price + printf "${color}%-10s | %-21s | ${reset}${cours_color}%7.2f${reset}${color} | " $symbol "$longName" $price printf "% 6.2f | % 6.2f%% | %7.2f | " $diff $percent $previous printf "%7.2f | %7.2f | %8d | " $haut $bas $volume printf "%9.2f | %25s | %18s | " $ouverture "$heure" "$ftweeks" if [ -n "$z" ]; then printf "%6d | %9.2f | %9.2f | % 6.2f%%${reset}\n" $quantity $valuations $profit $performance - else echo "" + else + echo "" fi fi - + done < <(echo "$results" | jq -c '.[]') + +d=$(LC_ALL=fr_FR.UTF-8 TZ='Europe/Paris' date +"%c") +echo -e "\n${reset}Dernière mise-à-jour: ${bold}$d${reset}"