ops/scripts/alpaca_hist_md/alpaca_md.sh
2024-03-24 16:40:20 -04:00

99 lines
2.3 KiB
Bash
Executable File

#!/bin/bash
Start=${1}
End=${2}
NumJobs=${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
if [ "${End}" == "" ] ; then
End=$(date -d "${Start} + 1 day" "+%Y-%m-%d")
fi
if [ "${NumJobs}" == "" ] ; then
NumJobs=25
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/alpaca_md
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}"
Cmd="${Cmd} --instruments=ALPACA:${Inst}"
Cmd="${Cmd} --start=${Start}"
if [ "${End}" != "" ]; then
Cmd="${Cmd} --end=${End}"
fi
Cmd="${Cmd} --log_file=${LogDir}/${Start}.${Inst}.log"
echo ${Cmd}
eval ${Cmd}
}
export -f run_proc
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-/'"
# split string into array
Instruments=()
for Inst in $(eval ${Cmd})
do
Instruments+=("$Inst")
done
slice_size=100 # 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