o
    miS                     @   s   d dl Z d dlZd dlZd dlZd dlmZ dZe dZe dZe dZej	edd d	d
 Z
e
 \ZZZedkr?dZndZdZeedZd ddZdd Zdd Zd!ddZd"ddZdd Zedkrle  dS dS )#    N)datetimez/var/www/screenerz/engine/config.jsonz/dataz/stocks.jsonT)exist_okc                  C   s   t jts
tdtt} t| }W d    n1 sw   Y  |di }|d}|d}|dd}|r=|sAtd|||fS )Nzengine/config.json not foundalpacakeysecretmodepaperz+Alpaca credentials missing from config.json)	ospathexistsENGINE_CONFIGRuntimeErroropenjsonloadget)fcfgalpr   r   r    r    /var/www/screener/alpaca_scan.pyload_config   s   



r   r   z https://paper-api.alpaca.marketszhttps://api.alpaca.marketszhttps://data.alpaca.markets)zAPCA-API-KEY-IDzAPCA-API-SECRET-KEYc                 C   sD   t j| t|dd}|jdkrtd|j d|jd d  | S )N   )headersparamstimeout   zHTTP z: )requestsr   HEADERSstatus_coder   textr   )urlr   rr   r   r   http_get8   s   
 r#   c                  C   s   t d tt d} t| tstdt dt|  d g }| D ]}|ddu r@|dd	v r@|d
dkr@||d  q"t dt|  |S )Nz [SCAN] Fetching Alpaca assets...z
/v2/assetsz$Alpaca assets response is not a listz[SCAN] Retrieved z assetstradableTexchange)NASDAQNYSEstatusactivesymbolz[SCAN] Tradable symbols: )	printr#   	TRADE_URL
isinstancelistr   lenr   append)assetssymbolsar   r   r   scan_assetsA   s   
r4   c                 C   s8   t dt|  d t d}dd| i}t||dS )Nz[SCAN] Fetching snapshots for z symbolsz/v2/stocks/snapshotsr2   ,)r   )r+   r/   DATA_URLjoinr#   )r2   r!   r   r   r   r   fetch_snapshotsV   s   
r8      d   c                 C   s,  g }|   D ]\}}|d}|d}|d}|d}	|r&|r&|r&|	s'q|d}
|d}|
d u s9|d u r:q|
|k sB|
|krCq|d}|d}d }|rZ|rZt|| d	}d }|	d
rpt|
|	d
  |	d
  d d}||t|
dt||||||d|dd	 qtdt|  |S )NlatestTradelatestQuotedailyBarprevDailyBarpvbpap   cr:      hl)	r*   pricevolumebidaskspread
change_pctday_highday_lowz [SCAN] Rows after price filter: )itemsr   roundr0   intr+   r/   )snaps	min_price	max_pricerowssymsnaptradequotedailyprevrH   rI   rJ   rK   rL   rM   r   r   r   
build_rows\   sF   









r]   2   c                 C   s4   g }t dt| |D ]}|| |||   q
|S )Nr   )ranger/   r0   )rV   bucket_sizebucketsir   r   r   bucket_rows   s   rc   c            	      C   s   t   } t }|d d }t|}t|ddd}|jdd dd t|d	d
}t  d t	t
|d	|d}td }t|d}tj||dd W d    n1 sSw   Y  t|t tt   |  d}tdt
| d| d d S )Ni  r9   r:   )rT   rU   c                 S   s   | d S )NrI   r   )r"   r   r   r   <lambda>   s    zmain.<locals>.<lambda>T)r   reverser^   )r`   Z)generated_atr   total_symbolsr`   ra   z.tmpwrE   )indentz[SCAN] Saved z buckets to data/stocks.json (zs))timer4   r8   r]   sortrc   r   utcnow	isoformatALPACA_MODEr/   OUTPUT_FILEr   r   dumpr	   replacerQ   r+   )	startr2   rS   rV   ra   payloadtmpr   elapsedr   r   r   main   s(   rw   __main__)N)r9   r:   )r^   )r   r	   rk   r   r   BASE_DIRr   DATA_DIRrp   makedirsr   
ALPACA_KEYALPACA_SECRETro   r,   r6   r   r#   r4   r8   r]   rc   rw   __name__r   r   r   r   <module>   s8   



	

/	"
