#!/bin/bash Start=${1} NumJobs=${2} InstListFile=${3} export CalendarURL=http://cloud16.cvtt.vpn:8000/api/v1/markets/hours?mic=XNYS is_business_day() { dt=${1} open_time=$(curl -s "${CalendarURL}&start=${dt}&end=${dt}" | jq '.[] | .open_time') if [ -n "${open_time}" ]; then return 0 else return 1 fi } export -f is_business_day if [ "${Start}" == "" ] ; then Start=$(date -d "yesterday" "+%Y-%m-%d") fi if ! is_business_day ${Start}; then echo "${Start} is not business day in US" exit fi End=$(date -d "${Start} + 1 day" "+%Y-%m-%d") if [ "${NumJobs}" == "" ] ; then NumJobs=30 fi echo "Start=${Start} End=${End} NumJobs=${NumJobs}" export PYTHONPATH=/home/cvtt/prod export Python=/home/cvtt/.pyenv/python3.10-venv/bin/python3 export PyScript=/home/cvtt/prod/cvttpy/exchanges/alpaca/hist_mkt_data.py export OutputDir=/home/cvtt/host_drive/alpaca_md # Local export Config=http://cloud16.cvtt.vpn:6789/apps/minimal_md export LogDir=/home/cvtt/prod/logs/alpaca_md mkdir -p ${LogDir} run_proc() { Inst=${1} Start=${2} End=${3} echo "Running for $Inst" Cmd="${Python} ${PyScript}" Cmd="${Cmd} --config=${Config}" Cmd="${Cmd} --output_dir=${OutputDir}/${Start:0:4}" Cmd="${Cmd} --instruments=ALPACA:${Inst}" Cmd="${Cmd} --start=${Start}" if [ "${End}" != "" ]; then Cmd="${Cmd} --end=${End}" fi Cmd="${Cmd} --log_file=${LogDir}/${Inst}.log" Cmd="${Cmd} --log_level=WARNING" echo ${Cmd} eval ${Cmd} } export -f run_proc if [ -n $InstListFile ]; then key=$(jq -r '.["ALPACA_SANDBOX"] | .api_key' ~/.creds) secret=$(jq -r '.["ALPACA_SANDBOX"] | .secret_key' ~/.creds) Cmd="curl -s --request GET --url 'https://paper-api.alpaca.markets/v2/assets?status=active'" Cmd="${Cmd} --header 'APCA-API-KEY-ID: ${key}'" Cmd="${Cmd} --header 'APCA-API-SECRET-KEY: ${secret}'" Cmd="${Cmd} --header 'accept: application/json'" Cmd="${Cmd} | jq '.[] | select(.class == \"us_equity\" and .exchange != \"OTC\") | .symbol'" Cmd="${Cmd} | sed 's/\"//g'" Cmd="${Cmd} | sed 's/^/STOCK-/'" else Cmd="cat ${InstListFile}" fi # split string into array Instruments=() for Inst in $(eval ${Cmd}) do Instruments+=("$Inst") done slice_size=500 # 10K symbols parallel cannot handle for ((ii=0; ii <${#Instruments[@]}; ii+=slice_size)); do InstSlice=("${Instruments[@]:ii:slice_size}") parallel -j ${NumJobs} run_proc {} ${Start} ${End} ::: "${InstSlice[@]}" done